-
- [Co-brand Logo]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- A
-
- $userName
-
+
);
};
diff --git a/frontend/packages/app/src/entities/index.ts b/frontend/packages/app/src/entities/index.ts
index f32f99ab06..38e529d87f 100644
--- a/frontend/packages/app/src/entities/index.ts
+++ b/frontend/packages/app/src/entities/index.ts
@@ -1,20 +1,22 @@
import {
createEntityKind,
createWidgetView,
- createEntityView,
+ createEntityPage,
} from '@backstage/core';
import ComputerIcon from '@material-ui/icons/Computer';
import MockEntityPage from './MockEntityPage';
import MockEntityCard from './MockEntityCard';
+import GithubActionsPlugin from '@backstage/plugin-github-actions';
/* SERVICE */
const serviceOverviewPage = createWidgetView()
.addComponent(MockEntityCard)
.addComponent(MockEntityCard);
-const serviceView = createEntityView()
- .addPage('Overview', 'overview', serviceOverviewPage)
- .addComponent('CI/CD', 'ci-cd', MockEntityPage);
+const serviceView = createEntityPage()
+ .addPage('Overview', '/overview', serviceOverviewPage)
+ .register(GithubActionsPlugin)
+ .addComponent('Deployment', '/deployment', MockEntityPage);
const serviceEntity = createEntityKind({
kind: 'service',
diff --git a/frontend/packages/app/src/login/LoginBarrier.test.tsx b/frontend/packages/app/src/login/LoginBarrier.test.tsx
new file mode 100644
index 0000000000..14389cea43
--- /dev/null
+++ b/frontend/packages/app/src/login/LoginBarrier.test.tsx
@@ -0,0 +1,57 @@
+import { render, wait, act } from '@testing-library/react';
+import React from 'react';
+import Observable from 'zen-observable';
+import { LoginBarrier } from './LoginBarrier';
+import { LoginState } from './types';
+
+describe('LoginBarrier', () => {
+ it('passes through when logged in', async () => {
+ const state$ = Observable.of
({
+ type: 'LOGGED_IN',
+ user: 'apa',
+ });
+ const rendered = render(
+ {state.type}
}
+ >
+ Logged in!
+ ,
+ );
+ await wait(() => rendered.getByText('Logged in!'));
+ });
+
+ it('goes to fallback when not logged in', async () => {
+ const state$ = Observable.of({ type: 'LOGGED_OUT' });
+ const rendered = render(
+ {state.type}
}
+ >
+ Logged in!
+ ,
+ );
+ await wait(() => rendered.getByText('LOGGED_OUT'));
+ });
+
+ it('transitions between states', async () => {
+ let subscriber: ZenObservable.SubscriptionObserver | undefined;
+ const state$ = new Observable(s => {
+ subscriber = s;
+ });
+
+ const rendered = render(
+ {state.type}
}
+ >
+ Logged in!
+ ,
+ );
+
+ await wait(() => rendered.getByText('LOGGED_OUT'));
+ // @ts-ignore: Object is possibly 'undefined'
+ act(() => subscriber.next({ type: 'LOGGED_IN', user: 'apa' }));
+ await wait(() => rendered.getByText('Logged in!'));
+ });
+});
diff --git a/frontend/packages/app/src/login/LoginBarrier.tsx b/frontend/packages/app/src/login/LoginBarrier.tsx
new file mode 100644
index 0000000000..56caf04bb8
--- /dev/null
+++ b/frontend/packages/app/src/login/LoginBarrier.tsx
@@ -0,0 +1,22 @@
+import React, { FC } from 'react';
+import Observable from 'zen-observable';
+import { useObservable } from 'react-use';
+import { LoginState } from './types';
+
+type LoginBarrierProps = {
+ fallback: React.ComponentType<{ state: LoginState }>;
+ state$: Observable;
+};
+
+export const LoginBarrier: FC = ({
+ fallback: Fallback,
+ state$,
+ children,
+}) => {
+ const state = useObservable(state$, { type: 'LOGGED_OUT' });
+ if (state.type === 'LOGGED_IN') {
+ return <>{children}>;
+ } else {
+ return ;
+ }
+};
diff --git a/frontend/packages/app/src/login/MockCurrentUser.test.ts b/frontend/packages/app/src/login/MockCurrentUser.test.ts
new file mode 100644
index 0000000000..598c5e53ba
--- /dev/null
+++ b/frontend/packages/app/src/login/MockCurrentUser.test.ts
@@ -0,0 +1,38 @@
+import { MockCurrentUser } from './MockCurrentUser';
+import { wait } from '@testing-library/react';
+
+describe('MockCurrentUser', () => {
+ it('notifies immediately on subscribe', async () => {
+ const next = jest.fn();
+ const current = new MockCurrentUser();
+ current.state.subscribe(next);
+ await wait();
+ expect(next).toHaveBeenNthCalledWith(
+ 1,
+ expect.objectContaining({ type: 'LOGGED_OUT' }),
+ );
+ });
+
+ it('logs in and out', async () => {
+ const next = jest.fn();
+ const current = new MockCurrentUser();
+ current.state.subscribe(next);
+ await wait();
+ expect(next).toHaveBeenNthCalledWith(
+ 1,
+ expect.objectContaining({ type: 'LOGGED_OUT' }),
+ );
+ current.login('apa');
+ await wait();
+ expect(next).toHaveBeenNthCalledWith(
+ 2,
+ expect.objectContaining({ type: 'LOGGED_IN', user: 'apa' }),
+ );
+ current.logout();
+ await wait();
+ expect(next).toHaveBeenNthCalledWith(
+ 3,
+ expect.objectContaining({ type: 'LOGGED_OUT' }),
+ );
+ });
+});
diff --git a/frontend/packages/app/src/login/MockCurrentUser.ts b/frontend/packages/app/src/login/MockCurrentUser.ts
new file mode 100644
index 0000000000..0b90e25fab
--- /dev/null
+++ b/frontend/packages/app/src/login/MockCurrentUser.ts
@@ -0,0 +1,67 @@
+import Observable from 'zen-observable';
+import { LoginState } from './types';
+
+const LOCAL_STORAGE_KEY = 'mock_current_user';
+
+export class MockCurrentUser {
+ private listeners: ZenObservable.SubscriptionObserver[];
+ private currentUser: string | undefined;
+
+ constructor() {
+ this.listeners = [];
+ this.currentUser = undefined;
+ this.loadPrevious();
+ }
+
+ login(user: string) {
+ this.currentUser = user;
+ this.saveCurrent();
+ this.notify();
+ }
+
+ logout() {
+ this.currentUser = undefined;
+ this.saveCurrent();
+ this.notify();
+ }
+
+ get state(): Observable {
+ return new Observable(subscriber => {
+ this.listeners.push(subscriber);
+ subscriber.next(this.getState());
+ return () => {
+ this.listeners = this.listeners.filter(x => x !== subscriber);
+ };
+ });
+ }
+
+ private loadPrevious() {
+ const user = localStorage.getItem(LOCAL_STORAGE_KEY);
+ if (user) {
+ try {
+ this.currentUser = JSON.parse(user);
+ } catch (e) {
+ localStorage.removeItem(LOCAL_STORAGE_KEY);
+ }
+ }
+ }
+
+ private saveCurrent() {
+ if (!this.currentUser) {
+ localStorage.removeItem(LOCAL_STORAGE_KEY);
+ } else {
+ localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(this.currentUser));
+ }
+ }
+
+ private notify() {
+ const state = this.getState();
+ this.listeners.forEach(listener => listener.next(state));
+ }
+
+ private getState(): LoginState {
+ return this.currentUser
+ ? { type: 'LOGGED_IN', user: this.currentUser }
+ : { type: 'LOGGED_OUT' };
+ }
+}
diff --git a/frontend/packages/app/src/login/types.ts b/frontend/packages/app/src/login/types.ts
new file mode 100644
index 0000000000..9a341917ad
--- /dev/null
+++ b/frontend/packages/app/src/login/types.ts
@@ -0,0 +1,11 @@
+export type LoggedOutState = { type: 'LOGGED_OUT' };
+export type LoggingInState = { type: 'LOGGING_IN' };
+export type LoggedInState = { type: 'LOGGED_IN'; user: string };
+export type LoggingOutState = { type: 'LOGGING_OUT' };
+export type LoginFailedState = { type: 'LOGIN_FAILED'; error: Error };
+export type LoginState =
+ | LoggedOutState
+ | LoggingInState
+ | LoggedInState
+ | LoggingOutState
+ | LoginFailedState;
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/EntityPageBuilder.tsx b/frontend/packages/core/src/api/entityView/EntityPageBuilder.tsx
new file mode 100644
index 0000000000..8dbf6ba2a0
--- /dev/null
+++ b/frontend/packages/core/src/api/entityView/EntityPageBuilder.tsx
@@ -0,0 +1,167 @@
+import React, { ComponentType, FC } from 'react';
+import { Route, Redirect, Switch } from 'react-router-dom';
+import List from '@material-ui/core/List';
+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 from '../plugin/Plugin';
+
+const EntityLayout: FC<{}> = ({ children }) => {
+ const config = useEntityConfig();
+ return (
+ {children}
+ );
+};
+
+const EntitySidebar: FC<{}> = ({ children }) => {
+ return {children}
;
+};
+
+const EntitySidebarItem: FC<{ title: string; path: string }> = ({
+ title,
+ path,
+}) => {
+ const entityUri = useEntityUri();
+
+ return (
+
+
+ {title}
+
+
+ );
+};
+
+type EntityPageNavItem = {
+ title: string;
+ target: string;
+};
+
+type EntityPageView = {
+ path: string;
+ component: ComponentType;
+};
+
+type Props = {
+ navItems: EntityPageNavItem[];
+ views: EntityPageView[];
+};
+
+const EntityPageComponent: FC = ({ navItems, views }) => {
+ const { kind, id } = useEntity();
+ const basePath = `/entity/${kind}/${id}`;
+
+ return (
+
+
+ {navItems.map(({ title, target }) => (
+
+ ))}
+
+
+ {views.map(({ path, component }) => (
+
+ ))}
+
+
+
+ );
+};
+
+type EntityPageRegistration =
+ | {
+ type: 'page';
+ title: string;
+ path: string;
+ page: AppComponentBuilder;
+ }
+ | {
+ type: 'plugin';
+ plugin: BackstagePlugin;
+ }
+ | {
+ type: 'component';
+ title: string;
+ path: string;
+ component: ComponentType;
+ };
+
+export default class EntityPageBuilder extends AppComponentBuilder {
+ private readonly registrations = new Array();
+
+ addPage(
+ title: string,
+ path: string,
+ page: AppComponentBuilder,
+ ): EntityPageBuilder {
+ this.registrations.push({ type: 'page', title, path, page });
+ return this;
+ }
+
+ addComponent(
+ title: string,
+ path: string,
+ component: ComponentType,
+ ): EntityPageBuilder {
+ this.registrations.push({ type: 'component', title, path, component });
+ return this;
+ }
+
+ register(plugin: BackstagePlugin): EntityPageBuilder {
+ this.registrations.push({ type: 'plugin', plugin });
+ return this;
+ }
+
+ build(app: App): ComponentType {
+ const navItems = new Array();
+ const views = new Array();
+
+ for (const reg of this.registrations) {
+ switch (reg.type) {
+ case 'page': {
+ const { title, path, page } = reg;
+ navItems.push({ title, target: path });
+ views.push({ path, component: page.build(app) });
+ break;
+ }
+ case 'component': {
+ const { title, path, component } = reg;
+ navItems.push({ title, target: path });
+ views.push({ path, component });
+ break;
+ }
+ case 'plugin': {
+ 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 ${reg.plugin} was registered as entity view, but did not provide any output`,
+ );
+ }
+ break;
+ }
+ }
+ }
+
+ return () => ;
+ }
+}
diff --git a/frontend/packages/core/src/api/entityView/EntityViewPageBuilder.tsx b/frontend/packages/core/src/api/entityView/EntityViewPageBuilder.tsx
deleted file mode 100644
index 10985325fc..0000000000
--- a/frontend/packages/core/src/api/entityView/EntityViewPageBuilder.tsx
+++ /dev/null
@@ -1,124 +0,0 @@
-import React, { ComponentType, FC } from 'react';
-import { Route, Redirect, Switch } from 'react-router-dom';
-import List from '@material-ui/core/List';
-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';
-
-const EntityLayout: FC<{}> = ({ children }) => {
- const config = useEntityConfig();
- return (
- {children}
- );
-};
-
-const EntitySidebar: FC<{}> = ({ children }) => {
- return {children}
;
-};
-
-const EntitySidebarItem: FC<{ title: string; path: string }> = ({
- title,
- path,
-}) => {
- const entityUri = useEntityUri();
-
- return (
-
-
- {title}
-
-
- );
-};
-
-type EntityViewPage = {
- title: string;
- path: string;
- component: ComponentType;
-};
-
-type Props = {
- pages: EntityViewPage[];
-};
-
-const EntityViewComponent: FC = ({ pages }) => {
- const { kind, id } = useEntity();
- const basePath = `/entity/${kind}/${id}`;
-
- return (
-
-
- {pages.map(({ title, path }) => (
-
- ))}
-
-
- {pages.map(({ path, component }) => (
-
- ))}
-
-
-
- );
-};
-
-type EntityViewRegistration =
- | {
- type: 'page';
- title: string;
- path: string;
- page: AppComponentBuilder;
- }
- | {
- type: 'component';
- title: string;
- path: string;
- component: ComponentType;
- };
-
-export default class EntityViewBuilder extends AppComponentBuilder {
- private readonly registrations = new Array();
-
- addPage(
- title: string,
- path: string,
- page: AppComponentBuilder,
- ): EntityViewBuilder {
- this.registrations.push({ type: 'page', title, path, page });
- return this;
- }
-
- addComponent(
- title: string,
- path: string,
- component: ComponentType,
- ): EntityViewBuilder {
- this.registrations.push({ type: 'component', title, path, component });
- return this;
- }
-
- build(app: App): ComponentType {
- const pages = this.registrations.map(registration => {
- switch (registration.type) {
- case 'page': {
- const { title, path, page } = registration;
- return { title, path, component: page.build(app) };
- }
- case 'component': {
- const { title, path, component } = registration;
- return { title, path, component };
- }
- default:
- throw new Error(`Unknown EntityViewBuilder registration`);
- }
- });
-
- return () => ;
- }
-}
diff --git a/frontend/packages/core/src/api/plugin/Plugin.tsx b/frontend/packages/core/src/api/plugin/Plugin.tsx
index 13caa40475..e351801047 100644
--- a/frontend/packages/core/src/api/plugin/Plugin.tsx
+++ b/frontend/packages/core/src/api/plugin/Plugin.tsx
@@ -1,5 +1,5 @@
-import React from 'react';
-import { Route, Redirect } from 'react-router-dom';
+import { ComponentType } from 'react';
+import { PluginOutput, RoutePath, RouteOptions } from './types';
export type PluginConfig = {
id: string;
@@ -7,89 +7,98 @@ export type PluginConfig = {
};
export type PluginHooks = {
- router: Router;
+ 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[];
+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 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 });
+ },
+ },
+ 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 };
- return this.result;
+ this.storedOutput = outputs;
+ return this.storedOutput;
}
toString() {
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/api/widgetView/WidgetViewBuilder.tsx b/frontend/packages/core/src/api/widgetView/WidgetViewBuilder.tsx
index eb9f5d1ed0..3ab13c2f8c 100644
--- a/frontend/packages/core/src/api/widgetView/WidgetViewBuilder.tsx
+++ b/frontend/packages/core/src/api/widgetView/WidgetViewBuilder.tsx
@@ -9,8 +9,8 @@ type Props = {
const WidgetViewComponent: FC = ({ cards }) => {
return (
- {cards.map(CardComponent => (
-
+ {cards.map((CardComponent, index) => (
+
))}
);
diff --git a/frontend/packages/core/src/components/EntityLink/EntityLink.tsx b/frontend/packages/core/src/components/EntityLink/EntityLink.tsx
index c26972c467..04b070e397 100644
--- a/frontend/packages/core/src/components/EntityLink/EntityLink.tsx
+++ b/frontend/packages/core/src/components/EntityLink/EntityLink.tsx
@@ -13,10 +13,10 @@ type Props = {
}
);
-function buildPath(kind: string, id?: string, subPath?: string) {
+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/core/src/components/EntityLink/RelativeEntityLink.tsx b/frontend/packages/core/src/components/EntityLink/RelativeEntityLink.tsx
new file mode 100644
index 0000000000..aa61abcc01
--- /dev/null
+++ b/frontend/packages/core/src/components/EntityLink/RelativeEntityLink.tsx
@@ -0,0 +1,16 @@
+import React, { FC } from 'react';
+import { Link } from 'react-router-dom';
+import { useEntity } from '../../api';
+import { buildPath } from './EntityLink';
+
+type Props = {
+ view: string;
+};
+
+const RelativeEntityLink: FC = ({ view, children }) => {
+ const entity = useEntity();
+
+ return {children};
+};
+
+export default RelativeEntityLink;
diff --git a/frontend/packages/core/src/components/EntityLink/index.ts b/frontend/packages/core/src/components/EntityLink/index.ts
index d35b5bee26..f067ebf3e2 100644
--- a/frontend/packages/core/src/components/EntityLink/index.ts
+++ b/frontend/packages/core/src/components/EntityLink/index.ts
@@ -1 +1,2 @@
export { default } from './EntityLink';
+export { default as RelativeEntityLink } from './RelativeEntityLink';
diff --git a/frontend/packages/core/src/index.ts b/frontend/packages/core/src/index.ts
index 3dc9c80d41..ccca30231a 100644
--- a/frontend/packages/core/src/index.ts
+++ b/frontend/packages/core/src/index.ts
@@ -1,5 +1,8 @@
export * from './api';
-export { default as EntityLink } from './components/EntityLink';
+export {
+ default as EntityLink,
+ RelativeEntityLink,
+} from './components/EntityLink';
export { default as Page } from '../src/layout/Page';
export { gradients, theme } from '../src/layout/Page';
export { default as Header } from '../src/layout/Header/Header';
diff --git a/frontend/packages/core/src/layout/Header/Header.js b/frontend/packages/core/src/layout/Header/Header.js
index f78e43ee76..5ddb7865e4 100644
--- a/frontend/packages/core/src/layout/Header/Header.js
+++ b/frontend/packages/core/src/layout/Header/Header.js
@@ -26,9 +26,9 @@ class Header extends Component {
return typeLink ? (
//
- {type}
- //
+ {type}
) : (
+ //
{type}
);
}
@@ -69,12 +69,17 @@ class Header extends Component {
const { title, pageTitleOverride, children, style, classes } = this.props;
const pageTitle = pageTitleOverride || title;
if (typeof pageTitle !== 'string') {
- console.warn(' title prop is not a string, pageTitleOverride should be provided.');
+ console.warn(
+ ' title prop is not a string, pageTitleOverride should be provided.',
+ );
}
return (
-
+
{theme => (
@@ -98,7 +103,7 @@ const styles = theme => ({
gridArea: 'pageHeader',
padding: theme.spacing(3),
minHeight: 118,
- width: 'calc(100vw - 224px)',
+ width: '100vw',
boxShadow: '0 0 8px 3px rgba(20, 20, 20, 0.3)',
position: 'relative',
zIndex: 100,
@@ -117,6 +122,7 @@ const styles = theme => ({
flexDirection: 'row',
flexWrap: 'wrap',
alignItems: 'center',
+ marginRight: theme.spacing(6),
},
title: {
color: theme.palette.bursts.fontColor,
diff --git a/frontend/packages/plugins/github-actions/README.md b/frontend/packages/plugins/github-actions/README.md
new file mode 100644
index 0000000000..d55e47c5b1
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/README.md
@@ -0,0 +1 @@
+Welcome to your github-actions plugin!
diff --git a/frontend/packages/plugins/github-actions/jest.config.js b/frontend/packages/plugins/github-actions/jest.config.js
new file mode 100644
index 0000000000..6b28dacb3d
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/jest.config.js
@@ -0,0 +1,4 @@
+module.exports = {
+ ...require('@spotify/web-scripts/config/jest.config.js'),
+ setupFilesAfterEnv: ['../jest.setup.ts'],
+};
diff --git a/frontend/packages/plugins/github-actions/jest.setup.ts b/frontend/packages/plugins/github-actions/jest.setup.ts
new file mode 100644
index 0000000000..666127af39
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/jest.setup.ts
@@ -0,0 +1 @@
+import '@testing-library/jest-dom/extend-expect';
diff --git a/frontend/packages/plugins/github-actions/package.json b/frontend/packages/plugins/github-actions/package.json
new file mode 100644
index 0000000000..cfe203d986
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "@backstage/plugin-github-actions",
+ "version": "0.0.0",
+ "main": "src/index.ts",
+ "main:src": "src/index.ts",
+ "devDependencies": {
+ "@backstage/core": "0.0.0",
+ "@spotify/web-scripts": "^6.0.0",
+ "@testing-library/jest-dom": "^4.2.4",
+ "@testing-library/react": "^9.3.2",
+ "@testing-library/user-event": "^7.1.2",
+ "@types/jest": "^24.0.0",
+ "@types/node": "^12.0.0",
+ "@types/react": "^16.9.0",
+ "@types/react-dom": "^16.9.0",
+ "@types/react-router-dom": "^5.1.3",
+ "react": "^16.12.0",
+ "react-dom": "^16.12.0",
+ "react-router-dom": "^5.1.2",
+ "@material-ui/core": "^4.9.1",
+ "@material-ui/icons": "^4.9.1"
+ },
+ "scripts": {
+ "lint": "web-scripts lint",
+ "test": "web-scripts test"
+ },
+ "license": "Apache-2.0"
+}
diff --git a/frontend/packages/plugins/github-actions/src/components/BuildDetailsPage/BuildDetailsPage.tsx b/frontend/packages/plugins/github-actions/src/components/BuildDetailsPage/BuildDetailsPage.tsx
new file mode 100644
index 0000000000..5cd5e21bf7
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/src/components/BuildDetailsPage/BuildDetailsPage.tsx
@@ -0,0 +1,20 @@
+import React, { FC } from 'react';
+import Button from '@material-ui/core/Button';
+
+type Props = {
+ buildId: string;
+};
+
+const BuildDetailsPage: FC = ({ buildId }) => {
+ return (
+
+ );
+};
+
+export default BuildDetailsPage;
diff --git a/frontend/packages/plugins/github-actions/src/components/BuildDetailsPage/index.ts b/frontend/packages/plugins/github-actions/src/components/BuildDetailsPage/index.ts
new file mode 100644
index 0000000000..a2b6def3b0
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/src/components/BuildDetailsPage/index.ts
@@ -0,0 +1 @@
+export { default } from './BuildDetailsPage';
diff --git a/frontend/packages/plugins/github-actions/src/components/BuildInfoCard/BuildInfoCard.tsx b/frontend/packages/plugins/github-actions/src/components/BuildInfoCard/BuildInfoCard.tsx
new file mode 100644
index 0000000000..38fc2266db
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/src/components/BuildInfoCard/BuildInfoCard.tsx
@@ -0,0 +1,8 @@
+import React, { FC } from 'react';
+import { InfoCard } from '@backstage/core';
+
+const BuildInfoCard: FC<{}> = () => {
+ return Last build was acb67fa3b5472w;
+};
+
+export default BuildInfoCard;
diff --git a/frontend/packages/plugins/github-actions/src/components/BuildInfoCard/index.ts b/frontend/packages/plugins/github-actions/src/components/BuildInfoCard/index.ts
new file mode 100644
index 0000000000..21c0b99099
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/src/components/BuildInfoCard/index.ts
@@ -0,0 +1 @@
+export { default } from './BuildInfoCard';
diff --git a/frontend/packages/plugins/github-actions/src/components/BuildListPage/BuildListPage.tsx b/frontend/packages/plugins/github-actions/src/components/BuildListPage/BuildListPage.tsx
new file mode 100644
index 0000000000..697d9edfa6
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/src/components/BuildListPage/BuildListPage.tsx
@@ -0,0 +1,46 @@
+import React, { FC } from 'react';
+import {
+ TableContainer,
+ Table,
+ TableHead,
+ TableRow,
+ TableCell,
+ Paper,
+ TableBody,
+} from '@material-ui/core';
+import { RelativeEntityLink } from '@backstage/core';
+
+const BuildListPage: FC<{}> = () => {
+ const rows = [
+ { message: 'Fixed a Bar', commit: 'fb46ca3dfbd7af5bc43da', id: 165 },
+ { message: 'Fixed a Foo', commit: 'd7af5bc43dafb46ca3dfb', id: 164 },
+ ];
+ return (
+
+
+
+
+ Message
+ Commit
+ Build ID
+
+
+
+ {rows.map(row => (
+
+ {row.message}
+ {row.commit}
+
+
+ {row.commit}
+
+
+
+ ))}
+
+
+
+ );
+};
+
+export default BuildListPage;
diff --git a/frontend/packages/plugins/github-actions/src/components/BuildListPage/index.ts b/frontend/packages/plugins/github-actions/src/components/BuildListPage/index.ts
new file mode 100644
index 0000000000..497fb05ab5
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/src/components/BuildListPage/index.ts
@@ -0,0 +1 @@
+export { default } from './BuildListPage';
diff --git a/frontend/packages/plugins/github-actions/src/index.ts b/frontend/packages/plugins/github-actions/src/index.ts
new file mode 100644
index 0000000000..b68aea57f9
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/src/index.ts
@@ -0,0 +1 @@
+export { default } from './plugin';
diff --git a/frontend/packages/plugins/github-actions/src/plugin.test.ts b/frontend/packages/plugins/github-actions/src/plugin.test.ts
new file mode 100644
index 0000000000..c202f56231
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/src/plugin.test.ts
@@ -0,0 +1,7 @@
+import plugin from './plugin';
+
+describe('github-actions', () => {
+ it('should export plugin', () => {
+ expect(plugin).toBeDefined();
+ });
+});
diff --git a/frontend/packages/plugins/github-actions/src/plugin.ts b/frontend/packages/plugins/github-actions/src/plugin.ts
new file mode 100644
index 0000000000..cecf142ca6
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/src/plugin.ts
@@ -0,0 +1,16 @@
+import { createPlugin } from '@backstage/core';
+import BuildDetailsPage from './components/BuildDetailsPage';
+import BuildListPage from './components/BuildListPage';
+
+// export const buildListRoute = createEntityRoute<[]>('/builds')
+// export const buildDetailsRoute = createEntityRoute<[number]>('/builds/:buildId')
+
+export default createPlugin({
+ id: 'github-actions',
+
+ register({ entityPage }) {
+ entityPage.navItem({ title: 'CI/CD', target: '/builds' });
+ entityPage.route('/builds', BuildListPage);
+ entityPage.route('/builds/:buildId', BuildDetailsPage);
+ },
+});
diff --git a/frontend/packages/plugins/hello-world/package.json b/frontend/packages/plugins/hello-world/package.json
index d63c6f3d7a..5b8b6e3b9f 100644
--- a/frontend/packages/plugins/hello-world/package.json
+++ b/frontend/packages/plugins/hello-world/package.json
@@ -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"
}
diff --git a/frontend/packages/plugins/home-page/src/components/HomePage/HomePage.tsx b/frontend/packages/plugins/home-page/src/components/HomePage/HomePage.tsx
index d9cb7217a6..d84256ac42 100644
--- a/frontend/packages/plugins/home-page/src/components/HomePage/HomePage.tsx
+++ b/frontend/packages/plugins/home-page/src/components/HomePage/HomePage.tsx
@@ -1,14 +1,12 @@
-import React, { FC } from 'react';
-import { InfoCard, EntityLink } from '@backstage/core';
-import { Link } from 'react-router-dom';
+import { EntityLink, InfoCard } from '@backstage/core';
import { Typography } from '@material-ui/core';
+import React, { FC } from 'react';
const HomePage: FC<{}> = () => {
return (
Welcome to Backstage!
-
Go to Login
Backstage Backend
diff --git a/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.test.tsx b/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.test.tsx
index 5262db4a5b..52e3341d6c 100644
--- a/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.test.tsx
+++ b/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.test.tsx
@@ -4,7 +4,8 @@ import LoginComponent from './LoginComponent';
describe('LoginComponent', () => {
it('should render', () => {
- const rendered = render(
);
+ const onLogin = jest.fn();
+ const rendered = render(
);
expect(rendered.getByText('Login')).toBeInTheDocument();
});
});
diff --git a/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.tsx b/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.tsx
index 8826eceda7..f0915bed2e 100644
--- a/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.tsx
+++ b/frontend/packages/plugins/login/src/components/LoginComponent/LoginComponent.tsx
@@ -1,11 +1,36 @@
-import React, { FC, Fragment } from 'react';
+import React, { FC, useState } from 'react';
import Button from '@material-ui/core/Button';
import TextField from '@material-ui/core/TextField';
import Grid from '@material-ui/core/Grid';
+import { Typography } from '@material-ui/core';
+
+type Props = {
+ onLogin: (username: string) => Promise
| void;
+};
+
+const LoginComponent: FC = ({ onLogin }) => {
+ const [error, setError] = useState('');
+ const [username, setUsername] = useState('');
+
+ const onUsernameChanged = async (e: React.ChangeEvent) => {
+ setUsername(e.target.value);
+ };
+
+ const onSubmit = async () => {
+ if (!username) {
+ setError('You have to supply a username');
+ }
+
+ setError('');
+ try {
+ await onLogin(username);
+ } catch (e) {
+ setError(`Login failed: ${e.message}`);
+ }
+ };
-const LoginComponent: FC<{}> = () => {
return (
-
+
+ {error || 'Just enter any fake username'}
+
);
};
diff --git a/frontend/packages/proto/package.json b/frontend/packages/proto/package.json
new file mode 100644
index 0000000000..b6a52085f5
--- /dev/null
+++ b/frontend/packages/proto/package.json
@@ -0,0 +1,8 @@
+{
+ "private": true,
+ "name": "@backstage/protobuf-definitions",
+ "version": "0.0.0",
+ "devDependencies": {
+ "ts-protoc-gen": "^0.12.0"
+ }
+}
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
new file mode 100644
index 0000000000..ac0f4de095
--- /dev/null
+++ b/frontend/packages/proto/src/generated/identity/v1/identity_pb.d.ts
@@ -0,0 +1,136 @@
+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 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 {
+ getUser(): User | undefined;
+ setUser(value?: User): void;
+ hasUser(): boolean;
+ clearUser(): 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 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,
+ }
+}
+
+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 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 {
+ 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 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 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;
+
+ getUsersList(): Array;
+ setUsersList(value: Array): void;
+ clearUsersList(): void;
+ addUsers(value?: User, index?: number): User;
+
+ 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 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,
+ groupsList: Array,
+ }
+}
+
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/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
new file mode 100644
index 0000000000..9f50e094ce
--- /dev/null
+++ b/frontend/packages/proto/src/generated/inventory/v1/inventory_pb.d.ts
@@ -0,0 +1,182 @@
+import * as jspb from "google-protobuf"
+
+export class GetEntityRequest extends jspb.Message {
+ getEntity(): Entity | undefined;
+ setEntity(value?: Entity): void;
+ hasEntity(): boolean;
+ clearEntity(): void;
+
+ getIncludeFactsList(): Array;
+ setIncludeFactsList(value: Array): void;
+ clearIncludeFactsList(): void;
+ addIncludeFacts(value: string, index?: number): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): GetEntityRequest.AsObject;
+ static toObject(includeInstance: boolean, msg: GetEntityRequest): GetEntityRequest.AsObject;
+ 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,
+ }
+}
+
+export class GetEntityReply extends jspb.Message {
+ getEntity(): Entity | undefined;
+ setEntity(value?: Entity): void;
+ hasEntity(): boolean;
+ clearEntity(): 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 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,
+ }
+}
+
+export class CreateEntityRequest extends jspb.Message {
+ 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 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 {
+ 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 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 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;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): Entity.AsObject;
+ static toObject(includeInstance: boolean, msg: Entity): Entity.AsObject;
+ 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 {
+ getEntityuri(): string;
+ setEntityuri(value: string): void;
+
+ 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 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 = {
+ 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/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
new file mode 100644
index 0000000000..0a795dc5f8
--- /dev/null
+++ b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb.d.ts
@@ -0,0 +1,70 @@
+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 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 GetAllTemplatesReply extends jspb.Message {
+ getTemplatesList(): Array;
+ setTemplatesList(value: Array): void;
+ clearTemplatesList(): void;
+ addTemplates(value?: Template, index?: number): Template;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): GetAllTemplatesReply.AsObject;
+ static toObject(includeInstance: boolean, msg: GetAllTemplatesReply): GetAllTemplatesReply.AsObject;
+ static serializeBinaryToWriter(message: GetAllTemplatesReply, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): GetAllTemplatesReply;
+ static deserializeBinaryFromReader(message: GetAllTemplatesReply, reader: jspb.BinaryReader): GetAllTemplatesReply;
+}
+
+export namespace GetAllTemplatesReply {
+ export type AsObject = {
+ templatesList: Array,
+ }
+}
+
+export class Template extends jspb.Message {
+ getId(): string;
+ setId(value: string): void;
+
+ getName(): string;
+ setName(value: string): void;
+
+ getDescription(): string;
+ setDescription(value: string): void;
+
+ getUser(): identity_v1_identity_pb.User | undefined;
+ setUser(value?: identity_v1_identity_pb.User): void;
+ hasUser(): boolean;
+ clearUser(): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): Template.AsObject;
+ static toObject(includeInstance: boolean, msg: Template): Template.AsObject;
+ static 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,
+ description: string,
+ user?: identity_v1_identity_pb.User.AsObject,
+ }
+}
+
diff --git a/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb.js b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb.js
new file mode 100644
index 0000000000..fd2f8390fb
--- /dev/null
+++ b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb.js
@@ -0,0 +1,567 @@
+/**
+ * @fileoverview
+ * @enhanceable
+ * @suppress {messageConventions} JS Compiler reports an error if a variable or
+ * field starts with 'MSG_' and isn't a translatable message.
+ * @public
+ */
+// GENERATED CODE -- DO NOT EDIT!
+
+var jspb = require('google-protobuf');
+var goog = jspb;
+var global = Function('return this')();
+
+var identity_v1_identity_pb = require('../../identity/v1/identity_pb.js');
+goog.object.extend(proto, identity_v1_identity_pb);
+goog.exportSymbol('proto.spotify.backstage.scaffolder.v1.Empty', null, global);
+goog.exportSymbol('proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply', null, global);
+goog.exportSymbol('proto.spotify.backstage.scaffolder.v1.Template', null, global);
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.scaffolder.v1.Empty = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.scaffolder.v1.Empty, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.scaffolder.v1.Empty.displayName = 'proto.spotify.backstage.scaffolder.v1.Empty';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.repeatedFields_, null);
+};
+goog.inherits(proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.displayName = 'proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.scaffolder.v1.Template = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.scaffolder.v1.Template, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.scaffolder.v1.Template.displayName = 'proto.spotify.backstage.scaffolder.v1.Template';
+}
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.scaffolder.v1.Empty.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.scaffolder.v1.Empty.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.scaffolder.v1.Empty} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.Empty.toObject = function(includeInstance, msg) {
+ var f, obj = {
+
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.scaffolder.v1.Empty}
+ */
+proto.spotify.backstage.scaffolder.v1.Empty.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.scaffolder.v1.Empty;
+ return proto.spotify.backstage.scaffolder.v1.Empty.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.scaffolder.v1.Empty} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.scaffolder.v1.Empty}
+ */
+proto.spotify.backstage.scaffolder.v1.Empty.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.scaffolder.v1.Empty.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.scaffolder.v1.Empty.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.scaffolder.v1.Empty} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.Empty.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+};
+
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.repeatedFields_ = [1];
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ templatesList: jspb.Message.toObjectList(msg.getTemplatesList(),
+ proto.spotify.backstage.scaffolder.v1.Template.toObject, includeInstance)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply}
+ */
+proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply;
+ return proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply}
+ */
+proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto.spotify.backstage.scaffolder.v1.Template;
+ reader.readMessage(value,proto.spotify.backstage.scaffolder.v1.Template.deserializeBinaryFromReader);
+ msg.addTemplates(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getTemplatesList();
+ if (f.length > 0) {
+ writer.writeRepeatedMessage(
+ 1,
+ f,
+ proto.spotify.backstage.scaffolder.v1.Template.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * repeated Template templates = 1;
+ * @return {!Array}
+ */
+proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.prototype.getTemplatesList = function() {
+ return /** @type{!Array} */ (
+ jspb.Message.getRepeatedWrapperField(this, proto.spotify.backstage.scaffolder.v1.Template, 1));
+};
+
+
+/** @param {!Array} value */
+proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.prototype.setTemplatesList = function(value) {
+ jspb.Message.setRepeatedWrapperField(this, 1, value);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.scaffolder.v1.Template=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.spotify.backstage.scaffolder.v1.Template}
+ */
+proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.prototype.addTemplates = function(opt_value, opt_index) {
+ return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.spotify.backstage.scaffolder.v1.Template, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ */
+proto.spotify.backstage.scaffolder.v1.GetAllTemplatesReply.prototype.clearTemplatesList = function() {
+ this.setTemplatesList([]);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.scaffolder.v1.Template.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.scaffolder.v1.Template} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.Template.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, ""),
+ name: jspb.Message.getFieldWithDefault(msg, 2, ""),
+ description: jspb.Message.getFieldWithDefault(msg, 3, ""),
+ user: (f = msg.getUser()) && identity_v1_identity_pb.User.toObject(includeInstance, f)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.scaffolder.v1.Template}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.scaffolder.v1.Template;
+ return proto.spotify.backstage.scaffolder.v1.Template.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.scaffolder.v1.Template} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.scaffolder.v1.Template}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setName(value);
+ break;
+ case 3:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setDescription(value);
+ break;
+ case 4:
+ var value = new identity_v1_identity_pb.User;
+ reader.readMessage(value,identity_v1_identity_pb.User.deserializeBinaryFromReader);
+ msg.setUser(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.scaffolder.v1.Template.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.scaffolder.v1.Template} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.Template.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+ f = message.getName();
+ if (f.length > 0) {
+ writer.writeString(
+ 2,
+ f
+ );
+ }
+ f = message.getDescription();
+ if (f.length > 0) {
+ writer.writeString(
+ 3,
+ f
+ );
+ }
+ f = message.getUser();
+ if (f != null) {
+ writer.writeMessage(
+ 4,
+ f,
+ identity_v1_identity_pb.User.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.getId = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.setId = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string name = 2;
+ * @return {string}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.getName = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.setName = function(value) {
+ jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional string description = 3;
+ * @return {string}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.getDescription = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.setDescription = function(value) {
+ jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
+/**
+ * optional spotify.backstage.identity.v1.User user = 4;
+ * @return {?proto.spotify.backstage.identity.v1.User}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.getUser = function() {
+ return /** @type{?proto.spotify.backstage.identity.v1.User} */ (
+ jspb.Message.getWrapperField(this, identity_v1_identity_pb.User, 4));
+};
+
+
+/** @param {?proto.spotify.backstage.identity.v1.User|undefined} value */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.setUser = function(value) {
+ jspb.Message.setWrapperField(this, 4, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.clearUser = function() {
+ this.setUser(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.hasUser = function() {
+ return jspb.Message.getField(this, 4) != null;
+};
+
+
+goog.object.extend(exports, proto.spotify.backstage.scaffolder.v1);
diff --git a/frontend/scripts/gen-proto.sh b/frontend/scripts/gen-proto.sh
deleted file mode 100755
index eb0618ca83..0000000000
--- a/frontend/scripts/gen-proto.sh
+++ /dev/null
@@ -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" "$@"
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index 31d4e195f3..09e79a8aca 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -2890,6 +2890,11 @@
jest-diff "^25.1.0"
pretty-format "^25.1.0"
+"@types/js-cookie@2.2.4":
+ version "2.2.4"
+ resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.4.tgz#f79720b4755aa197c2e15e982e2f438f5748e348"
+ integrity sha512-WTfSE1Eauak/Nrg6cA9FgPTFvVawejsai6zXoq0QYTQ3mxONeRtGhKxa7wMlUzWWmzrmTeV+rwLjHgsCntdrsA==
+
"@types/json-schema@^7.0.3":
version "7.0.4"
resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
@@ -3013,6 +3018,11 @@
dependencies:
"@types/yargs-parser" "*"
+"@types/zen-observable@^0.8.0":
+ version "0.8.0"
+ resolved "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d"
+ integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==
+
"@typescript-eslint/eslint-plugin@^2.14.0", "@typescript-eslint/eslint-plugin@^2.8.0":
version "2.18.0"
resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.18.0.tgz#f8cf272dfb057ecf1ea000fea1e0b3f06a32f9cb"
@@ -3202,6 +3212,11 @@
"@webassemblyjs/wast-parser" "1.8.5"
"@xtuc/long" "4.2.2"
+"@xobotyi/scrollbar-width@1.8.2":
+ version "1.8.2"
+ resolved "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.8.2.tgz#056946ac41ade4885c576619c8d70c46c77e9683"
+ integrity sha512-RV6+4hR29oMaPCvSYFUvzOvlsrg2s2k5NE9tNERs+4nFIC9dRXxs+lL2CcaRTbl3yQxKwAZ8Cd+qMI8aUu9TFw==
+
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
@@ -4033,6 +4048,11 @@ bottleneck@^2.18.1:
resolved "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91"
integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==
+bowser@^1.7.3:
+ version "1.9.4"
+ resolved "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz#890c58a2813a9d3243704334fa81b96a5c150c9a"
+ integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==
+
boxen@^1.2.1:
version "1.3.0"
resolved "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
@@ -5115,6 +5135,13 @@ copy-descriptor@^0.1.0:
resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+copy-to-clipboard@^3.2.0:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.2.1.tgz#b1a1137100e5665d5a96015cb579e30e90e07c44"
+ integrity sha512-btru1Q6RD9wbonIvEU5EfnhIRGHLo//BGXQ1hNAD2avIs/nBZlpbOeKtv3mhoUByN4DB9Cb6/vXBymj1S43KmA==
+ dependencies:
+ toggle-selection "^1.0.6"
+
core-js-compat@^3.6.2:
version "3.6.4"
resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17"
@@ -5300,6 +5327,14 @@ css-has-pseudo@^0.10.0:
postcss "^7.0.6"
postcss-selector-parser "^5.0.0-rc.4"
+css-in-js-utils@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz#3b472b398787291b47cfe3e44fecfdd9e914ba99"
+ integrity sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==
+ dependencies:
+ hyphenate-style-name "^1.0.2"
+ isobject "^3.0.1"
+
css-loader@3.2.0:
version "3.2.0"
resolved "https://registry.npmjs.org/css-loader/-/css-loader-3.2.0.tgz#bb570d89c194f763627fcf1f80059c6832d009b2"
@@ -5358,6 +5393,14 @@ css-tree@1.0.0-alpha.37:
mdn-data "2.0.4"
source-map "^0.6.1"
+css-tree@^1.0.0-alpha.28:
+ version "1.0.0-alpha.39"
+ resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb"
+ integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==
+ dependencies:
+ mdn-data "2.0.6"
+ source-map "^0.6.1"
+
css-unit-converter@^1.1.1:
version "1.1.1"
resolved "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
@@ -5510,7 +5553,7 @@ cssstyle@^2.0.0:
dependencies:
cssom "~0.3.6"
-csstype@^2.2.0, csstype@^2.5.2, csstype@^2.6.5, csstype@^2.6.7:
+csstype@^2.2.0, csstype@^2.5.2, csstype@^2.5.5, csstype@^2.6.5, csstype@^2.6.7:
version "2.6.8"
resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431"
integrity sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA==
@@ -6154,6 +6197,13 @@ error-ex@^1.2.0, error-ex@^1.3.1:
dependencies:
is-arrayish "^0.2.1"
+error-stack-parser@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8"
+ integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==
+ dependencies:
+ stackframe "^1.1.1"
+
es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2:
version "1.17.4"
resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184"
@@ -6758,6 +6808,16 @@ fast-levenshtein@~2.0.6:
resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+fast-shallow-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz#d4dcaf6472440dcefa6f88b98e3251e27f25628b"
+ integrity sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==
+
+fastest-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-1.0.1.tgz#9122d406d4c9d98bea644a6b6853d5874b87b028"
+ integrity sha1-kSLUBtTJ2YvqZEpraFPVh0uHsCg=
+
fastq@^1.6.0:
version "1.6.0"
resolved "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2"
@@ -7517,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"
@@ -7947,7 +8012,7 @@ humanize-ms@^1.2.1:
dependencies:
ms "^2.0.0"
-hyphenate-style-name@^1.0.3:
+hyphenate-style-name@^1.0.2, hyphenate-style-name@^1.0.3:
version "1.0.3"
resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48"
integrity sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==
@@ -8147,6 +8212,14 @@ init-package-json@^1.10.3:
validate-npm-package-license "^3.0.1"
validate-npm-package-name "^3.0.0"
+inline-style-prefixer@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-4.0.2.tgz#d390957d26f281255fe101da863158ac6eb60911"
+ integrity sha512-N8nVhwfYga9MiV9jWlwfdj1UDIaZlBFu4cJSJkIr7tZX7sHpHhGR5su1qdpW+7KPL8ISTvCIkcaFi/JdBknvPg==
+ dependencies:
+ bowser "^1.7.3"
+ css-in-js-utils "^2.0.0"
+
inquirer@6.5.0:
version "6.5.0"
resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42"
@@ -9541,6 +9614,11 @@ jest@^25.1.0:
import-local "^3.0.2"
jest-cli "^25.1.0"
+js-cookie@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8"
+ integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==
+
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -10588,6 +10666,11 @@ mdn-data@2.0.4:
resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
+mdn-data@2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978"
+ integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==
+
meant@~1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/meant/-/meant-1.0.1.tgz#66044fea2f23230ec806fb515efea29c44d2115d"
@@ -11019,6 +11102,20 @@ nan@^2.12.1:
resolved "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
+nano-css@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/nano-css/-/nano-css-5.2.1.tgz#73b8470fa40b028a134d3393ae36bbb34b9fa332"
+ integrity sha512-T54okxMAha0+de+W8o3qFtuWhTxYvqQh2ku1cYEqTTP9mR62nWV2lLK9qRuAGWmoaYWhU7K4evT9Lc1iF65wuw==
+ dependencies:
+ css-tree "^1.0.0-alpha.28"
+ csstype "^2.5.5"
+ fastest-stable-stringify "^1.0.1"
+ inline-style-prefixer "^4.0.0"
+ rtl-css-js "^1.9.0"
+ sourcemap-codec "^1.4.1"
+ stacktrace-js "^2.0.0"
+ stylis "3.5.0"
+
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@@ -13360,7 +13457,7 @@ react-error-overlay@^6.0.5:
resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.5.tgz#55d59c2a3810e8b41922e0b4e5f85dcf239bd533"
integrity sha512-+DMR2k5c6BqMDSMF8hLH0vYKtKTeikiFW+fj0LClN+XZg4N9b8QUAdHC62CGWNLTi/gnuuemNcNcTFrCvK1f+A==
-react-fast-compare@^2.0.2:
+react-fast-compare@^2.0.2, react-fast-compare@^2.0.4:
version "2.0.4"
resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9"
integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==
@@ -13431,6 +13528,25 @@ react-transition-group@^4.3.0:
loose-envify "^1.4.0"
prop-types "^15.6.2"
+react-use@^13.24.0:
+ version "13.24.0"
+ resolved "https://registry.npmjs.org/react-use/-/react-use-13.24.0.tgz#f4574e26cfaaad65e3f04c0d5ff80c1836546236"
+ integrity sha512-p8GsZuMdz8OeIGzuYLm6pzJysKOhNyQjCUG6SHrQGk6o6ghy/RVGSqnmxVacNbN9166S0+9FsM1N1yH9GzWlgg==
+ dependencies:
+ "@types/js-cookie" "2.2.4"
+ "@xobotyi/scrollbar-width" "1.8.2"
+ copy-to-clipboard "^3.2.0"
+ fast-shallow-equal "^1.0.0"
+ js-cookie "^2.2.1"
+ nano-css "^5.2.1"
+ react-fast-compare "^2.0.4"
+ resize-observer-polyfill "^1.5.1"
+ screenfull "^5.0.0"
+ set-harmonic-interval "^1.0.1"
+ throttle-debounce "^2.1.0"
+ ts-easing "^0.2.0"
+ tslib "^1.10.0"
+
react@^16.12.0:
version "16.12.0"
resolved "https://registry.npmjs.org/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83"
@@ -13900,6 +14016,11 @@ requires-port@^1.0.0:
resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
+resize-observer-polyfill@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
+ integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
+
resolve-cwd@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
@@ -14087,6 +14208,13 @@ rsvp@^4.8.4:
resolved "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
+rtl-css-js@^1.9.0:
+ version "1.14.0"
+ resolved "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.14.0.tgz#daa4f192a92509e292a0519f4b255e6e3c076b7d"
+ integrity sha512-Dl5xDTeN3e7scU1cWX8c9b6/Nqz3u/HgR4gePc1kWXYiQWVQbKCEyK6+Hxve9LbcJ5EieHy1J9nJCN3grTtGwg==
+ dependencies:
+ "@babel/runtime" "^7.1.2"
+
run-async@^2.2.0:
version "2.3.0"
resolved "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
@@ -14203,6 +14331,11 @@ schema-utils@^2.0.0, schema-utils@^2.0.1, schema-utils@^2.1.0, schema-utils@^2.2
ajv "^6.10.2"
ajv-keywords "^3.4.1"
+screenfull@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/screenfull/-/screenfull-5.0.1.tgz#873052411eb9096bc1c8e615f5badad119e6e42c"
+ integrity sha512-NgQH4KKh2V3zlj2u90l7TUcSFxr9qL/64QEvhAvCN/fu1YS39YLTBKIqZqiS3STj3QD8sN6XnsK/8jk3hRq4WA==
+
select-hose@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
@@ -14345,6 +14478,11 @@ set-blocking@^2.0.0, set-blocking@~2.0.0:
resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+set-harmonic-interval@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249"
+ integrity sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==
+
set-value@^2.0.0, set-value@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
@@ -14645,6 +14783,11 @@ source-map-url@^0.4.0:
resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
+source-map@0.5.6:
+ version "0.5.6"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
+ integrity sha1-dc449SvwczxafwwRjYEzSiu19BI=
+
source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
@@ -14660,6 +14803,11 @@ source-map@^0.7.3:
resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+sourcemap-codec@^1.4.1:
+ version "1.4.8"
+ resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
+ integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
+
spawn-error-forwarder@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz#1afd94738e999b0346d7b9fc373be55e07577029"
@@ -14787,11 +14935,40 @@ stable@^0.1.8:
resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+stack-generator@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz#fb00e5b4ee97de603e0773ea78ce944d81596c36"
+ integrity sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==
+ dependencies:
+ stackframe "^1.1.1"
+
stack-utils@^1.0.1:
version "1.0.2"
resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
+stackframe@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.1.1.tgz#ffef0a3318b1b60c3b58564989aca5660729ec71"
+ integrity sha512-0PlYhdKh6AfFxRyK/v+6/k+/mMfyiEBbTM5L94D0ZytQnJ166wuwoTYLHFWGbs2dpA8Rgq763KGWmN1EQEYHRQ==
+
+stacktrace-gps@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz#7688dc2fc09ffb3a13165ebe0dbcaf41bcf0c69a"
+ integrity sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==
+ dependencies:
+ source-map "0.5.6"
+ stackframe "^1.1.1"
+
+stacktrace-js@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz#4ca93ea9f494752d55709a081d400fdaebee897b"
+ integrity sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==
+ dependencies:
+ error-stack-parser "^2.0.6"
+ stack-generator "^2.0.5"
+ stacktrace-gps "^3.0.4"
+
static-extend@^0.1.1:
version "0.1.2"
resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@@ -15103,6 +15280,11 @@ stylehacks@^4.0.0:
postcss "^7.0.0"
postcss-selector-parser "^3.0.0"
+stylis@3.5.0:
+ version "3.5.0"
+ resolved "https://registry.npmjs.org/stylis/-/stylis-3.5.0.tgz#016fa239663d77f868fef5b67cf201c4b7c701e1"
+ integrity sha512-pP7yXN6dwMzAR29Q0mBrabPCe0/mNO1MSr93bhay+hcZondvMMTpeGyd8nbhYJdyperNT2DRxONQuUGcJr5iPw==
+
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -15331,6 +15513,11 @@ throat@^5.0.0:
resolved "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b"
integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==
+throttle-debounce@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.1.0.tgz#257e648f0a56bd9e54fe0f132c4ab8611df4e1d5"
+ integrity sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg==
+
through2@^2.0.0, through2@^2.0.2, through2@~2.0.0:
version "2.0.5"
resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
@@ -15442,6 +15629,11 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2"
safe-regex "^1.1.0"
+toggle-selection@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
+ integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI=
+
toidentifier@1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
@@ -15499,6 +15691,11 @@ trim-off-newlines@^1.0.0:
resolved "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3"
integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM=
+ts-easing@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz#c8a8a35025105566588d87dbda05dd7fbfa5a4ec"
+ integrity sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==
+
ts-jest@^25.0.0:
version "25.1.0"
resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-25.1.0.tgz#06e776c4cce8a4da8eec4945f36a5823d0c0f9ba"
@@ -15520,6 +15717,13 @@ ts-pnp@1.1.5, ts-pnp@^1.1.2:
resolved "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz#840e0739c89fce5f3abd9037bb091dbff16d9dec"
integrity sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==
+ts-protoc-gen@^0.12.0:
+ version "0.12.0"
+ resolved "https://registry.npmjs.org/ts-protoc-gen/-/ts-protoc-gen-0.12.0.tgz#932e5738f14b67e7202825b06f8c548cb7d8ef34"
+ integrity sha512-V7jnICJxKqalBrnJSMTW5tB9sGi48gOC325bfcM7TDNUItVOlaMM//rQmuo49ybipk/SyJTnWXgtJnhHCevNJw==
+ dependencies:
+ google-protobuf "^3.6.1"
+
tslib@^1.8.1, tslib@^1.9.0:
version "1.10.0"
resolved "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
@@ -16691,3 +16895,8 @@ yargs@^8.0.2:
which-module "^2.0.0"
y18n "^3.2.1"
yargs-parser "^7.0.0"
+
+zen-observable@^0.8.15:
+ version "0.8.15"
+ resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"
+ integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000000..7f0e501513
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1892 @@
+{
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "ansi-bgblack": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz",
+ "integrity": "sha1-poulAHiHcBtqr74/oNrf36juPKI=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bgblue": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz",
+ "integrity": "sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bgcyan": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz",
+ "integrity": "sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bggreen": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz",
+ "integrity": "sha1-TjGRJIUplD9DIelr8THRwTgWr0k=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bgmagenta": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz",
+ "integrity": "sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bgred": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgred/-/ansi-bgred-0.1.1.tgz",
+ "integrity": "sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bgwhite": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz",
+ "integrity": "sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bgyellow": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz",
+ "integrity": "sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-black": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-black/-/ansi-black-0.1.1.tgz",
+ "integrity": "sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-blue": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-blue/-/ansi-blue-0.1.1.tgz",
+ "integrity": "sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bold": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bold/-/ansi-bold-0.1.1.tgz",
+ "integrity": "sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-colors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz",
+ "integrity": "sha1-csMd4qDZoszQysMMyYI+6y9kNLU=",
+ "requires": {
+ "ansi-bgblack": "^0.1.1",
+ "ansi-bgblue": "^0.1.1",
+ "ansi-bgcyan": "^0.1.1",
+ "ansi-bggreen": "^0.1.1",
+ "ansi-bgmagenta": "^0.1.1",
+ "ansi-bgred": "^0.1.1",
+ "ansi-bgwhite": "^0.1.1",
+ "ansi-bgyellow": "^0.1.1",
+ "ansi-black": "^0.1.1",
+ "ansi-blue": "^0.1.1",
+ "ansi-bold": "^0.1.1",
+ "ansi-cyan": "^0.1.1",
+ "ansi-dim": "^0.1.1",
+ "ansi-gray": "^0.1.1",
+ "ansi-green": "^0.1.1",
+ "ansi-grey": "^0.1.1",
+ "ansi-hidden": "^0.1.1",
+ "ansi-inverse": "^0.1.1",
+ "ansi-italic": "^0.1.1",
+ "ansi-magenta": "^0.1.1",
+ "ansi-red": "^0.1.1",
+ "ansi-reset": "^0.1.1",
+ "ansi-strikethrough": "^0.1.1",
+ "ansi-underline": "^0.1.1",
+ "ansi-white": "^0.1.1",
+ "ansi-yellow": "^0.1.1",
+ "lazy-cache": "^2.0.1"
+ }
+ },
+ "ansi-cyan": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
+ "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-dim": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-dim/-/ansi-dim-0.1.1.tgz",
+ "integrity": "sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-green": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz",
+ "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-grey": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-grey/-/ansi-grey-0.1.1.tgz",
+ "integrity": "sha1-WdmLasK6GfilF5jphT+6eDOaM8E=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-hidden": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-hidden/-/ansi-hidden-0.1.1.tgz",
+ "integrity": "sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-inverse": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-inverse/-/ansi-inverse-0.1.1.tgz",
+ "integrity": "sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-italic": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-italic/-/ansi-italic-0.1.1.tgz",
+ "integrity": "sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-magenta": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-magenta/-/ansi-magenta-0.1.1.tgz",
+ "integrity": "sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-red": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+ "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-reset": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-reset/-/ansi-reset-0.1.1.tgz",
+ "integrity": "sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-strikethrough": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz",
+ "integrity": "sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-underline": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-underline/-/ansi-underline-0.1.1.tgz",
+ "integrity": "sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-white": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-white/-/ansi-white-0.1.1.tgz",
+ "integrity": "sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
+ },
+ "ansi-yellow": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-yellow/-/ansi-yellow-0.1.1.tgz",
+ "integrity": "sha1-y5NW8vRscy8OMZnmEClVp32oPB0=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+ },
+ "array-sort": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-0.1.4.tgz",
+ "integrity": "sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ==",
+ "requires": {
+ "default-compare": "^1.0.0",
+ "get-value": "^2.0.6",
+ "kind-of": "^5.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+ },
+ "autolinker": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz",
+ "integrity": "sha1-BlK0kYgYefB3XazgzcoyM5QqTkc=",
+ "requires": {
+ "gulp-header": "^1.7.1"
+ }
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "requires": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "requires": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "requires": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "requires": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ },
+ "concat-with-sourcemaps": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+ "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
+ "requires": {
+ "source-map": "^0.6.1"
+ }
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "create-frame": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/create-frame/-/create-frame-1.0.0.tgz",
+ "integrity": "sha1-i5XyaR4ySbYIBEPjPQutn49pdao=",
+ "requires": {
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "isobject": "^3.0.0",
+ "lazy-cache": "^2.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "date.js": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/date.js/-/date.js-0.3.3.tgz",
+ "integrity": "sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==",
+ "requires": {
+ "debug": "~3.1.0"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+ },
+ "default-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
+ "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
+ "requires": {
+ "kind-of": "^5.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "ent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+ "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0="
+ },
+ "error-symbol": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz",
+ "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y="
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ }
+ },
+ "falsey": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/falsey/-/falsey-0.3.2.tgz",
+ "integrity": "sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg==",
+ "requires": {
+ "kind-of": "^5.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+ },
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "requires": {
+ "for-in": "^1.0.1"
+ }
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "requires": {
+ "map-cache": "^0.2.2"
+ }
+ },
+ "fs-exists-sync": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+ "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0="
+ },
+ "get-object": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/get-object/-/get-object-0.2.0.tgz",
+ "integrity": "sha1-2S/31RkMZFMM2gVD2sY6PUf+jAw=",
+ "requires": {
+ "is-number": "^2.0.2",
+ "isobject": "^0.2.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "isobject": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-0.2.0.tgz",
+ "integrity": "sha1-o0MhkvObkQtfAsyYlIeDbscKqF4="
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+ },
+ "google-protobuf": {
+ "version": "3.11.3",
+ "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.11.3.tgz",
+ "integrity": "sha512-Sp8E+0AJLxmiPwAk9VH3MkYAmYYheNUhywIyXOS7wvRkqbIYcHtGzJzIYicNqYsqgKmY35F9hxRkI+ZTqTB4Tg=="
+ },
+ "grpc_tools_node_protoc_ts": {
+ "version": "2.5.10",
+ "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-2.5.10.tgz",
+ "integrity": "sha512-oPiY3+7ZlZWiuZ00liGH97R0UdWr7v2ioKuUQIil9kKFEDB8vezvW5gL2My3DrU+TZSL3fnwdydJX9uiD1KzQg==",
+ "requires": {
+ "google-protobuf": "3.5.0",
+ "handlebars": "4.5.3",
+ "handlebars-helpers": "0.10.0"
+ },
+ "dependencies": {
+ "google-protobuf": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.5.0.tgz",
+ "integrity": "sha1-uMxjx02DRXvYqakEUDyO+ya8ozk="
+ }
+ }
+ },
+ "gulp-header": {
+ "version": "1.8.12",
+ "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz",
+ "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==",
+ "requires": {
+ "concat-with-sourcemaps": "*",
+ "lodash.template": "^4.4.0",
+ "through2": "^2.0.0"
+ }
+ },
+ "handlebars": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz",
+ "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==",
+ "requires": {
+ "neo-async": "^2.6.0",
+ "optimist": "^0.6.1",
+ "source-map": "^0.6.1",
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "handlebars-helper-create-frame": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/handlebars-helper-create-frame/-/handlebars-helper-create-frame-0.1.0.tgz",
+ "integrity": "sha1-iqUdEK62QI/MZgXUDXc1YohIegM=",
+ "requires": {
+ "create-frame": "^1.0.0",
+ "isobject": "^3.0.0"
+ }
+ },
+ "handlebars-helpers": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/handlebars-helpers/-/handlebars-helpers-0.10.0.tgz",
+ "integrity": "sha512-QiyhQz58u/DbuV41VnfpE0nhy6YCH4vB514ajysV8SoKmP+DxU+pR+fahVyNECHj+jiwEN2VrvxD/34/yHaLUg==",
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-sort": "^0.1.4",
+ "create-frame": "^1.0.0",
+ "define-property": "^1.0.0",
+ "falsey": "^0.3.2",
+ "for-in": "^1.0.2",
+ "for-own": "^1.0.0",
+ "get-object": "^0.2.0",
+ "get-value": "^2.0.6",
+ "handlebars": "^4.0.11",
+ "handlebars-helper-create-frame": "^0.1.0",
+ "handlebars-utils": "^1.0.6",
+ "has-value": "^1.0.0",
+ "helper-date": "^1.0.1",
+ "helper-markdown": "^1.0.0",
+ "helper-md": "^0.2.2",
+ "html-tag": "^2.0.0",
+ "is-even": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "is-number": "^4.0.0",
+ "kind-of": "^6.0.0",
+ "lazy-cache": "^2.0.2",
+ "logging-helpers": "^1.0.0",
+ "micromatch": "^3.1.4",
+ "relative": "^3.0.2",
+ "striptags": "^3.1.0",
+ "to-gfm-code-block": "^0.1.1",
+ "year": "^0.2.1"
+ }
+ },
+ "handlebars-utils": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/handlebars-utils/-/handlebars-utils-1.0.6.tgz",
+ "integrity": "sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw==",
+ "requires": {
+ "kind-of": "^6.0.0",
+ "typeof-article": "^0.1.1"
+ }
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "requires": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "requires": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "helper-date": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/helper-date/-/helper-date-1.0.1.tgz",
+ "integrity": "sha512-wU3VOwwTJvGr/w5rZr3cprPHO+hIhlblTJHD6aFBrKLuNbf4lAmkawd2iK3c6NbJEvY7HAmDpqjOFSI5/+Ey2w==",
+ "requires": {
+ "date.js": "^0.3.1",
+ "handlebars-utils": "^1.0.4",
+ "moment": "^2.18.1"
+ }
+ },
+ "helper-markdown": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/helper-markdown/-/helper-markdown-1.0.0.tgz",
+ "integrity": "sha512-AnDqMS4ejkQK0MXze7pA9TM3pu01ZY+XXsES6gEE0RmCGk5/NIfvTn0NmItfyDOjRAzyo9z6X7YHbHX4PzIvOA==",
+ "requires": {
+ "handlebars-utils": "^1.0.2",
+ "highlight.js": "^9.12.0",
+ "remarkable": "^1.7.1"
+ }
+ },
+ "helper-md": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/helper-md/-/helper-md-0.2.2.tgz",
+ "integrity": "sha1-wfWdflW7riM2L9ig6XFgeuxp1B8=",
+ "requires": {
+ "ent": "^2.2.0",
+ "extend-shallow": "^2.0.1",
+ "fs-exists-sync": "^0.1.0",
+ "remarkable": "^1.6.2"
+ }
+ },
+ "highlight.js": {
+ "version": "9.18.1",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz",
+ "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg=="
+ },
+ "html-tag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/html-tag/-/html-tag-2.0.0.tgz",
+ "integrity": "sha512-XxzooSo6oBoxBEUazgjdXj7VwTn/iSTSZzTYKzYY6I916tkaYzypHxy+pbVU1h+0UQ9JlVf5XkNQyxOAiiQO1g==",
+ "requires": {
+ "is-self-closing": "^1.0.1",
+ "kind-of": "^6.0.0"
+ }
+ },
+ "info-symbol": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz",
+ "integrity": "sha1-J4QdcoZ920JCzWEtecEGM4gcang="
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "is-even": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-even/-/is-even-1.0.0.tgz",
+ "integrity": "sha1-drUFX7rY0pSoa2qUkBXhyXtxfAY=",
+ "requires": {
+ "is-odd": "^0.1.2"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+ },
+ "is-odd": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-0.1.2.tgz",
+ "integrity": "sha1-vFc7XONx7yqtbm9JeZtyvvE5eKc=",
+ "requires": {
+ "is-number": "^3.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "is-self-closing": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-self-closing/-/is-self-closing-1.0.1.tgz",
+ "integrity": "sha512-E+60FomW7Blv5GXTlYee2KDrnG6srxF7Xt1SjrhWUGUEsTFIqY/nq2y3DaftCsgUMdh89V07IVfhY9KIJhLezg==",
+ "requires": {
+ "self-closing-tags": "^1.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
+ },
+ "lazy-cache": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
+ "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
+ "requires": {
+ "set-getter": "^0.1.0"
+ }
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+ },
+ "lodash.template": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
+ "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+ "requires": {
+ "lodash._reinterpolate": "^3.0.0",
+ "lodash.templatesettings": "^4.0.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+ "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+ "requires": {
+ "lodash._reinterpolate": "^3.0.0"
+ }
+ },
+ "log-ok": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz",
+ "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=",
+ "requires": {
+ "ansi-green": "^0.1.1",
+ "success-symbol": "^0.1.0"
+ }
+ },
+ "log-utils": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz",
+ "integrity": "sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=",
+ "requires": {
+ "ansi-colors": "^0.2.0",
+ "error-symbol": "^0.1.0",
+ "info-symbol": "^0.1.0",
+ "log-ok": "^0.1.1",
+ "success-symbol": "^0.1.0",
+ "time-stamp": "^1.0.1",
+ "warning-symbol": "^0.1.0"
+ }
+ },
+ "logging-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/logging-helpers/-/logging-helpers-1.0.0.tgz",
+ "integrity": "sha512-qyIh2goLt1sOgQQrrIWuwkRjUx4NUcEqEGAcYqD8VOnOC6ItwkrVE8/tA4smGpjzyp4Svhc6RodDp9IO5ghpyA==",
+ "requires": {
+ "isobject": "^3.0.0",
+ "log-utils": "^0.2.1"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "requires": {
+ "object-visit": "^1.0.0"
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "minimist": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
+ },
+ "mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "requires": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "moment": {
+ "version": "2.24.0",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
+ "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "neo-async": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
+ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "requires": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "requires": {
+ "isobject": "^3.0.0"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "requires": {
+ "minimist": "~0.0.1",
+ "wordwrap": "~0.0.2"
+ }
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "relative": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/relative/-/relative-3.0.2.tgz",
+ "integrity": "sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=",
+ "requires": {
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "remarkable": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz",
+ "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==",
+ "requires": {
+ "argparse": "^1.0.10",
+ "autolinker": "~0.28.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "requires": {
+ "ret": "~0.1.10"
+ }
+ },
+ "self-closing-tags": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/self-closing-tags/-/self-closing-tags-1.0.1.tgz",
+ "integrity": "sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA=="
+ },
+ "set-getter": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
+ "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
+ "requires": {
+ "to-object-path": "^0.3.0"
+ }
+ },
+ "set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "requires": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "requires": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "requires": {
+ "kind-of": "^3.2.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "requires": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "requires": {
+ "extend-shallow": "^3.0.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "requires": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "striptags": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.1.1.tgz",
+ "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0="
+ },
+ "success-symbol": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz",
+ "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc="
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM="
+ },
+ "to-gfm-code-block": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/to-gfm-code-block/-/to-gfm-code-block-0.1.1.tgz",
+ "integrity": "sha1-JdBFpfrlUxielje1kJANpzLYqoI="
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "requires": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "ts-protoc-gen": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/ts-protoc-gen/-/ts-protoc-gen-0.12.0.tgz",
+ "integrity": "sha512-V7jnICJxKqalBrnJSMTW5tB9sGi48gOC325bfcM7TDNUItVOlaMM//rQmuo49ybipk/SyJTnWXgtJnhHCevNJw==",
+ "requires": {
+ "google-protobuf": "^3.6.1"
+ }
+ },
+ "typeof-article": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/typeof-article/-/typeof-article-0.1.1.tgz",
+ "integrity": "sha1-nwfnM8P7tkb/qeYcCN66zUYOBq8=",
+ "requires": {
+ "kind-of": "^3.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "uglify-js": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.7.tgz",
+ "integrity": "sha512-FeSU+hi7ULYy6mn8PKio/tXsdSXN35lm4KgV2asx00kzrLU9Pi3oAslcJT70Jdj7PHX29gGUPOT6+lXGBbemhA==",
+ "requires": {
+ "commander": "~2.20.3",
+ "source-map": "~0.6.1"
+ }
+ },
+ "union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "requires": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ }
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "requires": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "requires": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+ },
+ "use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "warning-symbol": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz",
+ "integrity": "sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE="
+ },
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ },
+ "year": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/year/-/year-0.2.1.tgz",
+ "integrity": "sha1-QIOuUgoxiyPshgN/MADLiSvfm7A="
+ }
+ }
+}
diff --git a/proto/README.md b/proto/README.md
index 1787ed13b2..e052080b22 100644
--- a/proto/README.md
+++ b/proto/README.md
@@ -4,32 +4,51 @@ 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
## 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-grpc-web
-### Generate code
+This will enable code generation for interacting with gRPC-Web.
-Run to generate code to `backend/proto/`:
+Installation instructions are found at https://github.com/grpc/grpc-web#code-generator-plugin
-```
-$ prototool generate
+## Generating Code
+
+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
```
-Generated code should be check in to the repo.
+This will generate the respective "generated" files in the following folders:
-### Import generated go code
+- `backend/proto`
+- `frontend/packages/proto/src/generated`
-Example import of inventory:
+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 +57,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) => {
+// /* ... */
+// });
+```
diff --git a/proto/builds/v1/builds.proto b/proto/builds/v1/builds.proto
new file mode 100644
index 0000000000..7d62de0af7
--- /dev/null
+++ b/proto/builds/v1/builds.proto
@@ -0,0 +1,49 @@
+syntax = "proto3";
+
+package spotify.backstage.builds.v1;
+
+option go_package = "buildsv1";
+
+service Builds {
+ rpc ListBuilds(ListBuildsRequest) returns (ListBuildsReply);
+ rpc GetBuild(GetBuildRequest) returns (GetBuildReply);
+}
+
+message ListBuildsRequest {
+ string entity_uri = 1;
+}
+
+message ListBuildsReply {
+ string entity_uri = 1;
+ repeated Build builds = 2;
+}
+
+message GetBuildRequest {
+ string build_uri = 1;
+}
+
+message GetBuildReply {
+ Build build = 1;
+ BuildDetails details = 2;
+}
+
+message Build {
+ string uri = 1;
+ string commit_id = 2;
+ string message = 3;
+ BuildStatus status = 4;
+}
+
+message BuildDetails {
+ string author = 1;
+ string overview_url = 2;
+ string log_url = 3;
+}
+
+enum BuildStatus {
+ NULL = 0;
+ SUCCESS = 1;
+ FAILURE = 2;
+ PENDING = 3;
+ RUNNING = 4;
+}
diff --git a/proto/inventory/v1/inventory.proto b/proto/inventory/v1/inventory.proto
index 0b3f9f4131..1994a3fe01 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 {
@@ -27,6 +29,25 @@ message CreateEntityReply {
Entity entity = 1;
}
+message SetFactRequest {
+ string entityUri = 1;
+ string name = 2;
+ string value = 3;
+}
+
+message SetFactReply {
+ Fact fact = 1;
+}
+
+message GetFactRequest {
+ string entityUri = 1;
+ string name = 2;
+}
+
+message GetFactReply {
+ Fact fact = 1;
+}
+
message Entity {
string uri = 1;
}
@@ -34,4 +55,4 @@ message Entity {
message Fact {
string name = 1;
string value = 2;
-}
+}
\ No newline at end of file
diff --git a/proto/prototool.yaml b/proto/prototool.yaml
index 458431a36c..cb8503583d 100644
--- a/proto/prototool.yaml
+++ b/proto/prototool.yaml
@@ -1,4 +1,3 @@
-
protoc:
version: 3.8.0
lint:
@@ -16,3 +15,9 @@ generate:
type: go
flags: plugins=grpc
output: ../backend/proto
+ - name: js
+ flags: import_style=commonjs
+ output: ../frontend/packages/proto/src/generated
+ - name: grpc-web
+ flags: import_style=commonjs+dts,mode=grpcwebtext
+ output: ../frontend/packages/proto/src/generated