Merge pull request #54 from spotify/bil/add-typescript-gen

Added Protobuf definitions for TypeScript using Prototool
This commit is contained in:
Raghunandan Balachandran
2020-02-06 10:47:59 +01:00
committed by GitHub
16 changed files with 959 additions and 23 deletions
+10
View File
@@ -8,6 +8,16 @@ Backstage is an open platform for building developer portals.
## Getting started
### Protobuf Definitions
To generate the Protobuf definitions in Go and TypeScript, run the following command from the root with [Prototool](https://github.com/uber/prototool):
```bash
$ prototool generate ./proto
```
See [proto/README.md](proto/README.md) for more information.
## Plugins
### Creating a Plugin
@@ -22,8 +22,7 @@
},
"scripts": {
"lint": "web-scripts lint",
"test": "web-scripts test",
"proto": "../../../scripts/gen-proto.sh hello.proto"
"test": "web-scripts test"
},
"license": "Apache-2.0"
}
+8
View File
@@ -0,0 +1,8 @@
{
"private": true,
"name": "@backstage/protobuf-definitions",
"version": "0.0.0",
"devDependencies": {
"ts-protoc-gen": "^0.12.0"
}
}
@@ -0,0 +1,151 @@
// package: spotify.backstage.identity.v1
// file: identity/v1/identity.proto
import * as jspb from "google-protobuf";
export class GetUserRequest extends jspb.Message {
getId(): string;
setId(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GetUserRequest.AsObject;
static toObject(includeInstance: boolean, msg: GetUserRequest): GetUserRequest.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: GetUserRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetUserRequest;
static deserializeBinaryFromReader(message: GetUserRequest, reader: jspb.BinaryReader): GetUserRequest;
}
export namespace GetUserRequest {
export type AsObject = {
id: string,
}
}
export class GetUserReply extends jspb.Message {
hasUser(): boolean;
clearUser(): void;
getUser(): User | undefined;
setUser(value?: User): void;
clearGroupsList(): void;
getGroupsList(): Array<Group>;
setGroupsList(value: Array<Group>): 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<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: GetUserReply, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetUserReply;
static deserializeBinaryFromReader(message: GetUserReply, reader: jspb.BinaryReader): GetUserReply;
}
export namespace GetUserReply {
export type AsObject = {
user?: User.AsObject,
groupsList: Array<Group.AsObject>,
}
}
export class GetGroupRequest extends jspb.Message {
getId(): string;
setId(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GetGroupRequest.AsObject;
static toObject(includeInstance: boolean, msg: GetGroupRequest): GetGroupRequest.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: GetGroupRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetGroupRequest;
static deserializeBinaryFromReader(message: GetGroupRequest, reader: jspb.BinaryReader): GetGroupRequest;
}
export namespace GetGroupRequest {
export type AsObject = {
id: string,
}
}
export class GetGroupReply extends jspb.Message {
hasGroup(): boolean;
clearGroup(): void;
getGroup(): Group | undefined;
setGroup(value?: Group): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GetGroupReply.AsObject;
static toObject(includeInstance: boolean, msg: GetGroupReply): GetGroupReply.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: GetGroupReply, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetGroupReply;
static deserializeBinaryFromReader(message: GetGroupReply, reader: jspb.BinaryReader): GetGroupReply;
}
export namespace GetGroupReply {
export type AsObject = {
group?: Group.AsObject,
}
}
export class User extends jspb.Message {
getId(): string;
setId(value: string): void;
getName(): string;
setName(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): User.AsObject;
static toObject(includeInstance: boolean, msg: User): User.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: User, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): User;
static deserializeBinaryFromReader(message: User, reader: jspb.BinaryReader): User;
}
export namespace User {
export type AsObject = {
id: string,
name: string,
}
}
export class Group extends jspb.Message {
getId(): string;
setId(value: string): void;
clearUsersList(): void;
getUsersList(): Array<User>;
setUsersList(value: Array<User>): void;
addUsers(value?: User, index?: number): User;
clearGroupsList(): void;
getGroupsList(): Array<Group>;
setGroupsList(value: Array<Group>): 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<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: Group, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): Group;
static deserializeBinaryFromReader(message: Group, reader: jspb.BinaryReader): Group;
}
export namespace Group {
export type AsObject = {
id: string,
usersList: Array<User.AsObject>,
groupsList: Array<Group.AsObject>,
}
}
@@ -0,0 +1,82 @@
// 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<T> {
cancel(): void;
on(type: 'data', handler: (message: T) => void): ResponseStream<T>;
on(type: 'end', handler: (status?: Status) => void): ResponseStream<T>;
on(type: 'status', handler: (status: Status) => void): ResponseStream<T>;
}
interface RequestStream<T> {
write(message: T): RequestStream<T>;
end(): void;
cancel(): void;
on(type: 'end', handler: (status?: Status) => void): RequestStream<T>;
on(type: 'status', handler: (status: Status) => void): RequestStream<T>;
}
interface BidirectionalStream<ReqT, ResT> {
write(message: ReqT): BidirectionalStream<ReqT, ResT>;
end(): void;
cancel(): void;
on(type: 'data', handler: (message: ResT) => void): BidirectionalStream<ReqT, ResT>;
on(type: 'end', handler: (status?: Status) => void): BidirectionalStream<ReqT, ResT>;
on(type: 'status', handler: (status: Status) => void): BidirectionalStream<ReqT, ResT>;
}
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;
}
@@ -0,0 +1,101 @@
// 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;
@@ -0,0 +1,149 @@
// package: spotify.backstage.inventory.v1
// file: inventory/v1/inventory.proto
import * as jspb from "google-protobuf";
export class GetEntityRequest extends jspb.Message {
hasEntity(): boolean;
clearEntity(): void;
getEntity(): Entity | undefined;
setEntity(value?: Entity): void;
clearIncludeFactsList(): void;
getIncludeFactsList(): Array<string>;
setIncludeFactsList(value: Array<string>): void;
addIncludeFacts(value: string, index?: number): string;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GetEntityRequest.AsObject;
static toObject(includeInstance: boolean, msg: GetEntityRequest): GetEntityRequest.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: GetEntityRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetEntityRequest;
static deserializeBinaryFromReader(message: GetEntityRequest, reader: jspb.BinaryReader): GetEntityRequest;
}
export namespace GetEntityRequest {
export type AsObject = {
entity?: Entity.AsObject,
includeFactsList: Array<string>,
}
}
export class GetEntityReply extends jspb.Message {
hasEntity(): boolean;
clearEntity(): void;
getEntity(): Entity | undefined;
setEntity(value?: Entity): void;
clearFactsList(): void;
getFactsList(): Array<Fact>;
setFactsList(value: Array<Fact>): 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<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: GetEntityReply, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetEntityReply;
static deserializeBinaryFromReader(message: GetEntityReply, reader: jspb.BinaryReader): GetEntityReply;
}
export namespace GetEntityReply {
export type AsObject = {
entity?: Entity.AsObject,
factsList: Array<Fact.AsObject>,
}
}
export class CreateEntityRequest extends jspb.Message {
hasEntity(): boolean;
clearEntity(): void;
getEntity(): Entity | undefined;
setEntity(value?: Entity): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): CreateEntityRequest.AsObject;
static toObject(includeInstance: boolean, msg: CreateEntityRequest): CreateEntityRequest.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: CreateEntityRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): CreateEntityRequest;
static deserializeBinaryFromReader(message: CreateEntityRequest, reader: jspb.BinaryReader): CreateEntityRequest;
}
export namespace CreateEntityRequest {
export type AsObject = {
entity?: Entity.AsObject,
}
}
export class CreateEntityReply extends jspb.Message {
hasEntity(): boolean;
clearEntity(): void;
getEntity(): Entity | undefined;
setEntity(value?: Entity): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): CreateEntityReply.AsObject;
static toObject(includeInstance: boolean, msg: CreateEntityReply): CreateEntityReply.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: CreateEntityReply, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): CreateEntityReply;
static deserializeBinaryFromReader(message: CreateEntityReply, reader: jspb.BinaryReader): CreateEntityReply;
}
export namespace CreateEntityReply {
export type AsObject = {
entity?: Entity.AsObject,
}
}
export class Entity extends jspb.Message {
getUri(): string;
setUri(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): Entity.AsObject;
static toObject(includeInstance: boolean, msg: Entity): Entity.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: Entity, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): Entity;
static deserializeBinaryFromReader(message: Entity, reader: jspb.BinaryReader): Entity;
}
export namespace Entity {
export type AsObject = {
uri: string,
}
}
export class Fact extends jspb.Message {
getName(): string;
setName(value: string): void;
getValue(): string;
setValue(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): Fact.AsObject;
static toObject(includeInstance: boolean, msg: Fact): Fact.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: Fact, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): Fact;
static deserializeBinaryFromReader(message: Fact, reader: jspb.BinaryReader): Fact;
}
export namespace Fact {
export type AsObject = {
name: string,
value: string,
}
}
@@ -0,0 +1,82 @@
// 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<T> {
cancel(): void;
on(type: 'data', handler: (message: T) => void): ResponseStream<T>;
on(type: 'end', handler: (status?: Status) => void): ResponseStream<T>;
on(type: 'status', handler: (status: Status) => void): ResponseStream<T>;
}
interface RequestStream<T> {
write(message: T): RequestStream<T>;
end(): void;
cancel(): void;
on(type: 'end', handler: (status?: Status) => void): RequestStream<T>;
on(type: 'status', handler: (status: Status) => void): RequestStream<T>;
}
interface BidirectionalStream<ReqT, ResT> {
write(message: ReqT): BidirectionalStream<ReqT, ResT>;
end(): void;
cancel(): void;
on(type: 'data', handler: (message: ResT) => void): BidirectionalStream<ReqT, ResT>;
on(type: 'end', handler: (status?: Status) => void): BidirectionalStream<ReqT, ResT>;
on(type: 'status', handler: (status: Status) => void): BidirectionalStream<ReqT, ResT>;
}
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;
}
@@ -0,0 +1,101 @@
// 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;
@@ -0,0 +1,74 @@
// package: spotify.backstage.scaffolder.v1
// file: scaffolder/v1/scaffolder.proto
import * as jspb from "google-protobuf";
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<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: Empty, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): Empty;
static deserializeBinaryFromReader(message: Empty, reader: jspb.BinaryReader): Empty;
}
export namespace Empty {
export type AsObject = {
}
}
export class GetAllTemplatesResponse extends jspb.Message {
clearTemplatesList(): void;
getTemplatesList(): Array<Template>;
setTemplatesList(value: Array<Template>): void;
addTemplates(value?: Template, index?: number): Template;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GetAllTemplatesResponse.AsObject;
static toObject(includeInstance: boolean, msg: GetAllTemplatesResponse): GetAllTemplatesResponse.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: GetAllTemplatesResponse, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetAllTemplatesResponse;
static deserializeBinaryFromReader(message: GetAllTemplatesResponse, reader: jspb.BinaryReader): GetAllTemplatesResponse;
}
export namespace GetAllTemplatesResponse {
export type AsObject = {
templatesList: Array<Template.AsObject>,
}
}
export class Template extends jspb.Message {
getId(): string;
setId(value: string): void;
getName(): string;
setName(value: string): void;
hasUser(): boolean;
clearUser(): void;
getUser(): identity_v1_identity_pb.User | undefined;
setUser(value?: identity_v1_identity_pb.User): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): Template.AsObject;
static toObject(includeInstance: boolean, msg: Template): Template.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: Template, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): Template;
static deserializeBinaryFromReader(message: Template, reader: jspb.BinaryReader): Template;
}
export namespace Template {
export type AsObject = {
id: string,
name: string,
user?: identity_v1_identity_pb.User.AsObject,
}
}
@@ -0,0 +1,63 @@
// package: spotify.backstage.scaffolder.v1
// file: scaffolder/v1/scaffolder.proto
import * as scaffolder_v1_scaffolder_pb from "../../scaffolder/v1/scaffolder_pb";
import {grpc} from "@improbable-eng/grpc-web";
type ScaffolderGetAllTemplates = {
readonly methodName: string;
readonly service: typeof Scaffolder;
readonly requestStream: false;
readonly responseStream: false;
readonly requestType: typeof scaffolder_v1_scaffolder_pb.Empty;
readonly responseType: typeof scaffolder_v1_scaffolder_pb.GetAllTemplatesResponse;
};
export class Scaffolder {
static readonly serviceName: string;
static readonly GetAllTemplates: ScaffolderGetAllTemplates;
}
export type ServiceError = { message: string, code: number; metadata: grpc.Metadata }
export type Status = { details: string, code: number; metadata: grpc.Metadata }
interface UnaryResponse {
cancel(): void;
}
interface ResponseStream<T> {
cancel(): void;
on(type: 'data', handler: (message: T) => void): ResponseStream<T>;
on(type: 'end', handler: (status?: Status) => void): ResponseStream<T>;
on(type: 'status', handler: (status: Status) => void): ResponseStream<T>;
}
interface RequestStream<T> {
write(message: T): RequestStream<T>;
end(): void;
cancel(): void;
on(type: 'end', handler: (status?: Status) => void): RequestStream<T>;
on(type: 'status', handler: (status: Status) => void): RequestStream<T>;
}
interface BidirectionalStream<ReqT, ResT> {
write(message: ReqT): BidirectionalStream<ReqT, ResT>;
end(): void;
cancel(): void;
on(type: 'data', handler: (message: ResT) => void): BidirectionalStream<ReqT, ResT>;
on(type: 'end', handler: (status?: Status) => void): BidirectionalStream<ReqT, ResT>;
on(type: 'status', handler: (status: Status) => void): BidirectionalStream<ReqT, ResT>;
}
export class ScaffolderClient {
readonly serviceHost: string;
constructor(serviceHost: string, options?: grpc.RpcOptions);
getAllTemplates(
requestMessage: scaffolder_v1_scaffolder_pb.Empty,
metadata: grpc.Metadata,
callback: (error: ServiceError|null, responseMessage: scaffolder_v1_scaffolder_pb.GetAllTemplatesResponse|null) => void
): UnaryResponse;
getAllTemplates(
requestMessage: scaffolder_v1_scaffolder_pb.Empty,
callback: (error: ServiceError|null, responseMessage: scaffolder_v1_scaffolder_pb.GetAllTemplatesResponse|null) => void
): UnaryResponse;
}
@@ -0,0 +1,61 @@
// package: spotify.backstage.scaffolder.v1
// file: scaffolder/v1/scaffolder.proto
var scaffolder_v1_scaffolder_pb = require("../../scaffolder/v1/scaffolder_pb");
var grpc = require("@improbable-eng/grpc-web").grpc;
var Scaffolder = (function () {
function Scaffolder() {}
Scaffolder.serviceName = "spotify.backstage.scaffolder.v1.Scaffolder";
return Scaffolder;
}());
Scaffolder.GetAllTemplates = {
methodName: "GetAllTemplates",
service: Scaffolder,
requestStream: false,
responseStream: false,
requestType: scaffolder_v1_scaffolder_pb.Empty,
responseType: scaffolder_v1_scaffolder_pb.GetAllTemplatesResponse
};
exports.Scaffolder = Scaffolder;
function ScaffolderClient(serviceHost, options) {
this.serviceHost = serviceHost;
this.options = options || {};
}
ScaffolderClient.prototype.getAllTemplates = function getAllTemplates(requestMessage, metadata, callback) {
if (arguments.length === 2) {
callback = arguments[1];
}
var client = grpc.unary(Scaffolder.GetAllTemplates, {
request: requestMessage,
host: this.serviceHost,
metadata: metadata,
transport: this.options.transport,
debug: this.options.debug,
onEnd: function (response) {
if (callback) {
if (response.status !== grpc.Code.OK) {
var err = new Error(response.statusMessage);
err.code = response.status;
err.metadata = response.trailers;
callback(err, null);
} else {
callback(null, response.message);
}
}
}
});
return {
cancel: function () {
callback = null;
client.close();
}
};
};
exports.ScaffolderClient = ScaffolderClient;
-8
View File
@@ -1,8 +0,0 @@
#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
OUT='src/proto'
mkdir -p "$OUT"
exec protoc -I="$DIR/../../protos" --js_out=import_style=commonjs:"$OUT" --grpc-web_out=import_style=commonjs+dts,mode=grpcwebtext:"$OUT" "$@"
+13 -1
View File
@@ -7577,6 +7577,11 @@ google-protobuf@^3.11.2:
resolved "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.11.2.tgz#43272974521a5cec35a21f62730cf517a5a8e38c"
integrity sha512-T4fin7lcYLUPj2ChUZ4DvfuuHtg3xi1621qeRZt2J7SvOQusOzq+sDT4vbotWTCjUXJoR36CA016LlhtPy80uQ==
google-protobuf@^3.6.1:
version "3.11.3"
resolved "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.11.3.tgz#660977f5de29cc8f647172a170602887102fa677"
integrity sha512-Sp8E+0AJLxmiPwAk9VH3MkYAmYYheNUhywIyXOS7wvRkqbIYcHtGzJzIYicNqYsqgKmY35F9hxRkI+ZTqTB4Tg==
got@^6.7.1:
version "6.7.1"
resolved "https://registry.npmjs.org/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
@@ -15712,7 +15717,14 @@ ts-pnp@1.1.5, ts-pnp@^1.1.2:
resolved "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz#840e0739c89fce5f3abd9037bb091dbff16d9dec"
integrity sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==
tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0:
ts-protoc-gen@^0.12.0:
version "0.12.0"
resolved "https://registry.npmjs.org/ts-protoc-gen/-/ts-protoc-gen-0.12.0.tgz#932e5738f14b67e7202825b06f8c548cb7d8ef34"
integrity sha512-V7jnICJxKqalBrnJSMTW5tB9sGi48gOC325bfcM7TDNUItVOlaMM//rQmuo49ybipk/SyJTnWXgtJnhHCevNJw==
dependencies:
google-protobuf "^3.6.1"
tslib@^1.8.1, tslib@^1.9.0:
version "1.10.0"
resolved "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
+59 -11
View File
@@ -4,32 +4,55 @@ Collection of all Backstage protobuf definitions.
## Usage
Managed with prototool, install instructions at https://github.com/uber/prototool/blob/dev/docs/install.md
Managed with [Prototool](https://github.com/uber/prototool), install instructions at <https://github.com/uber/prototool/blob/dev/docs/install.md>
## Install Dependencies
You will need to have `protoc-gen-go` available in your path. You can find out more information here: https://github.com/golang/protobuf
### Prototool
```bash
$ brew install prototool
```
```sh
### protoc-gen-go
This will enable code generation in Go for interacting with gRPC-Web. You will need to have `protoc-gen-go` available in your path. You can find out more information here: https://github.com/golang/protobuf
```bash
$ go get -u github.com/golang/protobuf/protoc-gen-go
$ protoc-gen-go # should now be available in your path providing you GOPATH + GOBIN paths are setup correctly.
```
### protoc-gen-ts
### Generate code
This will enable code generation in TypeScript for interacting with gRPC-Web. From the root, you will need to run [Yarn](https://yarnpkg.com) in the `frontend` folder:
Run to generate code to `backend/proto/`:
```
$ prototool generate
```bash
$ yarn --cwd ./frontend install
```
Generated code should be check in to the repo.
After this, you should be all set!
### Import generated go code
## Generating Code
Example import of inventory:
To generate the Protobuf definitions in Go and TypeScript, run the following command from the root with [Prototool](https://github.com/uber/prototool):
```bash
$ prototool generate ./proto
```
This will generate the respective "generated" files in the following folders:
- `backend/proto`
- `frontend/packages/proto/src/generated`
All generated code related to Protocol Buffers should be checked in to the repository.
## Code Examples
### Import using Go
This is what you'll need to use for development in any of the `backend` services.
```go
package spotify.backstage.identity.v1;
@@ -38,3 +61,28 @@ func main() {
identityv1.NewInventoryClient(nil)
}
```
### Import using TypeScript
This is what you'll need to use for development in any of the `frontend` services.
Firstly, ensure this line is in your `package.json` within the `frontend/` folder:
```js
"dependencies": {
"@backstage/protobuf-definitions": "0.0.0",
...
}
```
Next, you can use them in your [Yarn Workspaces](https://yarnpkg.com/en/docs/workspaces/) package using the following:
```ts
import { IdentityClient } from "@backstage/protocol-definitions/generated/identity/v1/identity_pb_service";
const client = new IdentityClient("http://localhost:8080");
// const req = new GetUserRequest();
// req.setUsername("johndoe");
// client.getUser(req, (err, user) => {
// /* ... */
// });
```
+4 -1
View File
@@ -1,4 +1,3 @@
protoc:
version: 3.8.0
lint:
@@ -16,3 +15,7 @@ generate:
type: go
flags: plugins=grpc
output: ../backend/proto
- name: ts
path: frontend/node_modules/ts-protoc-gen/bin/protoc-gen-ts
output: ../frontend/packages/proto/src/generated
flags: service=grpc-web