From e75fae037703da9279faf0bd35fc54c0397e78fe Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 5 Feb 2020 21:20:42 +0100 Subject: [PATCH 01/27] feat(scaffolder): Added the ability to create the repos with optional org in github --- backend/scaffolder/app/server.go | 43 ++++++++++++-- backend/scaffolder/go.mod | 2 + backend/scaffolder/go.sum | 7 +++ backend/scaffolder/main.go | 5 +- backend/scaffolder/remote/github.go | 65 +++++++++++++++++++++ backend/scaffolder/repository/repository.go | 2 +- proto/scaffolder/v1/scaffolder.proto | 33 ++++++++--- 7 files changed, 142 insertions(+), 15 deletions(-) create mode 100644 backend/scaffolder/remote/github.go diff --git a/backend/scaffolder/app/server.go b/backend/scaffolder/app/server.go index 88b6111bdf..2227108c20 100644 --- a/backend/scaffolder/app/server.go +++ b/backend/scaffolder/app/server.go @@ -2,20 +2,53 @@ package app import ( "context" + "fmt" identity "github.com/spotify/backstage/backend/proto/identity/v1" pb "github.com/spotify/backstage/proto/scaffolder/v1" + "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 } -// 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) { + repo := remote.Repository{ + Name: req.ComponentId, + Org: req.Org, + Private: req.Private, + } + + err := s.github.CreateRepository(repo) + + fmt.Println("Meta is") + fmt.Println(req.Metadata) + fmt.Println("error is") + fmt.Println(err) + + return nil, nil + // first create the repository with github + + // move the template into a temporary directory + + // use git bindings to add the remote with access token and push to the directory +} + +// 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 +67,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/go.mod b/backend/scaffolder/go.mod index 76873ce771..b29a9b6ad3 100644 --- a/backend/scaffolder/go.mod +++ b/backend/scaffolder/go.mod @@ -8,7 +8,9 @@ replace github.com/spotify/backstage/backend/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..e875470b7f 100644 --- a/backend/scaffolder/main.go +++ b/backend/scaffolder/main.go @@ -6,7 +6,6 @@ import ( pb "github.com/spotify/backstage/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..21d026b709 --- /dev/null +++ b/backend/scaffolder/remote/github.go @@ -0,0 +1,65 @@ +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) error { + ghRepo := &gh.Repository{ + Name: &repo.Name, + Private: &repo.Private, + } + + var org string + + if repo.Org != "" { + org = repo.Org + } + + created, response, err := g.client.Repositories.Create(*g.ctx, org, ghRepo) + + fmt.Println(created) + fmt.Println(response) + fmt.Println(err) + return nil +} diff --git a/backend/scaffolder/repository/repository.go b/backend/scaffolder/repository/repository.go index 1896cd0ce9..65e81eb942 100644 --- a/backend/scaffolder/repository/repository.go +++ b/backend/scaffolder/repository/repository.go @@ -45,5 +45,5 @@ func (s *Repository) Load() ([]*TemplateDefinition, error) { templateDefinitions = append(templateDefinitions, &definition) } - return templateDefinitions, err + return templateDefinitions, nil } 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 From 9f9949503a5e12e8257f2ce1286bc69eeffbd36e Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 6 Feb 2020 04:00:37 +0100 Subject: [PATCH 02/27] feat(scaffolder): Added the ability to create a component, create GH repo + copy to template to temp folder ready for cookiecutter --- backend/proto/scaffolder/v1/scaffolder.pb.go | 261 +++++++++++++++---- backend/scaffolder/app/server.go | 23 +- backend/scaffolder/fs/fs.go | 87 +++++++ backend/scaffolder/remote/github.go | 9 +- backend/scaffolder/repository/repository.go | 3 +- 5 files changed, 316 insertions(+), 67 deletions(-) create mode 100644 backend/scaffolder/fs/fs.go 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/scaffolder/app/server.go b/backend/scaffolder/app/server.go index 2227108c20..f69412b314 100644 --- a/backend/scaffolder/app/server.go +++ b/backend/scaffolder/app/server.go @@ -3,8 +3,12 @@ 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" + "github.com/spotify/backstage/scaffolder/fs" "github.com/spotify/backstage/scaffolder/remote" "github.com/spotify/backstage/scaffolder/repository" ) @@ -13,6 +17,7 @@ import ( type Server struct { repository *repository.Repository github *remote.Github + fs *fs.Filesystem } // NewServer creates a new server for with all the things @@ -24,25 +29,23 @@ func NewServer() *Server { // 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.Sprintln("Creating repository for Component %s", req.ComponentId) repo := remote.Repository{ Name: req.ComponentId, Org: req.Org, Private: req.Private, } - - err := s.github.CreateRepository(repo) - - fmt.Println("Meta is") - fmt.Println(req.Metadata) - fmt.Println("error is") - fmt.Println(err) - - return nil, nil - // first create the repository with github + 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 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/remote/github.go b/backend/scaffolder/remote/github.go index 21d026b709..3cc4b9e9e9 100644 --- a/backend/scaffolder/remote/github.go +++ b/backend/scaffolder/remote/github.go @@ -44,7 +44,7 @@ type Repository struct { } // CreateRepository will create the repository in Github ready for use by the scaffolder -func (g *Github) CreateRepository(repo Repository) error { +func (g *Github) CreateRepository(repo Repository) (*gh.Repository, error) { ghRepo := &gh.Repository{ Name: &repo.Name, Private: &repo.Private, @@ -56,10 +56,7 @@ func (g *Github) CreateRepository(repo Repository) error { org = repo.Org } - created, response, err := g.client.Repositories.Create(*g.ctx, org, ghRepo) + created, _, err := g.client.Repositories.Create(*g.ctx, org, ghRepo) - fmt.Println(created) - fmt.Println(response) - fmt.Println(err) - return nil + return created, err } diff --git a/backend/scaffolder/repository/repository.go b/backend/scaffolder/repository/repository.go index 65e81eb942..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 From c21ce9e768408ca2c6b3811411c168dc13339f6d Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 6 Feb 2020 04:07:44 +0100 Subject: [PATCH 03/27] feat(scaffolder): Added scaffolder github workflw --- .github/workflows/scaffolder.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 .github/workflows/scaffolder.yml 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 From 37ad61bb0deac86e4b29cd8f018be1c8792b86d4 Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 6 Feb 2020 04:19:50 +0100 Subject: [PATCH 04/27] hack(scaffolder): to get imports to work nicely with the current protobuf setup, we can slightly change the import rewrites in go modules to point to same place without error --- backend/scaffolder/go.mod | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/scaffolder/go.mod b/backend/scaffolder/go.mod index b29a9b6ad3..c8df6d39e9 100644 --- a/backend/scaffolder/go.mod +++ b/backend/scaffolder/go.mod @@ -2,9 +2,10 @@ 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 From aecd2f7e3f5dabdae2e3fce3393c460b1583642f Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 6 Feb 2020 04:28:39 +0100 Subject: [PATCH 05/27] fix(scaffolder): Fixing some small issues with CI workflows --- backend/scaffolder/app/server.go | 2 +- backend/scaffolder/app/server_test.go | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 backend/scaffolder/app/server_test.go diff --git a/backend/scaffolder/app/server.go b/backend/scaffolder/app/server.go index f69412b314..ae89cb81ca 100644 --- a/backend/scaffolder/app/server.go +++ b/backend/scaffolder/app/server.go @@ -30,7 +30,7 @@ func NewServer() *Server { // 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.Sprintln("Creating repository for Component %s", req.ComponentId) + fmt.Sprintf("Creating repository for Component %s", req.ComponentId) repo := remote.Repository{ Name: req.ComponentId, Org: req.Org, 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) { +} From 940d472df104568c6b6cf23b2f5e6dbdaf37b33b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 6 Feb 2020 10:00:28 +0100 Subject: [PATCH 06/27] frontend/core: simplify plugin output handling --- frontend/packages/app/src/entities/index.ts | 8 +- frontend/packages/core/src/api/api.ts | 6 +- .../packages/core/src/api/app/AppBuilder.tsx | 31 ++++- ...wPageBuilder.tsx => EntityPageBuilder.tsx} | 86 ++++++++------ .../packages/core/src/api/plugin/Plugin.tsx | 106 +++++++++--------- .../core/src/api/plugin/PluginOutputHook.ts | 11 -- .../packages/core/src/api/plugin/outputs.ts | 8 -- .../packages/core/src/api/plugin/types.ts | 41 +++++++ .../src/components/EntityLink/EntityLink.tsx | 2 +- .../src/components/BuildPage/BuildPage.tsx | 22 ---- .../src/components/BuildPage/index.ts | 1 - .../plugins/github-actions/src/plugin.ts | 14 +-- 12 files changed, 187 insertions(+), 149 deletions(-) rename frontend/packages/core/src/api/entityView/{EntityViewPageBuilder.tsx => EntityPageBuilder.tsx} (52%) delete mode 100644 frontend/packages/core/src/api/plugin/PluginOutputHook.ts delete mode 100644 frontend/packages/core/src/api/plugin/outputs.ts create mode 100644 frontend/packages/core/src/api/plugin/types.ts delete mode 100644 frontend/packages/plugins/github-actions/src/components/BuildPage/BuildPage.tsx delete mode 100644 frontend/packages/plugins/github-actions/src/components/BuildPage/index.ts 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/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..cecf142ca6 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/:buildId', BuildDetailsPage); }, }); From ae5283e1d47593b708dd8fe665c19cd87602a5ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jefferson=20Gir=C3=A3o?= Date: Thu, 6 Feb 2020 11:08:02 +0100 Subject: [PATCH 07/27] add failing scenario for getting entity --- backend/inventory/app/server.go | 2 +- backend/inventory/app/server_test.go | 37 +++- backend/proto/inventory/v1/inventory.pb.go | 233 +++++++++++++++++---- proto/inventory/v1/inventory.proto | 16 +- 4 files changed, 241 insertions(+), 47 deletions(-) diff --git a/backend/inventory/app/server.go b/backend/inventory/app/server.go index f4ea8d71d6..f1b616041f 100644 --- a/backend/inventory/app/server.go +++ b/backend/inventory/app/server.go @@ -37,5 +37,5 @@ func (s *Server) SetFact(ctx context.Context, req *pb.SetFactRequest) (*pb.SetFa 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{Uri: factUri, Value: req.Value}} , nil } diff --git a/backend/inventory/app/server_test.go b/backend/inventory/app/server_test.go index 7829a0e22c..1ac0c292fe 100644 --- a/backend/inventory/app/server_test.go +++ b/backend/inventory/app/server_test.go @@ -6,6 +6,7 @@ import ( "github.com/spotify/backstage/inventory/storage" "io/ioutil" "os" + "reflect" "testing" pb "github.com/spotify/backstage/proto/inventory/v1" @@ -49,6 +50,32 @@ 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{{Uri: "boss://test/test/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 +93,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{Uri: entity.GetUri() + "/" + req.Name, Value: "test-value"} + if !reflect.DeepEqual(resp.GetFact(), fact) { + t.Errorf("ServerTest(SetFact) got %v, wanted %v", resp.GetFact() , fact) } } @@ -85,8 +113,9 @@ 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{Uri: entityUri + "/" + req.Name, Value: "test-value"} + if !reflect.DeepEqual(resp.GetFact(), fact) { + t.Errorf("ServerTest(SetFact) got %v, wanted %v", resp.GetFact() , fact) } } diff --git a/backend/proto/inventory/v1/inventory.pb.go b/backend/proto/inventory/v1/inventory.pb.go index 556ca48b82..2c6201e584 100644 --- a/backend/proto/inventory/v1/inventory.pb.go +++ b/backend/proto/inventory/v1/inventory.pb.go @@ -252,7 +252,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:"-"` @@ -283,13 +283,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{6} +} + +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{7} +} + +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 +387,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{8} } func (m *Entity) XXX_Unmarshal(b []byte) error { @@ -330,8 +416,7 @@ 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"` + Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"` Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -342,7 +427,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{9} } func (m *Fact) XXX_Unmarshal(b []byte) error { @@ -363,16 +448,9 @@ func (m *Fact) XXX_DiscardUnknown() { var xxx_messageInfo_Fact proto.InternalMessageInfo -func (m *Fact) GetEntityUri() string { +func (m *Fact) GetUri() string { if m != nil { - return m.EntityUri - } - return "" -} - -func (m *Fact) GetName() string { - if m != nil { - return m.Name + return m.Uri } return "" } @@ -391,6 +469,8 @@ func init() { 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 +478,32 @@ 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, + // 386 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x4d, 0x4f, 0xc2, 0x40, + 0x10, 0x0d, 0x14, 0x30, 0x1d, 0x3e, 0x82, 0xab, 0x87, 0xa6, 0x21, 0x86, 0xac, 0xc6, 0x70, 0x30, + 0x8b, 0x85, 0x8b, 0xf1, 0xe0, 0x01, 0xa3, 0xd5, 0x6b, 0x09, 0x89, 0xf1, 0x62, 0x0a, 0x2e, 0xa4, + 0x11, 0x5a, 0x6c, 0xb7, 0x35, 0xfd, 0x0f, 0xfe, 0x2c, 0x7f, 0x98, 0xd9, 0xed, 0x5a, 0x40, 0x89, + 0x85, 0xc0, 0x6d, 0x77, 0x66, 0xde, 0xbc, 0xd7, 0xd7, 0xd7, 0x42, 0xc3, 0x71, 0x23, 0xea, 0x32, + 0xcf, 0x8f, 0xdb, 0x91, 0xd1, 0x4e, 0x2f, 0x64, 0xee, 0x7b, 0xcc, 0x43, 0x27, 0xc1, 0xdc, 0x63, + 0xce, 0x38, 0x26, 0x43, 0x7b, 0xf4, 0x16, 0x30, 0x7b, 0x42, 0xc9, 0x62, 0x24, 0x32, 0xf0, 0x07, + 0xd4, 0x4d, 0xca, 0xee, 0x5c, 0xe6, 0xb0, 0xd8, 0xa2, 0xef, 0x21, 0x0d, 0x18, 0xba, 0x81, 0x12, + 0x15, 0x05, 0x2d, 0xd7, 0xcc, 0xb5, 0xca, 0x9d, 0x73, 0xf2, 0xff, 0x12, 0x22, 0xe1, 0x12, 0x85, + 0x4e, 0xa1, 0xea, 0xb8, 0xa3, 0x69, 0xf8, 0x4a, 0x5f, 0xc6, 0xf6, 0x88, 0x05, 0x5a, 0xbe, 0xa9, + 0xb4, 0x54, 0xab, 0x22, 0x8b, 0xf7, 0xbc, 0x86, 0x3f, 0x73, 0x50, 0x5b, 0x62, 0x9e, 0x4f, 0xe3, + 0x9d, 0x79, 0xaf, 0xa1, 0xb8, 0xe0, 0x2b, 0x77, 0xce, 0xb2, 0xe0, 0x5c, 0x88, 0x95, 0x40, 0xf0, + 0x00, 0x8e, 0x6e, 0x7d, 0x6a, 0x33, 0xba, 0x57, 0x2b, 0x70, 0x1f, 0x0e, 0x57, 0xd7, 0xee, 0xe1, + 0x39, 0xf1, 0x13, 0xd4, 0xfa, 0x94, 0x09, 0xf5, 0x52, 0x66, 0x03, 0xd4, 0xa4, 0x37, 0xf0, 0x1d, + 0xb1, 0x54, 0xb5, 0x16, 0x05, 0x84, 0xa0, 0xe0, 0xda, 0x33, 0xaa, 0xe5, 0x45, 0x43, 0x9c, 0xd1, + 0x31, 0x14, 0x23, 0x7b, 0x1a, 0x52, 0x4d, 0x11, 0xc5, 0xe4, 0x82, 0x1f, 0xa0, 0x92, 0x6e, 0xe6, + 0x4a, 0xaf, 0xa0, 0xc0, 0xed, 0x91, 0x3a, 0x37, 0x33, 0x54, 0x20, 0x70, 0x4f, 0xbc, 0xdd, 0x9d, + 0x34, 0x72, 0x35, 0xe6, 0x7e, 0xd4, 0xe8, 0x50, 0x4a, 0x3c, 0x44, 0x75, 0x50, 0xc2, 0x94, 0x9f, + 0x1f, 0x31, 0x81, 0x02, 0x9f, 0xfc, 0xdb, 0x59, 0xef, 0x51, 0xe7, 0x4b, 0x01, 0xf5, 0xf1, 0x87, + 0x07, 0xcd, 0x40, 0x4d, 0x53, 0x8c, 0x2e, 0xb3, 0x24, 0xfd, 0xfe, 0xd4, 0x74, 0xb2, 0x05, 0x82, + 0x5b, 0x10, 0x41, 0x65, 0x39, 0x4f, 0xa8, 0x9b, 0x85, 0x5f, 0x13, 0x6a, 0xdd, 0xd8, 0x0e, 0xc4, + 0x79, 0x27, 0x70, 0x20, 0x83, 0x81, 0x32, 0x25, 0xaf, 0x66, 0x53, 0xbf, 0xd8, 0x78, 0x5e, 0x12, + 0x99, 0x9b, 0x12, 0x99, 0x5b, 0x12, 0x2d, 0x87, 0xa9, 0x57, 0x7d, 0x2e, 0xa7, 0xcd, 0xc8, 0x18, + 0x96, 0xc4, 0xef, 0xb2, 0xfb, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x62, 0x7f, 0x29, 0xca, 0x4e, 0x05, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -437,6 +520,8 @@ const _ = grpc.SupportPackageIsVersion6 type InventoryClient interface { 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 { @@ -465,10 +550,30 @@ 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 { 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. @@ -481,6 +586,12 @@ func (*UnimplementedInventoryServer) GetEntity(ctx context.Context, req *GetEnti 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) @@ -522,6 +633,42 @@ 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), @@ -534,6 +681,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/proto/inventory/v1/inventory.proto b/proto/inventory/v1/inventory.proto index 33a32f8e8f..5d0a3adf93 100644 --- a/proto/inventory/v1/inventory.proto +++ b/proto/inventory/v1/inventory.proto @@ -7,6 +7,8 @@ option go_package = "inventoryv1"; service Inventory { rpc GetEntity(GetEntityRequest) returns (GetEntityReply); rpc CreateEntity(CreateEntityRequest) returns (CreateEntityReply); + rpc SetFact(SetFactRequest) returns (SetFactReply); + rpc GetFact(GetFactRequest) returns (GetFactReply); } message GetEntityRequest { @@ -34,7 +36,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 +53,6 @@ message Entity { } message Fact { - string entityUri = 1; - string name = 2; + string uri = 1; string value = 3; } \ No newline at end of file From 1832a3a7638f31b40e57e3640c572cf8afcae7e1 Mon Sep 17 00:00:00 2001 From: Ochieng' Got Date: Thu, 6 Feb 2020 12:05:01 +0100 Subject: [PATCH 08/27] refactor: Protobuf messages --- backend/inventory/app/server.go | 29 +- backend/inventory/app/server_test.go | 24 +- backend/inventory/go.mod | 3 - backend/inventory/storage/storage.go | 9 +- backend/proto/inventory/v1/inventory.pb.go | 58 +- package-lock.json | 1892 ++++++++++++++++++++ proto/inventory/v1/inventory.proto | 4 +- 7 files changed, 1960 insertions(+), 59 deletions(-) create mode 100644 package-lock.json diff --git a/backend/inventory/app/server.go b/backend/inventory/app/server.go index f1b616041f..21170e6611 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" @@ -18,24 +19,40 @@ type Server struct { 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) { - entityUri, err := s.Storage.GetEntity(req.GetEntity().GetUri()) + numberOfIncludedFacts := len(req.GetIncludeFacts()) + var facts = make([]pb.Fact, numberOfIncludedFacts) + 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) + // TODO: handle errors + 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{Fact: &pb.Fact{Uri: factUri, Value: req.Value}} , 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 1ac0c292fe..745b40ecc6 100644 --- a/backend/inventory/app/server_test.go +++ b/backend/inventory/app/server_test.go @@ -3,12 +3,13 @@ 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" ) @@ -23,7 +24,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()) } } @@ -59,7 +60,6 @@ func TestServerGetEntityWithIncludedFacts(t *testing.T) { 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"}} @@ -70,7 +70,7 @@ func TestServerGetEntityWithIncludedFacts(t *testing.T) { if resp == nil { t.Errorf("ServerTest(GetEntity) returned nil") } - expectedFacts := []*pb.Fact{{Uri: "boss://test/test/test-name", Value: "test-value"}} + 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) } @@ -93,9 +93,9 @@ func TestServerSetFactForExistingEntity(t *testing.T) { if resp == nil { t.Errorf("ServerTest(SetFact) returned nil") } - fact := &pb.Fact{Uri: entity.GetUri() + "/" + req.Name, Value: "test-value"} + 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) + t.Errorf("ServerTest(SetFact) got %v, wanted %v", resp.GetFact(), fact) } } @@ -104,8 +104,8 @@ func TestServerSetFactForNonExistingEntity(t *testing.T) { defer testStorage.Close() s := Server{Storage: testStorage.Storage} - entityUri := "boss://test/test" - req := &pb.SetFactRequest{EntityUri: entityUri, Name: "test-name", Value: "test-value"} + entityURI := "boss://test/test" + req := &pb.SetFactRequest{EntityUri: entityURI, Name: "test-name", Value: "test-value"} resp, err := s.SetFact(context.Background(), req) if err != nil { t.Errorf("ServerTest(SetFact) got unexpected error %v", err) @@ -113,15 +113,16 @@ func TestServerSetFactForNonExistingEntity(t *testing.T) { if resp == nil { t.Errorf("ServerTest(SetFact) returned nil") } - fact := &pb.Fact{Uri: entityUri + "/" + req.Name, Value: "test-value"} + + 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) + 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. @@ -143,4 +144,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..17cd09f35f 100644 --- a/backend/inventory/storage/storage.go +++ b/backend/inventory/storage/storage.go @@ -37,8 +37,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 +49,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) { diff --git a/backend/proto/inventory/v1/inventory.pb.go b/backend/proto/inventory/v1/inventory.pb.go index 2c6201e584..151557d0a0 100644 --- a/backend/proto/inventory/v1/inventory.pb.go +++ b/backend/proto/inventory/v1/inventory.pb.go @@ -416,8 +416,8 @@ func (m *Entity) GetUri() string { } type Fact struct { - Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,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:"-"` @@ -448,9 +448,9 @@ func (m *Fact) XXX_DiscardUnknown() { var xxx_messageInfo_Fact proto.InternalMessageInfo -func (m *Fact) GetUri() string { +func (m *Fact) GetName() string { if m != nil { - return m.Uri + return m.Name } return "" } @@ -478,32 +478,32 @@ func init() { func init() { proto.RegisterFile("inventory/v1/inventory.proto", fileDescriptor_70be9028e322f9d8) } var fileDescriptor_70be9028e322f9d8 = []byte{ - // 386 bytes of a gzipped FileDescriptorProto + // 390 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x54, 0x4d, 0x4f, 0xc2, 0x40, - 0x10, 0x0d, 0x14, 0x30, 0x1d, 0x3e, 0x82, 0xab, 0x87, 0xa6, 0x21, 0x86, 0xac, 0xc6, 0x70, 0x30, - 0x8b, 0x85, 0x8b, 0xf1, 0xe0, 0x01, 0xa3, 0xd5, 0x6b, 0x09, 0x89, 0xf1, 0x62, 0x0a, 0x2e, 0xa4, - 0x11, 0x5a, 0x6c, 0xb7, 0x35, 0xfd, 0x0f, 0xfe, 0x2c, 0x7f, 0x98, 0xd9, 0xed, 0x5a, 0x40, 0x89, - 0x85, 0xc0, 0x6d, 0x77, 0x66, 0xde, 0xbc, 0xd7, 0xd7, 0xd7, 0x42, 0xc3, 0x71, 0x23, 0xea, 0x32, - 0xcf, 0x8f, 0xdb, 0x91, 0xd1, 0x4e, 0x2f, 0x64, 0xee, 0x7b, 0xcc, 0x43, 0x27, 0xc1, 0xdc, 0x63, - 0xce, 0x38, 0x26, 0x43, 0x7b, 0xf4, 0x16, 0x30, 0x7b, 0x42, 0xc9, 0x62, 0x24, 0x32, 0xf0, 0x07, - 0xd4, 0x4d, 0xca, 0xee, 0x5c, 0xe6, 0xb0, 0xd8, 0xa2, 0xef, 0x21, 0x0d, 0x18, 0xba, 0x81, 0x12, - 0x15, 0x05, 0x2d, 0xd7, 0xcc, 0xb5, 0xca, 0x9d, 0x73, 0xf2, 0xff, 0x12, 0x22, 0xe1, 0x12, 0x85, - 0x4e, 0xa1, 0xea, 0xb8, 0xa3, 0x69, 0xf8, 0x4a, 0x5f, 0xc6, 0xf6, 0x88, 0x05, 0x5a, 0xbe, 0xa9, - 0xb4, 0x54, 0xab, 0x22, 0x8b, 0xf7, 0xbc, 0x86, 0x3f, 0x73, 0x50, 0x5b, 0x62, 0x9e, 0x4f, 0xe3, - 0x9d, 0x79, 0xaf, 0xa1, 0xb8, 0xe0, 0x2b, 0x77, 0xce, 0xb2, 0xe0, 0x5c, 0x88, 0x95, 0x40, 0xf0, - 0x00, 0x8e, 0x6e, 0x7d, 0x6a, 0x33, 0xba, 0x57, 0x2b, 0x70, 0x1f, 0x0e, 0x57, 0xd7, 0xee, 0xe1, - 0x39, 0xf1, 0x13, 0xd4, 0xfa, 0x94, 0x09, 0xf5, 0x52, 0x66, 0x03, 0xd4, 0xa4, 0x37, 0xf0, 0x1d, - 0xb1, 0x54, 0xb5, 0x16, 0x05, 0x84, 0xa0, 0xe0, 0xda, 0x33, 0xaa, 0xe5, 0x45, 0x43, 0x9c, 0xd1, - 0x31, 0x14, 0x23, 0x7b, 0x1a, 0x52, 0x4d, 0x11, 0xc5, 0xe4, 0x82, 0x1f, 0xa0, 0x92, 0x6e, 0xe6, - 0x4a, 0xaf, 0xa0, 0xc0, 0xed, 0x91, 0x3a, 0x37, 0x33, 0x54, 0x20, 0x70, 0x4f, 0xbc, 0xdd, 0x9d, - 0x34, 0x72, 0x35, 0xe6, 0x7e, 0xd4, 0xe8, 0x50, 0x4a, 0x3c, 0x44, 0x75, 0x50, 0xc2, 0x94, 0x9f, - 0x1f, 0x31, 0x81, 0x02, 0x9f, 0xfc, 0xdb, 0x59, 0xef, 0x51, 0xe7, 0x4b, 0x01, 0xf5, 0xf1, 0x87, - 0x07, 0xcd, 0x40, 0x4d, 0x53, 0x8c, 0x2e, 0xb3, 0x24, 0xfd, 0xfe, 0xd4, 0x74, 0xb2, 0x05, 0x82, - 0x5b, 0x10, 0x41, 0x65, 0x39, 0x4f, 0xa8, 0x9b, 0x85, 0x5f, 0x13, 0x6a, 0xdd, 0xd8, 0x0e, 0xc4, - 0x79, 0x27, 0x70, 0x20, 0x83, 0x81, 0x32, 0x25, 0xaf, 0x66, 0x53, 0xbf, 0xd8, 0x78, 0x5e, 0x12, - 0x99, 0x9b, 0x12, 0x99, 0x5b, 0x12, 0x2d, 0x87, 0xa9, 0x57, 0x7d, 0x2e, 0xa7, 0xcd, 0xc8, 0x18, - 0x96, 0xc4, 0xef, 0xb2, 0xfb, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x62, 0x7f, 0x29, 0xca, 0x4e, 0x05, - 0x00, 0x00, + 0x10, 0x4d, 0x29, 0x60, 0x3a, 0x7c, 0x04, 0x57, 0x0f, 0x4d, 0x43, 0x0c, 0x59, 0x8d, 0xe1, 0x60, + 0x0a, 0x85, 0x8b, 0xf1, 0xe0, 0x01, 0xa3, 0xd5, 0x6b, 0x09, 0x89, 0xf1, 0x62, 0x0a, 0x2e, 0xa4, + 0x11, 0x5a, 0x6c, 0xb7, 0x35, 0xfd, 0x0f, 0xfe, 0x2c, 0x7f, 0x98, 0xd9, 0xed, 0x5a, 0x8a, 0x21, + 0x16, 0x02, 0xb7, 0xdd, 0x99, 0x79, 0xf3, 0x5e, 0x5f, 0x5f, 0x0b, 0x4d, 0xc7, 0x8d, 0x88, 0x4b, + 0x3d, 0x3f, 0xee, 0x44, 0x46, 0x27, 0xbd, 0xe8, 0x4b, 0xdf, 0xa3, 0x1e, 0x3a, 0x0b, 0x96, 0x1e, + 0x75, 0xa6, 0xb1, 0x3e, 0xb6, 0x27, 0xef, 0x01, 0xb5, 0x67, 0x44, 0x5f, 0x8d, 0x44, 0x06, 0xfe, + 0x84, 0x86, 0x49, 0xe8, 0xbd, 0x4b, 0x1d, 0x1a, 0x5b, 0xe4, 0x23, 0x24, 0x01, 0x45, 0xb7, 0x50, + 0x26, 0xbc, 0xa0, 0x4a, 0x2d, 0xa9, 0x5d, 0xe9, 0x5d, 0xea, 0xff, 0x2f, 0xd1, 0x05, 0x5c, 0xa0, + 0xd0, 0x39, 0xd4, 0x1c, 0x77, 0x32, 0x0f, 0xdf, 0xc8, 0xeb, 0xd4, 0x9e, 0xd0, 0x40, 0x2d, 0xb4, + 0xe4, 0xb6, 0x62, 0x55, 0x45, 0xf1, 0x81, 0xd5, 0xf0, 0x97, 0x04, 0xf5, 0x0c, 0xf3, 0x72, 0x1e, + 0xef, 0xcd, 0x7b, 0x03, 0xa5, 0x15, 0x5f, 0xa5, 0x77, 0x91, 0x07, 0x67, 0x42, 0xac, 0x04, 0x82, + 0x47, 0x70, 0x72, 0xe7, 0x13, 0x9b, 0x92, 0x83, 0x5a, 0x81, 0x87, 0x70, 0xbc, 0xbe, 0xf6, 0x00, + 0xcf, 0x89, 0x9f, 0xa1, 0x3e, 0x24, 0x94, 0xab, 0x17, 0x32, 0x9b, 0xa0, 0x24, 0xbd, 0x91, 0xef, + 0xf0, 0xa5, 0x8a, 0xb5, 0x2a, 0x20, 0x04, 0x45, 0xd7, 0x5e, 0x10, 0xb5, 0xc0, 0x1b, 0xfc, 0x8c, + 0x4e, 0xa1, 0x14, 0xd9, 0xf3, 0x90, 0xa8, 0x32, 0x2f, 0x26, 0x17, 0xfc, 0x08, 0xd5, 0x74, 0x33, + 0x53, 0x7a, 0x0d, 0x45, 0x66, 0x8f, 0xd0, 0xb9, 0x9d, 0xa1, 0x1c, 0x81, 0x07, 0xfc, 0xed, 0xee, + 0xa5, 0x91, 0xa9, 0x31, 0x0f, 0xa3, 0x46, 0x83, 0x72, 0xe2, 0x21, 0x6a, 0x80, 0x1c, 0xa6, 0xfc, + 0xec, 0x88, 0xbb, 0x50, 0x64, 0x93, 0xa9, 0x02, 0x69, 0x93, 0x4b, 0x85, 0x8c, 0x4b, 0xbd, 0x6f, + 0x19, 0x94, 0xa7, 0x5f, 0x26, 0xb4, 0x00, 0x25, 0xcd, 0x31, 0xea, 0xe6, 0x89, 0xfa, 0xfb, 0xb1, + 0x69, 0xfa, 0x0e, 0x08, 0x66, 0x42, 0x04, 0xd5, 0x6c, 0xa2, 0x50, 0x3f, 0x0f, 0xbf, 0x21, 0xd6, + 0x9a, 0xb1, 0x1b, 0x88, 0xf1, 0xce, 0xe0, 0x48, 0x44, 0x03, 0xe5, 0x4a, 0x5e, 0x4f, 0xa7, 0x76, + 0xb5, 0xf5, 0xbc, 0x20, 0x32, 0xb7, 0x25, 0x32, 0x77, 0x24, 0xca, 0xc6, 0x69, 0x50, 0x7b, 0xa9, + 0xa4, 0xcd, 0xc8, 0x18, 0x97, 0xf9, 0x0f, 0xb3, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x4f, 0xab, + 0xd5, 0x54, 0x50, 0x05, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. 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/inventory/v1/inventory.proto b/proto/inventory/v1/inventory.proto index 5d0a3adf93..1994a3fe01 100644 --- a/proto/inventory/v1/inventory.proto +++ b/proto/inventory/v1/inventory.proto @@ -53,6 +53,6 @@ message Entity { } message Fact { - string uri = 1; - string value = 3; + string name = 1; + string value = 2; } \ No newline at end of file From 90495b6187ffb30611ed98958bd6ae017b74c54f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jefferson=20Gir=C3=A3o?= Date: Thu, 6 Feb 2020 13:18:56 +0100 Subject: [PATCH 09/27] feat: returning correct list of included facts --- backend/inventory/app/server.go | 15 ++++++++------- backend/inventory/app/server_test.go | 4 ++-- backend/inventory/go.mod | 3 +++ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/backend/inventory/app/server.go b/backend/inventory/app/server.go index 21170e6611..02b0b06f68 100644 --- a/backend/inventory/app/server.go +++ b/backend/inventory/app/server.go @@ -26,19 +26,20 @@ func (s *Server) CreateEntity(ctx context.Context, req *pb.CreateEntityRequest) // GetEntity returns an inventory Entity with the selected facts func (s *Server) GetEntity(ctx context.Context, req *pb.GetEntityRequest) (*pb.GetEntityReply, error) { - numberOfIncludedFacts := len(req.GetIncludeFacts()) - var facts = make([]pb.Fact, numberOfIncludedFacts) - entityURI, err := s.Storage.GetEntity(req.GetEntity().GetUri()) + 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)) } for _, factName := range req.GetIncludeFacts() { - value, err := s.Storage.GetFact(entityURI, factName) - // TODO: handle errors - append(facts, pb.Fact{Name: factName, Value: value}) + 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 + return &pb.GetEntityReply{Entity: &pb.Entity{Uri: entityUri}, Facts: facts}, nil } func (s *Server) SetFact(ctx context.Context, req *pb.SetFactRequest) (*pb.SetFactReply, error) { diff --git a/backend/inventory/app/server_test.go b/backend/inventory/app/server_test.go index 745b40ecc6..fd6311645e 100644 --- a/backend/inventory/app/server_test.go +++ b/backend/inventory/app/server_test.go @@ -104,8 +104,8 @@ func TestServerSetFactForNonExistingEntity(t *testing.T) { defer testStorage.Close() s := Server{Storage: testStorage.Storage} - entityURI := "boss://test/test" - req := &pb.SetFactRequest{EntityUri: entityURI, Name: "test-name", Value: "test-value"} + entityUri := "boss://test/test" + req := &pb.SetFactRequest{EntityUri: entityUri, Name: "test-name", Value: "test-value"} resp, err := s.SetFact(context.Background(), req) if err != nil { t.Errorf("ServerTest(SetFact) got unexpected error %v", err) diff --git a/backend/inventory/go.mod b/backend/inventory/go.mod index a7148725b1..7a2e505cf6 100644 --- a/backend/inventory/go.mod +++ b/backend/inventory/go.mod @@ -8,5 +8,8 @@ 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 ) From ced428d3a4ef6edb34cfb139b59f906e5c8641aa Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 6 Feb 2020 13:27:44 +0100 Subject: [PATCH 10/27] proto: switch to grpc-web plugin + ship protoc plugin binary, because meh --- .../builds/v1/builds_grpc_web_pb.d.ts | 46 + .../generated/builds/v1/builds_grpc_web_pb.js | 233 +++ .../src/generated/builds/v1/builds_pb.d.ts | 151 ++ .../src/generated/builds/v1/builds_pb.js | 1178 +++++++++++++ .../identity/v1/identity_grpc_web_pb.d.ts | 46 + .../identity/v1/identity_grpc_web_pb.js | 233 +++ .../generated/identity/v1/identity_pb.d.ts | 31 +- .../src/generated/identity/v1/identity_pb.js | 1136 +++++++++++++ .../identity/v1/identity_pb_service.d.ts | 82 - .../identity/v1/identity_pb_service.js | 101 -- .../inventory/v1/inventory_grpc_web_pb.d.ts | 46 + .../inventory/v1/inventory_grpc_web_pb.js | 233 +++ .../generated/inventory/v1/inventory_pb.d.ts | 87 +- .../generated/inventory/v1/inventory_pb.js | 1501 +++++++++++++++++ .../inventory/v1/inventory_pb_service.d.ts | 82 - .../inventory/v1/inventory_pb_service.js | 101 -- .../scaffolder/v1/scaffolder_grpc_web_pb.d.ts | 34 + .../scaffolder/v1/scaffolder_grpc_web_pb.js | 155 ++ .../scaffolder/v1/scaffolder_pb.d.ts | 36 +- .../generated/scaffolder/v1/scaffolder_pb.js | 567 +++++++ .../scaffolder/v1/scaffolder_pb_service.d.ts | 63 - .../scaffolder/v1/scaffolder_pb_service.js | 61 - proto/prototool.yaml | 8 +- 23 files changed, 5648 insertions(+), 563 deletions(-) create mode 100644 frontend/packages/proto/src/generated/builds/v1/builds_grpc_web_pb.d.ts create mode 100644 frontend/packages/proto/src/generated/builds/v1/builds_grpc_web_pb.js create mode 100644 frontend/packages/proto/src/generated/builds/v1/builds_pb.d.ts create mode 100644 frontend/packages/proto/src/generated/builds/v1/builds_pb.js create mode 100644 frontend/packages/proto/src/generated/identity/v1/identity_grpc_web_pb.d.ts create mode 100644 frontend/packages/proto/src/generated/identity/v1/identity_grpc_web_pb.js create mode 100644 frontend/packages/proto/src/generated/identity/v1/identity_pb.js delete mode 100644 frontend/packages/proto/src/generated/identity/v1/identity_pb_service.d.ts delete mode 100644 frontend/packages/proto/src/generated/identity/v1/identity_pb_service.js create mode 100644 frontend/packages/proto/src/generated/inventory/v1/inventory_grpc_web_pb.d.ts create mode 100644 frontend/packages/proto/src/generated/inventory/v1/inventory_grpc_web_pb.js create mode 100644 frontend/packages/proto/src/generated/inventory/v1/inventory_pb.js delete mode 100644 frontend/packages/proto/src/generated/inventory/v1/inventory_pb_service.d.ts delete mode 100644 frontend/packages/proto/src/generated/inventory/v1/inventory_pb_service.js create mode 100644 frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_grpc_web_pb.d.ts create mode 100644 frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_grpc_web_pb.js create mode 100644 frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb.js delete mode 100644 frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb_service.d.ts delete mode 100644 frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb_service.js 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..a01cbd4a18 --- /dev/null +++ b/frontend/packages/proto/src/generated/inventory/v1/inventory_grpc_web_pb.d.ts @@ -0,0 +1,46 @@ +import * as grpcWeb from 'grpc-web'; + +import { + CreateEntityReply, + CreateEntityRequest, + GetEntityReply, + GetEntityRequest} from './inventory_pb'; + +export class InventoryClient { + constructor (hostname: string, + credentials?: null | { [index: string]: string; }, + options?: null | { [index: string]: string; }); + + 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; + +} + +export class InventoryPromiseClient { + constructor (hostname: string, + credentials?: null | { [index: string]: string; }, + options?: null | { [index: string]: string; }); + + getEntity( + request: GetEntityRequest, + metadata?: grpcWeb.Metadata + ): Promise; + + createEntity( + request: CreateEntityRequest, + 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..e17a3ee3e6 --- /dev/null +++ b/frontend/packages/proto/src/generated/inventory/v1/inventory_grpc_web_pb.js @@ -0,0 +1,233 @@ +/** + * @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.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); +}; + + +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..9f50e094ce 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,19 @@ -// package: spotify.backstage.inventory.v1 -// file: inventory/v1/inventory.proto - -import * as jspb from "google-protobuf"; +import * as jspb from "google-protobuf" 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 +27,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 +53,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 +73,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 +92,50 @@ 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 { + getFacturi(): string; + setFacturi(value: string): 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 = { + facturi: string, + } +} + export class Entity extends jspb.Message { getUri(): string; setUri(value: string): void; @@ -110,8 +143,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; @@ -124,6 +155,9 @@ export namespace Entity { } export class Fact extends jspb.Message { + getEntityuri(): string; + setEntityuri(value: string): void; + getName(): string; setName(value: string): void; @@ -133,8 +167,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; @@ -142,6 +174,7 @@ export class Fact extends jspb.Message { export namespace Fact { export type AsObject = { + entityuri: string, name: string, value: string, } 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..85a0dc2482 --- /dev/null +++ b/frontend/packages/proto/src/generated/inventory/v1/inventory_pb.js @@ -0,0 +1,1501 @@ +/** + * @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.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.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.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'; +} + +/** + * 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 = { + facturi: 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.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 = /** @type {string} */ (reader.readString()); + msg.setFacturi(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.getFacturi(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } +}; + + +/** + * optional string factUri = 1; + * @return {string} + */ +proto.spotify.backstage.inventory.v1.SetFactReply.prototype.getFacturi = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** @param {string} value */ +proto.spotify.backstage.inventory.v1.SetFactReply.prototype.setFacturi = 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.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 = { + 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.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.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.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.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.Fact.prototype.getEntityuri = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** @param {string} value */ +proto.spotify.backstage.inventory.v1.Fact.prototype.setEntityuri = function(value) { + jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string name = 2; + * @return {string} + */ +proto.spotify.backstage.inventory.v1.Fact.prototype.getName = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** @param {string} value */ +proto.spotify.backstage.inventory.v1.Fact.prototype.setName = function(value) { + jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string value = 3; + * @return {string} + */ +proto.spotify.backstage.inventory.v1.Fact.prototype.getValue = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** @param {string} value */ +proto.spotify.backstage.inventory.v1.Fact.prototype.setValue = function(value) { + jspb.Message.setProto3StringField(this, 3, 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..4777abdb9b --- /dev/null +++ b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_grpc_web_pb.d.ts @@ -0,0 +1,34 @@ +import * as grpcWeb from 'grpc-web'; + +import * as identity_v1_identity_pb from '../../identity/v1/identity_pb'; + +import { + Empty, + GetAllTemplatesReply} from './scaffolder_pb'; + +export class ScaffolderClient { + constructor (hostname: string, + credentials?: null | { [index: string]: string; }, + options?: null | { [index: string]: string; }); + + getAllTemplates( + request: Empty, + metadata: grpcWeb.Metadata | undefined, + callback: (err: grpcWeb.Error, + response: GetAllTemplatesReply) => void + ): grpcWeb.ClientReadableStream; + +} + +export class ScaffolderPromiseClient { + constructor (hostname: string, + credentials?: null | { [index: string]: string; }, + options?: null | { [index: string]: string; }); + + getAllTemplates( + request: Empty, + 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..af6eef700a --- /dev/null +++ b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_grpc_web_pb.js @@ -0,0 +1,155 @@ +/** + * @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') +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.GetAllTemplatesReply>} + */ +const methodDescriptor_Scaffolder_GetAllTemplates = new grpc.web.MethodDescriptor( + '/spotify.backstage.scaffolder.v1.Scaffolder/GetAllTemplates', + grpc.web.MethodType.UNARY, + proto.spotify.backstage.scaffolder.v1.Empty, + proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply, + /** + * @param {!proto.spotify.backstage.scaffolder.v1.Empty} request + * @return {!Uint8Array} + */ + function(request) { + return request.serializeBinary(); + }, + proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.deserializeBinary +); + + +/** + * @const + * @type {!grpc.web.AbstractClientBase.MethodInfo< + * !proto.spotify.backstage.scaffolder.v1.Empty, + * !proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply>} + */ +const methodInfo_Scaffolder_GetAllTemplates = new grpc.web.AbstractClientBase.MethodInfo( + proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply, + /** + * @param {!proto.spotify.backstage.scaffolder.v1.Empty} request + * @return {!Uint8Array} + */ + function(request) { + return request.serializeBinary(); + }, + proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.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.GetAllTemplatesReply)} + * callback The callback function(error, response) + * @return {!grpc.web.ClientReadableStream|undefined} + * The XHR Node Readable Stream + */ +proto.spotify.backstage.scaffolder.v1.ScaffolderClient.prototype.getAllTemplates = + function(request, metadata, callback) { + return this.client_.rpcCall(this.hostname_ + + '/spotify.backstage.scaffolder.v1.Scaffolder/GetAllTemplates', + request, + metadata || {}, + methodDescriptor_Scaffolder_GetAllTemplates, + 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.getAllTemplates = + function(request, metadata) { + return this.client_.unaryCall(this.hostname_ + + '/spotify.backstage.scaffolder.v1.Scaffolder/GetAllTemplates', + request, + metadata || {}, + methodDescriptor_Scaffolder_GetAllTemplates); +}; + + +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..0a795dc5f8 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,11 @@ -// 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'; 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,23 +16,21 @@ export namespace Empty { } } -export class GetAllTemplatesResponse extends jspb.Message { - clearTemplatesList(): void; +export class GetAllTemplatesReply extends jspb.Message { getTemplatesList(): Array