From 94378326169e81e994b36f9b2b47249289c82fa9 Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 29 May 2020 00:11:29 +0200 Subject: [PATCH 001/192] feat(core-api/UserSettings): Ported across the UserSettings API from internal and convert to ts --- .../src/apis/definitions/UserSettingsApi.ts | 78 +++++++++++++++ .../core-api/src/apis/definitions/index.ts | 1 + .../implementations/UserSettingsApi/index.ts | 97 +++++++++++++++++++ 3 files changed, 176 insertions(+) create mode 100644 packages/core-api/src/apis/definitions/UserSettingsApi.ts create mode 100644 packages/core-api/src/apis/implementations/UserSettingsApi/index.ts diff --git a/packages/core-api/src/apis/definitions/UserSettingsApi.ts b/packages/core-api/src/apis/definitions/UserSettingsApi.ts new file mode 100644 index 0000000000..62045e0e51 --- /dev/null +++ b/packages/core-api/src/apis/definitions/UserSettingsApi.ts @@ -0,0 +1,78 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { createApiRef } from '../ApiRef'; + +type setValue = (value: T | null) => void; +type removeValue = () => void; +export type UserSettingsApi = { + /** + * Get persistent data. + * + * TODO: Replace with something less volatile than LocalStorage + * + * @param {String} storeName Name of the store. + * @param {String?} key (Optional) Unique key associated with the data. + * If not key is specified,the whole store is returned. + * @param {String} key (Optional) Empty value to return if there is not data. + * @return {Object} data The data that should is stored. + */ + getFromStore( + storeName: string, + key: string, + defaultValue: T | null, + ): T | null; + /** + * Remove persistent data. + * + * TODO: Replace with something less volatile than LocalStorage + * + * @param {String} storeName Name of the store. + * @param {String} key Unique key associated with the data. + */ + removeFromStore(storeName: string, key: string): void; + + /** + * Save persistent data. + * + * TODO: Replace with something less volatile than LocalStorage + * + * @param {String} storeName Name of the store. + * @param {String} key Unique key associated with the data. + * @param {Object} data The data that should be stored. + */ + saveToStore(storeName: string, key: string, data: any): void; + + /** + * React hook that observes a single store value and provides functions for updating the value. + * + * @param {String} storeName Name of the store. + * @param {String} key Unique key associated with the data. + * @return {[value, setValue(value), removeValue()]} An array to be deconstructed, + * The first element is the value, the second is a function to call to update the value, + * and the third is a function to call to clear the value. + */ + useStoreValue( + storeName: string, + key: string, + ): [T | null, setValue, removeValue]; +}; + +export const userSettingsApiRef = createApiRef({ + id: 'core.user.settings', + description: + 'Provides the ability to modify settings that are personalised to the user', +}); diff --git a/packages/core-api/src/apis/definitions/index.ts b/packages/core-api/src/apis/definitions/index.ts index 2e008965cd..0acef2abb4 100644 --- a/packages/core-api/src/apis/definitions/index.ts +++ b/packages/core-api/src/apis/definitions/index.ts @@ -27,3 +27,4 @@ export * from './AppThemeApi'; export * from './ErrorApi'; export * from './FeatureFlagsApi'; export * from './OAuthRequestApi'; +export * from './UserSettingsApi'; diff --git a/packages/core-api/src/apis/implementations/UserSettingsApi/index.ts b/packages/core-api/src/apis/implementations/UserSettingsApi/index.ts new file mode 100644 index 0000000000..8d73202414 --- /dev/null +++ b/packages/core-api/src/apis/implementations/UserSettingsApi/index.ts @@ -0,0 +1,97 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { useState, useEffect } from 'react'; +import { UserSettingsApi } from '../../definitions'; + +export class UserSettings implements UserSettingsApi { + getFromStore( + storeName: string, + key: string = '', + defaultValue: T | null, + ): T | null { + let store; + try { + store = JSON.parse(localStorage.getItem(storeName)!) || {}; + } catch (e) { + window.console.error( + `Error when parsing JSON config from storage for: ${storeName}`, + ); + return defaultValue as T; + } + + if (key) { + return (store[key] ?? defaultValue) as T; + } + return store as T; + } + + saveToStore(storeName: string, key: string, data: any): void { + const store = JSON.parse(localStorage.getItem(storeName)!) || {}; + store[key] = data; + localStorage.setItem(storeName, JSON.stringify(store)); + } + + removeFromStore(storeName: string, key: string): void { + const store = JSON.parse(localStorage.getItem(storeName)!) || {}; + delete store[key]; + localStorage.setItem(storeName, JSON.stringify(store)); + } + + useStoreValue( + storeName: string, + key: string, + ): [T | null, (value: T | null) => void, () => void] { + // We hardcode the emptyValue to null, since allowing objects or arrays would make + // the useEffect params a lot more complex and it would easy to get stuck in a loop. + const [value, setValue] = useState(() => + this.getFromStore(storeName, key, null), + ); + + // Listen to storage change events from other tabs + useEffect(() => { + const onChange = (event: StorageEvent) => { + if (event.key === storeName) { + // Avoid sending unnecessary updates when only the reference changes because of JSON.parse + setValue((currentValue: T | null) => { + const newValue = this.getFromStore(storeName, key, null); + + // Fastest way to do a deep equals, since we know references will differ, + // the values are serializable, and it's ok to signal a change if key order changes. + if (JSON.stringify(currentValue) === JSON.stringify(newValue)) { + return currentValue; + } + return newValue; + }); + } + }; + + window.addEventListener('storage', onChange); + return () => window.removeEventListener('storage', onChange); + }, [storeName, key]); + + const saveValue = (newValue: T | null) => { + this.saveToStore(storeName, key, newValue); + setValue(this.getFromStore(storeName, key, null)); + }; + + const removeValue = () => { + this.removeFromStore(storeName, key); + setValue(null); + }; + + return [value, saveValue, removeValue]; + } +} From 1312d34147af604355117ee85ed913e7a9460092 Mon Sep 17 00:00:00 2001 From: Marc Bruggmann Date: Fri, 29 May 2020 10:23:01 +0200 Subject: [PATCH 002/192] ADR: Core entities in the catalog This is capturing the catalog part of the Backstage System Model RFC (#390). I'm planning to follow this up with a second ADR on how to express System, Application and Domain in catalog labels. Not sure if it helps to have the example yamls inline here. It helps me to visualize how it'd work, but it could also get outdated quickly. --- .../adr005-catalog-core-entities.md | 75 ++++++++++++++++++ .../catalog-core-entities.png | Bin 0 -> 14895 bytes 2 files changed, 75 insertions(+) create mode 100644 docs/architecture-decisions/adr005-catalog-core-entities.md create mode 100644 docs/architecture-decisions/catalog-core-entities.png diff --git a/docs/architecture-decisions/adr005-catalog-core-entities.md b/docs/architecture-decisions/adr005-catalog-core-entities.md new file mode 100644 index 0000000000..f14f8c8179 --- /dev/null +++ b/docs/architecture-decisions/adr005-catalog-core-entities.md @@ -0,0 +1,75 @@ +# ADR005: Catalog Core Entities + +| Created | Status | +| ---------- | ------ | +| 2020-05-29 | Open | + +## Context + +We want to standardize on a few core entities that we are tracking in the Backstage catalog. This allows us to build specific plugins around them. + +## Decision + +We maintain a catalog of the following core entities: + +* **Components** are individual pieces of software +* **APIs** are the boundaries between different components +* **Resources** are physical or virtual infrastructure needed to operate a component + +![Catalog Core Entities][catalog-core-entities] + +### Component +A component is a piece of software, for example a mobile application feature, web site, backend service or data pipeline (list not exhaustive). A component can be tracked in source control, or use some existing open source or commercial software. It can implement APIs for other components to consume. In turn it might depend on APIs implemented by other components, or resources that are attached to it at runtime. + +Component entities are typically defined in YAML descriptor files next to the code of the component, and could look like this (actual schema will evolve): +```yaml +apiVersion: backstage.io/v1beta1 +kind: Component +metadata: + name: my-component-name +spec: + type: service +``` + +### API +APIs form an abstraction that allows large software ecosystems to scale. Thus, APIs are a first class citizen in the Backstage model and the primary way to discover existing functionality in the ecosystem. + +APIs are implemented by components and make their boundaries explicit. They might be defined using an RPC IDL (eg in Protobuf, GraphQL or similar), a data schema (eg in Avro, TFRecord or similar), or as code interfaces (eg framework APIs in Swift, Kotlin, Java, C++, Typescript etc). In any case, APIs exposed by components need to be in a known machine-readable format so we can build further tooling and analysis on top. + +APIs are typically indexed from existing definitions in source control and thus wouldn't need their own descriptor files, but would be stored in the catalog somewhat like this (actual schema will evolve): +```yaml +apiVersion: backstage.io/v1beta1 +kind: API +metadata: + name: my-component-api +spec: + type: grpc + definition: > + service HelloService { + rpc SayHello (HelloRequest) returns (HelloResponse); + } + message HelloRequest { + string greeting = 1; + } + message HelloResponse { + string reply = 1; + } +``` + +### Resource +Resources are the infrastructure your software needs to operate at runtime like Bigtable databases, Pub/Sub topics, S3 buckets or CDNs. Modelling them together with components and APIs will allow us to visualize and create tooling around them in Backstage. + +Resources are typically indexed from declarative definitions (eg Terraform, GCP Config Connector, AWS Cloud Formation) and/or inventories from cloud providers (eg GCP Asset Inventory) and thus wouldn't need their own descriptor files, but would be stored in the catalog somewhat like this (actual schema will evolve): +```yaml +apiVersion: backstage.io/v1beta1 +kind: Resource +metadata: + name: my-component-db +spec: + type: gcp-spanner + url: spanner.googleapis.com/projects/prj/instances/my-component-db/databases/my-db +``` + +## Consequences + +We will start with fleshing out support for the Component entity in the catalog, and expand to APIs and Resources later down the line. diff --git a/docs/architecture-decisions/catalog-core-entities.png b/docs/architecture-decisions/catalog-core-entities.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c7cb4575e3426d298753c9bb626e45ca035e60 GIT binary patch literal 14895 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 Date: Fri, 29 May 2020 13:11:06 +0200 Subject: [PATCH 003/192] feat(core-api/Storage): Reworking the StorageApi to have a better interface --- .../{UserSettingsApi.ts => StorageApi.ts} | 57 ++++++----- .../core-api/src/apis/definitions/index.ts | 2 +- .../implementations/StorageApi/WebStorage.ts | 51 ++++++++++ .../apis/implementations/StorageApi/index.ts | 17 ++++ .../implementations/UserSettingsApi/index.ts | 97 ------------------- 5 files changed, 104 insertions(+), 120 deletions(-) rename packages/core-api/src/apis/definitions/{UserSettingsApi.ts => StorageApi.ts} (59%) create mode 100644 packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts create mode 100644 packages/core-api/src/apis/implementations/StorageApi/index.ts delete mode 100644 packages/core-api/src/apis/implementations/UserSettingsApi/index.ts diff --git a/packages/core-api/src/apis/definitions/UserSettingsApi.ts b/packages/core-api/src/apis/definitions/StorageApi.ts similarity index 59% rename from packages/core-api/src/apis/definitions/UserSettingsApi.ts rename to packages/core-api/src/apis/definitions/StorageApi.ts index 62045e0e51..0cb5ccc14d 100644 --- a/packages/core-api/src/apis/definitions/UserSettingsApi.ts +++ b/packages/core-api/src/apis/definitions/StorageApi.ts @@ -16,14 +16,22 @@ import { createApiRef } from '../ApiRef'; -type setValue = (value: T | null) => void; -type removeValue = () => void; -export type UserSettingsApi = { +type UnsubscribeFromStore = () => void; +type SubscribeToStoreHandler = ({ + storeName, + key, + oldValue, + newValue, +}: { + storeName: string; + key: string; + oldValue?: T; + newValue?: T; +}) => void; + +export type StorageApi = { /** * Get persistent data. - * - * TODO: Replace with something less volatile than LocalStorage - * * @param {String} storeName Name of the store. * @param {String?} key (Optional) Unique key associated with the data. * If not key is specified,the whole store is returned. @@ -33,45 +41,50 @@ export type UserSettingsApi = { getFromStore( storeName: string, key: string, - defaultValue: T | null, - ): T | null; + defaultValue?: T, + ): Promise; + /** * Remove persistent data. * - * TODO: Replace with something less volatile than LocalStorage - * * @param {String} storeName Name of the store. * @param {String} key Unique key associated with the data. */ - removeFromStore(storeName: string, key: string): void; + removeFromStore(storeName: string, key: string): Promise; /** - * Save persistent data. - * - * TODO: Replace with something less volatile than LocalStorage + * Save persiswtent data. * * @param {String} storeName Name of the store. * @param {String} key Unique key associated with the data. * @param {Object} data The data that should be stored. */ - saveToStore(storeName: string, key: string, data: any): void; + saveToStore(storeName: string, key: string, data: any): Promise; /** - * React hook that observes a single store value and provides functions for updating the value. + * Callback for Changes in the store + * @callback subscribeHandler + * @param {String} storeName Name of the store. + * @param {String} key Unique key associated with the data. + * @param {Object} oldValue The old value that was in the store. + * @param {Object} newValue The new value that has been set in the store. + */ + /** + * Subscribe to Key changes in a store and get the new and old value * * @param {String} storeName Name of the store. * @param {String} key Unique key associated with the data. - * @return {[value, setValue(value), removeValue()]} An array to be deconstructed, - * The first element is the value, the second is a function to call to update the value, - * and the third is a function to call to clear the value. + * @param {subscribeHandler} handler Handler which is called with the old value and new value in the store. + * @returns {Function} Unsubscribe to changes in the store. */ - useStoreValue( + subscribeToChange( storeName: string, key: string, - ): [T | null, setValue, removeValue]; + handler: SubscribeToStoreHandler, + ): UnsubscribeFromStore; }; -export const userSettingsApiRef = createApiRef({ +export const storageApiRef = createApiRef({ id: 'core.user.settings', description: 'Provides the ability to modify settings that are personalised to the user', diff --git a/packages/core-api/src/apis/definitions/index.ts b/packages/core-api/src/apis/definitions/index.ts index 0acef2abb4..475dba9189 100644 --- a/packages/core-api/src/apis/definitions/index.ts +++ b/packages/core-api/src/apis/definitions/index.ts @@ -27,4 +27,4 @@ export * from './AppThemeApi'; export * from './ErrorApi'; export * from './FeatureFlagsApi'; export * from './OAuthRequestApi'; -export * from './UserSettingsApi'; +export * from './StorageApi'; diff --git a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts new file mode 100644 index 0000000000..c48a1ee931 --- /dev/null +++ b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts @@ -0,0 +1,51 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { StorageApi } from '../../definitions'; + +export class WebStorage implements StorageApi { + async getFromStore( + storeName: string, + key: string = '', + defaultValue?: T, + ): Promise { + let store; + try { + store = JSON.parse(localStorage.getItem(storeName)!) || {}; + } catch (e) { + window.console.error( + `Error when parsing JSON config from storage for: ${storeName}`, + ); + return defaultValue; + } + + if (key) { + return store[key] ?? defaultValue; + } + return store; + } + + async saveToStore(storeName: string, key: string, data: any): Promise { + const store = JSON.parse(localStorage.getItem(storeName)!) || {}; + store[key] = data; + localStorage.setItem(storeName, JSON.stringify(store)); + } + + async removeFromStore(storeName: string, key: string): Promise { + const store = JSON.parse(localStorage.getItem(storeName)!) || {}; + delete store[key]; + localStorage.setItem(storeName, JSON.stringify(store)); + } +} diff --git a/packages/core-api/src/apis/implementations/StorageApi/index.ts b/packages/core-api/src/apis/implementations/StorageApi/index.ts new file mode 100644 index 0000000000..33b0094551 --- /dev/null +++ b/packages/core-api/src/apis/implementations/StorageApi/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { WebStorage } from './WebStorage'; diff --git a/packages/core-api/src/apis/implementations/UserSettingsApi/index.ts b/packages/core-api/src/apis/implementations/UserSettingsApi/index.ts deleted file mode 100644 index 8d73202414..0000000000 --- a/packages/core-api/src/apis/implementations/UserSettingsApi/index.ts +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { useState, useEffect } from 'react'; -import { UserSettingsApi } from '../../definitions'; - -export class UserSettings implements UserSettingsApi { - getFromStore( - storeName: string, - key: string = '', - defaultValue: T | null, - ): T | null { - let store; - try { - store = JSON.parse(localStorage.getItem(storeName)!) || {}; - } catch (e) { - window.console.error( - `Error when parsing JSON config from storage for: ${storeName}`, - ); - return defaultValue as T; - } - - if (key) { - return (store[key] ?? defaultValue) as T; - } - return store as T; - } - - saveToStore(storeName: string, key: string, data: any): void { - const store = JSON.parse(localStorage.getItem(storeName)!) || {}; - store[key] = data; - localStorage.setItem(storeName, JSON.stringify(store)); - } - - removeFromStore(storeName: string, key: string): void { - const store = JSON.parse(localStorage.getItem(storeName)!) || {}; - delete store[key]; - localStorage.setItem(storeName, JSON.stringify(store)); - } - - useStoreValue( - storeName: string, - key: string, - ): [T | null, (value: T | null) => void, () => void] { - // We hardcode the emptyValue to null, since allowing objects or arrays would make - // the useEffect params a lot more complex and it would easy to get stuck in a loop. - const [value, setValue] = useState(() => - this.getFromStore(storeName, key, null), - ); - - // Listen to storage change events from other tabs - useEffect(() => { - const onChange = (event: StorageEvent) => { - if (event.key === storeName) { - // Avoid sending unnecessary updates when only the reference changes because of JSON.parse - setValue((currentValue: T | null) => { - const newValue = this.getFromStore(storeName, key, null); - - // Fastest way to do a deep equals, since we know references will differ, - // the values are serializable, and it's ok to signal a change if key order changes. - if (JSON.stringify(currentValue) === JSON.stringify(newValue)) { - return currentValue; - } - return newValue; - }); - } - }; - - window.addEventListener('storage', onChange); - return () => window.removeEventListener('storage', onChange); - }, [storeName, key]); - - const saveValue = (newValue: T | null) => { - this.saveToStore(storeName, key, newValue); - setValue(this.getFromStore(storeName, key, null)); - }; - - const removeValue = () => { - this.removeFromStore(storeName, key); - setValue(null); - }; - - return [value, saveValue, removeValue]; - } -} From cef8abb5c4ba652c73bdb1e2545b13af9967ac2d Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Fri, 29 May 2020 14:48:12 +0200 Subject: [PATCH 004/192] add register button, addLocation api Co-authored-by: Nikita Dudnik Co-authored-by: Ben Lambert --- packages/app/package.json | 4 ++-- packages/backend/src/index.ts | 12 ++++++------ plugins/catalog/src/api/CatalogClient.ts | 17 +++++++++++++++++ .../src/components/ScaffolderPage/index.tsx | 14 ++++++++++++-- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index ed2f547ad7..0af25d6f3a 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -73,10 +73,10 @@ } }, "/catalog/api": { - "target": "http://localhost:3003", + "target": "http://localhost:7000", "changeOrigin": true, "pathRewrite": { - "^/catalog/api/": "/" + "^/catalog/api/": "/catalog/" } } } diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 5b1fc54330..a6299ca829 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -70,12 +70,12 @@ async function main() { app.use(requestLoggingHandler()); app.use('/catalog', await catalog(createEnv('catalog'))); app.use('/scaffolder', await scaffolder(createEnv('scaffolder'))); - app.use( - '/sentry', - await sentry(getRootLogger().child({ type: 'plugin', plugin: 'sentry' })), - ); - app.use('/auth', await auth(createEnv('auth'))); - app.use('/identity', await identity(createEnv('identity'))); + // app.use( + // '/sentry', + // await sentry(getRootLogger().child({ type: 'plugin', plugin: 'sentry' })), + // ); + // app.use('/auth', await auth(createEnv('auth'))); + // app.use('/identity', await identity(createEnv('identity'))); app.use(notFoundHandler()); app.use(errorHandler()); diff --git a/plugins/catalog/src/api/CatalogClient.ts b/plugins/catalog/src/api/CatalogClient.ts index 42ef1c4da5..7449ce2f2c 100644 --- a/plugins/catalog/src/api/CatalogClient.ts +++ b/plugins/catalog/src/api/CatalogClient.ts @@ -16,6 +16,7 @@ import { CatalogApi } from './types'; import { DescriptorEnvelope } from '../types'; +import {} from '@backstage/catalog-model'; export class CatalogClient implements CatalogApi { private apiOrigin: string; @@ -42,4 +43,20 @@ export class CatalogClient implements CatalogApi { if (entity) return entity; throw new Error(`'Entity not found: ${name}`); } + + async addLocation(type: string, target: string): Promise<{}> { + const response = await fetch( + `${this.apiOrigin}${this.basePath}/locations`, + { + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + body: JSON.stringify({ type, target }), + }, + ); + const location = await response.json(); + if (location) return location; + throw new Error(`'Location wasn't added: ${target}`); + } } diff --git a/plugins/scaffolder/src/components/ScaffolderPage/index.tsx b/plugins/scaffolder/src/components/ScaffolderPage/index.tsx index e6fed50cef..59eb6cff43 100644 --- a/plugins/scaffolder/src/components/ScaffolderPage/index.tsx +++ b/plugins/scaffolder/src/components/ScaffolderPage/index.tsx @@ -24,7 +24,8 @@ import { Page, pageTheme, } from '@backstage/core'; -import { Typography, Link } from '@material-ui/core'; +import { Typography, Link, Button } from '@material-ui/core'; +import { Link as RouterLink } from 'react-router-dom'; // TODO(blam): Connect to backend const STATIC_DATA = [ @@ -49,7 +50,16 @@ const ScaffolderPage: React.FC<{}> = () => { subtitle="Create new software components using standard templates" /> - + + + NOTE! This feature is WIP. You can follow progress{' '} From 304c544af51a746b52391a3bdf94da3098620177 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Fri, 29 May 2020 14:59:59 +0200 Subject: [PATCH 005/192] Posting addLocation --- plugins/catalog/src/api/CatalogClient.ts | 2 +- .../RegisterComponentPage.tsx | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/plugins/catalog/src/api/CatalogClient.ts b/plugins/catalog/src/api/CatalogClient.ts index 7449ce2f2c..94ee9aa4b3 100644 --- a/plugins/catalog/src/api/CatalogClient.ts +++ b/plugins/catalog/src/api/CatalogClient.ts @@ -16,7 +16,6 @@ import { CatalogApi } from './types'; import { DescriptorEnvelope } from '../types'; -import {} from '@backstage/catalog-model'; export class CatalogClient implements CatalogApi { private apiOrigin: string; @@ -44,6 +43,7 @@ export class CatalogClient implements CatalogApi { throw new Error(`'Entity not found: ${name}`); } + // TODO: Types for the type param async addLocation(type: string, target: string): Promise<{}> { const response = await fetch( `${this.apiOrigin}${this.basePath}/locations`, diff --git a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx index 114c37fe4c..33029a012d 100644 --- a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx +++ b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx @@ -23,22 +23,23 @@ import { Content, ContentHeader, SupportButton, + useApi, } from '@backstage/core'; import RegisterComponentForm from '../RegisterComponentForm'; +import { catalogApiRef } from '@backstage/plugin-catalog'; const RegisterComponentPage: FC<{}> = () => { + const catalogApi = useApi(catalogApiRef); const [isSubmitting, setIsSubmitting] = useState(false); - useEffect(() => { - if (isSubmitting) { - setTimeout(() => { - setIsSubmitting(false); - }, 4000); - } - }, [isSubmitting]); - - const onSubmit = () => { + const onSubmit = async (formData: { componentIdInput: string }) => { setIsSubmitting(true); + + const { componentIdInput: target } = formData; + + const location = await catalogApi.addLocation('github', target); + + setIsSubmitting(false); }; return ( From 7a665c3c2b4b18bb1c4f5ed747058a98a5fd8533 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Fri, 29 May 2020 15:16:10 +0200 Subject: [PATCH 006/192] Add github as an auth provider to the backend --- plugins/auth-backend/package.json | 14 ++-- plugins/auth-backend/src/providers/config.ts | 8 ++ .../auth-backend/src/providers/factories.ts | 2 + .../src/providers/github/index.ts | 17 ++++ .../src/providers/github/provider.ts | 84 +++++++++++++++++++ yarn.lock | 33 ++++---- 6 files changed, 137 insertions(+), 21 deletions(-) create mode 100644 plugins/auth-backend/src/providers/github/index.ts create mode 100644 plugins/auth-backend/src/providers/github/provider.ts diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 9cb8017f15..505240853d 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -16,21 +16,23 @@ }, "dependencies": { "@backstage/backend-common": "^0.1.1-alpha.6", + "@types/cookie-parser": "^1.4.2", + "@types/passport": "^1.0.3", + "@types/passport-github2": "^1.2.4", + "@types/passport-google-oauth20": "^2.0.3", "compression": "^1.7.4", + "cookie-parser": "^1.4.5", "cors": "^2.8.5", "express": "^4.17.1", "express-promise-router": "^3.0.3", "fs-extra": "^9.0.0", "helmet": "^3.22.0", "morgan": "^1.10.0", - "winston": "^3.2.1", - "yn": "^4.0.0", "passport": "^0.4.1", + "passport-github2": "^0.1.12", "passport-google-oauth20": "^2.0.0", - "cookie-parser": "^1.4.5", - "@types/passport": "^1.0.3", - "@types/passport-google-oauth20": "^2.0.3", - "@types/cookie-parser": "^1.4.2" + "winston": "^3.2.1", + "yn": "^4.0.0" }, "devDependencies": { "@backstage/cli": "^0.1.1-alpha.6", diff --git a/plugins/auth-backend/src/providers/config.ts b/plugins/auth-backend/src/providers/config.ts index 45098afb89..dad87e0448 100644 --- a/plugins/auth-backend/src/providers/config.ts +++ b/plugins/auth-backend/src/providers/config.ts @@ -23,4 +23,12 @@ export const providers = [ callbackURL: 'http://localhost:7000/auth/google/handler/frame', }, }, + { + provider: 'github', + options: { + clientID: process.env.AUTH_GITHUB_CLIENT_ID!, + clientSecret: process.env.AUTH_GITHUB_CLIENT_SECRET!, + callbackURL: 'http://localhost:7000/auth/github/handler/frame', + }, + }, ]; diff --git a/plugins/auth-backend/src/providers/factories.ts b/plugins/auth-backend/src/providers/factories.ts index 0a1e639082..10e4153714 100644 --- a/plugins/auth-backend/src/providers/factories.ts +++ b/plugins/auth-backend/src/providers/factories.ts @@ -16,10 +16,12 @@ import { AuthProviderFactories, AuthProviderFactory } from './types'; import { GoogleAuthProvider } from './google'; +import { GithubAuthProvider } from './github'; export class ProviderFactories { private static readonly providerFactories: AuthProviderFactories = { google: GoogleAuthProvider, + github: GithubAuthProvider, }; public static getProviderFactory(providerId: string): AuthProviderFactory { diff --git a/plugins/auth-backend/src/providers/github/index.ts b/plugins/auth-backend/src/providers/github/index.ts new file mode 100644 index 0000000000..c3a48d35e0 --- /dev/null +++ b/plugins/auth-backend/src/providers/github/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { GithubAuthProvider } from './provider'; diff --git a/plugins/auth-backend/src/providers/github/provider.ts b/plugins/auth-backend/src/providers/github/provider.ts new file mode 100644 index 0000000000..1e8022e1cc --- /dev/null +++ b/plugins/auth-backend/src/providers/github/provider.ts @@ -0,0 +1,84 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import express from 'express'; +import { Strategy as GithubStrategy } from 'passport-github2'; +import { + executeFrameHandlerStrategy, + executeRedirectStrategy, + executeRefreshTokenStrategy, +} from '../PassportStrategyHelper'; +import { + OAuthProviderHandlers, + AuthProviderConfig, + RedirectInfo, + AuthInfoBase, + AuthInfoPrivate, +} from '../types'; + +export class GithubAuthProvider implements OAuthProviderHandlers { + private readonly providerConfig: AuthProviderConfig; + private readonly _strategy: GithubStrategy; + + constructor(providerConfig: AuthProviderConfig) { + this.providerConfig = providerConfig; + this._strategy = new GithubStrategy( + { ...this.providerConfig.options }, + ( + accessToken: any, + refreshToken: any, + params: any, + profile: any, + done: any, + ) => { + done( + undefined, + { + profile, + accessToken, + scope: 'user', // params.scope is an empty string here for some reason, so hardcoding for now + expiresInSeconds: params.expires_in, + }, + { refreshToken }, + ); + }, + ); + } + + async start(req: express.Request, options: any): Promise { + return await executeRedirectStrategy(req, this._strategy, options); + } + + async handler( + req: express.Request, + ): Promise<{ user: AuthInfoBase; info: AuthInfoPrivate }> { + return await executeFrameHandlerStrategy(req, this._strategy); + } + + async refresh(refreshToken: string, scope: string): Promise { + const { accessToken, params } = await executeRefreshTokenStrategy( + this._strategy, + refreshToken, + scope, + ); + + return { + accessToken, + expiresInSeconds: params.expires_in, + scope: params.scope, + }; + } +} diff --git a/yarn.lock b/yarn.lock index 8439f5b0b9..30537a6cac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4281,6 +4281,15 @@ resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/passport-github2@^1.2.4": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/passport-github2/-/passport-github2-1.2.4.tgz#f56c386d1fe6435e359430e57adc1747a627bd86" + integrity sha512-dtGtA0Uyzk6ne3SrgQi/I1ClClLE3i7JmSiMaJgkGH8v1nbE9JdBpG7QWJ1XPlLdcf7EvoPdHmkWN2+Kln9y8g== + dependencies: + "@types/express" "*" + "@types/passport" "*" + "@types/passport-oauth2" "*" + "@types/passport-google-oauth20@^2.0.3": version "2.0.3" resolved "https://registry.npmjs.org/@types/passport-google-oauth20/-/passport-google-oauth20-2.0.3.tgz#f554ff6d39f395acff3f1d762e54462194dac8da" @@ -4290,15 +4299,7 @@ "@types/passport" "*" "@types/passport-oauth2" "*" -"@types/passport-oauth2-refresh@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@types/passport-oauth2-refresh/-/passport-oauth2-refresh-1.1.1.tgz#cbe466d4fcac36182fd75bf55279c0b1e953c382" - integrity sha512-Tw0JvfDPv9asgFPACd9oOGCaD/0/Uyi+QF7fmrJC74cJKC6I8N8wwhJJHyfd1N2E/qaLgTh431lhOa9jicpNdg== - dependencies: - "@types/oauth" "*" - "@types/passport-oauth2" "*" - -"@types/passport-oauth2@*", "@types/passport-oauth2@^1.4.9": +"@types/passport-oauth2@*": version "1.4.9" resolved "https://registry.npmjs.org/@types/passport-oauth2/-/passport-oauth2-1.4.9.tgz#134007c4b505a82548c9cb19094c5baeb2205c92" integrity sha512-QP0q+NVQOaIu2r0e10QWkiUA0Ya5mOBHRJN0UrI+LolMLOP1/VN4EVIpJ3xVwFo+xqNFRoFvFwJhBvKnk7kpUA== @@ -16103,6 +16104,13 @@ pascalcase@^0.1.1: resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +passport-github2@^0.1.12: + version "0.1.12" + resolved "https://registry.npmjs.org/passport-github2/-/passport-github2-0.1.12.tgz#a72ebff4fa52a35bc2c71122dcf470d1116f772c" + integrity sha512-3nPUCc7ttF/3HSP/k9sAXjz3SkGv5Nki84I05kSQPo01Jqq1NzJACgMblCK0fGcv9pKCG/KXU3AJRDGLqHLoIw== + dependencies: + passport-oauth2 "1.x.x" + passport-google-oauth20@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz#0d241b2d21ebd3dc7f2b60669ec4d587e3a674ef" @@ -16110,12 +16118,7 @@ passport-google-oauth20@^2.0.0: dependencies: passport-oauth2 "1.x.x" -passport-oauth2-refresh@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/passport-oauth2-refresh/-/passport-oauth2-refresh-2.0.0.tgz#7b19c77ff3cc000819c69f6ad9e318450f57b85e" - integrity sha512-yXvCB6nem/O+WThhiyI3TlPXpzSGY+9+hy9OTx9QF8e9GInplyRHxHaaOhFylKvnof9UmWHAufQFZk8cO1Fb2g== - -passport-oauth2@1.x.x, passport-oauth2@^1.5.0: +passport-oauth2@1.x.x: version "1.5.0" resolved "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.5.0.tgz#64babbb54ac46a4dcab35e7f266ed5294e3c4108" integrity sha512-kqBt6vR/5VlCK8iCx1/KpY42kQ+NEHZwsSyt4Y6STiNjU+wWICG1i8ucc1FapXDGO15C5O5VZz7+7vRzrDPXXQ== From d3055d432162a17d06bc97a37d6fcab3053e6e67 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Fri, 29 May 2020 15:24:38 +0200 Subject: [PATCH 007/192] Add github to auth api --- packages/app/src/apis.ts | 11 ++ .../auth/github/GithubAuth.test.ts | 31 +++++ .../implementations/auth/github/GithubAuth.ts | 118 ++++++++++++++++++ .../apis/implementations/auth/github/index.ts | 18 +++ .../apis/implementations/auth/github/types.ts | 21 ++++ .../src/apis/implementations/auth/index.ts | 1 + 6 files changed, 200 insertions(+) create mode 100644 packages/core-api/src/apis/implementations/auth/github/GithubAuth.test.ts create mode 100644 packages/core-api/src/apis/implementations/auth/github/GithubAuth.ts create mode 100644 packages/core-api/src/apis/implementations/auth/github/index.ts create mode 100644 packages/core-api/src/apis/implementations/auth/github/types.ts diff --git a/packages/app/src/apis.ts b/packages/app/src/apis.ts index 8d76c75d91..d6658c891c 100644 --- a/packages/app/src/apis.ts +++ b/packages/app/src/apis.ts @@ -25,9 +25,11 @@ import { featureFlagsApiRef, FeatureFlags, GoogleAuth, + GithubAuth, oauthRequestApiRef, OAuthRequestManager, googleAuthApiRef, + githubAuthApiRef, } from '@backstage/core'; import { @@ -63,6 +65,15 @@ builder.add( }), ); +builder.add( + githubAuthApiRef, + GithubAuth.create({ + apiOrigin: 'http://localhost:7000', + basePath: '/auth/', + oauthRequestApi, + }), +); + builder.add( techRadarApiRef, new TechRadar({ diff --git a/packages/core-api/src/apis/implementations/auth/github/GithubAuth.test.ts b/packages/core-api/src/apis/implementations/auth/github/GithubAuth.test.ts new file mode 100644 index 0000000000..3d3da266fc --- /dev/null +++ b/packages/core-api/src/apis/implementations/auth/github/GithubAuth.test.ts @@ -0,0 +1,31 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import GithubAuth from './GithubAuth'; + +const theFuture = new Date(Date.now() + 3600000); + +describe('GithubAuth', () => { + it('should get refreshed access token', async () => { + const getSession = jest + .fn() + .mockResolvedValue({ accessToken: 'access-token', expiresAt: theFuture }); + const githubAuth = new GithubAuth({ getSession } as any); + + expect(await githubAuth.getAccessToken()).toBe('access-token'); + expect(getSession).toBeCalledTimes(1); + }); +}); diff --git a/packages/core-api/src/apis/implementations/auth/github/GithubAuth.ts b/packages/core-api/src/apis/implementations/auth/github/GithubAuth.ts new file mode 100644 index 0000000000..d20eaa54cb --- /dev/null +++ b/packages/core-api/src/apis/implementations/auth/github/GithubAuth.ts @@ -0,0 +1,118 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import GithubIcon from '@material-ui/icons/AcUnit'; +import { DefaultAuthConnector } from '../../../../lib/AuthConnector'; +import { GithubSession } from './types'; +import { OAuthApi, AccessTokenOptions } from '../../../definitions/auth'; +import { OAuthRequestApi, AuthProvider } from '../../../definitions'; +import { SessionManager } from '../../../../lib/AuthSessionManager/types'; +import { RefreshingAuthSessionManager } from '../../../../lib/AuthSessionManager'; + +type CreateOptions = { + // TODO(Rugvip): These two should be grabbed from global config when available, they're not unique to GithubAuth + apiOrigin: string; + basePath: string; + + oauthRequestApi: OAuthRequestApi; + + environment?: string; + provider?: AuthProvider & { id: string }; +}; + +export type GithubAuthResponse = { + accessToken: string; + idToken: string; + scope: string; + expiresInSeconds: number; +}; + +const DEFAULT_PROVIDER = { + id: 'github', + title: 'Github', + icon: GithubIcon, +}; + +class GithubAuth implements OAuthApi { + static create({ + apiOrigin, + basePath, + environment = 'dev', + provider = DEFAULT_PROVIDER, + oauthRequestApi, + }: CreateOptions) { + const connector = new DefaultAuthConnector({ + apiOrigin, + basePath, + environment, + provider, + oauthRequestApi: oauthRequestApi, + sessionTransform(res: GithubAuthResponse): GithubSession { + return { + accessToken: res.accessToken, + scopes: GithubAuth.normalizeScopes(res.scope), + expiresAt: new Date(Date.now() + res.expiresInSeconds * 1000), + }; + }, + }); + + const sessionManager = new RefreshingAuthSessionManager({ + connector, + defaultScopes: new Set(['user']), + sessionScopes: session => session.scopes, + sessionShouldRefresh: session => { + const expiresInSec = (session.expiresAt.getTime() - Date.now()) / 1000; + return expiresInSec < 60 * 5; + }, + }); + + return new GithubAuth(sessionManager); + } + + constructor(private readonly sessionManager: SessionManager) {} + + async getAccessToken( + scope?: string | string[], + options?: AccessTokenOptions, + ) { + const normalizedScopes = GithubAuth.normalizeScopes(scope); + const session = await this.sessionManager.getSession({ + ...options, + scopes: normalizedScopes, + }); + if (session) { + return session.accessToken; + } + return ''; + } + + async logout() { + await this.sessionManager.removeSession(); + } + + static normalizeScopes(scopes?: string | string[]): Set { + if (!scopes) { + return new Set(); + } + + const scopeList = Array.isArray(scopes) + ? scopes + : scopes.split(/[\s]/).filter(Boolean); + + return new Set(scopeList); + } +} +export default GithubAuth; diff --git a/packages/core-api/src/apis/implementations/auth/github/index.ts b/packages/core-api/src/apis/implementations/auth/github/index.ts new file mode 100644 index 0000000000..9e1722f4a4 --- /dev/null +++ b/packages/core-api/src/apis/implementations/auth/github/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './types'; +export { default as GithubAuth } from './GithubAuth'; diff --git a/packages/core-api/src/apis/implementations/auth/github/types.ts b/packages/core-api/src/apis/implementations/auth/github/types.ts new file mode 100644 index 0000000000..282017b80d --- /dev/null +++ b/packages/core-api/src/apis/implementations/auth/github/types.ts @@ -0,0 +1,21 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type GithubSession = { + accessToken: string; + scopes: Set; + expiresAt: Date; +}; diff --git a/packages/core-api/src/apis/implementations/auth/index.ts b/packages/core-api/src/apis/implementations/auth/index.ts index 5fa6644b2a..f13368b5c4 100644 --- a/packages/core-api/src/apis/implementations/auth/index.ts +++ b/packages/core-api/src/apis/implementations/auth/index.ts @@ -15,3 +15,4 @@ */ export * from './google'; +export * from './github'; From 99e8009dadf1eabacd79a0abd970f08547b72c9e Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Fri, 29 May 2020 16:51:25 +0200 Subject: [PATCH 008/192] feat: success and error from the api Co-authored-by: Nikita Dudnik Co-authored-by: Ben Lambert --- plugins/catalog/src/api/CatalogClient.ts | 3 +++ plugins/catalog/src/api/types.ts | 1 + .../RegisterComponentPage.tsx | 18 +++++++++++++++--- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/plugins/catalog/src/api/CatalogClient.ts b/plugins/catalog/src/api/CatalogClient.ts index 94ee9aa4b3..1b3b26a11e 100644 --- a/plugins/catalog/src/api/CatalogClient.ts +++ b/plugins/catalog/src/api/CatalogClient.ts @@ -55,6 +55,9 @@ export class CatalogClient implements CatalogApi { body: JSON.stringify({ type, target }), }, ); + if (response.status !== 201) { + throw new Error(`Location wasn't added: ${target}`); + } const location = await response.json(); if (location) return location; throw new Error(`'Location wasn't added: ${target}`); diff --git a/plugins/catalog/src/api/types.ts b/plugins/catalog/src/api/types.ts index eb2cdca562..a016842e41 100644 --- a/plugins/catalog/src/api/types.ts +++ b/plugins/catalog/src/api/types.ts @@ -25,4 +25,5 @@ export const catalogApiRef = createApiRef({ export interface CatalogApi { getEntities(): Promise; getEntityByName(name: string): Promise; + addLocation(type: string, target: string): Promise<{}>; } diff --git a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx index 33029a012d..b44e3aa238 100644 --- a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx +++ b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { FC, useEffect, useState } from 'react'; +import React, { FC, useState } from 'react'; import { Grid } from '@material-ui/core'; import { InfoCard, @@ -24,6 +24,8 @@ import { ContentHeader, SupportButton, useApi, + alertApiRef, + errorApiRef, } from '@backstage/core'; import RegisterComponentForm from '../RegisterComponentForm'; import { catalogApiRef } from '@backstage/plugin-catalog'; @@ -32,12 +34,22 @@ const RegisterComponentPage: FC<{}> = () => { const catalogApi = useApi(catalogApiRef); const [isSubmitting, setIsSubmitting] = useState(false); + const alertApi = useApi(alertApiRef); + const errorApi = useApi(errorApiRef); + const onSubmit = async (formData: { componentIdInput: string }) => { setIsSubmitting(true); const { componentIdInput: target } = formData; - - const location = await catalogApi.addLocation('github', target); + try { + await catalogApi.addLocation('github', target); + alertApi.post({ + message: 'Successfully added the location', + severity: 'success', + }); + } catch (e) { + errorApi.post(e); + } setIsSubmitting(false); }; From 438bdba2cf09dacd9a95bc0a82597b5e0841a7ac Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Mon, 1 Jun 2020 12:07:58 +0200 Subject: [PATCH 009/192] Use StaticAuthSessionManager for Github --- .../implementations/auth/github/GithubAuth.ts | 27 +++++-------- .../src/lib/AuthSessionManager/index.ts | 1 + .../src/providers/github/provider.ts | 39 ++++--------------- 3 files changed, 18 insertions(+), 49 deletions(-) diff --git a/packages/core-api/src/apis/implementations/auth/github/GithubAuth.ts b/packages/core-api/src/apis/implementations/auth/github/GithubAuth.ts index d20eaa54cb..d75bceef97 100644 --- a/packages/core-api/src/apis/implementations/auth/github/GithubAuth.ts +++ b/packages/core-api/src/apis/implementations/auth/github/GithubAuth.ts @@ -20,7 +20,7 @@ import { GithubSession } from './types'; import { OAuthApi, AccessTokenOptions } from '../../../definitions/auth'; import { OAuthRequestApi, AuthProvider } from '../../../definitions'; import { SessionManager } from '../../../../lib/AuthSessionManager/types'; -import { RefreshingAuthSessionManager } from '../../../../lib/AuthSessionManager'; +import { StaticAuthSessionManager } from '../../../../lib/AuthSessionManager'; type CreateOptions = { // TODO(Rugvip): These two should be grabbed from global config when available, they're not unique to GithubAuth @@ -63,20 +63,16 @@ class GithubAuth implements OAuthApi { sessionTransform(res: GithubAuthResponse): GithubSession { return { accessToken: res.accessToken, - scopes: GithubAuth.normalizeScopes(res.scope), + scopes: GithubAuth.normalizeScope(res.scope), expiresAt: new Date(Date.now() + res.expiresInSeconds * 1000), }; }, }); - const sessionManager = new RefreshingAuthSessionManager({ + const sessionManager = new StaticAuthSessionManager({ connector, defaultScopes: new Set(['user']), sessionScopes: session => session.scopes, - sessionShouldRefresh: session => { - const expiresInSec = (session.expiresAt.getTime() - Date.now()) / 1000; - return expiresInSec < 60 * 5; - }, }); return new GithubAuth(sessionManager); @@ -84,11 +80,8 @@ class GithubAuth implements OAuthApi { constructor(private readonly sessionManager: SessionManager) {} - async getAccessToken( - scope?: string | string[], - options?: AccessTokenOptions, - ) { - const normalizedScopes = GithubAuth.normalizeScopes(scope); + async getAccessToken(scope?: string, options?: AccessTokenOptions) { + const normalizedScopes = GithubAuth.normalizeScope(scope); const session = await this.sessionManager.getSession({ ...options, scopes: normalizedScopes, @@ -103,14 +96,14 @@ class GithubAuth implements OAuthApi { await this.sessionManager.removeSession(); } - static normalizeScopes(scopes?: string | string[]): Set { - if (!scopes) { + static normalizeScope(scope?: string): Set { + if (!scope) { return new Set(); } - const scopeList = Array.isArray(scopes) - ? scopes - : scopes.split(/[\s]/).filter(Boolean); + const scopeList = Array.isArray(scope) + ? scope + : scope.split(/[\s|,]/).filter(Boolean); return new Set(scopeList); } diff --git a/packages/core-api/src/lib/AuthSessionManager/index.ts b/packages/core-api/src/lib/AuthSessionManager/index.ts index 426c514646..16a8d3c378 100644 --- a/packages/core-api/src/lib/AuthSessionManager/index.ts +++ b/packages/core-api/src/lib/AuthSessionManager/index.ts @@ -15,4 +15,5 @@ */ export { RefreshingAuthSessionManager } from './RefreshingAuthSessionManager'; +export { StaticAuthSessionManager } from './StaticAuthSessionManager'; export * from './types'; diff --git a/plugins/auth-backend/src/providers/github/provider.ts b/plugins/auth-backend/src/providers/github/provider.ts index 1e8022e1cc..4445e98451 100644 --- a/plugins/auth-backend/src/providers/github/provider.ts +++ b/plugins/auth-backend/src/providers/github/provider.ts @@ -19,7 +19,6 @@ import { Strategy as GithubStrategy } from 'passport-github2'; import { executeFrameHandlerStrategy, executeRedirectStrategy, - executeRefreshTokenStrategy, } from '../PassportStrategyHelper'; import { OAuthProviderHandlers, @@ -37,23 +36,13 @@ export class GithubAuthProvider implements OAuthProviderHandlers { this.providerConfig = providerConfig; this._strategy = new GithubStrategy( { ...this.providerConfig.options }, - ( - accessToken: any, - refreshToken: any, - params: any, - profile: any, - done: any, - ) => { - done( - undefined, - { - profile, - accessToken, - scope: 'user', // params.scope is an empty string here for some reason, so hardcoding for now - expiresInSeconds: params.expires_in, - }, - { refreshToken }, - ); + (accessToken: any, _: any, params: any, profile: any, done: any) => { + done(undefined, { + profile, + accessToken, + scope: params.scope, + expiresInSeconds: params.expires_in, + }); }, ); } @@ -67,18 +56,4 @@ export class GithubAuthProvider implements OAuthProviderHandlers { ): Promise<{ user: AuthInfoBase; info: AuthInfoPrivate }> { return await executeFrameHandlerStrategy(req, this._strategy); } - - async refresh(refreshToken: string, scope: string): Promise { - const { accessToken, params } = await executeRefreshTokenStrategy( - this._strategy, - refreshToken, - scope, - ); - - return { - accessToken, - expiresInSeconds: params.expires_in, - scope: params.scope, - }; - } } From 86930c9dd2061381567c5b14564ae4e75ba6bb80 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Mon, 1 Jun 2020 12:09:05 +0200 Subject: [PATCH 010/192] Support providers without refresh tokens --- .../src/providers/OAuthProvider.ts | 36 +++++++++++++------ plugins/auth-backend/src/providers/config.ts | 1 + .../auth-backend/src/providers/factories.ts | 20 +++++++++-- plugins/auth-backend/src/providers/index.ts | 6 +--- plugins/auth-backend/src/providers/types.ts | 3 +- 5 files changed, 47 insertions(+), 19 deletions(-) diff --git a/plugins/auth-backend/src/providers/OAuthProvider.ts b/plugins/auth-backend/src/providers/OAuthProvider.ts index 81f5ed25a6..30fd60f51f 100644 --- a/plugins/auth-backend/src/providers/OAuthProvider.ts +++ b/plugins/auth-backend/src/providers/OAuthProvider.ts @@ -89,9 +89,15 @@ export const removeRefreshTokenCookie = ( export class OAuthProvider implements AuthProviderRouteHandlers { private readonly provider: string; private readonly providerHandlers: OAuthProviderHandlers; - constructor(providerHandlers: OAuthProviderHandlers, provider: string) { + private readonly disableRefresh: boolean; + constructor( + providerHandlers: OAuthProviderHandlers, + provider: string, + disableRefresh?: boolean, + ) { this.provider = provider; this.providerHandlers = providerHandlers; + this.disableRefresh = disableRefresh ?? false; } async start(req: express.Request, res: express.Response): Promise { @@ -129,14 +135,16 @@ export class OAuthProvider implements AuthProviderRouteHandlers { const { user, info } = await this.providerHandlers.handler(req); - // throw error if missing refresh token - const { refreshToken } = info; - if (!refreshToken) { - throw new Error('Missing refresh token'); - } + if (!this.disableRefresh) { + // throw error if missing refresh token + const { refreshToken } = info; + if (!refreshToken) { + throw new Error('Missing refresh token'); + } - // set new refresh token - setRefreshTokenCookie(res, this.provider, refreshToken); + // set new refresh token + setRefreshTokenCookie(res, this.provider, refreshToken); + } // post message back to popup if successful return postMessageResponse(res, { @@ -160,8 +168,10 @@ export class OAuthProvider implements AuthProviderRouteHandlers { return res.status(401).send('Invalid X-Requested-With header'); } - // remove refresh token cookie before logout - removeRefreshTokenCookie(res, this.provider); + if (!this.disableRefresh) { + // remove refresh token cookie before logout + removeRefreshTokenCookie(res, this.provider); + } return res.send('logout!'); } @@ -170,6 +180,12 @@ export class OAuthProvider implements AuthProviderRouteHandlers { return res.status(401).send('Invalid X-Requested-With header'); } + if (!this.providerHandlers.refresh || this.disableRefresh) { + return res.send( + `Refresh token not supported for provider: ${this.provider}`, + ); + } + try { const refreshToken = req.cookies[`${this.provider}-refresh-token`]; diff --git a/plugins/auth-backend/src/providers/config.ts b/plugins/auth-backend/src/providers/config.ts index dad87e0448..8d04dc5a1f 100644 --- a/plugins/auth-backend/src/providers/config.ts +++ b/plugins/auth-backend/src/providers/config.ts @@ -30,5 +30,6 @@ export const providers = [ clientSecret: process.env.AUTH_GITHUB_CLIENT_SECRET!, callbackURL: 'http://localhost:7000/auth/github/handler/frame', }, + disableRefresh: true, }, ]; diff --git a/plugins/auth-backend/src/providers/factories.ts b/plugins/auth-backend/src/providers/factories.ts index 10e4153714..0c9f99e878 100644 --- a/plugins/auth-backend/src/providers/factories.ts +++ b/plugins/auth-backend/src/providers/factories.ts @@ -14,9 +14,14 @@ * limitations under the License. */ -import { AuthProviderFactories, AuthProviderFactory } from './types'; +import { + AuthProviderFactories, + AuthProviderRouteHandlers, + AuthProviderConfig, +} from './types'; import { GoogleAuthProvider } from './google'; import { GithubAuthProvider } from './github'; +import { OAuthProvider } from './OAuthProvider'; export class ProviderFactories { private static readonly providerFactories: AuthProviderFactories = { @@ -24,13 +29,22 @@ export class ProviderFactories { github: GithubAuthProvider, }; - public static getProviderFactory(providerId: string): AuthProviderFactory { + public static getProviderFactory( + config: AuthProviderConfig, + ): AuthProviderRouteHandlers { + const providerId = config.provider; const ProviderImpl = ProviderFactories.providerFactories[providerId]; if (!ProviderImpl) { throw Error( `Provider Implementation missing for : ${providerId} auth provider`, ); } - return ProviderImpl; + const providerInstance = new ProviderImpl(config); + const oauthProvider = new OAuthProvider( + providerInstance, + providerId, + config.disableRefresh, + ); + return oauthProvider; } } diff --git a/plugins/auth-backend/src/providers/index.ts b/plugins/auth-backend/src/providers/index.ts index 59dd116fa6..cfbabbbad1 100644 --- a/plugins/auth-backend/src/providers/index.ts +++ b/plugins/auth-backend/src/providers/index.ts @@ -17,7 +17,6 @@ import Router from 'express-promise-router'; import { AuthProviderRouteHandlers, AuthProviderConfig } from './types'; import { ProviderFactories } from './factories'; -import { OAuthProvider } from './OAuthProvider'; export const defaultRouter = (provider: AuthProviderRouteHandlers) => { const router = Router(); @@ -32,10 +31,7 @@ export const defaultRouter = (provider: AuthProviderRouteHandlers) => { export const makeProvider = (config: AuthProviderConfig) => { const providerId = config.provider; - const ProviderImpl = ProviderFactories.getProviderFactory(providerId); - const providerInstance = new ProviderImpl(config); - - const oauthProvider = new OAuthProvider(providerInstance, providerId); + const oauthProvider = ProviderFactories.getProviderFactory(config); const providerRouter = defaultRouter(oauthProvider); return { providerId, providerRouter }; }; diff --git a/plugins/auth-backend/src/providers/types.ts b/plugins/auth-backend/src/providers/types.ts index dcbe6ad1de..dc83c19dd0 100644 --- a/plugins/auth-backend/src/providers/types.ts +++ b/plugins/auth-backend/src/providers/types.ts @@ -20,12 +20,13 @@ import passport from 'passport'; export type AuthProviderConfig = { provider: string; options: any; + disableRefresh?: boolean; }; export interface OAuthProviderHandlers { start(req: express.Request, options: any): Promise; handler(req: express.Request): Promise; - refresh(refreshToken: string, scope: string): Promise; + refresh?(refreshToken: string, scope: string): Promise; logout?(): Promise; } From 37ca9e1434fb8fe31d463457fac1bec7d9142948 Mon Sep 17 00:00:00 2001 From: Marc Bruggmann Date: Mon, 1 Jun 2020 17:06:00 +0200 Subject: [PATCH 011/192] Clarify that we start by only implementing the Component entity --- docs/architecture-decisions/adr005-catalog-core-entities.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/architecture-decisions/adr005-catalog-core-entities.md b/docs/architecture-decisions/adr005-catalog-core-entities.md index f14f8c8179..1014019f8a 100644 --- a/docs/architecture-decisions/adr005-catalog-core-entities.md +++ b/docs/architecture-decisions/adr005-catalog-core-entities.md @@ -10,7 +10,7 @@ We want to standardize on a few core entities that we are tracking in the Backst ## Decision -We maintain a catalog of the following core entities: +Backstage should eventually support the following core entities: * **Components** are individual pieces of software * **APIs** are the boundaries between different components @@ -18,6 +18,8 @@ We maintain a catalog of the following core entities: ![Catalog Core Entities][catalog-core-entities] +For now, we'll start by only implementing support for the Component entity in the Backstage catalog. This can later be extended to APIs, Resources and other potentially useful entities. + ### Component A component is a piece of software, for example a mobile application feature, web site, backend service or data pipeline (list not exhaustive). A component can be tracked in source control, or use some existing open source or commercial software. It can implement APIs for other components to consume. In turn it might depend on APIs implemented by other components, or resources that are attached to it at runtime. @@ -72,4 +74,4 @@ spec: ## Consequences -We will start with fleshing out support for the Component entity in the catalog, and expand to APIs and Resources later down the line. +We will continue fleshing out support for the Component entity in the Backstage catalog. From a8643dc8dbe26cc3a31205cbe75fd65a31b0dfee Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 1 Jun 2020 17:14:38 +0200 Subject: [PATCH 012/192] Feedback for the entity registration Co-authored-by: Nikita Dudnik --- plugins/catalog/src/api/CatalogClient.ts | 43 +++++++- plugins/catalog/src/api/types.ts | 5 +- .../RegisterComponentPage.tsx | 97 +++++++++++++++++-- 3 files changed, 135 insertions(+), 10 deletions(-) diff --git a/plugins/catalog/src/api/CatalogClient.ts b/plugins/catalog/src/api/CatalogClient.ts index 1b3b26a11e..ed38c008ac 100644 --- a/plugins/catalog/src/api/CatalogClient.ts +++ b/plugins/catalog/src/api/CatalogClient.ts @@ -44,7 +44,7 @@ export class CatalogClient implements CatalogApi { } // TODO: Types for the type param - async addLocation(type: string, target: string): Promise<{}> { + async addLocation(type: string, target: string) { const response = await fetch( `${this.apiOrigin}${this.basePath}/locations`, { @@ -59,7 +59,46 @@ export class CatalogClient implements CatalogApi { throw new Error(`Location wasn't added: ${target}`); } const location = await response.json(); - if (location) return location; + + // TODO(shmidt-i): remove mocks + if (location) + return { + location, + entities: [ + { + apiVersion: 'backstage.io/v1beta1', + kind: 'Component', + metadata: { + name: 'component-website', + annotations: { + 'backstage.io/managed-by-location': location.id, + }, + uid: 'uid1', + etag: 'YTQzMmNmNjctMGZmMC00YWM5LWFjYWQtZDg1NjBjNDFlYWM4', + generation: 1, + }, + spec: { + type: 'website', + }, + }, + { + apiVersion: 'backstage.io/v1beta1', + kind: 'Component', + metadata: { + name: 'component-service', + annotations: { + 'backstage.io/managed-by-location': location.id, + }, + uid: 'uid2', + etag: 'YTQzMmNmNjctMGZmMC00YWM5LWFjYWQtZDg1NjBjNDFlYWM4', + generation: 1, + }, + spec: { + type: 'service', + }, + }, + ], + }; throw new Error(`'Location wasn't added: ${target}`); } } diff --git a/plugins/catalog/src/api/types.ts b/plugins/catalog/src/api/types.ts index a016842e41..b92f07247f 100644 --- a/plugins/catalog/src/api/types.ts +++ b/plugins/catalog/src/api/types.ts @@ -25,5 +25,8 @@ export const catalogApiRef = createApiRef({ export interface CatalogApi { getEntities(): Promise; getEntityByName(name: string): Promise; - addLocation(type: string, target: string): Promise<{}>; + addLocation( + type: string, + target: string, + ): Promise<{ location: any; entities: Entity[] }>; } diff --git a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx index b44e3aa238..de830f9a43 100644 --- a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx +++ b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx @@ -15,7 +15,24 @@ */ import React, { FC, useState } from 'react'; -import { Grid } from '@material-ui/core'; +import { useHistory, Link as RouterLink } from 'react-router-dom'; +import { + Grid, + makeStyles, + DialogTitle, + Dialog, + DialogContent, + DialogContentText, + DialogActions, + Button, + ListItem, + ListItemText, + List, + LinearProgress, +} from '@material-ui/core'; +import { GitHub as GitHubIcon } from '@material-ui/icons'; +import { Star as StarIcon } from '@material-ui/icons'; + import { InfoCard, Page, @@ -30,30 +47,60 @@ import { import RegisterComponentForm from '../RegisterComponentForm'; import { catalogApiRef } from '@backstage/plugin-catalog'; +const useStyles = makeStyles(theme => ({ + dialogPaper: { + minHeight: 250, + minWidth: 600, + }, + icon: { + width: 20, + marginRight: theme.spacing(1), + }, + contentText: { + paddingBottom: theme.spacing(2), + }, +})); + const RegisterComponentPage: FC<{}> = () => { + const history = useHistory(); + const classes = useStyles(); + const catalogApi = useApi(catalogApiRef); const [isSubmitting, setIsSubmitting] = useState(false); const alertApi = useApi(alertApiRef); const errorApi = useApi(errorApiRef); + const [result, setResult] = useState<{ + data: any; + error: null | Error; + loading: boolean; + }>({ + data: null, + error: null, + loading: false, + }); + const onSubmit = async (formData: { componentIdInput: string }) => { setIsSubmitting(true); const { componentIdInput: target } = formData; try { - await catalogApi.addLocation('github', target); + const data = await catalogApi.addLocation('github', target); + alertApi.post({ message: 'Successfully added the location', severity: 'success', }); + setResult({ error: null, loading: false, data }); } catch (e) { errorApi.post(e); } setIsSubmitting(false); }; - + const gheUrl = 'some-url'; + const showDialog = result.data && !result.error; return ( @@ -63,14 +110,50 @@ const RegisterComponentPage: FC<{}> = () => { - + {result.loading ? ( + + ) : ( + + )} +

+ Component registration result + {result.data ? ( + <> + + + Following components have been succefully created. + + {result.data.entities.map((entity: any) => ( + + + + + + ))} + + + + + + + + ) : ( + + + Your component is being created. Please wait. + + + )} + ); }; From 5094dc75a51f973f1b635397813651bce18b5fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 1 Jun 2020 21:27:38 +0200 Subject: [PATCH 013/192] Add ability to specify locationId on addOrUpdateEntity --- .../src/catalog/DatabaseEntitiesCatalog.ts | 14 ++++++++++---- plugins/catalog-backend/src/catalog/types.ts | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts index d13ac9a1ba..606b6dc475 100644 --- a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts @@ -49,13 +49,16 @@ export class DatabaseEntitiesCatalog implements EntitiesCatalog { ); } - async addOrUpdateEntity(entity: Entity): Promise { + async addOrUpdateEntity( + entity: Entity, + locationId?: string, + ): Promise { await this.policy.enforce(entity); return await this.database.transaction(async tx => { let response: DbEntityResponse; if (entity.metadata.uid) { - response = await this.database.updateEntity(tx, { entity }); + response = await this.database.updateEntity(tx, { locationId, entity }); } else { const existing = await this.entityByNameInternal( tx, @@ -64,9 +67,12 @@ export class DatabaseEntitiesCatalog implements EntitiesCatalog { entity.metadata.namespace, ); if (existing) { - response = await this.database.updateEntity(tx, { entity }); + response = await this.database.updateEntity(tx, { + locationId, + entity, + }); } else { - response = await this.database.addEntity(tx, { entity }); + response = await this.database.addEntity(tx, { locationId, entity }); } } diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index 61fba33ebf..2ef5fd9e56 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -30,7 +30,7 @@ export type EntitiesCatalog = { namespace: string | undefined, name: string, ): Promise; - addOrUpdateEntity(entity: Entity): Promise; + addOrUpdateEntity(entity: Entity, locationId?: string): Promise; removeEntityByUid(uid: string): Promise; }; From f7ef6d492147449ecb9538f3166789c0df6d9580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 2 Jun 2020 09:32:45 +0200 Subject: [PATCH 014/192] Move addLocation to new HigherOrderOperations --- packages/backend/src/plugins/catalog.ts | 21 +- .../catalog/DatabaseEntitiesCatalog.test.ts | 13 +- .../src/catalog/DatabaseEntitiesCatalog.ts | 8 +- .../catalog/DatabaseLocationsCatalog.test.ts | 72 ++---- .../src/catalog/DatabaseLocationsCatalog.ts | 32 +-- plugins/catalog-backend/src/catalog/index.ts | 3 +- plugins/catalog-backend/src/catalog/types.ts | 22 +- .../src/database/CommonDatabase.test.ts | 47 ++-- .../src/database/CommonDatabase.ts | 28 +-- .../migrations/20200511113813_init.ts | 6 +- plugins/catalog-backend/src/database/types.ts | 16 +- .../src/ingestion/HigherOrderOperations.ts | 119 ++++++++++ .../catalog-backend/src/ingestion/index.ts | 1 + .../catalog-backend/src/ingestion/types.ts | 11 + .../src/service/router.test.ts | 208 +++++++----------- plugins/catalog-backend/src/service/router.ts | 31 ++- 16 files changed, 324 insertions(+), 314 deletions(-) create mode 100644 plugins/catalog-backend/src/ingestion/HigherOrderOperations.ts diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts index 91cbd8c254..150b9d1826 100644 --- a/packages/backend/src/plugins/catalog.ts +++ b/packages/backend/src/plugins/catalog.ts @@ -23,6 +23,7 @@ import { LocationReaders, IngestionModels, runPeriodically, + HigherOrderOperations, } from '@backstage/plugin-catalog-backend'; import { PluginEnvironment } from '../types'; import { EntityPolicies } from '@backstage/catalog-model'; @@ -32,7 +33,7 @@ export default async function createPlugin({ database, }: PluginEnvironment) { const policy = new EntityPolicies(); - const ingestion = new IngestionModels( + const ingestionModel = new IngestionModels( new LocationReaders(), new DescriptorParsers(), new EntityPolicies(), @@ -40,12 +41,22 @@ export default async function createPlugin({ const db = await DatabaseManager.createDatabase(database, logger); runPeriodically( - () => DatabaseManager.refreshLocations(db, ingestion, policy, logger), + () => DatabaseManager.refreshLocations(db, ingestionModel, policy, logger), 10000, ); - const entitiesCatalog = new DatabaseEntitiesCatalog(db, policy); - const locationsCatalog = new DatabaseLocationsCatalog(db, ingestion); + const entitiesCatalog = new DatabaseEntitiesCatalog(db); + const locationsCatalog = new DatabaseLocationsCatalog(db); + const higherOrderOperation = new HigherOrderOperations( + entitiesCatalog, + locationsCatalog, + ingestionModel, + ); - return await createRouter({ entitiesCatalog, locationsCatalog, logger }); + return await createRouter({ + entitiesCatalog, + locationsCatalog, + higherOrderOperation, + logger, + }); } diff --git a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.test.ts b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.test.ts index 1de5038112..b185075002 100644 --- a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.test.ts @@ -14,13 +14,12 @@ * limitations under the License. */ -import type { Entity, EntityPolicy } from '@backstage/catalog-model'; +import type { Entity } from '@backstage/catalog-model'; import type { Database } from '../database'; import { DatabaseEntitiesCatalog } from './DatabaseEntitiesCatalog'; describe('DatabaseEntitiesCatalog', () => { let db: jest.Mocked; - let policy: EntityPolicy; beforeEach(() => { db = { @@ -38,7 +37,6 @@ describe('DatabaseEntitiesCatalog', () => { addLocationUpdateLogEvent: jest.fn(), }; db.transaction.mockImplementation(async f => f('tx')); - policy = { enforce: jest.fn(async x => x) }; }); describe('addOrUpdateEntity', () => { @@ -55,10 +53,9 @@ describe('DatabaseEntitiesCatalog', () => { db.entities.mockResolvedValue([]); db.addEntity.mockResolvedValue({ entity }); - const catalog = new DatabaseEntitiesCatalog(db, policy); + const catalog = new DatabaseEntitiesCatalog(db); const result = await catalog.addOrUpdateEntity(entity); - expect(policy.enforce).toBeCalledWith(entity); expect(db.entities).toHaveBeenCalledTimes(1); expect(db.addEntity).toHaveBeenCalledTimes(1); expect(result).toBe(entity); @@ -78,10 +75,9 @@ describe('DatabaseEntitiesCatalog', () => { db.entities.mockResolvedValue([]); db.updateEntity.mockResolvedValue({ entity }); - const catalog = new DatabaseEntitiesCatalog(db, policy); + const catalog = new DatabaseEntitiesCatalog(db); const result = await catalog.addOrUpdateEntity(entity); - expect(policy.enforce).toBeCalledWith(entity); expect(db.entities).toHaveBeenCalledTimes(0); expect(db.updateEntity).toHaveBeenCalledTimes(1); expect(result).toBe(entity); @@ -108,10 +104,9 @@ describe('DatabaseEntitiesCatalog', () => { db.entities.mockResolvedValue([{ entity: existing }]); db.updateEntity.mockResolvedValue({ entity: added }); - const catalog = new DatabaseEntitiesCatalog(db, policy); + const catalog = new DatabaseEntitiesCatalog(db); const result = await catalog.addOrUpdateEntity(added); - expect(policy.enforce).toBeCalledWith(added); expect(db.entities).toHaveBeenCalledTimes(1); expect(db.updateEntity).toHaveBeenCalledTimes(1); expect(result).toEqual(existing); diff --git a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts index 606b6dc475..6a7a51a168 100644 --- a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts @@ -14,15 +14,12 @@ * limitations under the License. */ -import type { Entity, EntityPolicy } from '@backstage/catalog-model'; +import type { Entity } from '@backstage/catalog-model'; import type { Database, DbEntityResponse, EntityFilters } from '../database'; import type { EntitiesCatalog } from './types'; export class DatabaseEntitiesCatalog implements EntitiesCatalog { - constructor( - private readonly database: Database, - private readonly policy: EntityPolicy, - ) {} + constructor(private readonly database: Database) {} async entities(filters?: EntityFilters): Promise { const items = await this.database.transaction(tx => @@ -53,7 +50,6 @@ export class DatabaseEntitiesCatalog implements EntitiesCatalog { entity: Entity, locationId?: string, ): Promise { - await this.policy.enforce(entity); return await this.database.transaction(async tx => { let response: DbEntityResponse; diff --git a/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.test.ts b/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.test.ts index 443b3bf6b0..907bdea2d5 100644 --- a/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.test.ts +++ b/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.test.ts @@ -13,73 +13,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { getVoidLogger } from '@backstage/backend-common'; -import type { Entity } from '@backstage/catalog-model'; import Knex from 'knex'; import path from 'path'; import { CommonDatabase } from '../database'; -import type { Database } from '../database'; -import type { IngestionModel } from '../ingestion/types'; import { DatabaseLocationsCatalog } from './DatabaseLocationsCatalog'; -class MockIngestionModel implements IngestionModel { - readLocation = jest.fn(async (type: string, target: string) => { - if (type !== 'valid_type') { - throw new Error(`Unknown location type ${type}`); - } - if (target === 'valid_target') { - return [{ type: 'data', data: {} as Entity } as const]; - } - throw new Error( - `Can't read location at ${target} with error: Something is broken`, - ); - }); -} - describe('DatabaseLocationsCatalog', () => { - const knex = Knex({ - client: 'sqlite3', - connection: ':memory:', - useNullAsDefault: true, - }); - knex.client.pool.on('createSuccess', (_eventId: any, resource: any) => { - resource.run('PRAGMA foreign_keys = ON', () => {}); - }); - let db: Database; let catalog: DatabaseLocationsCatalog; - let ingestionModel: IngestionModel; beforeEach(async () => { + const knex = Knex({ + client: 'sqlite3', + connection: ':memory:', + useNullAsDefault: true, + }); + knex.client.pool.on('createSuccess', (_eventId: any, resource: any) => { + resource.run('PRAGMA foreign_keys = ON', () => {}); + }); await knex.migrate.latest({ directory: path.resolve(__dirname, '../database/migrations'), loadExtensions: ['.ts'], }); - db = new CommonDatabase(knex, getVoidLogger()); - ingestionModel = new MockIngestionModel(); - catalog = new DatabaseLocationsCatalog(db, ingestionModel); + const db = new CommonDatabase(knex, getVoidLogger()); + catalog = new DatabaseLocationsCatalog(db); }); - it('resolves to location with id', async () => { - return expect( - catalog.addLocation({ type: 'valid_type', target: 'valid_target' }), - ).resolves.toEqual({ - id: expect.anything(), + it('can add a location', async () => { + const location = { + id: 'dd12620d-0436-422f-93bd-929aa0788123', type: 'valid_type', target: 'valid_target', - }); - }); - it('rejects for invalid type', async () => { - const type = 'invalid_type'; - return expect( - catalog.addLocation({ type, target: 'valid_target' }), - ).rejects.toThrow(/Unknown location type/); - }); - it('rejects for unreadable target ', async () => { - const target = 'invalid_target'; - return expect( - catalog.addLocation({ type: 'valid_type', target }), - ).rejects.toThrow( - `Can't read location at ${target} with error: Something is broken`, - ); + }; + await expect(catalog.addLocation(location)).resolves.toEqual(location); + await expect( + catalog.location('dd12620d-0436-422f-93bd-929aa0788123'), + ).resolves.toEqual(expect.objectContaining({ data: location })); + await expect(catalog.locations()).resolves.toEqual([ + expect.objectContaining({ data: location }), + ]); }); }); diff --git a/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts b/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts index ae910e0b9b..2a5208c95a 100644 --- a/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts +++ b/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts @@ -16,38 +16,12 @@ import type { Database } from '../database'; import { DatabaseLocationUpdateLogEvent } from '../database/types'; -import { IngestionModel } from '../ingestion/types'; -import { - AddLocation, - Location, - LocationResponse, - LocationsCatalog, -} from './types'; +import { Location, LocationResponse, LocationsCatalog } from './types'; export class DatabaseLocationsCatalog implements LocationsCatalog { - constructor( - private readonly database: Database, - private readonly ingestionModel: IngestionModel, - ) {} - - async addLocation(location: AddLocation): Promise { - const outputs = await this.ingestionModel.readLocation( - location.type, - location.target, - ); - if (!outputs) { - throw new Error( - `Unknown location type ${location.type} ${location.target}`, - ); - } - outputs.forEach(output => { - if (output.type === 'error') { - throw new Error( - `Can't read location at ${location.target}, ${output.error}`, - ); - } - }); + constructor(private readonly database: Database) {} + async addLocation(location: Location): Promise { const added = await this.database.addLocation(location); return added; } diff --git a/plugins/catalog-backend/src/catalog/index.ts b/plugins/catalog-backend/src/catalog/index.ts index 6768268f34..dc0bb2e84a 100644 --- a/plugins/catalog-backend/src/catalog/index.ts +++ b/plugins/catalog-backend/src/catalog/index.ts @@ -17,10 +17,9 @@ export { DatabaseEntitiesCatalog } from './DatabaseEntitiesCatalog'; export { DatabaseLocationsCatalog } from './DatabaseLocationsCatalog'; export { StaticEntitiesCatalog } from './StaticEntitiesCatalog'; -export { addLocationSchema } from './types'; export type { - AddLocation, EntitiesCatalog, Location, LocationsCatalog, + LocationSpec, } from './types'; diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index 2ef5fd9e56..a8c3c7a15e 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -15,7 +15,6 @@ */ import { Entity } from '@backstage/catalog-model'; -import * as yup from 'yup'; import type { EntityFilters } from '../database'; // @@ -52,31 +51,22 @@ export type LocationUpdateLogEvent = { message?: string; }; -export type Location = { - id: string; +export type LocationSpec = { type: string; target: string; }; +export type Location = { + id: string; +} & LocationSpec; + export type LocationResponse = { data: Location; currentStatus: LocationUpdateStatus; }; -export type AddLocation = { - type: string; - target: string; -}; - -export const addLocationSchema: yup.Schema = yup - .object({ - type: yup.string().required(), - target: yup.string().required(), - }) - .noUnknown(); - export type LocationsCatalog = { - addLocation(location: AddLocation): Promise; + addLocation(location: Location): Promise; removeLocation(id: string): Promise; locations(): Promise; location(id: string): Promise; diff --git a/plugins/catalog-backend/src/database/CommonDatabase.test.ts b/plugins/catalog-backend/src/database/CommonDatabase.test.ts index 3b783a7691..8f62969bd1 100644 --- a/plugins/catalog-backend/src/database/CommonDatabase.test.ts +++ b/plugins/catalog-backend/src/database/CommonDatabase.test.ts @@ -22,13 +22,12 @@ import { import type { Entity } from '@backstage/catalog-model'; import Knex from 'knex'; import path from 'path'; +import { Location } from '../catalog'; import { CommonDatabase } from './CommonDatabase'; import { DatabaseLocationUpdateLogStatus } from './types'; import type { - AddDatabaseLocation, DbEntityRequest, DbEntityResponse, - DbLocationsRow, DbLocationsRowWithStatus, } from './types'; @@ -87,9 +86,13 @@ describe('CommonDatabase', () => { it('manages locations', async () => { const db = new CommonDatabase(knex, getVoidLogger()); - const input: AddDatabaseLocation = { type: 'a', target: 'b' }; + const input: Location = { + id: 'dd12620d-0436-422f-93bd-929aa0788123', + type: 'a', + target: 'b', + }; const output: DbLocationsRowWithStatus = { - id: expect.anything(), + id: 'dd12620d-0436-422f-93bd-929aa0788123', type: 'a', target: 'b', message: null, @@ -112,22 +115,6 @@ describe('CommonDatabase', () => { ); }); - it('instead of adding second location with the same target, returns existing one', async () => { - // Prepare - const catalog = new CommonDatabase(knex, getVoidLogger()); - const input: AddDatabaseLocation = { type: 'a', target: 'b' }; - const output1: DbLocationsRow = await catalog.addLocation(input); - - // Try to insert the same location - const output2: DbLocationsRow = await catalog.addLocation(input); - const locations = await catalog.locations(); - - // Output is the same - expect(output2).toEqual(output1); - // Locations contain only one record - expect(locations[0]).toMatchObject(output1); - }); - describe('addEntity', () => { it('happy path: adds entity to empty database', async () => { const catalog = new CommonDatabase(knex, getVoidLogger()); @@ -160,27 +147,33 @@ describe('CommonDatabase', () => { describe('locationHistory', () => { it('outputs the history correctly', async () => { const catalog = new CommonDatabase(knex, getVoidLogger()); - const location: AddDatabaseLocation = { type: 'a', target: 'b' }; - const { id: locationId } = await catalog.addLocation(location); + const location: Location = { + id: 'dd12620d-0436-422f-93bd-929aa0788123', + type: 'a', + target: 'b', + }; + await catalog.addLocation(location); await catalog.addLocationUpdateLogEvent( - locationId, + 'dd12620d-0436-422f-93bd-929aa0788123', DatabaseLocationUpdateLogStatus.SUCCESS, ); await catalog.addLocationUpdateLogEvent( - locationId, + 'dd12620d-0436-422f-93bd-929aa0788123', DatabaseLocationUpdateLogStatus.FAIL, undefined, 'Something went wrong', ); - const result = await catalog.locationHistory(locationId); + const result = await catalog.locationHistory( + 'dd12620d-0436-422f-93bd-929aa0788123', + ); expect(result).toEqual([ { created_at: expect.anything(), entity_name: null, id: expect.anything(), - location_id: locationId, + location_id: 'dd12620d-0436-422f-93bd-929aa0788123', message: null, status: DatabaseLocationUpdateLogStatus.SUCCESS, }, @@ -188,7 +181,7 @@ describe('CommonDatabase', () => { created_at: expect.anything(), entity_name: null, id: expect.anything(), - location_id: locationId, + location_id: 'dd12620d-0436-422f-93bd-929aa0788123', message: 'Something went wrong', status: DatabaseLocationUpdateLogStatus.FAIL, }, diff --git a/plugins/catalog-backend/src/database/CommonDatabase.ts b/plugins/catalog-backend/src/database/CommonDatabase.ts index 2dac08b9bc..084f6ea662 100644 --- a/plugins/catalog-backend/src/database/CommonDatabase.ts +++ b/plugins/catalog-backend/src/database/CommonDatabase.ts @@ -26,7 +26,6 @@ import { v4 as uuidv4 } from 'uuid'; import type { Logger } from 'winston'; import { buildEntitySearch } from './search'; import type { - AddDatabaseLocation, Database, DatabaseLocationUpdateLogEvent, DatabaseLocationUpdateLogStatus, @@ -38,6 +37,7 @@ import type { DbLocationsRowWithStatus, EntityFilters, } from './types'; +import { Location } from '../catalog'; function getStrippedMetadata(metadata: EntityMeta): EntityMeta { const output = lodash.cloneDeep(metadata); @@ -336,25 +336,15 @@ export class CommonDatabase implements Database { } } - async addLocation(location: AddDatabaseLocation): Promise { + async addLocation(location: Location): Promise { return await this.database.transaction(async tx => { - const existingLocation = await tx('locations') - .where({ target: location.target }) - .select(); - - if (existingLocation?.[0]) { - return existingLocation[0]; - } - - const id = uuidv4(); - const { type, target } = location; - await tx('locations').insert({ - id, - type, - target, - }); - - return (await tx('locations').where({ id }).select())![0]; + const row: DbLocationsRow = { + id: location.id, + type: location.type, + target: location.target, + }; + await tx('locations').insert(row); + return row; }); } diff --git a/plugins/catalog-backend/src/database/migrations/20200511113813_init.ts b/plugins/catalog-backend/src/database/migrations/20200511113813_init.ts index 2ff06c4046..5f136670f4 100644 --- a/plugins/catalog-backend/src/database/migrations/20200511113813_init.ts +++ b/plugins/catalog-backend/src/database/migrations/20200511113813_init.ts @@ -26,7 +26,11 @@ export async function up(knex: Knex): Promise { table.comment( 'Registered locations that shall be contiuously scanned for catalog item updates', ); - table.uuid('id').primary().comment('Auto-generated ID of the location'); + table + .uuid('id') + .primary() + .notNullable() + .comment('Auto-generated ID of the location'); table.string('type').notNullable().comment('The type of location'); table .string('target') diff --git a/plugins/catalog-backend/src/database/types.ts b/plugins/catalog-backend/src/database/types.ts index f69a7353c7..4bcc66af1c 100644 --- a/plugins/catalog-backend/src/database/types.ts +++ b/plugins/catalog-backend/src/database/types.ts @@ -15,7 +15,7 @@ */ import type { Entity } from '@backstage/catalog-model'; -import * as yup from 'yup'; +import { Location } from '../catalog'; export type DbEntitiesRow = { id: string; @@ -58,18 +58,6 @@ export type DbLocationsRowWithStatus = DbLocationsRow & { message: string | null; }; -export type AddDatabaseLocation = { - type: string; - target: string; -}; - -export const addDatabaseLocationSchema: yup.Schema = yup - .object({ - type: yup.string().required(), - target: yup.string().required(), - }) - .noUnknown(); - export enum DatabaseLocationUpdateLogStatus { FAIL = 'fail', SUCCESS = 'success', @@ -145,7 +133,7 @@ export type Database = { removeEntity(tx: unknown, uid: string): Promise; - addLocation(location: AddDatabaseLocation): Promise; + addLocation(location: Location): Promise; removeLocation(id: string): Promise; diff --git a/plugins/catalog-backend/src/ingestion/HigherOrderOperations.ts b/plugins/catalog-backend/src/ingestion/HigherOrderOperations.ts new file mode 100644 index 0000000000..0314556e27 --- /dev/null +++ b/plugins/catalog-backend/src/ingestion/HigherOrderOperations.ts @@ -0,0 +1,119 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { InputError } from '@backstage/backend-common'; +import { Entity } from '@backstage/catalog-model'; +import { v4 as uuidv4 } from 'uuid'; +import { + EntitiesCatalog, + Location, + LocationsCatalog, + LocationSpec, +} from '../catalog'; +import { IngestionModel } from '../ingestion'; +import { AddLocationResult, HigherOrderOperation } from './types'; + +const LOCATION_ANNOTATION = 'backstage.io/managed-by-location'; + +/** + * Placeholder for operations that span several catalogs and/or stretches out + * in time. + * + * TODO(freben): Find a better home for these, possibly refactoring to use the + * database more directly. + */ +export class HigherOrderOperations implements HigherOrderOperation { + private readonly entitiesCatalog: EntitiesCatalog; + private readonly locationsCatalog: LocationsCatalog; + private readonly ingestionModel: IngestionModel; + + constructor( + entitiesCatalog: EntitiesCatalog, + locationsCatalog: LocationsCatalog, + ingestionModel: IngestionModel, + ) { + this.entitiesCatalog = entitiesCatalog; + this.locationsCatalog = locationsCatalog; + this.ingestionModel = ingestionModel; + } + + /** + * Adds a single location to the catalog. + * + * The location is inspected and fetched, and all of the resulting data is + * validated. If everything goes well, the location and entities are stored + * in the catalog. + * + * If the location already existed, the old location is returned instead and + * the catalog is left unchanged. + * + * @param spec The location to add + */ + async addLocation(spec: LocationSpec): Promise { + // Attempt to find a previous location matching the spec + const previousLocations = await this.locationsCatalog.locations(); + const previousLocation = previousLocations.find( + l => spec.type === l.data.type && spec.target === l.data.target, + ); + const location: Location = previousLocation + ? previousLocation.data + : { + id: uuidv4(), + type: spec.type, + target: spec.target, + }; + + // Read the location fully, bailing on any errors + const readerOutput = await this.ingestionModel.readLocation( + location.type, + location.target, + ); + const inputEntities: Entity[] = []; + for (const entry of readerOutput) { + if (entry.type === 'error') { + throw new InputError( + `Failed to read location ${location.type} ${location.target}, ${entry.error}`, + ); + } else { + // Append the location reference annotation + entry.data.metadata.annotations = { + ...entry.data.metadata.annotations, + [LOCATION_ANNOTATION]: location.id, + }; + inputEntities.push(entry.data); + } + } + + // TODO(freben): At this point, we could detect orphaned entities, by way + // of having a LOCATION_ANNOTATION pointing to the location but not being + // in the entities list. But we aren't sure what to do about those yet. + + // Write + if (!previousLocation) { + await this.locationsCatalog.addLocation(location); + } + const outputEntities: Entity[] = []; + for (const entity of inputEntities) { + const out = await this.entitiesCatalog.addOrUpdateEntity( + entity, + location.id, + ); + outputEntities.push(out); + } + + return { location, entities: outputEntities }; + } +} diff --git a/plugins/catalog-backend/src/ingestion/index.ts b/plugins/catalog-backend/src/ingestion/index.ts index b6aceaecdd..93af856656 100644 --- a/plugins/catalog-backend/src/ingestion/index.ts +++ b/plugins/catalog-backend/src/ingestion/index.ts @@ -15,6 +15,7 @@ */ export * from './descriptor'; +export { HigherOrderOperations } from './HigherOrderOperations'; export { IngestionModels } from './IngestionModels'; export * from './source'; export type { IngestionModel } from './types'; diff --git a/plugins/catalog-backend/src/ingestion/types.ts b/plugins/catalog-backend/src/ingestion/types.ts index 8878c2af5b..45dd0d9f74 100644 --- a/plugins/catalog-backend/src/ingestion/types.ts +++ b/plugins/catalog-backend/src/ingestion/types.ts @@ -14,8 +14,19 @@ * limitations under the License. */ +import { Entity } from '@backstage/catalog-model'; +import { Location, LocationSpec } from '../catalog'; import { ReaderOutput } from './descriptor/parsers/types'; +export type AddLocationResult = { + location: Location; + entities: Entity[]; +}; + export type IngestionModel = { readLocation(type: string, target: string): Promise; }; + +export type HigherOrderOperation = { + addLocation(spec: LocationSpec): Promise; +}; diff --git a/plugins/catalog-backend/src/service/router.test.ts b/plugins/catalog-backend/src/service/router.test.ts index 4092ed1395..e03cb3dc98 100644 --- a/plugins/catalog-backend/src/service/router.test.ts +++ b/plugins/catalog-backend/src/service/router.test.ts @@ -18,42 +18,52 @@ import { getVoidLogger, NotFoundError } from '@backstage/backend-common'; import type { Entity } from '@backstage/catalog-model'; import express from 'express'; import request from 'supertest'; -import { EntitiesCatalog, Location, LocationsCatalog } from '../catalog'; +import { EntitiesCatalog, LocationsCatalog, LocationSpec } from '../catalog'; +import { LocationResponse } from '../catalog/types'; +import { HigherOrderOperation } from '../ingestion/types'; import { createRouter } from './router'; -class MockEntitiesCatalog implements EntitiesCatalog { - entities = jest.fn(); - entityByUid = jest.fn(); - entityByName = jest.fn(); - addEntity = jest.fn(); - addOrUpdateEntity = jest.fn(); - removeEntityByUid = jest.fn(); -} - -class MockLocationsCatalog implements LocationsCatalog { - addLocation = jest.fn(); - removeLocation = jest.fn(); - locations = jest.fn(); - location = jest.fn(); - locationHistory = jest.fn(); -} - describe('createRouter', () => { + let entitiesCatalog: jest.Mocked; + let locationsCatalog: jest.Mocked; + let higherOrderOperation: jest.Mocked; + let app: express.Express; + + beforeEach(async () => { + entitiesCatalog = { + entities: jest.fn(), + entityByUid: jest.fn(), + entityByName: jest.fn(), + addOrUpdateEntity: jest.fn(), + removeEntityByUid: jest.fn(), + }; + locationsCatalog = { + addLocation: jest.fn(), + removeLocation: jest.fn(), + locations: jest.fn(), + location: jest.fn(), + locationHistory: jest.fn(), + }; + higherOrderOperation = { + addLocation: jest.fn(), + }; + const router = await createRouter({ + entitiesCatalog, + locationsCatalog, + higherOrderOperation, + logger: getVoidLogger(), + }); + app = express().use(router); + }); + describe('GET /entities', () => { it('happy path: lists entities', async () => { const entities: Entity[] = [ { apiVersion: 'a', kind: 'b', metadata: { name: 'n' } }, ]; - const catalog = new MockEntitiesCatalog(); - catalog.entities.mockResolvedValueOnce(entities); + entitiesCatalog.entities.mockResolvedValueOnce(entities); - const router = await createRouter({ - entitiesCatalog: catalog, - logger: getVoidLogger(), - }); - - const app = express().use(router); const response = await request(app).get('/entities'); expect(response.status).toEqual(200); @@ -61,18 +71,10 @@ describe('createRouter', () => { }); it('parses single and multiple request parameters and passes them down', async () => { - const catalog = new MockEntitiesCatalog(); - - const router = await createRouter({ - entitiesCatalog: catalog, - logger: getVoidLogger(), - }); - - const app = express().use(router); const response = await request(app).get('/entities?a=1&a=&a=3&b=4&c='); expect(response.status).toEqual(200); - expect(catalog.entities).toHaveBeenCalledWith([ + expect(entitiesCatalog.entities).toHaveBeenCalledWith([ { key: 'a', values: ['1', null, '3'] }, { key: 'b', values: ['4'] }, { key: 'c', values: [null] }, @@ -89,15 +91,8 @@ describe('createRouter', () => { name: 'c', }, }; - const catalog = new MockEntitiesCatalog(); - catalog.entityByUid.mockResolvedValue(entity); + entitiesCatalog.entityByUid.mockResolvedValue(entity); - const router = await createRouter({ - entitiesCatalog: catalog, - logger: getVoidLogger(), - }); - - const app = express().use(router); const response = await request(app).get('/entities/by-uid/zzz'); expect(response.status).toEqual(200); @@ -105,15 +100,7 @@ describe('createRouter', () => { }); it('responds with a 404 for missing entities', async () => { - const catalog = new MockEntitiesCatalog(); - catalog.entityByUid.mockResolvedValue(undefined); - - const router = await createRouter({ - entitiesCatalog: catalog, - logger: getVoidLogger(), - }); - - const app = express().use(router); + entitiesCatalog.entityByUid.mockResolvedValue(undefined); const response = await request(app).get('/entities/by-uid/zzz'); expect(response.status).toEqual(404); @@ -131,15 +118,8 @@ describe('createRouter', () => { namespace: 'd', }, }; - const catalog = new MockEntitiesCatalog(); - catalog.entityByName.mockResolvedValue(entity); + entitiesCatalog.entityByName.mockResolvedValue(entity); - const router = await createRouter({ - entitiesCatalog: catalog, - logger: getVoidLogger(), - }); - - const app = express().use(router); const response = await request(app).get('/entities/by-name/b/d/c'); expect(response.status).toEqual(200); @@ -147,15 +127,8 @@ describe('createRouter', () => { }); it('responds with a 404 for missing entities', async () => { - const catalog = new MockEntitiesCatalog(); - catalog.entityByName.mockResolvedValue(undefined); + entitiesCatalog.entityByName.mockResolvedValue(undefined); - const router = await createRouter({ - entitiesCatalog: catalog, - logger: getVoidLogger(), - }); - - const app = express().use(router); const response = await request(app).get('/entities/by-name//b/d/c'); expect(response.status).toEqual(404); @@ -165,13 +138,6 @@ describe('createRouter', () => { describe('POST /entities', () => { it('requires a body', async () => { - const catalog = new MockEntitiesCatalog(); - const router = await createRouter({ - entitiesCatalog: catalog, - logger: getVoidLogger(), - }); - - const app = express().use(router); const response = await request(app) .post('/entities') .set('Content-Type', 'application/json') @@ -179,7 +145,7 @@ describe('createRouter', () => { expect(response.status).toEqual(400); expect(response.text).toMatch(/body/); - expect(catalog.addOrUpdateEntity).not.toHaveBeenCalled(); + expect(entitiesCatalog.addOrUpdateEntity).not.toHaveBeenCalled(); }); it('passes the body down', async () => { @@ -192,15 +158,8 @@ describe('createRouter', () => { }, }; - const catalog = new MockEntitiesCatalog(); - catalog.addOrUpdateEntity.mockResolvedValue(entity); + entitiesCatalog.addOrUpdateEntity.mockResolvedValue(entity); - const router = await createRouter({ - entitiesCatalog: catalog, - logger: getVoidLogger(), - }); - - const app = express().use(router); const response = await request(app) .post('/entities') .send(entity) @@ -208,58 +167,46 @@ describe('createRouter', () => { expect(response.status).toEqual(200); expect(response.body).toEqual(entity); - expect(catalog.addOrUpdateEntity).toHaveBeenCalledTimes(1); - expect(catalog.addOrUpdateEntity).toHaveBeenNthCalledWith(1, entity); + expect(entitiesCatalog.addOrUpdateEntity).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.addOrUpdateEntity).toHaveBeenNthCalledWith( + 1, + entity, + ); }); }); describe('DELETE /entities/by-uid/:uid', () => { it('can remove', async () => { - const catalog = new MockEntitiesCatalog(); - catalog.removeEntityByUid.mockResolvedValue(undefined); + entitiesCatalog.removeEntityByUid.mockResolvedValue(undefined); - const router = await createRouter({ - entitiesCatalog: catalog, - logger: getVoidLogger(), - }); - - const app = express().use(router); const response = await request(app).delete('/entities/by-uid/apa'); expect(response.status).toEqual(204); - expect(catalog.removeEntityByUid).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.removeEntityByUid).toHaveBeenCalledTimes(1); }); it('responds with a 404 for missing entities', async () => { - const catalog = new MockEntitiesCatalog(); - catalog.removeEntityByUid.mockRejectedValue(new NotFoundError('nope')); + entitiesCatalog.removeEntityByUid.mockRejectedValue( + new NotFoundError('nope'), + ); - const router = await createRouter({ - entitiesCatalog: catalog, - logger: getVoidLogger(), - }); - - const app = express().use(router); const response = await request(app).delete('/entities/by-uid/apa'); expect(response.status).toEqual(404); - expect(catalog.removeEntityByUid).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.removeEntityByUid).toHaveBeenCalledTimes(1); }); }); describe('GET /locations', () => { it('happy path: lists locations', async () => { - const locations: Location[] = [{ id: 'a', type: 'b', target: 'c' }]; + const locations: LocationResponse[] = [ + { + currentStatus: { timestamp: '', status: '', message: '' }, + data: { id: 'a', type: 'b', target: 'c' }, + }, + ]; + locationsCatalog.locations.mockResolvedValueOnce(locations); - const catalog = new MockLocationsCatalog(); - catalog.locations.mockResolvedValueOnce(locations); - - const router = await createRouter({ - locationsCatalog: catalog, - logger: getVoidLogger(), - }); - - const app = express().use(router); const response = await request(app).get('/locations'); expect(response.status).toEqual(200); @@ -269,22 +216,33 @@ describe('createRouter', () => { describe('POST /locations', () => { it('rejects malformed locations', async () => { - const location = ({ - id: 'a', + const spec = ({ typez: 'b', target: 'c', - } as unknown) as Location; + } as unknown) as LocationSpec; - const catalog = new MockLocationsCatalog(); - const router = await createRouter({ - locationsCatalog: catalog, - logger: getVoidLogger(), - }); - - const app = express().use(router); - const response = await request(app).post('/locations').send(location); + const response = await request(app).post('/locations').send(spec); expect(response.status).toEqual(400); + expect(higherOrderOperation.addLocation).not.toHaveBeenCalled(); + }); + + it('passes the body down', async () => { + const spec: LocationSpec = { + type: 'b', + target: 'c', + }; + + higherOrderOperation.addLocation.mockResolvedValue({ + location: { id: 'a', ...spec }, + entities: [], + }); + + const response = await request(app).post('/locations').send(spec); + + expect(response.status).toEqual(201); + expect(higherOrderOperation.addLocation).toHaveBeenCalledTimes(1); + expect(higherOrderOperation.addLocation).toHaveBeenCalledWith(spec); }); }); }); diff --git a/plugins/catalog-backend/src/service/router.ts b/plugins/catalog-backend/src/service/router.ts index f5adbd84ca..95ea068f58 100644 --- a/plugins/catalog-backend/src/service/router.ts +++ b/plugins/catalog-backend/src/service/router.ts @@ -19,24 +19,30 @@ import { Entity } from '@backstage/catalog-model'; import express from 'express'; import Router from 'express-promise-router'; import { Logger } from 'winston'; -import { - addLocationSchema, - EntitiesCatalog, - LocationsCatalog, -} from '../catalog'; +import * as yup from 'yup'; +import { EntitiesCatalog, LocationsCatalog, LocationSpec } from '../catalog'; import { EntityFilters } from '../database'; +import { HigherOrderOperation } from '../ingestion/types'; import { requireRequestBody, validateRequestBody } from './util'; export interface RouterOptions { entitiesCatalog?: EntitiesCatalog; locationsCatalog?: LocationsCatalog; + higherOrderOperation?: HigherOrderOperation; logger: Logger; } +const addLocationSchema = yup + .object({ + type: yup.string().required(), + target: yup.string().required(), + }) + .noUnknown(); + export async function createRouter( options: RouterOptions, ): Promise { - const { entitiesCatalog, locationsCatalog } = options; + const { entitiesCatalog, locationsCatalog, higherOrderOperation } = options; const router = Router(); router.use(express.json()); @@ -84,13 +90,16 @@ export async function createRouter( }); } + if (higherOrderOperation) { + router.post('/locations', async (req, res) => { + const input = await validateRequestBody(req, addLocationSchema); + const output = await higherOrderOperation.addLocation(input); + res.status(201).send(output); + }); + } + if (locationsCatalog) { router - .post('/locations', async (req, res) => { - const input = await validateRequestBody(req, addLocationSchema); - const output = await locationsCatalog.addLocation(input); - res.status(201).send(output); - }) .get('/locations', async (_req, res) => { const output = await locationsCatalog.locations(); res.status(200).send(output); From 9db24c79b80625626df5d09c93f12b083462b451 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2020 09:46:12 +0200 Subject: [PATCH 015/192] build(deps): bump ts-jest from 26.0.0 to 26.1.0 (#1099) Bumps [ts-jest](https://github.com/kulshekhar/ts-jest) from 26.0.0 to 26.1.0. - [Release notes](https://github.com/kulshekhar/ts-jest/releases) - [Changelog](https://github.com/kulshekhar/ts-jest/blob/master/CHANGELOG.md) - [Commits](https://github.com/kulshekhar/ts-jest/compare/v26.0.0...v26.1.0) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- yarn.lock | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index 74fba61f49..b322cb1da4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18024,9 +18024,9 @@ ts-invariant@^0.4.0: tslib "^1.9.3" ts-jest@^26.0.0: - version "26.0.0" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-26.0.0.tgz#957b802978249aaf74180b9dcb17b4fd787ad6f3" - integrity sha512-eBpWH65mGgzobuw7UZy+uPP9lwu+tPp60o324ASRX4Ijg8UC5dl2zcge4kkmqr2Zeuk9FwIjvCTOPuNMEyGWWw== + version "26.1.0" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-26.1.0.tgz#e9070fc97b3ea5557a48b67c631c74eb35e15417" + integrity sha512-JbhQdyDMYN5nfKXaAwCIyaWLGwevcT2/dbqRPsQeh6NZPUuXjZQZEfeLb75tz0ubCIgEELNm6xAzTe5NXs5Y4Q== dependencies: bs-logger "0.x" buffer-from "1.x" @@ -19211,7 +19211,7 @@ yaml@^1.7.2: dependencies: "@babel/runtime" "^7.8.7" -yargs-parser@18.x: +yargs-parser@18.x, yargs-parser@^18.1.1: version "18.1.3" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== @@ -19242,14 +19242,6 @@ yargs-parser@^15.0.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.1: - version "18.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz#bf7407b915427fc760fcbbccc6c82b4f0ffcbd37" - integrity sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs@^13.3.2: version "13.3.2" resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" From 7d4c044d1a58923916e0d296e6ed7656d00da689 Mon Sep 17 00:00:00 2001 From: Marcus Eide Date: Tue, 2 Jun 2020 10:04:20 +0200 Subject: [PATCH 016/192] Rename test to clarify what it is doing --- .../src/apis/implementations/auth/github/GithubAuth.test.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/core-api/src/apis/implementations/auth/github/GithubAuth.test.ts b/packages/core-api/src/apis/implementations/auth/github/GithubAuth.test.ts index 3d3da266fc..7c8e6ce9f0 100644 --- a/packages/core-api/src/apis/implementations/auth/github/GithubAuth.test.ts +++ b/packages/core-api/src/apis/implementations/auth/github/GithubAuth.test.ts @@ -16,13 +16,11 @@ import GithubAuth from './GithubAuth'; -const theFuture = new Date(Date.now() + 3600000); - describe('GithubAuth', () => { - it('should get refreshed access token', async () => { + it('should get access token', async () => { const getSession = jest .fn() - .mockResolvedValue({ accessToken: 'access-token', expiresAt: theFuture }); + .mockResolvedValue({ accessToken: 'access-token' }); const githubAuth = new GithubAuth({ getSession } as any); expect(await githubAuth.getAccessToken()).toBe('access-token'); From 8d0e750bc2ab32676214645aeb8c5699b7dd66a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 2 Jun 2020 10:49:23 +0200 Subject: [PATCH 017/192] Address comments and add tests --- packages/catalog-model/src/index.ts | 1 + packages/catalog-model/src/location/index.ts | 18 +++ packages/catalog-model/src/location/types.ts | 24 +++ .../catalog-model/src/location/validation.ts | 33 ++++ .../catalog/DatabaseEntitiesCatalog.test.ts | 6 +- .../src/catalog/DatabaseLocationsCatalog.ts | 3 +- plugins/catalog-backend/src/catalog/index.ts | 7 +- plugins/catalog-backend/src/catalog/types.ts | 11 +- .../src/database/CommonDatabase.test.ts | 3 +- .../src/database/CommonDatabase.ts | 3 +- plugins/catalog-backend/src/database/types.ts | 3 +- .../ingestion/HigherOrderOperations.test.ts | 143 ++++++++++++++++++ .../src/ingestion/HigherOrderOperations.ts | 9 +- .../catalog-backend/src/ingestion/types.ts | 5 +- .../src/service/router.test.ts | 10 +- plugins/catalog-backend/src/service/router.ts | 15 +- 16 files changed, 246 insertions(+), 48 deletions(-) create mode 100644 packages/catalog-model/src/location/index.ts create mode 100644 packages/catalog-model/src/location/types.ts create mode 100644 packages/catalog-model/src/location/validation.ts create mode 100644 plugins/catalog-backend/src/ingestion/HigherOrderOperations.test.ts diff --git a/packages/catalog-model/src/index.ts b/packages/catalog-model/src/index.ts index fb51461053..f149b8c9b4 100644 --- a/packages/catalog-model/src/index.ts +++ b/packages/catalog-model/src/index.ts @@ -17,5 +17,6 @@ export * from './entity'; export { EntityPolicies } from './EntityPolicies'; export * from './kinds'; +export * from './location'; export type { EntityPolicy } from './types'; export * from './validation'; diff --git a/packages/catalog-model/src/location/index.ts b/packages/catalog-model/src/location/index.ts new file mode 100644 index 0000000000..60465bff9b --- /dev/null +++ b/packages/catalog-model/src/location/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type { Location, LocationSpec } from './types'; +export { locationSchema, locationSpecSchema } from './validation'; diff --git a/packages/catalog-model/src/location/types.ts b/packages/catalog-model/src/location/types.ts new file mode 100644 index 0000000000..50e6e82a54 --- /dev/null +++ b/packages/catalog-model/src/location/types.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type LocationSpec = { + type: string; + target: string; +}; + +export type Location = { + id: string; +} & LocationSpec; diff --git a/packages/catalog-model/src/location/validation.ts b/packages/catalog-model/src/location/validation.ts new file mode 100644 index 0000000000..5fad47bdd0 --- /dev/null +++ b/packages/catalog-model/src/location/validation.ts @@ -0,0 +1,33 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as yup from 'yup'; +import { LocationSpec, Location } from './types'; + +export const locationSpecSchema = yup + .object({ + type: yup.string().required(), + target: yup.string().required(), + }) + .noUnknown(); + +export const locationSchema = yup + .object({ + id: yup.string().required(), + type: yup.string().required(), + target: yup.string().required(), + }) + .noUnknown(); diff --git a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.test.ts b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.test.ts index b185075002..eb9cb2439c 100644 --- a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.test.ts @@ -21,7 +21,7 @@ import { DatabaseEntitiesCatalog } from './DatabaseEntitiesCatalog'; describe('DatabaseEntitiesCatalog', () => { let db: jest.Mocked; - beforeEach(() => { + beforeAll(() => { db = { transaction: jest.fn(), addEntity: jest.fn(), @@ -36,6 +36,10 @@ describe('DatabaseEntitiesCatalog', () => { locationHistory: jest.fn(), addLocationUpdateLogEvent: jest.fn(), }; + }); + + beforeEach(() => { + jest.resetAllMocks(); db.transaction.mockImplementation(async f => f('tx')); }); diff --git a/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts b/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts index 2a5208c95a..066fab8464 100644 --- a/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts +++ b/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts @@ -14,9 +14,10 @@ * limitations under the License. */ +import { Location } from '@backstage/catalog-model'; import type { Database } from '../database'; import { DatabaseLocationUpdateLogEvent } from '../database/types'; -import { Location, LocationResponse, LocationsCatalog } from './types'; +import { LocationResponse, LocationsCatalog } from './types'; export class DatabaseLocationsCatalog implements LocationsCatalog { constructor(private readonly database: Database) {} diff --git a/plugins/catalog-backend/src/catalog/index.ts b/plugins/catalog-backend/src/catalog/index.ts index dc0bb2e84a..308078b1fc 100644 --- a/plugins/catalog-backend/src/catalog/index.ts +++ b/plugins/catalog-backend/src/catalog/index.ts @@ -17,9 +17,4 @@ export { DatabaseEntitiesCatalog } from './DatabaseEntitiesCatalog'; export { DatabaseLocationsCatalog } from './DatabaseLocationsCatalog'; export { StaticEntitiesCatalog } from './StaticEntitiesCatalog'; -export type { - EntitiesCatalog, - Location, - LocationsCatalog, - LocationSpec, -} from './types'; +export type { EntitiesCatalog, LocationsCatalog } from './types'; diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index a8c3c7a15e..0499b8a409 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Entity } from '@backstage/catalog-model'; +import { Entity, Location } from '@backstage/catalog-model'; import type { EntityFilters } from '../database'; // @@ -51,15 +51,6 @@ export type LocationUpdateLogEvent = { message?: string; }; -export type LocationSpec = { - type: string; - target: string; -}; - -export type Location = { - id: string; -} & LocationSpec; - export type LocationResponse = { data: Location; currentStatus: LocationUpdateStatus; diff --git a/plugins/catalog-backend/src/database/CommonDatabase.test.ts b/plugins/catalog-backend/src/database/CommonDatabase.test.ts index 8f62969bd1..f1723e3733 100644 --- a/plugins/catalog-backend/src/database/CommonDatabase.test.ts +++ b/plugins/catalog-backend/src/database/CommonDatabase.test.ts @@ -19,10 +19,9 @@ import { getVoidLogger, NotFoundError, } from '@backstage/backend-common'; -import type { Entity } from '@backstage/catalog-model'; +import type { Entity, Location } from '@backstage/catalog-model'; import Knex from 'knex'; import path from 'path'; -import { Location } from '../catalog'; import { CommonDatabase } from './CommonDatabase'; import { DatabaseLocationUpdateLogStatus } from './types'; import type { diff --git a/plugins/catalog-backend/src/database/CommonDatabase.ts b/plugins/catalog-backend/src/database/CommonDatabase.ts index 084f6ea662..dd965c89ef 100644 --- a/plugins/catalog-backend/src/database/CommonDatabase.ts +++ b/plugins/catalog-backend/src/database/CommonDatabase.ts @@ -19,7 +19,7 @@ import { InputError, NotFoundError, } from '@backstage/backend-common'; -import type { Entity, EntityMeta } from '@backstage/catalog-model'; +import type { Entity, EntityMeta, Location } from '@backstage/catalog-model'; import Knex from 'knex'; import lodash from 'lodash'; import { v4 as uuidv4 } from 'uuid'; @@ -37,7 +37,6 @@ import type { DbLocationsRowWithStatus, EntityFilters, } from './types'; -import { Location } from '../catalog'; function getStrippedMetadata(metadata: EntityMeta): EntityMeta { const output = lodash.cloneDeep(metadata); diff --git a/plugins/catalog-backend/src/database/types.ts b/plugins/catalog-backend/src/database/types.ts index 4bcc66af1c..17da373ae9 100644 --- a/plugins/catalog-backend/src/database/types.ts +++ b/plugins/catalog-backend/src/database/types.ts @@ -14,8 +14,7 @@ * limitations under the License. */ -import type { Entity } from '@backstage/catalog-model'; -import { Location } from '../catalog'; +import type { Entity, Location } from '@backstage/catalog-model'; export type DbEntitiesRow = { id: string; diff --git a/plugins/catalog-backend/src/ingestion/HigherOrderOperations.test.ts b/plugins/catalog-backend/src/ingestion/HigherOrderOperations.test.ts new file mode 100644 index 0000000000..7f1e890fbf --- /dev/null +++ b/plugins/catalog-backend/src/ingestion/HigherOrderOperations.test.ts @@ -0,0 +1,143 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { EntitiesCatalog, LocationsCatalog } from '../catalog'; +import { IngestionModel } from './types'; +import { HigherOrderOperations } from './HigherOrderOperations'; +import { Entity } from '@backstage/catalog-model'; + +describe('HigherOrderOperations', () => { + let entitiesCatalog: jest.Mocked; + let locationsCatalog: jest.Mocked; + let ingestionModel: jest.Mocked; + let higherOrderOperation: HigherOrderOperations; + + beforeAll(() => { + entitiesCatalog = { + entities: jest.fn(), + entityByUid: jest.fn(), + entityByName: jest.fn(), + addOrUpdateEntity: jest.fn(), + removeEntityByUid: jest.fn(), + }; + locationsCatalog = { + addLocation: jest.fn(), + removeLocation: jest.fn(), + locations: jest.fn(), + location: jest.fn(), + locationHistory: jest.fn(), + }; + ingestionModel = { + readLocation: jest.fn(), + }; + higherOrderOperation = new HigherOrderOperations( + entitiesCatalog, + locationsCatalog, + ingestionModel, + ); + }); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + describe('addLocation', () => { + it('just inserts the location when there are no entities to read', async () => { + const spec = { + type: 'a', + target: 'b', + }; + locationsCatalog.addLocation.mockImplementation(x => Promise.resolve(x)); + locationsCatalog.locations.mockResolvedValue([]); + ingestionModel.readLocation.mockResolvedValue([]); + + const result = await higherOrderOperation.addLocation(spec); + + expect(result.location).toEqual( + expect.objectContaining({ + id: expect.anything(), + ...spec, + }), + ); + expect(result.entities).toEqual([]); + expect(locationsCatalog.locations).toBeCalledTimes(1); + expect(ingestionModel.readLocation).toBeCalledTimes(1); + expect(ingestionModel.readLocation).toBeCalledWith('a', 'b'); + expect(entitiesCatalog.addOrUpdateEntity).not.toBeCalled(); + expect(locationsCatalog.addLocation).toBeCalledTimes(1); + expect(locationsCatalog.addLocation).toBeCalledWith( + expect.objectContaining({ + id: expect.anything(), + ...spec, + }), + ); + }); + + it('reuses the location if a match already existed', async () => { + const spec = { + type: 'a', + target: 'b', + }; + const location = { + id: 'dd12620d-0436-422f-93bd-929aa0788123', + ...spec, + }; + + locationsCatalog.locations.mockResolvedValue([ + { + currentStatus: { timestamp: '', status: '', message: '' }, + data: location, + }, + ]); + ingestionModel.readLocation.mockResolvedValue([]); + + const result = await higherOrderOperation.addLocation(spec); + + expect(result.location).toEqual(location); + expect(result.entities).toEqual([]); + expect(locationsCatalog.locations).toBeCalledTimes(1); + expect(ingestionModel.readLocation).toBeCalledTimes(1); + expect(ingestionModel.readLocation).toBeCalledWith('a', 'b'); + expect(entitiesCatalog.addOrUpdateEntity).not.toBeCalled(); + expect(locationsCatalog.addLocation).not.toBeCalled(); + }); + + it('rejects the whole operation if any entity could not be read', async () => { + const spec = { + type: 'a', + target: 'b', + }; + const entity: Entity = { + apiVersion: 'a', + kind: 'b', + metadata: { name: 'n' }, + }; + + locationsCatalog.locations.mockResolvedValue([]); + ingestionModel.readLocation.mockResolvedValue([ + { type: 'data', data: entity }, + { type: 'error', error: new Error('abcd') }, + ]); + + await expect(higherOrderOperation.addLocation(spec)).rejects.toThrow( + /abcd/, + ); + expect(locationsCatalog.locations).toBeCalledTimes(1); + expect(entitiesCatalog.addOrUpdateEntity).not.toBeCalled(); + expect(locationsCatalog.addLocation).not.toBeCalled(); + }); + }); +}); diff --git a/plugins/catalog-backend/src/ingestion/HigherOrderOperations.ts b/plugins/catalog-backend/src/ingestion/HigherOrderOperations.ts index 0314556e27..e28d1e722a 100644 --- a/plugins/catalog-backend/src/ingestion/HigherOrderOperations.ts +++ b/plugins/catalog-backend/src/ingestion/HigherOrderOperations.ts @@ -15,14 +15,9 @@ */ import { InputError } from '@backstage/backend-common'; -import { Entity } from '@backstage/catalog-model'; +import { Entity, Location, LocationSpec } from '@backstage/catalog-model'; import { v4 as uuidv4 } from 'uuid'; -import { - EntitiesCatalog, - Location, - LocationsCatalog, - LocationSpec, -} from '../catalog'; +import { EntitiesCatalog, LocationsCatalog } from '../catalog'; import { IngestionModel } from '../ingestion'; import { AddLocationResult, HigherOrderOperation } from './types'; diff --git a/plugins/catalog-backend/src/ingestion/types.ts b/plugins/catalog-backend/src/ingestion/types.ts index 45dd0d9f74..018784bd0f 100644 --- a/plugins/catalog-backend/src/ingestion/types.ts +++ b/plugins/catalog-backend/src/ingestion/types.ts @@ -14,9 +14,8 @@ * limitations under the License. */ -import { Entity } from '@backstage/catalog-model'; -import { Location, LocationSpec } from '../catalog'; -import { ReaderOutput } from './descriptor/parsers/types'; +import type { Entity, Location, LocationSpec } from '@backstage/catalog-model'; +import type { ReaderOutput } from './descriptor/parsers/types'; export type AddLocationResult = { location: Location; diff --git a/plugins/catalog-backend/src/service/router.test.ts b/plugins/catalog-backend/src/service/router.test.ts index e03cb3dc98..d26476bca0 100644 --- a/plugins/catalog-backend/src/service/router.test.ts +++ b/plugins/catalog-backend/src/service/router.test.ts @@ -15,10 +15,10 @@ */ import { getVoidLogger, NotFoundError } from '@backstage/backend-common'; -import type { Entity } from '@backstage/catalog-model'; +import type { Entity, LocationSpec } from '@backstage/catalog-model'; import express from 'express'; import request from 'supertest'; -import { EntitiesCatalog, LocationsCatalog, LocationSpec } from '../catalog'; +import { EntitiesCatalog, LocationsCatalog } from '../catalog'; import { LocationResponse } from '../catalog/types'; import { HigherOrderOperation } from '../ingestion/types'; import { createRouter } from './router'; @@ -29,7 +29,7 @@ describe('createRouter', () => { let higherOrderOperation: jest.Mocked; let app: express.Express; - beforeEach(async () => { + beforeAll(async () => { entitiesCatalog = { entities: jest.fn(), entityByUid: jest.fn(), @@ -56,6 +56,10 @@ describe('createRouter', () => { app = express().use(router); }); + beforeEach(() => { + jest.resetAllMocks(); + }); + describe('GET /entities', () => { it('happy path: lists entities', async () => { const entities: Entity[] = [ diff --git a/plugins/catalog-backend/src/service/router.ts b/plugins/catalog-backend/src/service/router.ts index 95ea068f58..22d1f73730 100644 --- a/plugins/catalog-backend/src/service/router.ts +++ b/plugins/catalog-backend/src/service/router.ts @@ -15,12 +15,12 @@ */ import { errorHandler, InputError } from '@backstage/backend-common'; -import { Entity } from '@backstage/catalog-model'; +import { locationSpecSchema } from '@backstage/catalog-model'; +import type { Entity } from '@backstage/catalog-model'; import express from 'express'; import Router from 'express-promise-router'; import { Logger } from 'winston'; -import * as yup from 'yup'; -import { EntitiesCatalog, LocationsCatalog, LocationSpec } from '../catalog'; +import { EntitiesCatalog, LocationsCatalog } from '../catalog'; import { EntityFilters } from '../database'; import { HigherOrderOperation } from '../ingestion/types'; import { requireRequestBody, validateRequestBody } from './util'; @@ -32,13 +32,6 @@ export interface RouterOptions { logger: Logger; } -const addLocationSchema = yup - .object({ - type: yup.string().required(), - target: yup.string().required(), - }) - .noUnknown(); - export async function createRouter( options: RouterOptions, ): Promise { @@ -92,7 +85,7 @@ export async function createRouter( if (higherOrderOperation) { router.post('/locations', async (req, res) => { - const input = await validateRequestBody(req, addLocationSchema); + const input = await validateRequestBody(req, locationSpecSchema); const output = await higherOrderOperation.addLocation(input); res.status(201).send(output); }); From fcb6c70587b883f60821b8c6ad8be82945c00c8f Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Tue, 2 Jun 2020 11:05:58 +0200 Subject: [PATCH 018/192] Enable hot-reload --- packages/app/src/App.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index c18169ae03..31b68a9da5 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -20,6 +20,7 @@ import { BrowserRouter as Router } from 'react-router-dom'; import Root from './components/Root'; import * as plugins from './plugins'; import apis from './apis'; +import { hot } from 'react-hot-loader/root'; const app = createApp({ apis, @@ -53,4 +54,4 @@ const App: FC<{}> = () => ( ); -export default App; +export default hot(App); From ef3ed1a54a809f305b2d150d00b03bf9b83302eb Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Tue, 2 Jun 2020 11:06:12 +0200 Subject: [PATCH 019/192] Cleanup for the register component flow --- .../RegisterComponentForm.tsx | 29 +++------ .../RegisterComponentPage.tsx | 63 +++++++++++-------- 2 files changed, 44 insertions(+), 48 deletions(-) diff --git a/plugins/register-component/src/components/RegisterComponentForm/RegisterComponentForm.tsx b/plugins/register-component/src/components/RegisterComponentForm/RegisterComponentForm.tsx index d279afac25..9a1597dce3 100644 --- a/plugins/register-component/src/components/RegisterComponentForm/RegisterComponentForm.tsx +++ b/plugins/register-component/src/components/RegisterComponentForm/RegisterComponentForm.tsx @@ -20,12 +20,10 @@ import { FormControl, FormHelperText, TextField, - Typography, } from '@material-ui/core'; import { useForm } from 'react-hook-form'; import { makeStyles } from '@material-ui/core/styles'; import { BackstageTheme } from '@backstage/theme'; -import { Progress } from '@backstage/core'; import { ComponentIdValidators } from '../../util/validate'; const useStyles = makeStyles(theme => ({ @@ -40,30 +38,17 @@ const useStyles = makeStyles(theme => ({ })); type RegisterComponentProps = { - onSubmit: () => any; - submitting: boolean; + onSubmit: (formData: Record) => Promise; }; -const RegisterComponentForm: FC = ({ - onSubmit, - submitting, -}) => { +const RegisterComponentForm: FC = ({ onSubmit }) => { const { register, handleSubmit, errors, formState } = useForm({ mode: 'onChange', }); const classes = useStyles(); - const hasErrors = !!errors.componentIdInput; + const hasErrors = !!errors.componentLocation; const dirty = formState?.dirty; - if (submitting) { - return ( - <> - - Your component is being registered. Please wait. - - - - ); - } + return (
= ({ label="Component service file URL" error={hasErrors} placeholder="https://example.com/user/some-service/blob/master/service-info.yaml" - name="componentIdInput" + name="componentLocation" required margin="normal" helperText="Enter the full path to the service-info.yaml file in GHE to start tracking your component. It must be in a public repo, on the master branch." @@ -87,9 +72,9 @@ const RegisterComponentForm: FC = ({ })} /> - {errors.componentIdInput && ( + {errors.componentLocation && ( - {errors.componentIdInput.message} + {errors.componentLocation.message} )} diff --git a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx index de830f9a43..c67dc158c8 100644 --- a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx +++ b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx @@ -15,7 +15,7 @@ */ import React, { FC, useState } from 'react'; -import { useHistory, Link as RouterLink } from 'react-router-dom'; +import { Link as RouterLink } from 'react-router-dom'; import { Grid, makeStyles, @@ -29,10 +29,9 @@ import { ListItemText, List, LinearProgress, + ListItemIcon, } from '@material-ui/core'; -import { GitHub as GitHubIcon } from '@material-ui/icons'; -import { Star as StarIcon } from '@material-ui/icons'; - +import LinkIcon from '@material-ui/icons/Link'; import { InfoCard, Page, @@ -61,12 +60,20 @@ const useStyles = makeStyles(theme => ({ }, })); -const RegisterComponentPage: FC<{}> = () => { - const history = useHistory(); - const classes = useStyles(); +const FormStates = { + Idle: 'idle', + Success: 'success', + Error: 'error', + Submitting: 'submitting', +} as const; +type ValuesOf = T extends Record ? V : never; +const RegisterComponentPage: FC<{}> = () => { + const classes = useStyles(); const catalogApi = useApi(catalogApiRef); - const [isSubmitting, setIsSubmitting] = useState(false); + const [formState, setFormState] = useState>( + FormStates.Idle, + ); const alertApi = useApi(alertApiRef); const errorApi = useApi(errorApiRef); @@ -81,10 +88,9 @@ const RegisterComponentPage: FC<{}> = () => { loading: false, }); - const onSubmit = async (formData: { componentIdInput: string }) => { - setIsSubmitting(true); - - const { componentIdInput: target } = formData; + const handleSubmit = async (formData: Record) => { + setFormState(FormStates.Submitting); + const { componentLocation: target } = formData; try { const data = await catalogApi.addLocation('github', target); @@ -93,45 +99,50 @@ const RegisterComponentPage: FC<{}> = () => { severity: 'success', }); setResult({ error: null, loading: false, data }); + setFormState(FormStates.Success); } catch (e) { + setFormState(FormStates.Error); errorApi.post(e); } - - setIsSubmitting(false); }; - const gheUrl = 'some-url'; - const showDialog = result.data && !result.error; + return ( - + Documentation - {result.loading ? ( + {formState === FormStates.Submitting ? ( ) : ( - + )} - + setFormState(FormStates.Idle)} + classes={{ paper: classes.dialogPaper }} + > Component registration result {result.data ? ( <> - Following components have been succefully created. + Following components have been succefully created: {result.data.entities.map((entity: any) => ( + + + @@ -141,8 +152,8 @@ const RegisterComponentPage: FC<{}> = () => { - From 6060face132fb955c4c97c8155bcb4afc669ff67 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Tue, 2 Jun 2020 11:38:38 +0200 Subject: [PATCH 020/192] Wire up real data --- plugins/catalog/src/api/CatalogClient.ts | 40 +----------- plugins/catalog/src/api/types.ts | 4 +- .../RegisterComponentPage.tsx | 64 +++++++++---------- 3 files changed, 36 insertions(+), 72 deletions(-) diff --git a/plugins/catalog/src/api/CatalogClient.ts b/plugins/catalog/src/api/CatalogClient.ts index ed38c008ac..6784c08494 100644 --- a/plugins/catalog/src/api/CatalogClient.ts +++ b/plugins/catalog/src/api/CatalogClient.ts @@ -58,46 +58,12 @@ export class CatalogClient implements CatalogApi { if (response.status !== 201) { throw new Error(`Location wasn't added: ${target}`); } - const location = await response.json(); + const { location, entities } = await response.json(); - // TODO(shmidt-i): remove mocks - if (location) + if (location && entities.length > 0) return { location, - entities: [ - { - apiVersion: 'backstage.io/v1beta1', - kind: 'Component', - metadata: { - name: 'component-website', - annotations: { - 'backstage.io/managed-by-location': location.id, - }, - uid: 'uid1', - etag: 'YTQzMmNmNjctMGZmMC00YWM5LWFjYWQtZDg1NjBjNDFlYWM4', - generation: 1, - }, - spec: { - type: 'website', - }, - }, - { - apiVersion: 'backstage.io/v1beta1', - kind: 'Component', - metadata: { - name: 'component-service', - annotations: { - 'backstage.io/managed-by-location': location.id, - }, - uid: 'uid2', - etag: 'YTQzMmNmNjctMGZmMC00YWM5LWFjYWQtZDg1NjBjNDFlYWM4', - generation: 1, - }, - spec: { - type: 'service', - }, - }, - ], + entities, }; throw new Error(`'Location wasn't added: ${target}`); } diff --git a/plugins/catalog/src/api/types.ts b/plugins/catalog/src/api/types.ts index b92f07247f..1418ea17fa 100644 --- a/plugins/catalog/src/api/types.ts +++ b/plugins/catalog/src/api/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { createApiRef } from '@backstage/core'; -import { Entity } from '@backstage/catalog-model'; +import { Entity, Location } from '@backstage/catalog-model'; export const catalogApiRef = createApiRef({ id: 'plugin.catalog.service', @@ -28,5 +28,5 @@ export interface CatalogApi { addLocation( type: string, target: string, - ): Promise<{ location: any; entities: Entity[] }>; + ): Promise<{ location: Location; entities: Entity[] }>; } diff --git a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx index c67dc158c8..0b6639f40a 100644 --- a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx +++ b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx @@ -26,12 +26,11 @@ import { DialogActions, Button, ListItem, - ListItemText, List, LinearProgress, - ListItemIcon, + Divider, + Link, } from '@material-ui/core'; -import LinkIcon from '@material-ui/icons/Link'; import { InfoCard, Page, @@ -40,8 +39,8 @@ import { ContentHeader, SupportButton, useApi, - alertApiRef, errorApiRef, + StructuredMetadataTable, } from '@backstage/core'; import RegisterComponentForm from '../RegisterComponentForm'; import { catalogApiRef } from '@backstage/plugin-catalog'; @@ -63,7 +62,6 @@ const useStyles = makeStyles(theme => ({ const FormStates = { Idle: 'idle', Success: 'success', - Error: 'error', Submitting: 'submitting', } as const; @@ -75,17 +73,14 @@ const RegisterComponentPage: FC<{}> = () => { FormStates.Idle, ); - const alertApi = useApi(alertApiRef); const errorApi = useApi(errorApiRef); const [result, setResult] = useState<{ data: any; error: null | Error; - loading: boolean; }>({ data: null, error: null, - loading: false, }); const handleSubmit = async (formData: Record) => { @@ -94,14 +89,11 @@ const RegisterComponentPage: FC<{}> = () => { try { const data = await catalogApi.addLocation('github', target); - alertApi.post({ - message: 'Successfully added the location', - severity: 'success', - }); - setResult({ error: null, loading: false, data }); + setResult({ error: null, data }); setFormState(FormStates.Success); } catch (e) { - setFormState(FormStates.Error); + setResult({ error: e, data: null }); + setFormState(FormStates.Idle); errorApi.post(e); } }; @@ -125,28 +117,40 @@ const RegisterComponentPage: FC<{}> = () => { setFormState(FormStates.Idle)} classes={{ paper: classes.dialogPaper }} > Component registration result - {result.data ? ( + {formState === FormStates.Success && ( <> Following components have been succefully created: - {result.data.entities.map((entity: any) => ( - - - - - - - - + {result.data.entities.map((entity: any, index: number) => ( + <> + + + /catalog/{entity.metadata.name} + + ), + }} + /> + + {index < result.data.entities.length - 1 && ( + + )} + ))} @@ -157,12 +161,6 @@ const RegisterComponentPage: FC<{}> = () => { - ) : ( - - - Your component is being created. Please wait. - - )} From f80c6304c21217c6507be5edbe117fcb0eddb578 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Tue, 2 Jun 2020 12:06:04 +0200 Subject: [PATCH 021/192] Use routeRefs --- .../components/CatalogPage/CatalogPage.tsx | 15 ++++++++---- .../components/CatalogTable/CatalogTable.tsx | 9 ++++++- plugins/catalog/src/index.ts | 1 + plugins/catalog/src/plugin.ts | 5 ++-- plugins/catalog/src/routes.ts | 14 +++++++++++ .../RegisterComponentPage.tsx | 24 ++++++++++++++----- plugins/register-component/src/index.ts | 2 +- plugins/register-component/src/plugin.ts | 10 ++++++-- .../src/components/ScaffolderPage/index.tsx | 2 +- plugins/scaffolder/src/index.ts | 2 +- plugins/scaffolder/src/plugin.ts | 10 ++++++-- 11 files changed, 74 insertions(+), 20 deletions(-) create mode 100644 plugins/catalog/src/routes.ts diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx index 8a2b448d97..d3b29bfa86 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx @@ -34,6 +34,8 @@ import { } from '../CatalogFilter/CatalogFilter'; import { Button, makeStyles, Typography, Link } from '@material-ui/core'; import { filterGroups, defaultFilter } from '../../data/filters'; +import { Link as RouterLink } from 'react-router-dom'; +import { rootRoute as scaffolderRootRoute } from '@backstage/plugin-scaffolder'; const useStyles = makeStyles(theme => ({ contentWrapper: { @@ -72,18 +74,23 @@ const CatalogPage: FC<{}> = () => { 👋🏼 - {' '} + Welcome to Backstage, we are happy to have you. Start by checking - out our{' '} + out our getting started - {' '} + page. } /> - All your components diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx index f5fa45dc7e..37c518cb6b 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx @@ -17,6 +17,8 @@ import React, { FC } from 'react'; import { Component } from '../../data/component'; import { InfoCard, Progress, Table, TableColumn } from '@backstage/core'; import { Typography, Link } from '@material-ui/core'; +import { Link as RouterLink, generatePath } from 'react-router-dom'; +import { entityRoute } from '../../routes'; const columns: TableColumn[] = [ { @@ -24,7 +26,12 @@ const columns: TableColumn[] = [ field: 'name', highlight: true, render: (componentData: any) => ( - {componentData.name} + + {componentData.name} + ), }, { diff --git a/plugins/catalog/src/index.ts b/plugins/catalog/src/index.ts index f495bd3146..2b986b59ea 100644 --- a/plugins/catalog/src/index.ts +++ b/plugins/catalog/src/index.ts @@ -18,3 +18,4 @@ export { plugin } from './plugin'; export * from './api/CatalogClient'; export * from './api/types'; export * from './types'; +export * from './routes'; diff --git a/plugins/catalog/src/plugin.ts b/plugins/catalog/src/plugin.ts index 97e470a065..1eee5efe07 100644 --- a/plugins/catalog/src/plugin.ts +++ b/plugins/catalog/src/plugin.ts @@ -17,11 +17,12 @@ import { createPlugin } from '@backstage/core'; import CatalogPage from './components/CatalogPage'; import ComponentPage from './components/ComponentPage/ComponentPage'; +import { rootRoute, entityRoute } from './routes'; export const plugin = createPlugin({ id: 'catalog', register({ router }) { - router.registerRoute('/', CatalogPage); - router.registerRoute('/catalog/:name/', ComponentPage); + router.addRoute(rootRoute, CatalogPage); + router.addRoute(entityRoute, ComponentPage); }, }); diff --git a/plugins/catalog/src/routes.ts b/plugins/catalog/src/routes.ts new file mode 100644 index 0000000000..79d02fefe1 --- /dev/null +++ b/plugins/catalog/src/routes.ts @@ -0,0 +1,14 @@ +import { createRouteRef } from '@backstage/core'; + +const NoIcon = () => null; + +export const rootRoute = createRouteRef({ + icon: NoIcon, + path: '/', + title: 'Catalog', +}); +export const entityRoute = createRouteRef({ + icon: NoIcon, + path: '/catalog/:name/', + title: 'Entity', +}); diff --git a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx index 0b6639f40a..d0189ba7f8 100644 --- a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx +++ b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx @@ -41,9 +41,15 @@ import { useApi, errorApiRef, StructuredMetadataTable, + Header, } from '@backstage/core'; import RegisterComponentForm from '../RegisterComponentForm'; import { catalogApiRef } from '@backstage/plugin-catalog'; +import { + entityRoute, + rootRoute as catalogRootRoute, +} from '@backstage/plugin-catalog'; +import { generatePath } from 'react-router'; const useStyles = makeStyles(theme => ({ dialogPaper: { @@ -100,10 +106,8 @@ const RegisterComponentPage: FC<{}> = () => { return ( +
- - Documentation - @@ -139,9 +143,13 @@ const RegisterComponentPage: FC<{}> = () => { link: ( - /catalog/{entity.metadata.name} + {generatePath(entityRoute.path, { + name: entity.metadata.name, + })} ), }} @@ -156,7 +164,11 @@ const RegisterComponentPage: FC<{}> = () => { - diff --git a/plugins/register-component/src/index.ts b/plugins/register-component/src/index.ts index 3a0a0fe2d3..5b20cb0158 100644 --- a/plugins/register-component/src/index.ts +++ b/plugins/register-component/src/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { plugin } from './plugin'; +export { plugin, rootRoute } from './plugin'; diff --git a/plugins/register-component/src/plugin.ts b/plugins/register-component/src/plugin.ts index f32e9dc84f..9c73688a70 100644 --- a/plugins/register-component/src/plugin.ts +++ b/plugins/register-component/src/plugin.ts @@ -14,12 +14,18 @@ * limitations under the License. */ -import { createPlugin } from '@backstage/core'; +import { createPlugin, createRouteRef } from '@backstage/core'; import RegisterComponentPage from './components/RegisterComponentPage'; +export const rootRoute = createRouteRef({ + icon: () => null, + path: '/register-component', + title: 'Register component', +}); + export const plugin = createPlugin({ id: 'register-component', register({ router }) { - router.registerRoute('/register-component', RegisterComponentPage); + router.addRoute(rootRoute, RegisterComponentPage); }, }); diff --git a/plugins/scaffolder/src/components/ScaffolderPage/index.tsx b/plugins/scaffolder/src/components/ScaffolderPage/index.tsx index 59eb6cff43..5d976a20b2 100644 --- a/plugins/scaffolder/src/components/ScaffolderPage/index.tsx +++ b/plugins/scaffolder/src/components/ScaffolderPage/index.tsx @@ -57,7 +57,7 @@ const ScaffolderPage: React.FC<{}> = () => { component={RouterLink} to="/register-component" > - Register existing entity + Register existing component diff --git a/plugins/scaffolder/src/index.ts b/plugins/scaffolder/src/index.ts index 3a0a0fe2d3..5b20cb0158 100644 --- a/plugins/scaffolder/src/index.ts +++ b/plugins/scaffolder/src/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { plugin } from './plugin'; +export { plugin, rootRoute } from './plugin'; diff --git a/plugins/scaffolder/src/plugin.ts b/plugins/scaffolder/src/plugin.ts index 31bdab2f84..b2cb305e57 100644 --- a/plugins/scaffolder/src/plugin.ts +++ b/plugins/scaffolder/src/plugin.ts @@ -14,12 +14,18 @@ * limitations under the License. */ -import { createPlugin } from '@backstage/core'; +import { createPlugin, createRouteRef } from '@backstage/core'; import ScaffolderPage from './components/ScaffolderPage'; +export const rootRoute = createRouteRef({ + icon: () => null, + path: '/create', + title: 'Create entity', +}); + export const plugin = createPlugin({ id: 'scaffolder', register({ router }) { - router.registerRoute('/create', ScaffolderPage); + router.addRoute(rootRoute, ScaffolderPage); }, }); From 1010f4d6b120a5ea7267dffc3f28b01abaf90756 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 1 Jun 2020 17:10:50 +0200 Subject: [PATCH 022/192] plugins: added initial mock-idp-backend --- plugins/mock-idp-backend/.eslintrc.js | 3 + plugins/mock-idp-backend/README.md | 7 ++ plugins/mock-idp-backend/package.json | 41 ++++++++++ plugins/mock-idp-backend/src/index.ts | 17 ++++ plugins/mock-idp-backend/src/run.ts | 80 +++++++++++++++++++ plugins/mock-idp-backend/src/service/index.ts | 17 ++++ .../src/service/router.test.ts | 36 +++++++++ .../mock-idp-backend/src/service/router.ts | 34 ++++++++ plugins/mock-idp-backend/src/setupTests.ts | 17 ++++ plugins/mock-idp-backend/tsconfig.json | 15 ++++ 10 files changed, 267 insertions(+) create mode 100644 plugins/mock-idp-backend/.eslintrc.js create mode 100644 plugins/mock-idp-backend/README.md create mode 100644 plugins/mock-idp-backend/package.json create mode 100644 plugins/mock-idp-backend/src/index.ts create mode 100644 plugins/mock-idp-backend/src/run.ts create mode 100644 plugins/mock-idp-backend/src/service/index.ts create mode 100644 plugins/mock-idp-backend/src/service/router.test.ts create mode 100644 plugins/mock-idp-backend/src/service/router.ts create mode 100644 plugins/mock-idp-backend/src/setupTests.ts create mode 100644 plugins/mock-idp-backend/tsconfig.json diff --git a/plugins/mock-idp-backend/.eslintrc.js b/plugins/mock-idp-backend/.eslintrc.js new file mode 100644 index 0000000000..16a033dbc6 --- /dev/null +++ b/plugins/mock-idp-backend/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: [require.resolve('@backstage/cli/config/eslint.backend')], +}; diff --git a/plugins/mock-idp-backend/README.md b/plugins/mock-idp-backend/README.md new file mode 100644 index 0000000000..c1925e326f --- /dev/null +++ b/plugins/mock-idp-backend/README.md @@ -0,0 +1,7 @@ +# Mock IdP Backend + +Mock backend for demonstrating 3rd party identity provider flow with SAML 2.0. + +## Links + +- (The Backstage homepage)[https://backstage.io] diff --git a/plugins/mock-idp-backend/package.json b/plugins/mock-idp-backend/package.json new file mode 100644 index 0000000000..e4ff95e46a --- /dev/null +++ b/plugins/mock-idp-backend/package.json @@ -0,0 +1,41 @@ +{ + "name": "@backstage/plugin-mock-idp-backend", + "version": "0.1.1-alpha.6", + "main": "dist", + "types": "src/index.ts", + "license": "Apache-2.0", + "private": true, + "scripts": { + "start": "tsc-watch --onFirstSuccess \"cross-env NODE_ENV=development nodemon dist/run.js\"", + "build": "tsc", + "lint": "backstage-cli lint", + "test": "backstage-cli test", + "prepack": "backstage-cli prepack", + "postpack": "backstage-cli postpack", + "clean": "backstage-cli clean" + }, + "dependencies": { + "@backstage/backend-common": "^0.1.1-alpha.6", + "compression": "^1.7.4", + "cors": "^2.8.5", + "express": "^4.17.1", + "express-promise-router": "^3.0.3", + "fs-extra": "^9.0.0", + "helmet": "^3.22.0", + "morgan": "^1.10.0", + "winston": "^3.2.1", + "yn": "^4.0.0" + }, + "devDependencies": { + "@backstage/cli": "^0.1.1-alpha.6", + "@types/supertest": "^2.0.8", + "supertest": "^4.0.2", + "tsc-watch": "^4.2.3" + }, + "files": [ + "dist" + ], + "nodemonConfig": { + "watch": "./dist" + } +} diff --git a/plugins/mock-idp-backend/src/index.ts b/plugins/mock-idp-backend/src/index.ts new file mode 100644 index 0000000000..7612c392a2 --- /dev/null +++ b/plugins/mock-idp-backend/src/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './service/router'; diff --git a/plugins/mock-idp-backend/src/run.ts b/plugins/mock-idp-backend/src/run.ts new file mode 100644 index 0000000000..ea67d335fd --- /dev/null +++ b/plugins/mock-idp-backend/src/run.ts @@ -0,0 +1,80 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + errorHandler, + getRootLogger, + notFoundHandler, + requestLoggingHandler, +} from '@backstage/backend-common'; +import compression from 'compression'; +import cors from 'cors'; +import express from 'express'; +import helmet from 'helmet'; +import { Server } from 'http'; +import { Logger } from 'winston'; +import { createRouter } from './service'; + +export type ServerConfig = { + port: number; + logger: Logger; +}; + +function readConfig() { + const port = Number(process.env.PLUGIN_PORT) || 3003; + const logger = getRootLogger().child({ service: 'mock-idp-backend' }); + return { port, logger }; +} + +async function startStandaloneServer(config: ServerConfig): Promise { + const { port, logger } = config; + logger.debug('Creating application...'); + + const app = express(); + + app.use(helmet()); + app.use(cors()); + app.use(compression()); + app.use(express.json()); + app.use(requestLoggingHandler()); + app.use(await createRouter({ logger })); + app.use(notFoundHandler()); + app.use(errorHandler()); + + logger.debug('Starting application server...'); + + process.on('SIGINT', () => { + logger.info('CTRL+C pressed; exiting.'); + process.exit(0); + }); + + return await new Promise((resolve, reject) => { + const server = app.listen(port, (err?: Error) => { + if (err) { + reject(err); + return; + } + + logger.info(`Listening on port ${port}`); + resolve(server); + }); + }); +} + +startStandaloneServer(readConfig()).catch(err => { + console.error(err.stack || err); + process.exit(1); +}); diff --git a/plugins/mock-idp-backend/src/service/index.ts b/plugins/mock-idp-backend/src/service/index.ts new file mode 100644 index 0000000000..38fbb697c4 --- /dev/null +++ b/plugins/mock-idp-backend/src/service/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { createRouter } from './router'; diff --git a/plugins/mock-idp-backend/src/service/router.test.ts b/plugins/mock-idp-backend/src/service/router.test.ts new file mode 100644 index 0000000000..192baeebb9 --- /dev/null +++ b/plugins/mock-idp-backend/src/service/router.test.ts @@ -0,0 +1,36 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getVoidLogger } from '@backstage/backend-common'; +import { createRouter } from './router'; +import express from 'express'; +import request from 'supertest'; + +async function makeApp() { + const router = await createRouter({ logger: getVoidLogger() }); + const app = express(); + app.use(router); + return app; +} + +describe('router', () => { + it('should echo', async () => { + const app = await makeApp(); + const response = await request(app).get('/echo'); + expect(response.status).toEqual(200); + expect(response.text).toEqual('echo'); + }); +}); diff --git a/plugins/mock-idp-backend/src/service/router.ts b/plugins/mock-idp-backend/src/service/router.ts new file mode 100644 index 0000000000..62bffb050d --- /dev/null +++ b/plugins/mock-idp-backend/src/service/router.ts @@ -0,0 +1,34 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Router from 'express-promise-router'; +import { Logger } from 'winston'; + +export interface RouterOptions { + logger: Logger; +} + +export async function createRouter(options: RouterOptions) { + const { logger } = options; + const router = Router(); + + router.get('/echo', (_req, res) => { + logger.info('sending echo'); + res.send('echo'); + }); + + return router; +} diff --git a/plugins/mock-idp-backend/src/setupTests.ts b/plugins/mock-idp-backend/src/setupTests.ts new file mode 100644 index 0000000000..ba33cf996b --- /dev/null +++ b/plugins/mock-idp-backend/src/setupTests.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export {}; diff --git a/plugins/mock-idp-backend/tsconfig.json b/plugins/mock-idp-backend/tsconfig.json new file mode 100644 index 0000000000..015a967f76 --- /dev/null +++ b/plugins/mock-idp-backend/tsconfig.json @@ -0,0 +1,15 @@ +{ + "include": ["src"], + "compilerOptions": { + "outDir": "dist", + "incremental": true, + "sourceMap": true, + "declaration": true, + "strict": true, + "target": "es2019", + "module": "commonjs", + "esModuleInterop": true, + "lib": ["es2019"], + "types": ["node", "jest"] + } +} From 922c02884693b5083f4fa626a82b5189cd5b1743 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Mon, 1 Jun 2020 17:44:41 +0200 Subject: [PATCH 023/192] plugins/mock-idp-backend: generate some dev certs --- plugins/mock-idp-backend/cert.pem | 11 +++++++++++ plugins/mock-idp-backend/gen-certs.sh | 10 ++++++++++ plugins/mock-idp-backend/key.pem | 16 ++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 plugins/mock-idp-backend/cert.pem create mode 100755 plugins/mock-idp-backend/gen-certs.sh create mode 100644 plugins/mock-idp-backend/key.pem diff --git a/plugins/mock-idp-backend/cert.pem b/plugins/mock-idp-backend/cert.pem new file mode 100644 index 0000000000..9fd9f66f97 --- /dev/null +++ b/plugins/mock-idp-backend/cert.pem @@ -0,0 +1,11 @@ +-----BEGIN CERTIFICATE----- +MIIBnzCCAQgCCQCIF7n8FCJ0azANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDDAls +b2NhbGhvc3QwHhcNMjAwNjAxMTU0NDM1WhcNMzAwNTMwMTU0NDM1WjAUMRIwEAYD +VQQDDAlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMoHudQ6 +bah8Div++6Ooi+ZchrseVWgXU+q/X6jIY7Gkf/aUMAYtiBAvr/FG5WTn1ePVdHxo +20VkNRkiwFGeL0Z33IrGhkgkwpQZnWGwKpwqEddjed1ABeOksP/RFmzBCHNnxZGu +xu5E1nqWkPLjPRicAoo9V76xPLLlUJoS5ls7AgMBAAEwDQYJKoZIhvcNAQELBQAD +gYEAkG2oNLjFk0FUeM6cqnLvaA9fCml3JUA1nFgMshVXLvE/aOeXKhgy96DAcUw3 +xsdHHKMJpX4n49Odz3wyAtCWFTkz600T7oSrZ7FAU2VORKapBqqUL2HtLGB2gds+ +ndfiDwLV7Yb67cQikkgLU9ZzwYcGL6ovfxuw01f13ZyiAwg= +-----END CERTIFICATE----- diff --git a/plugins/mock-idp-backend/gen-certs.sh b/plugins/mock-idp-backend/gen-certs.sh new file mode 100755 index 0000000000..d33c0f0e75 --- /dev/null +++ b/plugins/mock-idp-backend/gen-certs.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +openssl req \ + -x509 \ + -newkey rsa:1024 \ + -days 3650 \ + -nodes \ + -subj '/CN=localhost' \ + -keyout "key.pem" \ + -out "cert.pem" diff --git a/plugins/mock-idp-backend/key.pem b/plugins/mock-idp-backend/key.pem new file mode 100644 index 0000000000..a90f813106 --- /dev/null +++ b/plugins/mock-idp-backend/key.pem @@ -0,0 +1,16 @@ +-----BEGIN PRIVATE KEY----- +MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMoHudQ6bah8Div+ ++6Ooi+ZchrseVWgXU+q/X6jIY7Gkf/aUMAYtiBAvr/FG5WTn1ePVdHxo20VkNRki +wFGeL0Z33IrGhkgkwpQZnWGwKpwqEddjed1ABeOksP/RFmzBCHNnxZGuxu5E1nqW +kPLjPRicAoo9V76xPLLlUJoS5ls7AgMBAAECgYEAk2hztGA1Zrutc3iGjvEJsrlM +LPeDBYIP3rZny7T62MDYBUg2iitqnbTNwVQjSC7IJ4a1iZjQdJ8bBw4OGP88Kfcv +QQl7PnU7+Sp/z6PMGpcsP/bBoStrqG4Bdv5bM15csLuGlkz/rQV/4Q/9nrCY4qDp +5U7Np/E2TTrjjPINtMECQQD53Q8hl8PkvH5pdqm+GwmGIQu1++WX8kD90ib7hnaL +Vs39pMGFviXmW8LLv0rwFhLNpVCNBpjh4jA8knKFYfexAkEAzv3t4whHUrzdxbBk +TXAg/JTg3KuiYNY64Pq5LzwSYgWNmbcD/FTjy3a7WQd6UzLpcZJ7armtwWaTOkWR +9rZoqwJBAJ/IxAJhgT5nZBehcM9HjwGdZFXObnaKzxECMTesN2bH7hcEI1WZ0bbM +e3e8Lvn1w7SKwUZOL7pT4TD7Hg06JyECQQDCwmpyk/eIAe0pdS7rLfXbsrlg6J2A +QBJmXYKgzwT89fymBW3anoU3jB/7RO30GpNMKWe2o765mqosygjs+fTBAkBdAny5 +Tixg8VNC32dbqlwzcZ8EvrgAoaGZc9HnS3Ay5/OUkMFvyjzNEF2I/brqe2wDPQg0 +nKpWXqNkODXwtYmF +-----END PRIVATE KEY----- From 3573c74fca66964e7a9c8cf4a07f6e9e7ec9b61f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Jun 2020 10:56:15 +0200 Subject: [PATCH 024/192] plugins/mock-idp-backend: add saml-idp + test command --- .../{key.pem => idp-private-key.pem} | 0 .../{cert.pem => idp-public-cert.pem} | 0 plugins/mock-idp-backend/package.json | 2 + yarn.lock | 201 +++++++++++++++++- 4 files changed, 194 insertions(+), 9 deletions(-) rename plugins/mock-idp-backend/{key.pem => idp-private-key.pem} (100%) rename plugins/mock-idp-backend/{cert.pem => idp-public-cert.pem} (100%) diff --git a/plugins/mock-idp-backend/key.pem b/plugins/mock-idp-backend/idp-private-key.pem similarity index 100% rename from plugins/mock-idp-backend/key.pem rename to plugins/mock-idp-backend/idp-private-key.pem diff --git a/plugins/mock-idp-backend/cert.pem b/plugins/mock-idp-backend/idp-public-cert.pem similarity index 100% rename from plugins/mock-idp-backend/cert.pem rename to plugins/mock-idp-backend/idp-public-cert.pem diff --git a/plugins/mock-idp-backend/package.json b/plugins/mock-idp-backend/package.json index e4ff95e46a..451004ca79 100644 --- a/plugins/mock-idp-backend/package.json +++ b/plugins/mock-idp-backend/package.json @@ -7,6 +7,7 @@ "private": true, "scripts": { "start": "tsc-watch --onFirstSuccess \"cross-env NODE_ENV=development nodemon dist/run.js\"", + "start:idp": "saml-idp --acsUrl=http://localhost:3003/auth/saml/handler/frame --audience http://localhost:3003", "build": "tsc", "lint": "backstage-cli lint", "test": "backstage-cli test", @@ -23,6 +24,7 @@ "fs-extra": "^9.0.0", "helmet": "^3.22.0", "morgan": "^1.10.0", + "saml-idp": "^1.2.1", "winston": "^3.2.1", "yn": "^4.0.0" }, diff --git a/yarn.lock b/yarn.lock index 760f1421b7..46dca51b6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@auth0/thumbprint@0.0.6": + version "0.0.6" + resolved "https://registry.npmjs.org/@auth0/thumbprint/-/thumbprint-0.0.6.tgz#cab1062c6c04662ce6c592d48157ec4268ae8518" + integrity sha1-yrEGLGwEZizmxZLUgVfsQmiuhRg= + "@babel/code-frame@7.5.5": version "7.5.5" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" @@ -4943,7 +4948,7 @@ async-limiter@~1.0.0: resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^2.6.1, async@^2.6.2: +async@^2.1.5, async@^2.6.1, async@^2.6.2, async@~2.6.2: version "2.6.3" resolved "https://registry.npmjs.org/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -5453,7 +5458,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -body-parser@1.19.0: +body-parser@1.19.0, body-parser@~1.19.0: version "1.19.0" resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== @@ -7249,7 +7254,7 @@ debug@3.1.0, debug@=3.1.0: dependencies: ms "2.0.0" -debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: +debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -7839,7 +7844,12 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^2.7.4: +ejs@2.6.1: + version "2.6.1" + resolved "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" + integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== + +ejs@^2.5.6, ejs@^2.7.4: version "2.7.4" resolved "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== @@ -8515,6 +8525,20 @@ express-promise-router@^3.0.3: lodash.flattendeep "^4.0.0" methods "^1.0.0" +express-session@^1.17.1: + version "1.17.1" + resolved "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz#36ecbc7034566d38c8509885c044d461c11bf357" + integrity sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q== + dependencies: + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~2.0.0" + on-headers "~1.0.2" + parseurl "~1.3.3" + safe-buffer "5.2.0" + uid-safe "~2.1.5" + express@^4.17.0, express@^4.17.1: version "4.17.1" resolved "https://registry.npmjs.org/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -8566,7 +8590,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.2: +extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -8941,6 +8965,15 @@ flatted@^2.0.0: resolved "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== +flowstate@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/flowstate/-/flowstate-0.4.1.tgz#b5fbb8b7fc2d7bdc5b54be46c98309ef736f4ec0" + integrity sha1-tfu4t/wte9xbVL5GyYMJ73NvTsA= + dependencies: + clone "^1.0.2" + uid-safe "^2.1.0" + utils-flatten "^1.0.0" + flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -8997,6 +9030,11 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" +foreachasync@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz#5502987dc8714be3392097f32e0071c9dee07cf6" + integrity sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY= + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -9732,7 +9770,7 @@ handle-thing@^2.0.0: resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== -handlebars@^4.4.0, handlebars@^4.7.3: +handlebars@4.7.6, handlebars@^4.4.0, handlebars@^4.7.3: version "4.7.6" resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== @@ -9868,6 +9906,14 @@ hastscript@^5.0.0: property-information "^5.0.0" space-separated-tokens "^1.0.0" +hbs@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/hbs/-/hbs-4.1.1.tgz#8aab17ca6ae70f9aaa225278bed7af31011254b7" + integrity sha512-6QsbB4RwbpL4cb4DNyjEEPF+suwp+3yZqFVlhILEn92ScC0U4cDCR+FDX53jkfKJPhutcqhAvs+rOLZw5sQrDA== + dependencies: + handlebars "4.7.6" + walk "2.3.14" + he@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -13210,6 +13256,11 @@ node-forge@0.9.0: resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== +node-forge@^0.7.0: + version "0.7.6" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" + integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw== + node-gyp@^5.0.2: version "5.1.0" resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.0.tgz#8e31260a7af4a2e2f994b0673d4e0b3866156332" @@ -15130,6 +15181,11 @@ ramda@^0.21.0: resolved "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35" integrity sha1-oAGr7bP/YQd9T/HVd9RN536NCjU= +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" + integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= + randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -16368,7 +16424,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.0, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== @@ -16390,6 +16446,51 @@ safe-regex@^1.1.0: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +saml-idp@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/saml-idp/-/saml-idp-1.2.1.tgz#2df394cd406ce273641115f587062ea60d29ce03" + integrity sha512-C7iXTxryohn8fOWUGyPDCJwyA4eWyh4gJrMAndyRe+idTrj51kPOW1FAAsIBc7afmoJLM00qqcAP/gxalq4r9A== + dependencies: + body-parser "~1.19.0" + chalk "^4.0.0" + debug "~4.1.1" + express "^4.17.1" + express-session "^1.17.1" + extend "^3.0.2" + hbs "^4.1.1" + morgan "^1.10.0" + samlp "github:mcguinness/node-samlp" + xml-formatter "^2.1.0" + xmldom "^0.3.0" + yargs "^15.3.1" + +"saml@github:mcguinness/node-saml": + version "0.12.5" + resolved "https://codeload.github.com/mcguinness/node-saml/tar.gz/ec47b9ab43ad756a5d1fbc82c71e260f7a5cb18a" + dependencies: + async "~2.6.2" + moment "2.24.0" + valid-url "~1.0.9" + xml-crypto "~1.3.0" + xml-encryption "0.11.2" + xml-name-validator "~3.0.0" + xmldom "=0.1.27" + xpath "0.0.27" + +"samlp@github:mcguinness/node-samlp": + version "3.4.1" + resolved "https://codeload.github.com/mcguinness/node-samlp/tar.gz/7bfb7c29be520f249beff6a9e933b63a628e31a1" + dependencies: + "@auth0/thumbprint" "0.0.6" + ejs "2.6.1" + flowstate "^0.4.0" + querystring "^0.2.0" + saml "github:mcguinness/node-saml" + xml-crypto "^1.3.0" + xmldom "github:auth0/xmldom#v0.1.19-auth0_1" + xpath "0.0.27" + xtend "^4.0.1" + sane@^4.0.3: version "4.1.0" resolved "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" @@ -18224,6 +18325,13 @@ uid-number@0.0.6: resolved "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= +uid-safe@^2.1.0, uid-safe@~2.1.5: + version "2.1.5" + resolved "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" + integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== + dependencies: + random-bytes "~1.0.0" + uid2@0.0.x: version "0.0.3" resolved "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" @@ -18574,6 +18682,11 @@ utila@^0.4.0, utila@~0.4: resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= +utils-flatten@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/utils-flatten/-/utils-flatten-1.0.0.tgz#01f30d3193be464c40b31755e6740d0db0cef243" + integrity sha1-AfMNMZO+RkxAsxdV5nQNDbDO8kM= + utils-merge@1.0.1, utils-merge@1.x.x: version "1.0.1" resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -18615,7 +18728,7 @@ v8flags@^3.1.3: dependencies: homedir-polyfill "^1.0.1" -valid-url@1.0.9: +valid-url@1.0.9, valid-url@~1.0.9: version "1.0.9" resolved "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= @@ -18722,6 +18835,13 @@ wait-on@4.0.0: request-promise-native "^1.0.8" rxjs "^6.5.4" +walk@2.3.14: + version "2.3.14" + resolved "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz#60ec8631cfd23276ae1e7363ce11d626452e1ef3" + integrity sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg== + dependencies: + foreachasync "^3.0.0" + walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -19171,16 +19291,79 @@ xdg-basedir@^4.0.0: resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xml-name-validator@^3.0.0: +xml-crypto@^1.3.0: + version "1.5.3" + resolved "https://registry.npmjs.org/xml-crypto/-/xml-crypto-1.5.3.tgz#a8f500b90f0dfaf0efa3331c345ecb0fff993c34" + integrity sha512-uHkmpUtX15xExe5iimPmakAZN+6CqIvjmaJTy4FwqGzaTjrKRBNeqMh8zGEzVNgW0dk6beFYpyQSgqV/J6C5xA== + dependencies: + xmldom "0.1.27" + xpath "0.0.27" + +xml-crypto@~1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/xml-crypto/-/xml-crypto-1.3.0.tgz#5450e0768c24a854a5cfea6c485d2b73c835d9e1" + integrity sha512-Kx/owhke7oy89NAB8HTkaENc1BaCixQDHD6Wg61VTIOdjBlIRLNs2Ts76MhJz78EPyOMoqUoY4ytShCqbv1XBA== + dependencies: + xmldom "0.1.27" + xpath "0.0.27" + +xml-encryption@0.11.2: + version "0.11.2" + resolved "https://registry.npmjs.org/xml-encryption/-/xml-encryption-0.11.2.tgz#c217f5509547e34b500b829f2c0bca85cca73a21" + integrity sha512-jVvES7i5ovdO7N+NjgncA326xYKjhqeAnnvIgRnY7ROLCfFqEDLwP0Sxp/30SHG0AXQV1048T5yinOFyvwGFzg== + dependencies: + async "^2.1.5" + ejs "^2.5.6" + node-forge "^0.7.0" + xmldom "~0.1.15" + xpath "0.0.27" + +xml-formatter@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/xml-formatter/-/xml-formatter-2.1.0.tgz#ff438be6e2195e480b7525ecd3b06652ed76f390" + integrity sha512-t55v5mfpohwKvNbfd8A0FZSZI22//hqXqx3AwRx3mjZel0IEoRM2p1bvVnvNPxHqdqZ0sDjUrBqfHJNbIfE8fw== + dependencies: + xml-parser-xo "^3.0.0" + +xml-name-validator@^3.0.0, xml-name-validator@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml-parser-xo@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-3.0.0.tgz#4d46f1962e5100f228b5f73f34c61bb798430195" + integrity sha512-MPPexqXBx48m3OFMQXxo7+RYhG6o6kCGflk4q4oL3uQ0b7d5NDKjHFDwUoozOTPT3WFztT13z3R9Sn0QCTIJcQ== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xmldom@0.1.27, xmldom@=0.1.27: + version "0.1.27" + resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= + +xmldom@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.3.0.tgz#e625457f4300b5df9c2e1ecb776147ece47f3e5a" + integrity sha512-z9s6k3wxE+aZHgXYxSTpGDo7BYOUfJsIRyoZiX6HTjwpwfS2wpQBQKa2fD+ShLyPkqDYo5ud7KitmLZ2Cd6r0g== + +"xmldom@github:auth0/xmldom#v0.1.19-auth0_1": + version "0.1.19" + resolved "https://codeload.github.com/auth0/xmldom/tar.gz/3376bc7beb5551bf68e12b0cc6b0e3669f77d392" + +xmldom@~0.1.15: + version "0.1.31" + resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== + +xpath@0.0.27: + version "0.0.27" + resolved "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz#dd3421fbdcc5646ac32c48531b4d7e9d0c2cfa92" + integrity sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ== + xregexp@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" From 397e670a2e4d9f4a209e972485fbaad57477d494 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Jun 2020 11:18:36 +0200 Subject: [PATCH 025/192] plugins/auth-backend: add script for starting up saml test idp --- plugins/auth-backend/scripts/.gitignore | 1 + .../auth-backend/scripts/start-saml-idp.sh | 17 ++++++ plugins/mock-idp-backend/gen-certs.sh | 10 ---- plugins/mock-idp-backend/idp-private-key.pem | 16 ------ plugins/mock-idp-backend/idp-public-cert.pem | 11 ---- yarn.lock | 57 +++++++++++++++---- 6 files changed, 65 insertions(+), 47 deletions(-) create mode 100644 plugins/auth-backend/scripts/.gitignore create mode 100755 plugins/auth-backend/scripts/start-saml-idp.sh delete mode 100755 plugins/mock-idp-backend/gen-certs.sh delete mode 100644 plugins/mock-idp-backend/idp-private-key.pem delete mode 100644 plugins/mock-idp-backend/idp-public-cert.pem diff --git a/plugins/auth-backend/scripts/.gitignore b/plugins/auth-backend/scripts/.gitignore new file mode 100644 index 0000000000..cfaad76118 --- /dev/null +++ b/plugins/auth-backend/scripts/.gitignore @@ -0,0 +1 @@ +*.pem diff --git a/plugins/auth-backend/scripts/start-saml-idp.sh b/plugins/auth-backend/scripts/start-saml-idp.sh new file mode 100755 index 0000000000..dd80ca6c32 --- /dev/null +++ b/plugins/auth-backend/scripts/start-saml-idp.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +if [[ ! -f idp-public-cert.pem ]]; then + echo "Generating new SAML Certificates" + openssl req \ + -x509 \ + -newkey rsa:1024 \ + -days 3650 \ + -nodes \ + -subj '/CN=localhost' \ + -keyout "idp-private-key.pem" \ + -out "idp-public-cert.pem" +fi + +echo "Downloading and starting SAML-IdP" +export NPM_CONFIG_REGISTRY=https://registry.npmjs.org +exec npx saml-idp --acsUrl "http://localhost:3003/auth/saml/handler/frame" --audience "http://localhost:3003" diff --git a/plugins/mock-idp-backend/gen-certs.sh b/plugins/mock-idp-backend/gen-certs.sh deleted file mode 100755 index d33c0f0e75..0000000000 --- a/plugins/mock-idp-backend/gen-certs.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -openssl req \ - -x509 \ - -newkey rsa:1024 \ - -days 3650 \ - -nodes \ - -subj '/CN=localhost' \ - -keyout "key.pem" \ - -out "cert.pem" diff --git a/plugins/mock-idp-backend/idp-private-key.pem b/plugins/mock-idp-backend/idp-private-key.pem deleted file mode 100644 index a90f813106..0000000000 --- a/plugins/mock-idp-backend/idp-private-key.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PRIVATE KEY----- -MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMoHudQ6bah8Div+ -+6Ooi+ZchrseVWgXU+q/X6jIY7Gkf/aUMAYtiBAvr/FG5WTn1ePVdHxo20VkNRki -wFGeL0Z33IrGhkgkwpQZnWGwKpwqEddjed1ABeOksP/RFmzBCHNnxZGuxu5E1nqW -kPLjPRicAoo9V76xPLLlUJoS5ls7AgMBAAECgYEAk2hztGA1Zrutc3iGjvEJsrlM -LPeDBYIP3rZny7T62MDYBUg2iitqnbTNwVQjSC7IJ4a1iZjQdJ8bBw4OGP88Kfcv -QQl7PnU7+Sp/z6PMGpcsP/bBoStrqG4Bdv5bM15csLuGlkz/rQV/4Q/9nrCY4qDp -5U7Np/E2TTrjjPINtMECQQD53Q8hl8PkvH5pdqm+GwmGIQu1++WX8kD90ib7hnaL -Vs39pMGFviXmW8LLv0rwFhLNpVCNBpjh4jA8knKFYfexAkEAzv3t4whHUrzdxbBk -TXAg/JTg3KuiYNY64Pq5LzwSYgWNmbcD/FTjy3a7WQd6UzLpcZJ7armtwWaTOkWR -9rZoqwJBAJ/IxAJhgT5nZBehcM9HjwGdZFXObnaKzxECMTesN2bH7hcEI1WZ0bbM -e3e8Lvn1w7SKwUZOL7pT4TD7Hg06JyECQQDCwmpyk/eIAe0pdS7rLfXbsrlg6J2A -QBJmXYKgzwT89fymBW3anoU3jB/7RO30GpNMKWe2o765mqosygjs+fTBAkBdAny5 -Tixg8VNC32dbqlwzcZ8EvrgAoaGZc9HnS3Ay5/OUkMFvyjzNEF2I/brqe2wDPQg0 -nKpWXqNkODXwtYmF ------END PRIVATE KEY----- diff --git a/plugins/mock-idp-backend/idp-public-cert.pem b/plugins/mock-idp-backend/idp-public-cert.pem deleted file mode 100644 index 9fd9f66f97..0000000000 --- a/plugins/mock-idp-backend/idp-public-cert.pem +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIBnzCCAQgCCQCIF7n8FCJ0azANBgkqhkiG9w0BAQsFADAUMRIwEAYDVQQDDAls -b2NhbGhvc3QwHhcNMjAwNjAxMTU0NDM1WhcNMzAwNTMwMTU0NDM1WjAUMRIwEAYD -VQQDDAlsb2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMoHudQ6 -bah8Div++6Ooi+ZchrseVWgXU+q/X6jIY7Gkf/aUMAYtiBAvr/FG5WTn1ePVdHxo -20VkNRkiwFGeL0Z33IrGhkgkwpQZnWGwKpwqEddjed1ABeOksP/RFmzBCHNnxZGu -xu5E1nqWkPLjPRicAoo9V76xPLLlUJoS5ls7AgMBAAEwDQYJKoZIhvcNAQELBQAD -gYEAkG2oNLjFk0FUeM6cqnLvaA9fCml3JUA1nFgMshVXLvE/aOeXKhgy96DAcUw3 -xsdHHKMJpX4n49Odz3wyAtCWFTkz600T7oSrZ7FAU2VORKapBqqUL2HtLGB2gds+ -ndfiDwLV7Yb67cQikkgLU9ZzwYcGL6ovfxuw01f13ZyiAwg= ------END CERTIFICATE----- diff --git a/yarn.lock b/yarn.lock index 46dca51b6a..f869bbaa12 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8075,7 +8075,7 @@ escape-goat@^2.0.0: resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== -escape-html@~1.0.3: +escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= @@ -14130,7 +14130,21 @@ passport-oauth2@1.x.x: uid2 "0.0.x" utils-merge "1.x.x" -passport-strategy@1.x.x: +passport-saml@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/passport-saml/-/passport-saml-1.3.3.tgz#cbea1a2b21ff32b3bc4bfd84dc39c3a370df9935" + integrity sha512-54ecY/A6UEsyCehJws6a+J6THvwtYnGl9cnAUxx5DjsuKgZrDs0tSy58K4hCk1XG/LOcdQSF1TR3xlRXgTULhA== + dependencies: + debug "^3.1.0" + passport-strategy "*" + q "^1.5.0" + xml-crypto "^1.4.0" + xml-encryption "^1.0.0" + xml2js "0.4.x" + xmlbuilder "^11.0.0" + xmldom "0.1.x" + +passport-strategy@*, passport-strategy@1.x.x: version "1.0.0" resolved "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= @@ -15118,7 +15132,7 @@ pupa@^2.0.1: dependencies: escape-goat "^2.0.0" -q@^1.1.2, q@^1.5.1: +q@^1.1.2, q@^1.5.0, q@^1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= @@ -16506,7 +16520,7 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sax@^1.2.4, sax@~1.2.4: +sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -19291,7 +19305,7 @@ xdg-basedir@^4.0.0: resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xml-crypto@^1.3.0: +xml-crypto@^1.3.0, xml-crypto@^1.4.0: version "1.5.3" resolved "https://registry.npmjs.org/xml-crypto/-/xml-crypto-1.5.3.tgz#a8f500b90f0dfaf0efa3331c345ecb0fff993c34" integrity sha512-uHkmpUtX15xExe5iimPmakAZN+6CqIvjmaJTy4FwqGzaTjrKRBNeqMh8zGEzVNgW0dk6beFYpyQSgqV/J6C5xA== @@ -19318,6 +19332,16 @@ xml-encryption@0.11.2: xmldom "~0.1.15" xpath "0.0.27" +xml-encryption@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/xml-encryption/-/xml-encryption-1.2.0.tgz#37c8b470beae88b4625ea8cad82f108ea0f9c364" + integrity sha512-J3NjGMY8jf6bTo15jURTYBLtsisbnyCeM+MuxtfiAkZEZBnSZpNKjUUORhiOScKvSi6tMOAaZ3r7bZOXOni+Ew== + dependencies: + escape-html "^1.0.3" + node-forge "^0.7.0" + xmldom "~0.1.15" + xpath "0.0.27" + xml-formatter@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/xml-formatter/-/xml-formatter-2.1.0.tgz#ff438be6e2195e480b7525ecd3b06652ed76f390" @@ -19335,6 +19359,19 @@ xml-parser-xo@^3.0.0: resolved "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-3.0.0.tgz#4d46f1962e5100f228b5f73f34c61bb798430195" integrity sha512-MPPexqXBx48m3OFMQXxo7+RYhG6o6kCGflk4q4oL3uQ0b7d5NDKjHFDwUoozOTPT3WFztT13z3R9Sn0QCTIJcQ== +xml2js@0.4.x: + version "0.4.23" + resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@^11.0.0, xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" @@ -19345,6 +19382,11 @@ xmldom@0.1.27, xmldom@=0.1.27: resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= +xmldom@0.1.x, xmldom@~0.1.15: + version "0.1.31" + resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== + xmldom@^0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.3.0.tgz#e625457f4300b5df9c2e1ecb776147ece47f3e5a" @@ -19354,11 +19396,6 @@ xmldom@^0.3.0: version "0.1.19" resolved "https://codeload.github.com/auth0/xmldom/tar.gz/3376bc7beb5551bf68e12b0cc6b0e3669f77d392" -xmldom@~0.1.15: - version "0.1.31" - resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" - integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== - xpath@0.0.27: version "0.0.27" resolved "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz#dd3421fbdcc5646ac32c48531b4d7e9d0c2cfa92" From cd180f6928825f8c0ea29603311d2a4450d2d4cf Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Jun 2020 11:33:56 +0200 Subject: [PATCH 026/192] plugins: remove mock-idp-backend --- plugins/mock-idp-backend/.eslintrc.js | 3 - plugins/mock-idp-backend/README.md | 7 - plugins/mock-idp-backend/package.json | 43 --- plugins/mock-idp-backend/src/index.ts | 17 -- plugins/mock-idp-backend/src/run.ts | 80 ------ plugins/mock-idp-backend/src/service/index.ts | 17 -- .../src/service/router.test.ts | 36 --- .../mock-idp-backend/src/service/router.ts | 34 --- plugins/mock-idp-backend/src/setupTests.ts | 17 -- plugins/mock-idp-backend/tsconfig.json | 15 -- yarn.lock | 246 +----------------- 11 files changed, 13 insertions(+), 502 deletions(-) delete mode 100644 plugins/mock-idp-backend/.eslintrc.js delete mode 100644 plugins/mock-idp-backend/README.md delete mode 100644 plugins/mock-idp-backend/package.json delete mode 100644 plugins/mock-idp-backend/src/index.ts delete mode 100644 plugins/mock-idp-backend/src/run.ts delete mode 100644 plugins/mock-idp-backend/src/service/index.ts delete mode 100644 plugins/mock-idp-backend/src/service/router.test.ts delete mode 100644 plugins/mock-idp-backend/src/service/router.ts delete mode 100644 plugins/mock-idp-backend/src/setupTests.ts delete mode 100644 plugins/mock-idp-backend/tsconfig.json diff --git a/plugins/mock-idp-backend/.eslintrc.js b/plugins/mock-idp-backend/.eslintrc.js deleted file mode 100644 index 16a033dbc6..0000000000 --- a/plugins/mock-idp-backend/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: [require.resolve('@backstage/cli/config/eslint.backend')], -}; diff --git a/plugins/mock-idp-backend/README.md b/plugins/mock-idp-backend/README.md deleted file mode 100644 index c1925e326f..0000000000 --- a/plugins/mock-idp-backend/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Mock IdP Backend - -Mock backend for demonstrating 3rd party identity provider flow with SAML 2.0. - -## Links - -- (The Backstage homepage)[https://backstage.io] diff --git a/plugins/mock-idp-backend/package.json b/plugins/mock-idp-backend/package.json deleted file mode 100644 index 451004ca79..0000000000 --- a/plugins/mock-idp-backend/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "@backstage/plugin-mock-idp-backend", - "version": "0.1.1-alpha.6", - "main": "dist", - "types": "src/index.ts", - "license": "Apache-2.0", - "private": true, - "scripts": { - "start": "tsc-watch --onFirstSuccess \"cross-env NODE_ENV=development nodemon dist/run.js\"", - "start:idp": "saml-idp --acsUrl=http://localhost:3003/auth/saml/handler/frame --audience http://localhost:3003", - "build": "tsc", - "lint": "backstage-cli lint", - "test": "backstage-cli test", - "prepack": "backstage-cli prepack", - "postpack": "backstage-cli postpack", - "clean": "backstage-cli clean" - }, - "dependencies": { - "@backstage/backend-common": "^0.1.1-alpha.6", - "compression": "^1.7.4", - "cors": "^2.8.5", - "express": "^4.17.1", - "express-promise-router": "^3.0.3", - "fs-extra": "^9.0.0", - "helmet": "^3.22.0", - "morgan": "^1.10.0", - "saml-idp": "^1.2.1", - "winston": "^3.2.1", - "yn": "^4.0.0" - }, - "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@types/supertest": "^2.0.8", - "supertest": "^4.0.2", - "tsc-watch": "^4.2.3" - }, - "files": [ - "dist" - ], - "nodemonConfig": { - "watch": "./dist" - } -} diff --git a/plugins/mock-idp-backend/src/index.ts b/plugins/mock-idp-backend/src/index.ts deleted file mode 100644 index 7612c392a2..0000000000 --- a/plugins/mock-idp-backend/src/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export * from './service/router'; diff --git a/plugins/mock-idp-backend/src/run.ts b/plugins/mock-idp-backend/src/run.ts deleted file mode 100644 index ea67d335fd..0000000000 --- a/plugins/mock-idp-backend/src/run.ts +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - errorHandler, - getRootLogger, - notFoundHandler, - requestLoggingHandler, -} from '@backstage/backend-common'; -import compression from 'compression'; -import cors from 'cors'; -import express from 'express'; -import helmet from 'helmet'; -import { Server } from 'http'; -import { Logger } from 'winston'; -import { createRouter } from './service'; - -export type ServerConfig = { - port: number; - logger: Logger; -}; - -function readConfig() { - const port = Number(process.env.PLUGIN_PORT) || 3003; - const logger = getRootLogger().child({ service: 'mock-idp-backend' }); - return { port, logger }; -} - -async function startStandaloneServer(config: ServerConfig): Promise { - const { port, logger } = config; - logger.debug('Creating application...'); - - const app = express(); - - app.use(helmet()); - app.use(cors()); - app.use(compression()); - app.use(express.json()); - app.use(requestLoggingHandler()); - app.use(await createRouter({ logger })); - app.use(notFoundHandler()); - app.use(errorHandler()); - - logger.debug('Starting application server...'); - - process.on('SIGINT', () => { - logger.info('CTRL+C pressed; exiting.'); - process.exit(0); - }); - - return await new Promise((resolve, reject) => { - const server = app.listen(port, (err?: Error) => { - if (err) { - reject(err); - return; - } - - logger.info(`Listening on port ${port}`); - resolve(server); - }); - }); -} - -startStandaloneServer(readConfig()).catch(err => { - console.error(err.stack || err); - process.exit(1); -}); diff --git a/plugins/mock-idp-backend/src/service/index.ts b/plugins/mock-idp-backend/src/service/index.ts deleted file mode 100644 index 38fbb697c4..0000000000 --- a/plugins/mock-idp-backend/src/service/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export { createRouter } from './router'; diff --git a/plugins/mock-idp-backend/src/service/router.test.ts b/plugins/mock-idp-backend/src/service/router.test.ts deleted file mode 100644 index 192baeebb9..0000000000 --- a/plugins/mock-idp-backend/src/service/router.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { getVoidLogger } from '@backstage/backend-common'; -import { createRouter } from './router'; -import express from 'express'; -import request from 'supertest'; - -async function makeApp() { - const router = await createRouter({ logger: getVoidLogger() }); - const app = express(); - app.use(router); - return app; -} - -describe('router', () => { - it('should echo', async () => { - const app = await makeApp(); - const response = await request(app).get('/echo'); - expect(response.status).toEqual(200); - expect(response.text).toEqual('echo'); - }); -}); diff --git a/plugins/mock-idp-backend/src/service/router.ts b/plugins/mock-idp-backend/src/service/router.ts deleted file mode 100644 index 62bffb050d..0000000000 --- a/plugins/mock-idp-backend/src/service/router.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import Router from 'express-promise-router'; -import { Logger } from 'winston'; - -export interface RouterOptions { - logger: Logger; -} - -export async function createRouter(options: RouterOptions) { - const { logger } = options; - const router = Router(); - - router.get('/echo', (_req, res) => { - logger.info('sending echo'); - res.send('echo'); - }); - - return router; -} diff --git a/plugins/mock-idp-backend/src/setupTests.ts b/plugins/mock-idp-backend/src/setupTests.ts deleted file mode 100644 index ba33cf996b..0000000000 --- a/plugins/mock-idp-backend/src/setupTests.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export {}; diff --git a/plugins/mock-idp-backend/tsconfig.json b/plugins/mock-idp-backend/tsconfig.json deleted file mode 100644 index 015a967f76..0000000000 --- a/plugins/mock-idp-backend/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "include": ["src"], - "compilerOptions": { - "outDir": "dist", - "incremental": true, - "sourceMap": true, - "declaration": true, - "strict": true, - "target": "es2019", - "module": "commonjs", - "esModuleInterop": true, - "lib": ["es2019"], - "types": ["node", "jest"] - } -} diff --git a/yarn.lock b/yarn.lock index f869bbaa12..760f1421b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,11 +2,6 @@ # yarn lockfile v1 -"@auth0/thumbprint@0.0.6": - version "0.0.6" - resolved "https://registry.npmjs.org/@auth0/thumbprint/-/thumbprint-0.0.6.tgz#cab1062c6c04662ce6c592d48157ec4268ae8518" - integrity sha1-yrEGLGwEZizmxZLUgVfsQmiuhRg= - "@babel/code-frame@7.5.5": version "7.5.5" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" @@ -4948,7 +4943,7 @@ async-limiter@~1.0.0: resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^2.1.5, async@^2.6.1, async@^2.6.2, async@~2.6.2: +async@^2.6.1, async@^2.6.2: version "2.6.3" resolved "https://registry.npmjs.org/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -5458,7 +5453,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -body-parser@1.19.0, body-parser@~1.19.0: +body-parser@1.19.0: version "1.19.0" resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== @@ -7254,7 +7249,7 @@ debug@3.1.0, debug@=3.1.0: dependencies: ms "2.0.0" -debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.1: +debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -7844,12 +7839,7 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@2.6.1: - version "2.6.1" - resolved "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" - integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== - -ejs@^2.5.6, ejs@^2.7.4: +ejs@^2.7.4: version "2.7.4" resolved "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== @@ -8075,7 +8065,7 @@ escape-goat@^2.0.0: resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== -escape-html@^1.0.3, escape-html@~1.0.3: +escape-html@~1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= @@ -8525,20 +8515,6 @@ express-promise-router@^3.0.3: lodash.flattendeep "^4.0.0" methods "^1.0.0" -express-session@^1.17.1: - version "1.17.1" - resolved "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz#36ecbc7034566d38c8509885c044d461c11bf357" - integrity sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q== - dependencies: - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~2.0.0" - on-headers "~1.0.2" - parseurl "~1.3.3" - safe-buffer "5.2.0" - uid-safe "~2.1.5" - express@^4.17.0, express@^4.17.1: version "4.17.1" resolved "https://registry.npmjs.org/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -8590,7 +8566,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: +extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -8965,15 +8941,6 @@ flatted@^2.0.0: resolved "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== -flowstate@^0.4.0: - version "0.4.1" - resolved "https://registry.npmjs.org/flowstate/-/flowstate-0.4.1.tgz#b5fbb8b7fc2d7bdc5b54be46c98309ef736f4ec0" - integrity sha1-tfu4t/wte9xbVL5GyYMJ73NvTsA= - dependencies: - clone "^1.0.2" - uid-safe "^2.1.0" - utils-flatten "^1.0.0" - flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -9030,11 +8997,6 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -foreachasync@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz#5502987dc8714be3392097f32e0071c9dee07cf6" - integrity sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY= - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -9770,7 +9732,7 @@ handle-thing@^2.0.0: resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== -handlebars@4.7.6, handlebars@^4.4.0, handlebars@^4.7.3: +handlebars@^4.4.0, handlebars@^4.7.3: version "4.7.6" resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== @@ -9906,14 +9868,6 @@ hastscript@^5.0.0: property-information "^5.0.0" space-separated-tokens "^1.0.0" -hbs@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/hbs/-/hbs-4.1.1.tgz#8aab17ca6ae70f9aaa225278bed7af31011254b7" - integrity sha512-6QsbB4RwbpL4cb4DNyjEEPF+suwp+3yZqFVlhILEn92ScC0U4cDCR+FDX53jkfKJPhutcqhAvs+rOLZw5sQrDA== - dependencies: - handlebars "4.7.6" - walk "2.3.14" - he@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -13256,11 +13210,6 @@ node-forge@0.9.0: resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== -node-forge@^0.7.0: - version "0.7.6" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" - integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw== - node-gyp@^5.0.2: version "5.1.0" resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.0.tgz#8e31260a7af4a2e2f994b0673d4e0b3866156332" @@ -14130,21 +14079,7 @@ passport-oauth2@1.x.x: uid2 "0.0.x" utils-merge "1.x.x" -passport-saml@^1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/passport-saml/-/passport-saml-1.3.3.tgz#cbea1a2b21ff32b3bc4bfd84dc39c3a370df9935" - integrity sha512-54ecY/A6UEsyCehJws6a+J6THvwtYnGl9cnAUxx5DjsuKgZrDs0tSy58K4hCk1XG/LOcdQSF1TR3xlRXgTULhA== - dependencies: - debug "^3.1.0" - passport-strategy "*" - q "^1.5.0" - xml-crypto "^1.4.0" - xml-encryption "^1.0.0" - xml2js "0.4.x" - xmlbuilder "^11.0.0" - xmldom "0.1.x" - -passport-strategy@*, passport-strategy@1.x.x: +passport-strategy@1.x.x: version "1.0.0" resolved "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= @@ -15132,7 +15067,7 @@ pupa@^2.0.1: dependencies: escape-goat "^2.0.0" -q@^1.1.2, q@^1.5.0, q@^1.5.1: +q@^1.1.2, q@^1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= @@ -15195,11 +15130,6 @@ ramda@^0.21.0: resolved "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35" integrity sha1-oAGr7bP/YQd9T/HVd9RN536NCjU= -random-bytes@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" - integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= - randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -16438,7 +16368,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.0, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== @@ -16460,51 +16390,6 @@ safe-regex@^1.1.0: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -saml-idp@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/saml-idp/-/saml-idp-1.2.1.tgz#2df394cd406ce273641115f587062ea60d29ce03" - integrity sha512-C7iXTxryohn8fOWUGyPDCJwyA4eWyh4gJrMAndyRe+idTrj51kPOW1FAAsIBc7afmoJLM00qqcAP/gxalq4r9A== - dependencies: - body-parser "~1.19.0" - chalk "^4.0.0" - debug "~4.1.1" - express "^4.17.1" - express-session "^1.17.1" - extend "^3.0.2" - hbs "^4.1.1" - morgan "^1.10.0" - samlp "github:mcguinness/node-samlp" - xml-formatter "^2.1.0" - xmldom "^0.3.0" - yargs "^15.3.1" - -"saml@github:mcguinness/node-saml": - version "0.12.5" - resolved "https://codeload.github.com/mcguinness/node-saml/tar.gz/ec47b9ab43ad756a5d1fbc82c71e260f7a5cb18a" - dependencies: - async "~2.6.2" - moment "2.24.0" - valid-url "~1.0.9" - xml-crypto "~1.3.0" - xml-encryption "0.11.2" - xml-name-validator "~3.0.0" - xmldom "=0.1.27" - xpath "0.0.27" - -"samlp@github:mcguinness/node-samlp": - version "3.4.1" - resolved "https://codeload.github.com/mcguinness/node-samlp/tar.gz/7bfb7c29be520f249beff6a9e933b63a628e31a1" - dependencies: - "@auth0/thumbprint" "0.0.6" - ejs "2.6.1" - flowstate "^0.4.0" - querystring "^0.2.0" - saml "github:mcguinness/node-saml" - xml-crypto "^1.3.0" - xmldom "github:auth0/xmldom#v0.1.19-auth0_1" - xpath "0.0.27" - xtend "^4.0.1" - sane@^4.0.3: version "4.1.0" resolved "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" @@ -16520,7 +16405,7 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: +sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -18339,13 +18224,6 @@ uid-number@0.0.6: resolved "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" integrity sha1-DqEOgDXo61uOREnwbaHHMGY7qoE= -uid-safe@^2.1.0, uid-safe@~2.1.5: - version "2.1.5" - resolved "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" - integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== - dependencies: - random-bytes "~1.0.0" - uid2@0.0.x: version "0.0.3" resolved "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82" @@ -18696,11 +18574,6 @@ utila@^0.4.0, utila@~0.4: resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= -utils-flatten@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/utils-flatten/-/utils-flatten-1.0.0.tgz#01f30d3193be464c40b31755e6740d0db0cef243" - integrity sha1-AfMNMZO+RkxAsxdV5nQNDbDO8kM= - utils-merge@1.0.1, utils-merge@1.x.x: version "1.0.1" resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -18742,7 +18615,7 @@ v8flags@^3.1.3: dependencies: homedir-polyfill "^1.0.1" -valid-url@1.0.9, valid-url@~1.0.9: +valid-url@1.0.9: version "1.0.9" resolved "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= @@ -18849,13 +18722,6 @@ wait-on@4.0.0: request-promise-native "^1.0.8" rxjs "^6.5.4" -walk@2.3.14: - version "2.3.14" - resolved "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz#60ec8631cfd23276ae1e7363ce11d626452e1ef3" - integrity sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg== - dependencies: - foreachasync "^3.0.0" - walker@^1.0.7, walker@~1.0.5: version "1.0.7" resolved "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -19305,102 +19171,16 @@ xdg-basedir@^4.0.0: resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xml-crypto@^1.3.0, xml-crypto@^1.4.0: - version "1.5.3" - resolved "https://registry.npmjs.org/xml-crypto/-/xml-crypto-1.5.3.tgz#a8f500b90f0dfaf0efa3331c345ecb0fff993c34" - integrity sha512-uHkmpUtX15xExe5iimPmakAZN+6CqIvjmaJTy4FwqGzaTjrKRBNeqMh8zGEzVNgW0dk6beFYpyQSgqV/J6C5xA== - dependencies: - xmldom "0.1.27" - xpath "0.0.27" - -xml-crypto@~1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/xml-crypto/-/xml-crypto-1.3.0.tgz#5450e0768c24a854a5cfea6c485d2b73c835d9e1" - integrity sha512-Kx/owhke7oy89NAB8HTkaENc1BaCixQDHD6Wg61VTIOdjBlIRLNs2Ts76MhJz78EPyOMoqUoY4ytShCqbv1XBA== - dependencies: - xmldom "0.1.27" - xpath "0.0.27" - -xml-encryption@0.11.2: - version "0.11.2" - resolved "https://registry.npmjs.org/xml-encryption/-/xml-encryption-0.11.2.tgz#c217f5509547e34b500b829f2c0bca85cca73a21" - integrity sha512-jVvES7i5ovdO7N+NjgncA326xYKjhqeAnnvIgRnY7ROLCfFqEDLwP0Sxp/30SHG0AXQV1048T5yinOFyvwGFzg== - dependencies: - async "^2.1.5" - ejs "^2.5.6" - node-forge "^0.7.0" - xmldom "~0.1.15" - xpath "0.0.27" - -xml-encryption@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/xml-encryption/-/xml-encryption-1.2.0.tgz#37c8b470beae88b4625ea8cad82f108ea0f9c364" - integrity sha512-J3NjGMY8jf6bTo15jURTYBLtsisbnyCeM+MuxtfiAkZEZBnSZpNKjUUORhiOScKvSi6tMOAaZ3r7bZOXOni+Ew== - dependencies: - escape-html "^1.0.3" - node-forge "^0.7.0" - xmldom "~0.1.15" - xpath "0.0.27" - -xml-formatter@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/xml-formatter/-/xml-formatter-2.1.0.tgz#ff438be6e2195e480b7525ecd3b06652ed76f390" - integrity sha512-t55v5mfpohwKvNbfd8A0FZSZI22//hqXqx3AwRx3mjZel0IEoRM2p1bvVnvNPxHqdqZ0sDjUrBqfHJNbIfE8fw== - dependencies: - xml-parser-xo "^3.0.0" - -xml-name-validator@^3.0.0, xml-name-validator@~3.0.0: +xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xml-parser-xo@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-3.0.0.tgz#4d46f1962e5100f228b5f73f34c61bb798430195" - integrity sha512-MPPexqXBx48m3OFMQXxo7+RYhG6o6kCGflk4q4oL3uQ0b7d5NDKjHFDwUoozOTPT3WFztT13z3R9Sn0QCTIJcQ== - -xml2js@0.4.x: - version "0.4.23" - resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@^11.0.0, xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== -xmldom@0.1.27, xmldom@=0.1.27: - version "0.1.27" - resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" - integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= - -xmldom@0.1.x, xmldom@~0.1.15: - version "0.1.31" - resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" - integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== - -xmldom@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.3.0.tgz#e625457f4300b5df9c2e1ecb776147ece47f3e5a" - integrity sha512-z9s6k3wxE+aZHgXYxSTpGDo7BYOUfJsIRyoZiX6HTjwpwfS2wpQBQKa2fD+ShLyPkqDYo5ud7KitmLZ2Cd6r0g== - -"xmldom@github:auth0/xmldom#v0.1.19-auth0_1": - version "0.1.19" - resolved "https://codeload.github.com/auth0/xmldom/tar.gz/3376bc7beb5551bf68e12b0cc6b0e3669f77d392" - -xpath@0.0.27: - version "0.0.27" - resolved "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz#dd3421fbdcc5646ac32c48531b4d7e9d0c2cfa92" - integrity sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ== - xregexp@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" From 17a16f617c0e63d2de078f2f68f6f1d534906459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 2 Jun 2020 13:35:59 +0200 Subject: [PATCH 027/192] Break out the location refresh loop as well --- packages/backend/src/plugins/catalog.ts | 9 +- .../src/catalog/DatabaseEntitiesCatalog.ts | 2 +- .../src/catalog/DatabaseLocationsCatalog.ts | 29 +- plugins/catalog-backend/src/catalog/types.ts | 6 + .../src/database/DatabaseManager.test.ts | 248 ------------------ .../src/database/DatabaseManager.ts | 184 +------------ .../ingestion/HigherOrderOperations.test.ts | 153 ++++++++++- .../src/ingestion/HigherOrderOperations.ts | 155 +++++++++++ .../src/service/router.test.ts | 2 + 9 files changed, 347 insertions(+), 441 deletions(-) delete mode 100644 plugins/catalog-backend/src/database/DatabaseManager.test.ts diff --git a/packages/backend/src/plugins/catalog.ts b/packages/backend/src/plugins/catalog.ts index 150b9d1826..906e8c2d11 100644 --- a/packages/backend/src/plugins/catalog.ts +++ b/packages/backend/src/plugins/catalog.ts @@ -32,7 +32,6 @@ export default async function createPlugin({ logger, database, }: PluginEnvironment) { - const policy = new EntityPolicies(); const ingestionModel = new IngestionModels( new LocationReaders(), new DescriptorParsers(), @@ -40,19 +39,17 @@ export default async function createPlugin({ ); const db = await DatabaseManager.createDatabase(database, logger); - runPeriodically( - () => DatabaseManager.refreshLocations(db, ingestionModel, policy, logger), - 10000, - ); - const entitiesCatalog = new DatabaseEntitiesCatalog(db); const locationsCatalog = new DatabaseLocationsCatalog(db); const higherOrderOperation = new HigherOrderOperations( entitiesCatalog, locationsCatalog, ingestionModel, + logger, ); + runPeriodically(() => higherOrderOperation.refreshAllLocations(), 10000); + return await createRouter({ entitiesCatalog, locationsCatalog, diff --git a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts index 6a7a51a168..1ec1ebf6e5 100644 --- a/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/catalog/DatabaseEntitiesCatalog.ts @@ -38,8 +38,8 @@ export class DatabaseEntitiesCatalog implements EntitiesCatalog { async entityByName( kind: string, - name: string, namespace: string | undefined, + name: string, ): Promise { return await this.database.transaction(tx => this.entityByNameInternal(tx, kind, name, namespace), diff --git a/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts b/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts index 066fab8464..a1e76679f7 100644 --- a/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts +++ b/plugins/catalog-backend/src/catalog/DatabaseLocationsCatalog.ts @@ -16,7 +16,10 @@ import { Location } from '@backstage/catalog-model'; import type { Database } from '../database'; -import { DatabaseLocationUpdateLogEvent } from '../database/types'; +import { + DatabaseLocationUpdateLogEvent, + DatabaseLocationUpdateLogStatus, +} from '../database/types'; import { LocationResponse, LocationsCatalog } from './types'; export class DatabaseLocationsCatalog implements LocationsCatalog { @@ -63,4 +66,28 @@ export class DatabaseLocationsCatalog implements LocationsCatalog { data, }; } + + async logUpdateSuccess( + locationId: string, + entityName?: string, + ): Promise { + await this.database.addLocationUpdateLogEvent( + locationId, + DatabaseLocationUpdateLogStatus.SUCCESS, + entityName, + ); + } + + async logUpdateFailure( + locationId: string, + error?: Error, + entityName?: string, + ): Promise { + await this.database.addLocationUpdateLogEvent( + locationId, + DatabaseLocationUpdateLogStatus.FAIL, + entityName, + error?.message, + ); + } } diff --git a/plugins/catalog-backend/src/catalog/types.ts b/plugins/catalog-backend/src/catalog/types.ts index 0499b8a409..b0d3dde0fb 100644 --- a/plugins/catalog-backend/src/catalog/types.ts +++ b/plugins/catalog-backend/src/catalog/types.ts @@ -62,4 +62,10 @@ export type LocationsCatalog = { locations(): Promise; location(id: string): Promise; locationHistory(id: string): Promise; + logUpdateSuccess(locationId: string, entityName?: string): Promise; + logUpdateFailure( + locationId: string, + error?: Error, + entityName?: string, + ): Promise; }; diff --git a/plugins/catalog-backend/src/database/DatabaseManager.test.ts b/plugins/catalog-backend/src/database/DatabaseManager.test.ts deleted file mode 100644 index 0c28524f8d..0000000000 --- a/plugins/catalog-backend/src/database/DatabaseManager.test.ts +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { getVoidLogger } from '@backstage/backend-common'; -import type { Entity, EntityPolicy } from '@backstage/catalog-model'; -import Knex from 'knex'; -import type { IngestionModel } from '../ingestion/types'; -import { DatabaseManager } from './DatabaseManager'; -import { DatabaseLocationUpdateLogStatus } from './types'; -import type { - Database, - DbLocationsRow, - DbLocationsRowWithStatus, -} from './types'; - -describe('DatabaseManager', () => { - describe('refreshLocations', () => { - it('works with no locations added', async () => { - const db = ({ - locations: jest.fn().mockResolvedValue([]), - } as unknown) as Database; - const reader: IngestionModel = { - readLocation: jest.fn(), - }; - const policy: EntityPolicy = { - enforce: jest.fn(), - }; - - await expect( - DatabaseManager.refreshLocations(db, reader, policy, getVoidLogger()), - ).resolves.toBeUndefined(); - expect(reader.readLocation).not.toHaveBeenCalled(); - expect(policy.enforce).not.toHaveBeenCalled(); - }); - - it('can update a single location', async () => { - const location: DbLocationsRowWithStatus = { - id: '123', - type: 'some', - target: 'thing', - message: '', - status: DatabaseLocationUpdateLogStatus.SUCCESS, - timestamp: new Date(314159265).toISOString(), - }; - const desc: Entity = { - apiVersion: 'backstage.io/v1beta1', - kind: 'Component', - metadata: { name: 'c1' }, - spec: { type: 'service' }, - }; - - const tx = (undefined as unknown) as Knex.Transaction; - - const db = ({ - transaction: jest.fn(f => f(tx)), - entity: jest.fn(() => Promise.resolve(undefined)), - addEntity: jest.fn(), - locations: jest.fn(() => Promise.resolve([location])), - addLocationUpdateLogEvent: jest.fn(), - } as Partial) as Database; - - const reader: IngestionModel = { - readLocation: jest.fn(() => - Promise.resolve([{ type: 'data', data: desc }]), - ), - }; - const policy: EntityPolicy = { - enforce: jest.fn(() => Promise.resolve(desc)), - }; - - await expect( - DatabaseManager.refreshLocations(db, reader, policy, getVoidLogger()), - ).resolves.toBeUndefined(); - expect(reader.readLocation).toHaveBeenCalledTimes(1); - expect(reader.readLocation).toHaveBeenNthCalledWith(1, 'some', 'thing'); - expect(db.addEntity).toHaveBeenCalledTimes(1); - expect(db.addEntity).toHaveBeenNthCalledWith(1, undefined, { - locationId: '123', - entity: expect.objectContaining({ - metadata: expect.objectContaining({ name: 'c1' }), - }), - }); - }); - - it('logs successful updates', async () => { - const tx = (undefined as unknown) as Knex.Transaction; - - const db = ({ - transaction: jest.fn(f => f(tx)), - addEntity: jest.fn(), - entity: jest.fn(() => Promise.resolve(undefined)), - locations: jest.fn(() => - Promise.resolve([ - { - id: '123', - type: 'some', - target: 'thing', - } as DbLocationsRow, - ]), - ), - addLocationUpdateLogEvent: jest.fn(), - } as unknown) as Database; - - const desc: Entity = { - apiVersion: 'backstage.io/v1beta1', - kind: 'Component', - metadata: { name: 'c1' }, - spec: { type: 'service' }, - }; - const reader: IngestionModel = { - readLocation: jest.fn(() => - Promise.resolve([{ type: 'data', data: desc }]), - ), - }; - const policy: EntityPolicy = { - enforce: jest.fn(() => Promise.resolve(desc)), - }; - - await expect( - DatabaseManager.refreshLocations(db, reader, policy, getVoidLogger()), - ).resolves.toBeUndefined(); - - expect(db.addLocationUpdateLogEvent).toHaveBeenNthCalledWith( - 1, - '123', - DatabaseLocationUpdateLogStatus.SUCCESS, - 'c1', - ); - - expect(db.addLocationUpdateLogEvent).toHaveBeenNthCalledWith( - 2, - '123', - DatabaseLocationUpdateLogStatus.SUCCESS, - undefined, - ); - }); - - it('logs unsuccessful updates when parser fails', async () => { - const tx = (undefined as unknown) as Knex.Transaction; - - const db = ({ - transaction: jest.fn(f => f(tx)), - addEntity: jest.fn(), - locations: jest.fn(() => - Promise.resolve([ - { - id: '123', - type: 'some', - target: 'thing', - } as DbLocationsRow, - ]), - ), - addLocationUpdateLogEvent: jest.fn(), - } as unknown) as Database; - - const desc: Entity = { - apiVersion: 'backstage.io/v1beta1', - kind: 'Component', - metadata: { name: 'c1' }, - spec: { type: 'service' }, - }; - const reader: IngestionModel = { - readLocation: jest.fn(() => - Promise.resolve([{ type: 'data', data: desc }]), - ), - }; - const policy: EntityPolicy = { - enforce: jest.fn(() => - Promise.reject(new Error('parser error message')), - ), - }; - - await expect( - DatabaseManager.refreshLocations(db, reader, policy, getVoidLogger()), - ).resolves.toBeUndefined(); - - expect(db.addLocationUpdateLogEvent).toHaveBeenNthCalledWith( - 1, - '123', - DatabaseLocationUpdateLogStatus.FAIL, - 'c1', - 'parser error message', - ); - - expect(db.addLocationUpdateLogEvent).toHaveBeenNthCalledWith( - 2, - '123', - DatabaseLocationUpdateLogStatus.SUCCESS, - undefined, - ); - }); - - it('logs unsuccessful updates when reader fails', async () => { - const tx = (undefined as unknown) as Knex.Transaction; - - const db = ({ - transaction: jest.fn(f => f(tx)), - addEntity: jest.fn(), - locations: jest.fn(() => - Promise.resolve([ - { - id: '123', - type: 'some', - target: 'thing', - } as DbLocationsRow, - ]), - ), - addLocationUpdateLogEvent: jest.fn(), - } as unknown) as Database; - - const reader: IngestionModel = { - readLocation: jest.fn(() => - Promise.reject([{ type: 'error', error: new Error('test message') }]), - ), - }; - const policy: EntityPolicy = { - enforce: jest.fn(() => - Promise.reject(new Error('parser error message')), - ), - }; - - await expect( - DatabaseManager.refreshLocations(db, reader, policy, getVoidLogger()), - ).resolves.toBeUndefined(); - - expect(db.addLocationUpdateLogEvent).toHaveBeenNthCalledWith( - 1, - '123', - DatabaseLocationUpdateLogStatus.FAIL, - undefined, - undefined, - ); - }); - }); -}); diff --git a/plugins/catalog-backend/src/database/DatabaseManager.ts b/plugins/catalog-backend/src/database/DatabaseManager.ts index 4268dc4146..bc7c7b8dae 100644 --- a/plugins/catalog-backend/src/database/DatabaseManager.ts +++ b/plugins/catalog-backend/src/database/DatabaseManager.ts @@ -14,15 +14,11 @@ * limitations under the License. */ -import type { Entity, EntityPolicy } from '@backstage/catalog-model'; import Knex from 'knex'; -import lodash from 'lodash'; import path from 'path'; import { Logger } from 'winston'; -import type { IngestionModel } from '../ingestion/types'; import { CommonDatabase } from './CommonDatabase'; -import { DatabaseLocationUpdateLogStatus } from './types'; -import type { Database, DbEntityRequest } from './types'; +import type { Database } from './types'; export class DatabaseManager { public static async createDatabase( @@ -35,182 +31,4 @@ export class DatabaseManager { }); return new CommonDatabase(knex, logger); } - - private static async logUpdateSuccess( - database: Database, - locationId: string, - entityName?: string, - ) { - return database.addLocationUpdateLogEvent( - locationId, - DatabaseLocationUpdateLogStatus.SUCCESS, - entityName, - ); - } - - private static async logUpdateFailure( - database: Database, - locationId: string, - error?: Error, - entityName?: string, - ) { - return database.addLocationUpdateLogEvent( - locationId, - DatabaseLocationUpdateLogStatus.FAIL, - entityName, - error?.message, - ); - } - - public static async refreshLocations( - database: Database, - ingestionModel: IngestionModel, - entityPolicy: EntityPolicy, - logger: Logger, - ): Promise { - const locations = await database.locations(); - for (const location of locations) { - try { - logger.debug( - `Refreshing location id="${location.id}" type="${location.type}" target="${location.target}"`, - ); - - const readerOutput = await ingestionModel.readLocation( - location.type, - location.target, - ); - - for (const readerItem of readerOutput) { - if (readerItem.type === 'error') { - logger.info(readerItem.error); - continue; - } - - try { - const entity = await entityPolicy.enforce(readerItem.data); - await DatabaseManager.refreshSingleEntity( - database, - location.id, - entity, - logger, - ); - await DatabaseManager.logUpdateSuccess( - database, - location.id, - entity.metadata.name, - ); - } catch (error) { - await DatabaseManager.logUpdateFailure( - database, - location.id, - error, - readerItem.data.metadata.name, - ); - } - } - await DatabaseManager.logUpdateSuccess( - database, - location.id, - undefined, - ); - } catch (error) { - logger.debug( - `Failed to refresh location id="${location.id}", ${error}`, - ); - await DatabaseManager.logUpdateFailure(database, location.id, error); - } - } - } - - private static async refreshSingleEntity( - database: Database, - locationId: string, - entity: Entity, - logger: Logger, - ): Promise { - const { kind } = entity; - const { name, namespace } = entity.metadata || {}; - if (!name) { - throw new Error('Entities without names are not yet supported'); - } - - const request: DbEntityRequest = { - locationId: locationId, - entity: entity, - }; - - logger.debug( - `Read entity kind="${kind}" name="${name}" namespace="${namespace}"`, - ); - - await database.transaction(async tx => { - const previous = await database.entity(tx, kind, name, namespace); - if (!previous) { - logger.debug(`No such entity found, adding`); - await database.addEntity(tx, request); - } else if ( - !DatabaseManager.entitiesAreEqual(previous.entity, request.entity) - ) { - logger.debug(`Different from existing entity, updating`); - await database.updateEntity(tx, request); - } else { - logger.debug(`Equal to existing entity, skipping update`); - } - }); - } - - private static entitiesAreEqual(previous: Entity, next: Entity) { - if ( - previous.apiVersion !== next.apiVersion || - previous.kind !== next.kind || - !lodash.isEqual(previous.spec, next.spec) // Accept that {} !== undefined - ) { - return false; - } - - // Since the next annotations get merged into the previous, extract only - // the overlapping keys and check if their values match. - if (next.metadata.annotations) { - if (!previous.metadata.annotations) { - return false; - } - if ( - !lodash.isEqual( - next.metadata.annotations, - lodash.pick( - previous.metadata.annotations, - Object.keys(next.metadata.annotations), - ), - ) - ) { - return false; - } - } - - const e1 = lodash.cloneDeep(previous); - const e2 = lodash.cloneDeep(next); - - if (!e1.metadata.labels) { - e1.metadata.labels = {}; - } - if (!e2.metadata.labels) { - e2.metadata.labels = {}; - } - - // Remove generated fields - delete e1.metadata.uid; - delete e1.metadata.etag; - delete e1.metadata.generation; - delete e2.metadata.uid; - delete e2.metadata.etag; - delete e2.metadata.generation; - - // Remove already compared things - delete e1.metadata.annotations; - delete e1.spec; - delete e2.metadata.annotations; - delete e2.spec; - - return lodash.isEqual(e1, e2); - } } diff --git a/plugins/catalog-backend/src/ingestion/HigherOrderOperations.test.ts b/plugins/catalog-backend/src/ingestion/HigherOrderOperations.test.ts index 7f1e890fbf..bd8dbedb27 100644 --- a/plugins/catalog-backend/src/ingestion/HigherOrderOperations.test.ts +++ b/plugins/catalog-backend/src/ingestion/HigherOrderOperations.test.ts @@ -14,10 +14,13 @@ * limitations under the License. */ +import { getVoidLogger } from '@backstage/backend-common'; +import { Entity, Location } from '@backstage/catalog-model'; import { EntitiesCatalog, LocationsCatalog } from '../catalog'; -import { IngestionModel } from './types'; +import { LocationUpdateStatus } from '../catalog/types'; +import { DatabaseLocationUpdateLogStatus } from '../database/types'; import { HigherOrderOperations } from './HigherOrderOperations'; -import { Entity } from '@backstage/catalog-model'; +import { IngestionModel } from './types'; describe('HigherOrderOperations', () => { let entitiesCatalog: jest.Mocked; @@ -39,6 +42,8 @@ describe('HigherOrderOperations', () => { locations: jest.fn(), location: jest.fn(), locationHistory: jest.fn(), + logUpdateSuccess: jest.fn(), + logUpdateFailure: jest.fn(), }; ingestionModel = { readLocation: jest.fn(), @@ -47,6 +52,7 @@ describe('HigherOrderOperations', () => { entitiesCatalog, locationsCatalog, ingestionModel, + getVoidLogger(), ); }); @@ -140,4 +146,147 @@ describe('HigherOrderOperations', () => { expect(locationsCatalog.addLocation).not.toBeCalled(); }); }); + + describe('refreshLocations', () => { + it('works with no locations added', async () => { + locationsCatalog.locations.mockResolvedValue([]); + + await expect( + higherOrderOperation.refreshAllLocations(), + ).resolves.toBeUndefined(); + + expect(locationsCatalog.locations).toHaveBeenCalledTimes(1); + expect(ingestionModel.readLocation).not.toHaveBeenCalled(); + expect(entitiesCatalog.addOrUpdateEntity).not.toHaveBeenCalled(); + }); + + it('can update a single location where a matching entity did not exist', async () => { + const locationStatus: LocationUpdateStatus = { + message: '', + status: DatabaseLocationUpdateLogStatus.SUCCESS, + timestamp: new Date(314159265).toISOString(), + }; + const location: Location = { + id: '123', + type: 'some', + target: 'thing', + }; + const desc: Entity = { + apiVersion: 'backstage.io/v1beta1', + kind: 'Component', + metadata: { name: 'c1' }, + spec: { type: 'service' }, + }; + + locationsCatalog.locations.mockResolvedValue([ + { currentStatus: locationStatus, data: location }, + ]); + ingestionModel.readLocation.mockResolvedValue([ + { type: 'data', data: desc }, + ]); + entitiesCatalog.entityByName.mockResolvedValue(undefined); + entitiesCatalog.addOrUpdateEntity.mockResolvedValue(desc); + + await expect( + higherOrderOperation.refreshAllLocations(), + ).resolves.toBeUndefined(); + + expect(locationsCatalog.locations).toHaveBeenCalledTimes(1); + expect(ingestionModel.readLocation).toHaveBeenCalledTimes(1); + expect(ingestionModel.readLocation).toHaveBeenNthCalledWith( + 1, + 'some', + 'thing', + ); + expect(entitiesCatalog.entityByName).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entityByName).toHaveBeenNthCalledWith( + 1, + 'Component', + undefined, + 'c1', + ); + expect(entitiesCatalog.addOrUpdateEntity).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.addOrUpdateEntity).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ + metadata: expect.objectContaining({ name: 'c1' }), + }), + '123', + ); + }); + + it('logs successful updates', async () => { + const locationStatus: LocationUpdateStatus = { + message: '', + status: DatabaseLocationUpdateLogStatus.SUCCESS, + timestamp: new Date(314159265).toISOString(), + }; + const location: Location = { + id: '123', + type: 'some', + target: 'thing', + }; + const desc: Entity = { + apiVersion: 'backstage.io/v1beta1', + kind: 'Component', + metadata: { name: 'c1' }, + spec: { type: 'service' }, + }; + + locationsCatalog.locations.mockResolvedValue([ + { currentStatus: locationStatus, data: location }, + ]); + ingestionModel.readLocation.mockResolvedValue([ + { type: 'data', data: desc }, + ]); + entitiesCatalog.entityByName.mockResolvedValue(undefined); + entitiesCatalog.addOrUpdateEntity.mockResolvedValue(desc); + + await expect( + higherOrderOperation.refreshAllLocations(), + ).resolves.toBeUndefined(); + + expect(locationsCatalog.logUpdateSuccess).toHaveBeenCalledTimes(2); + expect(locationsCatalog.logUpdateSuccess).toHaveBeenCalledWith( + '123', + undefined, + ); + expect(locationsCatalog.logUpdateSuccess).toHaveBeenCalledWith( + '123', + 'c1', + ); + }); + + it('logs unsuccessful updates when reader fails', async () => { + const locationStatus: LocationUpdateStatus = { + message: '', + status: DatabaseLocationUpdateLogStatus.SUCCESS, + timestamp: new Date(314159265).toISOString(), + }; + const location: Location = { + id: '123', + type: 'some', + target: 'thing', + }; + + locationsCatalog.locations.mockResolvedValue([ + { currentStatus: locationStatus, data: location }, + ]); + ingestionModel.readLocation.mockRejectedValue( + new Error('reader error message'), + ); + + await expect( + higherOrderOperation.refreshAllLocations(), + ).resolves.toBeUndefined(); + + expect(ingestionModel.readLocation).toHaveBeenCalledTimes(1); + expect(locationsCatalog.logUpdateFailure).toHaveBeenCalledTimes(1); + expect(locationsCatalog.logUpdateSuccess).not.toHaveBeenCalled(); + expect(locationsCatalog.logUpdateFailure).toHaveBeenCalledWith( + '123', + expect.objectContaining({ message: 'reader error message' }), + ); + }); + }); }); diff --git a/plugins/catalog-backend/src/ingestion/HigherOrderOperations.ts b/plugins/catalog-backend/src/ingestion/HigherOrderOperations.ts index e28d1e722a..e9051d1f78 100644 --- a/plugins/catalog-backend/src/ingestion/HigherOrderOperations.ts +++ b/plugins/catalog-backend/src/ingestion/HigherOrderOperations.ts @@ -16,10 +16,12 @@ import { InputError } from '@backstage/backend-common'; import { Entity, Location, LocationSpec } from '@backstage/catalog-model'; +import lodash from 'lodash'; import { v4 as uuidv4 } from 'uuid'; import { EntitiesCatalog, LocationsCatalog } from '../catalog'; import { IngestionModel } from '../ingestion'; import { AddLocationResult, HigherOrderOperation } from './types'; +import { Logger } from 'winston'; const LOCATION_ANNOTATION = 'backstage.io/managed-by-location'; @@ -34,15 +36,18 @@ export class HigherOrderOperations implements HigherOrderOperation { private readonly entitiesCatalog: EntitiesCatalog; private readonly locationsCatalog: LocationsCatalog; private readonly ingestionModel: IngestionModel; + private readonly logger: Logger; constructor( entitiesCatalog: EntitiesCatalog, locationsCatalog: LocationsCatalog, ingestionModel: IngestionModel, + logger: Logger, ) { this.entitiesCatalog = entitiesCatalog; this.locationsCatalog = locationsCatalog; this.ingestionModel = ingestionModel; + this.logger = logger; } /** @@ -111,4 +116,154 @@ export class HigherOrderOperations implements HigherOrderOperation { return { location, entities: outputEntities }; } + + /** + * Goes through all registered locations, and performs a refresh of each one. + * + * Entities are read from their respective sources, are parsed and validated + * according to the entity policy, and get inserted or updated in the catalog. + * Entities that have disappeared from their location are left orphaned, + * without changes. + */ + async refreshAllLocations(): Promise { + const startTimestamp = new Date().valueOf(); + this.logger.info('Beginning locations refresh'); + + const locations = await this.locationsCatalog.locations(); + this.logger.info(`Visiting ${locations.length} locations`); + + for (const { data: location } of locations) { + this.logger.debug( + `Refreshing location id="${location.id}" type="${location.type}" target="${location.target}"`, + ); + try { + await this.refreshSingleLocation(location); + await this.locationsCatalog.logUpdateSuccess(location.id, undefined); + } catch (e) { + this.logger.debug( + `Failed to refresh location id="${location.id}" type="${location.type}" target="${location.target}", ${e}`, + ); + await this.locationsCatalog.logUpdateFailure(location.id, e); + } + } + + const endTimestamp = new Date().valueOf(); + const duration = ((endTimestamp - startTimestamp) / 1000).toFixed(1); + this.logger.debug(`Completed locations refresh in ${duration} seconds`); + } + + // Performs a full refresh of a single location + private async refreshSingleLocation(location: Location) { + const readerOutput = await this.ingestionModel.readLocation( + location.type, + location.target, + ); + + for (const readerItem of readerOutput) { + if (readerItem.type === 'error') { + this.logger.debug( + `Failed item in location id="${location.id}" type="${location.type}" target="${location.target}", ${readerItem.error}`, + ); + continue; + } + + const entity = readerItem.data; + this.logger.debug( + `Read entity kind="${entity.kind}" name="${ + entity.metadata.name + }" namespace="${entity.metadata.namespace || ''}"`, + ); + + try { + const previous = await this.entitiesCatalog.entityByName( + entity.kind, + entity.metadata.namespace, + entity.metadata.name, + ); + + if (!previous) { + this.logger.debug(`No such entity found, adding`); + await this.entitiesCatalog.addOrUpdateEntity(entity, location.id); + } else if (!this.entitiesAreEqual(previous, entity)) { + this.logger.debug(`Different from existing entity, updating`); + await this.entitiesCatalog.addOrUpdateEntity(entity, location.id); + } else { + this.logger.debug(`Equal to existing entity, skipping update`); + } + + await this.locationsCatalog.logUpdateSuccess( + location.id, + entity.metadata.name, + ); + } catch (error) { + this.logger.debug( + `Failed refresh of entity kind="${entity.kind}" name="${ + entity.metadata.name + }" namespace="${entity.metadata.namespace || ''}", ${error}`, + ); + + await this.locationsCatalog.logUpdateFailure( + location.id, + error, + entity.metadata.name, + ); + } + } + } + + // Compares entities, ignoring generated and irrelevant data + private entitiesAreEqual(previous: Entity, next: Entity): boolean { + if ( + previous.apiVersion !== next.apiVersion || + previous.kind !== next.kind || + !lodash.isEqual(previous.spec, next.spec) // Accept that {} !== undefined + ) { + return false; + } + + // Since the next annotations get merged into the previous, extract only + // the overlapping keys and check if their values match. + if (next.metadata.annotations) { + if (!previous.metadata.annotations) { + return false; + } + if ( + !lodash.isEqual( + next.metadata.annotations, + lodash.pick( + previous.metadata.annotations, + Object.keys(next.metadata.annotations), + ), + ) + ) { + return false; + } + } + + const e1 = lodash.cloneDeep(previous); + const e2 = lodash.cloneDeep(next); + + if (!e1.metadata.labels) { + e1.metadata.labels = {}; + } + if (!e2.metadata.labels) { + e2.metadata.labels = {}; + } + + // Remove generated fields + delete e1.metadata.uid; + delete e1.metadata.etag; + delete e1.metadata.generation; + delete e2.metadata.uid; + delete e2.metadata.etag; + delete e2.metadata.generation; + + // Remove already compared things + delete e1.metadata.annotations; + delete e1.spec; + delete e2.metadata.annotations; + delete e2.spec; + + return lodash.isEqual(e1, e2); + } } diff --git a/plugins/catalog-backend/src/service/router.test.ts b/plugins/catalog-backend/src/service/router.test.ts index d26476bca0..0efc0a3be4 100644 --- a/plugins/catalog-backend/src/service/router.test.ts +++ b/plugins/catalog-backend/src/service/router.test.ts @@ -43,6 +43,8 @@ describe('createRouter', () => { locations: jest.fn(), location: jest.fn(), locationHistory: jest.fn(), + logUpdateSuccess: jest.fn(), + logUpdateFailure: jest.fn(), }; higherOrderOperation = { addLocation: jest.fn(), From 3c47bc4e23ef8b1e31633d35a921e499c4fefd7e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Jun 2020 12:00:30 +0200 Subject: [PATCH 028/192] plugins/auth-backend: refactor to allow non-oauth providers --- .../auth-backend/src/providers/factories.ts | 57 +++++++++---------- .../src/providers/github/index.ts | 2 +- .../src/providers/github/provider.ts | 7 +++ .../src/providers/google/index.ts | 2 +- .../src/providers/google/provider.ts | 7 +++ .../auth-backend/src/providers/index.test.ts | 23 -------- plugins/auth-backend/src/providers/index.ts | 22 +------ plugins/auth-backend/src/providers/types.ts | 10 +--- plugins/auth-backend/src/service/router.ts | 9 +-- 9 files changed, 52 insertions(+), 87 deletions(-) delete mode 100644 plugins/auth-backend/src/providers/index.test.ts diff --git a/plugins/auth-backend/src/providers/factories.ts b/plugins/auth-backend/src/providers/factories.ts index 0c9f99e878..010b86f409 100644 --- a/plugins/auth-backend/src/providers/factories.ts +++ b/plugins/auth-backend/src/providers/factories.ts @@ -14,37 +14,34 @@ * limitations under the License. */ -import { - AuthProviderFactories, - AuthProviderRouteHandlers, - AuthProviderConfig, -} from './types'; -import { GoogleAuthProvider } from './google'; -import { GithubAuthProvider } from './github'; -import { OAuthProvider } from './OAuthProvider'; +import Router from 'express-promise-router'; +import { createGithubProvider } from './github'; +import { createGoogleProvider } from './google'; +import { AuthProviderFactory, AuthProviderConfig } from './types'; -export class ProviderFactories { - private static readonly providerFactories: AuthProviderFactories = { - google: GoogleAuthProvider, - github: GithubAuthProvider, - }; +const factories: { [providerId: string]: AuthProviderFactory } = { + google: createGoogleProvider, + github: createGithubProvider, +}; - public static getProviderFactory( - config: AuthProviderConfig, - ): AuthProviderRouteHandlers { - const providerId = config.provider; - const ProviderImpl = ProviderFactories.providerFactories[providerId]; - if (!ProviderImpl) { - throw Error( - `Provider Implementation missing for : ${providerId} auth provider`, - ); - } - const providerInstance = new ProviderImpl(config); - const oauthProvider = new OAuthProvider( - providerInstance, - providerId, - config.disableRefresh, - ); - return oauthProvider; +export function createAuthProvider(providerId: string, config: any) { + const factory = factories[providerId]; + if (!factory) { + throw Error(`No auth provider available for '${providerId}'`); } + return factory(config); } + +export const createAuthProviderRouter = (config: AuthProviderConfig) => { + const providerId = config.provider; + const provider = createAuthProvider(providerId, config); + + const router = Router(); + router.get('/start', provider.start.bind(provider)); + router.get('/handler/frame', provider.frameHandler.bind(provider)); + router.get('/logout', provider.logout.bind(provider)); + if (provider.refresh) { + router.get('/refresh', provider.refresh.bind(provider)); + } + return router; +}; diff --git a/plugins/auth-backend/src/providers/github/index.ts b/plugins/auth-backend/src/providers/github/index.ts index c3a48d35e0..60ad6998b7 100644 --- a/plugins/auth-backend/src/providers/github/index.ts +++ b/plugins/auth-backend/src/providers/github/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { GithubAuthProvider } from './provider'; +export { createGithubProvider } from './provider'; diff --git a/plugins/auth-backend/src/providers/github/provider.ts b/plugins/auth-backend/src/providers/github/provider.ts index 4445e98451..09622d9303 100644 --- a/plugins/auth-backend/src/providers/github/provider.ts +++ b/plugins/auth-backend/src/providers/github/provider.ts @@ -27,6 +27,7 @@ import { AuthInfoBase, AuthInfoPrivate, } from '../types'; +import { OAuthProvider } from '../OAuthProvider'; export class GithubAuthProvider implements OAuthProviderHandlers { private readonly providerConfig: AuthProviderConfig; @@ -57,3 +58,9 @@ export class GithubAuthProvider implements OAuthProviderHandlers { return await executeFrameHandlerStrategy(req, this._strategy); } } + +export function createGithubProvider(config: AuthProviderConfig) { + const provider = new GithubAuthProvider(config); + const oauthProvider = new OAuthProvider(provider, config.provider, true); + return oauthProvider; +} diff --git a/plugins/auth-backend/src/providers/google/index.ts b/plugins/auth-backend/src/providers/google/index.ts index 0ec98bef89..b2cd85e6de 100644 --- a/plugins/auth-backend/src/providers/google/index.ts +++ b/plugins/auth-backend/src/providers/google/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { GoogleAuthProvider } from './provider'; +export { createGoogleProvider } from './provider'; diff --git a/plugins/auth-backend/src/providers/google/provider.ts b/plugins/auth-backend/src/providers/google/provider.ts index 90d33652a5..e3969b14c8 100644 --- a/plugins/auth-backend/src/providers/google/provider.ts +++ b/plugins/auth-backend/src/providers/google/provider.ts @@ -28,6 +28,7 @@ import { RedirectInfo, AuthProviderConfig, } from '../types'; +import { OAuthProvider } from '../OAuthProvider'; export class GoogleAuthProvider implements OAuthProviderHandlers { private readonly providerConfig: AuthProviderConfig; @@ -87,3 +88,9 @@ export class GoogleAuthProvider implements OAuthProviderHandlers { }; } } + +export function createGoogleProvider(config: AuthProviderConfig) { + const provider = new GoogleAuthProvider(config); + const oauthProvider = new OAuthProvider(provider, config.provider); + return oauthProvider; +} diff --git a/plugins/auth-backend/src/providers/index.test.ts b/plugins/auth-backend/src/providers/index.test.ts deleted file mode 100644 index 7f39d9de57..0000000000 --- a/plugins/auth-backend/src/providers/index.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { defaultRouter } from '.'; - -describe('test', () => { - it('unbreaks the test runner', () => { - expect(defaultRouter).toBeDefined(); - }); -}); diff --git a/plugins/auth-backend/src/providers/index.ts b/plugins/auth-backend/src/providers/index.ts index cfbabbbad1..d210bfd1bb 100644 --- a/plugins/auth-backend/src/providers/index.ts +++ b/plugins/auth-backend/src/providers/index.ts @@ -14,24 +14,4 @@ * limitations under the License. */ -import Router from 'express-promise-router'; -import { AuthProviderRouteHandlers, AuthProviderConfig } from './types'; -import { ProviderFactories } from './factories'; - -export const defaultRouter = (provider: AuthProviderRouteHandlers) => { - const router = Router(); - router.get('/start', provider.start.bind(provider)); - router.get('/handler/frame', provider.frameHandler.bind(provider)); - router.get('/logout', provider.logout.bind(provider)); - if (provider.refresh) { - router.get('/refresh', provider.refresh.bind(provider)); - } - return router; -}; - -export const makeProvider = (config: AuthProviderConfig) => { - const providerId = config.provider; - const oauthProvider = ProviderFactories.getProviderFactory(config); - const providerRouter = defaultRouter(oauthProvider); - return { providerId, providerRouter }; -}; +export { createAuthProviderRouter } from './factories'; diff --git a/plugins/auth-backend/src/providers/types.ts b/plugins/auth-backend/src/providers/types.ts index dc83c19dd0..661435e74b 100644 --- a/plugins/auth-backend/src/providers/types.ts +++ b/plugins/auth-backend/src/providers/types.ts @@ -37,13 +37,9 @@ export interface AuthProviderRouteHandlers { logout(req: express.Request, res: express.Response): Promise; } -export type AuthProviderFactories = { - [key: string]: AuthProviderFactory; -}; - -export type AuthProviderFactory = { - new (providerConfig: any): OAuthProviderHandlers; -}; +export type AuthProviderFactory = ( + config: AuthProviderConfig, +) => AuthProviderRouteHandlers; export type AuthInfoBase = { accessToken: string; diff --git a/plugins/auth-backend/src/service/router.ts b/plugins/auth-backend/src/service/router.ts index 49487d551a..aeb72b3a3b 100644 --- a/plugins/auth-backend/src/service/router.ts +++ b/plugins/auth-backend/src/service/router.ts @@ -19,7 +19,7 @@ import Router from 'express-promise-router'; import cookieParser from 'cookie-parser'; import { Logger } from 'winston'; import { providers } from './../providers/config'; -import { makeProvider } from '../providers'; +import { createAuthProviderRouter } from '../providers'; export interface RouterOptions { logger: Logger; @@ -35,9 +35,10 @@ export async function createRouter( // configure all the providers for (const providerConfig of providers) { - const { providerId, providerRouter } = makeProvider(providerConfig); - logger.info(`Configuring provider, ${providerId}`); - router.use(`/${providerId}`, providerRouter); + const { provider } = providerConfig; + const providerRouter = createAuthProviderRouter(providerConfig); + logger.info(`Configuring provider, ${provider}`); + router.use(`/${provider}`, providerRouter); } return router; From 5d24d086f5c5fd29e10219b42ee3fe7965bb91c2 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Jun 2020 12:44:33 +0200 Subject: [PATCH 029/192] plugins/auth-backend: added basic saml provider --- plugins/auth-backend/package.json | 4 + .../auth-backend/scripts/start-saml-idp.sh | 2 +- .../src/providers/PassportStrategyHelper.ts | 2 +- plugins/auth-backend/src/providers/config.ts | 8 ++ .../auth-backend/src/providers/factories.ts | 3 + .../auth-backend/src/providers/saml/index.ts | 17 ++++ .../src/providers/saml/provider.ts | 82 ++++++++++++++++++ plugins/auth-backend/src/service/router.ts | 3 + yarn.lock | 85 +++++++++++++++++-- 9 files changed, 198 insertions(+), 8 deletions(-) create mode 100644 plugins/auth-backend/src/providers/saml/index.ts create mode 100644 plugins/auth-backend/src/providers/saml/provider.ts diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 505240853d..3e902304db 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -20,6 +20,7 @@ "@types/passport": "^1.0.3", "@types/passport-github2": "^1.2.4", "@types/passport-google-oauth20": "^2.0.3", + "body-parser": "^1.19.0", "compression": "^1.7.4", "cookie-parser": "^1.4.5", "cors": "^2.8.5", @@ -31,11 +32,14 @@ "passport": "^0.4.1", "passport-github2": "^0.1.12", "passport-google-oauth20": "^2.0.0", + "passport-saml": "^1.3.3", "winston": "^3.2.1", "yn": "^4.0.0" }, "devDependencies": { "@backstage/cli": "^0.1.1-alpha.6", + "@types/body-parser": "^1.19.0", + "@types/passport-saml": "^1.1.2", "jest-fetch-mock": "^3.0.3", "tsc-watch": "^4.2.3" }, diff --git a/plugins/auth-backend/scripts/start-saml-idp.sh b/plugins/auth-backend/scripts/start-saml-idp.sh index dd80ca6c32..592e372e44 100755 --- a/plugins/auth-backend/scripts/start-saml-idp.sh +++ b/plugins/auth-backend/scripts/start-saml-idp.sh @@ -14,4 +14,4 @@ fi echo "Downloading and starting SAML-IdP" export NPM_CONFIG_REGISTRY=https://registry.npmjs.org -exec npx saml-idp --acsUrl "http://localhost:3003/auth/saml/handler/frame" --audience "http://localhost:3003" +exec npx saml-idp --acsUrl "http://localhost:7000/auth/saml/handler/frame" --audience "http://localhost:7000" --port 7001 diff --git a/plugins/auth-backend/src/providers/PassportStrategyHelper.ts b/plugins/auth-backend/src/providers/PassportStrategyHelper.ts index 3ec8539330..5c02930c2c 100644 --- a/plugins/auth-backend/src/providers/PassportStrategyHelper.ts +++ b/plugins/auth-backend/src/providers/PassportStrategyHelper.ts @@ -55,7 +55,7 @@ export const executeFrameHandlerStrategy = async ( reject(new Error('Unexpected redirect')); }; - strategy.authenticate(req); + strategy.authenticate(req, {}); }); }; diff --git a/plugins/auth-backend/src/providers/config.ts b/plugins/auth-backend/src/providers/config.ts index 8d04dc5a1f..5ec73b7827 100644 --- a/plugins/auth-backend/src/providers/config.ts +++ b/plugins/auth-backend/src/providers/config.ts @@ -32,4 +32,12 @@ export const providers = [ }, disableRefresh: true, }, + { + provider: 'saml', + options: { + path: '/auth/saml/handler/frame', + entryPoint: 'http://localhost:7001/', + issuer: 'passport-saml', + }, + }, ]; diff --git a/plugins/auth-backend/src/providers/factories.ts b/plugins/auth-backend/src/providers/factories.ts index 010b86f409..f7560174ef 100644 --- a/plugins/auth-backend/src/providers/factories.ts +++ b/plugins/auth-backend/src/providers/factories.ts @@ -17,11 +17,13 @@ import Router from 'express-promise-router'; import { createGithubProvider } from './github'; import { createGoogleProvider } from './google'; +import { createSamlProvider } from './saml'; import { AuthProviderFactory, AuthProviderConfig } from './types'; const factories: { [providerId: string]: AuthProviderFactory } = { google: createGoogleProvider, github: createGithubProvider, + saml: createSamlProvider, }; export function createAuthProvider(providerId: string, config: any) { @@ -39,6 +41,7 @@ export const createAuthProviderRouter = (config: AuthProviderConfig) => { const router = Router(); router.get('/start', provider.start.bind(provider)); router.get('/handler/frame', provider.frameHandler.bind(provider)); + router.post('/handler/frame', provider.frameHandler.bind(provider)); router.get('/logout', provider.logout.bind(provider)); if (provider.refresh) { router.get('/refresh', provider.refresh.bind(provider)); diff --git a/plugins/auth-backend/src/providers/saml/index.ts b/plugins/auth-backend/src/providers/saml/index.ts new file mode 100644 index 0000000000..582deb1608 --- /dev/null +++ b/plugins/auth-backend/src/providers/saml/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { createSamlProvider } from './provider'; diff --git a/plugins/auth-backend/src/providers/saml/provider.ts b/plugins/auth-backend/src/providers/saml/provider.ts new file mode 100644 index 0000000000..50bea3495e --- /dev/null +++ b/plugins/auth-backend/src/providers/saml/provider.ts @@ -0,0 +1,82 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import express from 'express'; +import { Strategy as SamlStrategy } from 'passport-saml'; +import { + executeFrameHandlerStrategy, + executeRedirectStrategy, +} from '../PassportStrategyHelper'; +import { AuthProviderConfig, AuthProviderRouteHandlers } from '../types'; +import { postMessageResponse } from '../OAuthProvider'; + +export class SamlAuthProvider implements AuthProviderRouteHandlers { + private readonly strategy: SamlStrategy; + + constructor(providerConfig: AuthProviderConfig) { + this.strategy = new SamlStrategy( + { ...providerConfig.options }, + (profile: any, done: any) => { + // TODO: There's plenty more validation and profile handling to do here, + // this provider is currently only intended to validate the provider pattern + // for non-oauth auth flows. + // TODO: This flow doesn't issue an identity token that can be used to validate + // the identity of the user in other backends, which we need in some form. + done(undefined, { + email: profile.email, + firstName: profile.firstName, + lastName: profile.lastName, + displayName: profile.displayName, + }); + }, + ); + } + + async start(req: express.Request, res: express.Response): Promise { + const { url } = await executeRedirectStrategy(req, this.strategy, {}); + res.redirect(url); + } + + async frameHandler( + req: express.Request, + res: express.Response, + ): Promise { + try { + const { user } = await executeFrameHandlerStrategy(req, this.strategy); + + return postMessageResponse(res, { + type: 'auth-result', + payload: user, + }); + } catch (error) { + return postMessageResponse(res, { + type: 'auth-result', + error: { + name: error.name, + message: error.message, + }, + }); + } + } + + async logout(_req: express.Request, res: express.Response): Promise { + res.send('noop'); + } +} + +export function createSamlProvider(config: AuthProviderConfig) { + return new SamlAuthProvider(config); +} diff --git a/plugins/auth-backend/src/service/router.ts b/plugins/auth-backend/src/service/router.ts index aeb72b3a3b..9de5fb80a5 100644 --- a/plugins/auth-backend/src/service/router.ts +++ b/plugins/auth-backend/src/service/router.ts @@ -17,6 +17,7 @@ import express from 'express'; import Router from 'express-promise-router'; import cookieParser from 'cookie-parser'; +import bodyParser from 'body-parser'; import { Logger } from 'winston'; import { providers } from './../providers/config'; import { createAuthProviderRouter } from '../providers'; @@ -32,6 +33,8 @@ export async function createRouter( const logger = options.logger.child({ plugin: 'auth' }); router.use(cookieParser()); + router.use(bodyParser.urlencoded({ extended: false })); + router.use(bodyParser.json()); // configure all the providers for (const providerConfig of providers) { diff --git a/yarn.lock b/yarn.lock index 760f1421b7..a118f0cea2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3402,7 +3402,7 @@ dependencies: "@babel/types" "^7.3.0" -"@types/body-parser@*": +"@types/body-parser@*", "@types/body-parser@^1.19.0": version "1.19.0" resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f" integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ== @@ -3812,6 +3812,14 @@ "@types/oauth" "*" "@types/passport" "*" +"@types/passport-saml@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@types/passport-saml/-/passport-saml-1.1.2.tgz#f32ac2321eb25ec7bdbb1f3a5313b596bb0887e6" + integrity sha512-vpSdcb7V/bFxrvZJwSqnBr0qEqIhtOnwRBxw+Dvq4UkVbEgcCOkxF4tERCCFfA+FP3lp63VCCAifZLQrF5JkXA== + dependencies: + "@types/express" "*" + "@types/passport" "*" + "@types/passport@*", "@types/passport@^1.0.3": version "1.0.3" resolved "https://registry.npmjs.org/@types/passport/-/passport-1.0.3.tgz#e459ed6c262bf0686684d1b05901be0d0b192a9c" @@ -5453,7 +5461,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -body-parser@1.19.0: +body-parser@1.19.0, body-parser@^1.19.0: version "1.19.0" resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== @@ -8065,7 +8073,7 @@ escape-goat@^2.0.0: resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== -escape-html@~1.0.3: +escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= @@ -13210,6 +13218,11 @@ node-forge@0.9.0: resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ== +node-forge@^0.7.0: + version "0.7.6" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" + integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw== + node-gyp@^5.0.2: version "5.1.0" resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.0.tgz#8e31260a7af4a2e2f994b0673d4e0b3866156332" @@ -14079,7 +14092,21 @@ passport-oauth2@1.x.x: uid2 "0.0.x" utils-merge "1.x.x" -passport-strategy@1.x.x: +passport-saml@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/passport-saml/-/passport-saml-1.3.3.tgz#cbea1a2b21ff32b3bc4bfd84dc39c3a370df9935" + integrity sha512-54ecY/A6UEsyCehJws6a+J6THvwtYnGl9cnAUxx5DjsuKgZrDs0tSy58K4hCk1XG/LOcdQSF1TR3xlRXgTULhA== + dependencies: + debug "^3.1.0" + passport-strategy "*" + q "^1.5.0" + xml-crypto "^1.4.0" + xml-encryption "^1.0.0" + xml2js "0.4.x" + xmlbuilder "^11.0.0" + xmldom "0.1.x" + +passport-strategy@*, passport-strategy@1.x.x: version "1.0.0" resolved "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= @@ -15067,7 +15094,7 @@ pupa@^2.0.1: dependencies: escape-goat "^2.0.0" -q@^1.1.2, q@^1.5.1: +q@^1.1.2, q@^1.5.0, q@^1.5.1: version "1.5.1" resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= @@ -16405,7 +16432,7 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sax@^1.2.4, sax@~1.2.4: +sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -19171,16 +19198,62 @@ xdg-basedir@^4.0.0: resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== +xml-crypto@^1.4.0: + version "1.5.3" + resolved "https://registry.npmjs.org/xml-crypto/-/xml-crypto-1.5.3.tgz#a8f500b90f0dfaf0efa3331c345ecb0fff993c34" + integrity sha512-uHkmpUtX15xExe5iimPmakAZN+6CqIvjmaJTy4FwqGzaTjrKRBNeqMh8zGEzVNgW0dk6beFYpyQSgqV/J6C5xA== + dependencies: + xmldom "0.1.27" + xpath "0.0.27" + +xml-encryption@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/xml-encryption/-/xml-encryption-1.2.0.tgz#37c8b470beae88b4625ea8cad82f108ea0f9c364" + integrity sha512-J3NjGMY8jf6bTo15jURTYBLtsisbnyCeM+MuxtfiAkZEZBnSZpNKjUUORhiOScKvSi6tMOAaZ3r7bZOXOni+Ew== + dependencies: + escape-html "^1.0.3" + node-forge "^0.7.0" + xmldom "~0.1.15" + xpath "0.0.27" + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xml2js@0.4.x: + version "0.4.23" + resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@^11.0.0, xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + xmlchars@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xmldom@0.1.27: + version "0.1.27" + resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= + +xmldom@0.1.x, xmldom@~0.1.15: + version "0.1.31" + resolved "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz#b76c9a1bd9f0a9737e5a72dc37231cf38375e2ff" + integrity sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ== + +xpath@0.0.27: + version "0.0.27" + resolved "https://registry.npmjs.org/xpath/-/xpath-0.0.27.tgz#dd3421fbdcc5646ac32c48531b4d7e9d0c2cfa92" + integrity sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ== + xregexp@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50" From cf5e4f367dc6fac35e78bb06a9b5089ddc30829e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Jun 2020 13:42:15 +0200 Subject: [PATCH 030/192] plugins/auth-backend: docs for saml-idp --- plugins/auth-backend/README.md | 8 ++++++++ plugins/auth-backend/scripts/start-saml-idp.sh | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/plugins/auth-backend/README.md b/plugins/auth-backend/README.md index 46bfef8b3c..ae17a556c9 100644 --- a/plugins/auth-backend/README.md +++ b/plugins/auth-backend/README.md @@ -19,6 +19,14 @@ read -r AUTH_GOOGLE_CLIENT_SECRET export AUTH_GOOGLE_CLIENT_SECRET run `yarn start` in packages/backend folder +### SAML + +To try out SAML, you can use the mock identity provider: + +```bash +./scripts/start-saml-idp.sh +``` + ## Links - (The Backstage homepage)[https://backstage.io] diff --git a/plugins/auth-backend/scripts/start-saml-idp.sh b/plugins/auth-backend/scripts/start-saml-idp.sh index 592e372e44..33217f7978 100755 --- a/plugins/auth-backend/scripts/start-saml-idp.sh +++ b/plugins/auth-backend/scripts/start-saml-idp.sh @@ -1,5 +1,9 @@ #!/bin/bash +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" + +cd "$DIR" + if [[ ! -f idp-public-cert.pem ]]; then echo "Generating new SAML Certificates" openssl req \ From dfe817cb742c737ce773234c6e38f98633bff283 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Tue, 2 Jun 2020 13:55:17 +0200 Subject: [PATCH 031/192] Fix linting and tsc --- packages/app/package.json | 3 ++- packages/backend/src/index.ts | 12 ++++----- plugins/catalog/package.json | 9 ++++--- plugins/catalog/src/routes.ts | 26 ++++++++++++++++++- plugins/register-component/package.json | 3 +++ .../RegisterComponentForm.test.tsx | 13 +++------- .../RegisterComponentPage.tsx | 4 +-- plugins/scaffolder/package.json | 1 + 8 files changed, 48 insertions(+), 23 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index 0af25d6f3a..15681d0548 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -12,15 +12,16 @@ "@backstage/plugin-lighthouse": "^0.1.1-alpha.6", "@backstage/plugin-register-component": "^0.1.1-alpha.6", "@backstage/plugin-scaffolder": "^0.1.1-alpha.6", + "@backstage/plugin-sentry": "^0.1.1-alpha.6", "@backstage/plugin-tech-radar": "^0.1.1-alpha.6", "@backstage/plugin-welcome": "^0.1.1-alpha.6", "@backstage/theme": "^0.1.1-alpha.6", - "@backstage/plugin-sentry": "^0.1.1-alpha.6", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "prop-types": "^15.7.2", "react": "^16.12.0", "react-dom": "^16.12.0", + "react-hot-loader": "^4.12.21", "react-router-dom": "^5.2.0", "react-use": "^14.2.0", "zen-observable": "^0.8.15" diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index a6299ca829..5b1fc54330 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -70,12 +70,12 @@ async function main() { app.use(requestLoggingHandler()); app.use('/catalog', await catalog(createEnv('catalog'))); app.use('/scaffolder', await scaffolder(createEnv('scaffolder'))); - // app.use( - // '/sentry', - // await sentry(getRootLogger().child({ type: 'plugin', plugin: 'sentry' })), - // ); - // app.use('/auth', await auth(createEnv('auth'))); - // app.use('/identity', await identity(createEnv('identity'))); + app.use( + '/sentry', + await sentry(getRootLogger().child({ type: 'plugin', plugin: 'sentry' })), + ); + app.use('/auth', await auth(createEnv('auth'))); + app.use('/identity', await identity(createEnv('identity'))); app.use(notFoundHandler()); app.use(errorHandler()); diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 0cdc5d2618..5445fffb32 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -17,15 +17,18 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", "@backstage/catalog-model": "^0.1.1-alpha.6", + "@backstage/core": "^0.1.1-alpha.6", + "@backstage/plugin-scaffolder": "^0.1.1-alpha.6", + "@backstage/plugin-sentry": "^0.1.1-alpha.6", + "@backstage/theme": "^0.1.1-alpha.6", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", - "@backstage/plugin-sentry": "^0.1.1-alpha.6", "react": "^16.13.1", "react-dom": "^16.13.1", + "react-router": "^5.2.0", + "react-router-dom": "^5.2.0", "react-use": "^14.2.0" }, "devDependencies": { diff --git a/plugins/catalog/src/routes.ts b/plugins/catalog/src/routes.ts index 79d02fefe1..830dc6d48f 100644 --- a/plugins/catalog/src/routes.ts +++ b/plugins/catalog/src/routes.ts @@ -1,4 +1,28 @@ -import { createRouteRef } from '@backstage/core'; +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * Hi! + * + * Note that this is an EXAMPLE Backstage backend. Please check the README. + * + * Happy hacking! + */ + + import { createRouteRef } from '@backstage/core'; const NoIcon = () => null; diff --git a/plugins/register-component/package.json b/plugins/register-component/package.json index 053af6bb51..c2d8408f1f 100644 --- a/plugins/register-component/package.json +++ b/plugins/register-component/package.json @@ -18,6 +18,7 @@ }, "dependencies": { "@backstage/core": "^0.1.1-alpha.6", + "@backstage/plugin-catalog": "^0.1.1-alpha.6", "@backstage/theme": "^0.1.1-alpha.6", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", @@ -25,6 +26,8 @@ "react": "^16.13.1", "react-dom": "^16.13.1", "react-hook-form": "^5.7.2", + "react-router": "^5.2.0", + "react-router-dom": "^5.2.0", "react-use": "^14.2.0" }, "devDependencies": { diff --git a/plugins/register-component/src/components/RegisterComponentForm/RegisterComponentForm.test.tsx b/plugins/register-component/src/components/RegisterComponentForm/RegisterComponentForm.test.tsx index 9203093d48..3b8b7f9dcf 100644 --- a/plugins/register-component/src/components/RegisterComponentForm/RegisterComponentForm.test.tsx +++ b/plugins/register-component/src/components/RegisterComponentForm/RegisterComponentForm.test.tsx @@ -18,11 +18,10 @@ import React from 'react'; import { render, fireEvent } from '@testing-library/react'; import RegisterComponentForm from './RegisterComponentForm'; +// TODO(ishmidt): rewrite tests describe('RegisterComponentForm', () => { it('should initially render a disabled button', async () => { - const rendered = render( - , - ); + const rendered = render(); expect( await rendered.findByText( 'Enter the full path to the service-info.yaml file in GHE to start tracking your component. It must be in a public repo, on the master branch.', @@ -34,9 +33,7 @@ describe('RegisterComponentForm', () => { }); it('should enable a submit form when data when component url is set ', async () => { - const rendered = render( - , - ); + const rendered = render(); const input = (await rendered.getByRole('textbox')) as HTMLInputElement; fireEvent.change(input, { target: { value: 'https://example.com/blob/master/service.yaml' }, @@ -47,9 +44,7 @@ describe('RegisterComponentForm', () => { }); it('should hide input on submission ', async () => { - const rendered = render( - , - ); + const rendered = render(); expect( await rendered.findByText( diff --git a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx index d0189ba7f8..6d01fc469e 100644 --- a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx +++ b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.tsx @@ -36,18 +36,16 @@ import { Page, pageTheme, Content, - ContentHeader, - SupportButton, useApi, errorApiRef, StructuredMetadataTable, Header, } from '@backstage/core'; import RegisterComponentForm from '../RegisterComponentForm'; -import { catalogApiRef } from '@backstage/plugin-catalog'; import { entityRoute, rootRoute as catalogRootRoute, + catalogApiRef } from '@backstage/plugin-catalog'; import { generatePath } from 'react-router'; diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 7f453fde48..ad44e06986 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -24,6 +24,7 @@ "@material-ui/lab": "4.0.0-alpha.45", "react": "^16.13.1", "react-dom": "^16.13.1", + "react-router-dom": "^5.2.0", "react-use": "^14.2.0" }, "devDependencies": { From 5afd5355466b18571e1b15190bd6324b4ede5d8f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Jun 2020 14:00:19 +0200 Subject: [PATCH 032/192] github/workflows: split cli build to skip more builds on windows --- .github/workflows/cli-win.yml | 65 +++++++++++++++++++++++++++++++++++ .github/workflows/cli.yml | 12 ++----- 2 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 .github/workflows/cli-win.yml diff --git a/.github/workflows/cli-win.yml b/.github/workflows/cli-win.yml new file mode 100644 index 0000000000..33179358c6 --- /dev/null +++ b/.github/workflows/cli-win.yml @@ -0,0 +1,65 @@ +name: CLI Test Windows + +# Building on windows is really slow, so this workflow is separate from cli.yml and only builds on changes +# to the cli itself. They're more likely to introduce issues on windows, compared to changes to core and yarn.lock. +on: + pull_request: + paths: + - '.github/workflows/cli-win.yml' + - 'packages/cli/**' + +jobs: + build: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [windows-latest] + node-version: [12.x] + + env: + CI: true + NODE_OPTIONS: --max-old-space-size=4096 + + name: Node ${{ matrix.node-version }} on ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + - name: find location of global yarn cache + id: yarn-cache + run: echo "::set-output name=dir::$(yarn cache dir)" + - name: cache global yarn cache + uses: actions/cache@v1 + with: + path: ${{ steps.yarn-cache.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + - name: use node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - name: yarn install + run: yarn install --frozen-lockfile + - run: yarn tsc + - run: yarn build + - name: verify app and plugin creation + working-directory: ${{ runner.temp }} + run: node ${{ github.workspace }}/packages/cli/e2e-test/cli-e2e-test.js + env: + BACKSTAGE_E2E_CLI_TEST: true + - name: lint newly created app and plugin + run: yarn lint:all + working-directory: ${{ runner.temp }}/test-app + env: + BACKSTAGE_E2E_CLI_TEST: true + - name: test newly created app and plugin + run: yarn test:all + working-directory: ${{ runner.temp }}/test-app + env: + BACKSTAGE_E2E_CLI_TEST: true + - name: e2e test newly created app + run: yarn test:e2e:ci + working-directory: ${{ runner.temp }}/test-app/packages/app + env: + PORT: 3001 + BACKSTAGE_E2E_CLI_TEST: true diff --git a/.github/workflows/cli.yml b/.github/workflows/cli.yml index 24ff2a734c..49d90546cf 100644 --- a/.github/workflows/cli.yml +++ b/.github/workflows/cli.yml @@ -6,6 +6,7 @@ on: - '.github/workflows/cli.yml' - 'packages/cli/**' - 'packages/core/**' + - 'packages/core-api/**' - 'yarn.lock' jobs: @@ -14,7 +15,7 @@ jobs: strategy: matrix: - os: [ubuntu-latest, windows-latest] + os: [ubuntu-latest] node-version: [12.x] env: @@ -42,15 +43,8 @@ jobs: run: yarn install --frozen-lockfile - run: yarn tsc - run: yarn build - - name: verify app and plugin creation on Windows + - name: verify app and plugin creation working-directory: ${{ runner.temp }} - if: runner.os == 'Windows' - run: node ${{ github.workspace }}/packages/cli/e2e-test/cli-e2e-test.js - env: - BACKSTAGE_E2E_CLI_TEST: true - - name: verify app and plugin creation on Linux - working-directory: ${{ runner.temp }} - if: runner.os == 'Linux' run: | sudo sysctl fs.inotify.max_user_watches=524288 node ${{ github.workspace }}/packages/cli/e2e-test/cli-e2e-test.js From 2b6cd94cfa749dcafb716340e51deb680edaa16b Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Jun 2020 14:01:08 +0200 Subject: [PATCH 033/192] github/workflows: use actions/cache@v2 --- .github/workflows/cli-win.yml | 2 +- .github/workflows/cli.yml | 2 +- .github/workflows/frontend.yml | 6 +++--- .github/workflows/master.yml | 6 +++--- .github/workflows/storybook-deploy.yml | 4 ++-- .../.github/workflows/build.yml | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/cli-win.yml b/.github/workflows/cli-win.yml index 33179358c6..52ec1b8b27 100644 --- a/.github/workflows/cli-win.yml +++ b/.github/workflows/cli-win.yml @@ -28,7 +28,7 @@ jobs: id: yarn-cache run: echo "::set-output name=dir::$(yarn cache dir)" - name: cache global yarn cache - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: ${{ steps.yarn-cache.outputs.dir }} key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} diff --git a/.github/workflows/cli.yml b/.github/workflows/cli.yml index 49d90546cf..62f91e3259 100644 --- a/.github/workflows/cli.yml +++ b/.github/workflows/cli.yml @@ -29,7 +29,7 @@ jobs: id: yarn-cache run: echo "::set-output name=dir::$(yarn cache dir)" - name: cache global yarn cache - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: ${{ steps.yarn-cache.outputs.dir }} key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml index 55a594d55e..c3fa6e4e23 100644 --- a/.github/workflows/frontend.yml +++ b/.github/workflows/frontend.yml @@ -25,19 +25,19 @@ jobs: id: yarn-cache run: echo "::set-output name=dir::$(yarn cache dir)" - name: cache global yarn cache - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: ${{ steps.yarn-cache.outputs.dir }} key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | ${{ runner.os }}-yarn- - name: cache node_modules - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: node_modules key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - name: cache build cache - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: .backstage-build-cache key: build-cache-${{ github.sha }} diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index 14619305cd..52f2760469 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -24,19 +24,19 @@ jobs: id: yarn-cache run: echo "::set-output name=dir::$(yarn cache dir)" - name: cache global yarn cache - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: ${{ steps.yarn-cache.outputs.dir }} key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | ${{ runner.os }}-yarn- - name: cache node_modules - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: node_modules key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - name: cache build cache - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: .backstage-build-cache key: build-cache-${{ github.sha }} diff --git a/.github/workflows/storybook-deploy.yml b/.github/workflows/storybook-deploy.yml index d6eef29744..33ffba5ccd 100644 --- a/.github/workflows/storybook-deploy.yml +++ b/.github/workflows/storybook-deploy.yml @@ -27,14 +27,14 @@ jobs: id: yarn-cache run: echo "::set-output name=dir::$(yarn cache dir)" - name: cache global yarn cache - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: ${{ steps.yarn-cache.outputs.dir }} key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | ${{ runner.os }}-yarn- - name: cache node_modules - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: node_modules key: ${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} diff --git a/plugins/scaffolder-backend/sample-templates/react-ssr-template/{{cookiecutter.componentId}}/.github/workflows/build.yml b/plugins/scaffolder-backend/sample-templates/react-ssr-template/{{cookiecutter.componentId}}/.github/workflows/build.yml index 9087876ce2..d1563ba3e6 100644 --- a/plugins/scaffolder-backend/sample-templates/react-ssr-template/{{cookiecutter.componentId}}/.github/workflows/build.yml +++ b/plugins/scaffolder-backend/sample-templates/react-ssr-template/{{cookiecutter.componentId}}/.github/workflows/build.yml @@ -19,7 +19,7 @@ jobs: - name: get yarn cache id: yarn-cache run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v1 + - uses: actions/cache@v2 with: path: ${{ steps.yarn-cache.outputs.dir }} key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} From 04566215693c6fa5d7ed16afc7503342df19083e Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Tue, 2 Jun 2020 14:20:40 +0200 Subject: [PATCH 034/192] Fix arguments order --- plugins/catalog-backend/src/service/router.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog-backend/src/service/router.ts b/plugins/catalog-backend/src/service/router.ts index 22d1f73730..a3da182416 100644 --- a/plugins/catalog-backend/src/service/router.ts +++ b/plugins/catalog-backend/src/service/router.ts @@ -69,8 +69,8 @@ export async function createRouter( const { kind, namespace, name } = req.params; const entity = await entitiesCatalog.entityByName( kind, - name, namespace, + name, ); if (!entity) { res From 947cb2984ee0bda2eb5060ffc6f4181abbec57c6 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Tue, 2 Jun 2020 14:33:42 +0200 Subject: [PATCH 035/192] Show error from the backend --- plugins/catalog/src/api/CatalogClient.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/plugins/catalog/src/api/CatalogClient.ts b/plugins/catalog/src/api/CatalogClient.ts index 6784c08494..2e019982dc 100644 --- a/plugins/catalog/src/api/CatalogClient.ts +++ b/plugins/catalog/src/api/CatalogClient.ts @@ -43,7 +43,6 @@ export class CatalogClient implements CatalogApi { throw new Error(`'Entity not found: ${name}`); } - // TODO: Types for the type param async addLocation(type: string, target: string) { const response = await fetch( `${this.apiOrigin}${this.basePath}/locations`, @@ -55,16 +54,19 @@ export class CatalogClient implements CatalogApi { body: JSON.stringify({ type, target }), }, ); + if (response.status !== 201) { - throw new Error(`Location wasn't added: ${target}`); + throw new Error(await response.text()); } + const { location, entities } = await response.json(); - if (location && entities.length > 0) - return { - location, - entities, - }; - throw new Error(`'Location wasn't added: ${target}`); + if (!location || entities.length === 0) + throw new Error(`'Location wasn't added: ${target}`); + + return { + location, + entities, + }; } } From dc81a30ff44cf096c11f413aba0cb0ccc6c39196 Mon Sep 17 00:00:00 2001 From: Sebastian Qvarfordt Date: Tue, 2 Jun 2020 14:56:22 +0200 Subject: [PATCH 036/192] Initial github link --- plugins/catalog/src/api/CatalogClient.ts | 20 +++++++ plugins/catalog/src/api/types.ts | 1 + .../components/CatalogPage/CatalogPage.tsx | 56 +++++++++++++++++-- .../components/CatalogTable/CatalogTable.tsx | 5 +- plugins/catalog/src/data/component.ts | 1 + plugins/catalog/src/data/utils.ts | 6 +- 6 files changed, 83 insertions(+), 6 deletions(-) diff --git a/plugins/catalog/src/api/CatalogClient.ts b/plugins/catalog/src/api/CatalogClient.ts index 42ef1c4da5..d6d717a085 100644 --- a/plugins/catalog/src/api/CatalogClient.ts +++ b/plugins/catalog/src/api/CatalogClient.ts @@ -16,6 +16,7 @@ import { CatalogApi } from './types'; import { DescriptorEnvelope } from '../types'; +import { Entity } from '@backstage/catalog-model'; export class CatalogClient implements CatalogApi { private apiOrigin: string; @@ -42,4 +43,23 @@ export class CatalogClient implements CatalogApi { if (entity) return entity; throw new Error(`'Entity not found: ${name}`); } + async getLocationByEntity(entity: Entity): Promise { + const findLocationIdInEntity = (e: Entity) => { + return e.metadata.annotations + ? e.metadata.annotations['backstage.io/managed-by-location'] + : null; + }; + + const locationId = findLocationIdInEntity(entity); + if (!locationId) return null; + + const response = await fetch( + `${this.apiOrigin}${this.basePath}/locations/${locationId}`, + ); + if (response.ok) { + const location = await response.json(); + if (location) return location; + } + throw new Error(`'Location not found: ${locationId}`); + } } diff --git a/plugins/catalog/src/api/types.ts b/plugins/catalog/src/api/types.ts index eb2cdca562..845dbe8e83 100644 --- a/plugins/catalog/src/api/types.ts +++ b/plugins/catalog/src/api/types.ts @@ -25,4 +25,5 @@ export const catalogApiRef = createApiRef({ export interface CatalogApi { getEntities(): Promise; getEntityByName(name: string): Promise; + getLocationByEntity(entity: Entity): Promise; } diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx index 8a2b448d97..4242f89fe1 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { FC } from 'react'; +import React, { FC, useCallback, useState, useEffect } from 'react'; import { Content, ContentHeader, @@ -34,6 +34,8 @@ import { } from '../CatalogFilter/CatalogFilter'; import { Button, makeStyles, Typography, Link } from '@material-ui/core'; import { filterGroups, defaultFilter } from '../../data/filters'; +import GitHub from '@material-ui/icons/GitHub'; +import { Entity } from '@backstage/catalog-model'; const useStyles = makeStyles(theme => ({ contentWrapper: { @@ -50,16 +52,52 @@ import { envelopeToComponent } from '../../data/utils'; const CatalogPage: FC<{}> = () => { const catalogApi = useApi(catalogApiRef); const { value, error, loading } = useAsync(() => catalogApi.getEntities()); - const [selectedFilter, setSelectedFilter] = React.useState( + const [locations, setLocations] = useState([]); + const [selectedFilter, setSelectedFilter] = useState( defaultFilter, ); - const onFilterSelected = React.useCallback( + const onFilterSelected = useCallback( selected => setSelectedFilter(selected), [], ); const styles = useStyles(); + useEffect(() => { + const getLocationDataForEntities = async (entities: Entity[]) => { + return Promise.all( + entities.map(entity => catalogApi.getLocationByEntity(entity)), + ); + }; + + if (value) { + getLocationDataForEntities(value) + .then(location => location.map(l => l.data)) + .then(setLocations); + } + }, [value, catalogApi]); + + const actions = [ + (rowData: any) => ({ + icon: GitHub, + tooltop: 'View on GitHub', + onClick: () => { + if (!rowData || !rowData.location) return; + window.open(rowData.location.target, '_blank'); + }, + isHidden: + rowData && rowData.location + ? rowData.location.type === 'github' + : false, + }), + ]; + + const findLocationForEntity = (entity: Entity, l: any) => { + const entityLocationId = + entity.metadata.annotations?.['backstage.io/managed-by-location']; + return l.find((location: any) => location.id === entityLocationId); + }; + return (
@@ -98,9 +136,19 @@ const CatalogPage: FC<{}> = () => { + envelopeToComponent( + val, + findLocationForEntity(val, locations), + ), + )) || + [] + } loading={loading} error={error} + actions={actions} /> diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx index f5fa45dc7e..59359fab16 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx @@ -42,12 +42,14 @@ type CatalogTableProps = { titlePreamble: string; loading: boolean; error?: any; + actions: any; }; const CatalogTable: FC = ({ components, loading, error, titlePreamble, + actions, }) => { if (loading) { return ; @@ -64,9 +66,10 @@ const CatalogTable: FC = ({ return ( ); }; diff --git a/plugins/catalog/src/data/component.ts b/plugins/catalog/src/data/component.ts index 57cba03a9a..5da962911e 100644 --- a/plugins/catalog/src/data/component.ts +++ b/plugins/catalog/src/data/component.ts @@ -17,4 +17,5 @@ export type Component = { name: string; kind: string; description: string; + location: any; }; diff --git a/plugins/catalog/src/data/utils.ts b/plugins/catalog/src/data/utils.ts index 05fb2fee46..e54b39c7c0 100644 --- a/plugins/catalog/src/data/utils.ts +++ b/plugins/catalog/src/data/utils.ts @@ -16,10 +16,14 @@ import { Component } from './component'; import { Entity } from '@backstage/catalog-model'; -export function envelopeToComponent(envelope: Entity): Component { +export function envelopeToComponent( + envelope: Entity, + location: any, +): Component { return { name: envelope.metadata?.name ?? '', kind: envelope.kind ?? 'unknown', description: envelope.metadata?.annotations?.description ?? 'placeholder', + location, }; } From 8e6df5f575d0399fe934d4c8445224267544db5a Mon Sep 17 00:00:00 2001 From: Sebastian Qvarfordt Date: Tue, 2 Jun 2020 15:03:11 +0200 Subject: [PATCH 037/192] quickfix failing tests --- .../catalog/src/components/CatalogPage/CatalogPage.test.tsx | 5 ++++- plugins/catalog/src/components/CatalogTable/CatalogTable.tsx | 2 +- plugins/catalog/src/data/component.ts | 2 +- plugins/catalog/src/data/utils.ts | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.test.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.test.tsx index ec26ce5b28..9ebeb7f546 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.test.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.test.tsx @@ -22,7 +22,10 @@ import { wrapInTestApp } from '@backstage/test-utils'; import { catalogApiRef } from '../..'; const errorApi = { post: () => {} }; -const catalogApi = { getEntities: () => Promise.resolve([{ kind: '' }]) }; +const catalogApi = { + getEntities: () => Promise.resolve([{ kind: '', metadata: {} }]), + getLocationByEntity: () => Promise.resolve({ data: {} }), +}; describe('CatalogPage', () => { // this test right now causes some red lines in the log output when running tests diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx index 59359fab16..015916c3f4 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx @@ -42,7 +42,7 @@ type CatalogTableProps = { titlePreamble: string; loading: boolean; error?: any; - actions: any; + actions?: any; }; const CatalogTable: FC = ({ components, diff --git a/plugins/catalog/src/data/component.ts b/plugins/catalog/src/data/component.ts index 5da962911e..d53a6387fc 100644 --- a/plugins/catalog/src/data/component.ts +++ b/plugins/catalog/src/data/component.ts @@ -17,5 +17,5 @@ export type Component = { name: string; kind: string; description: string; - location: any; + location?: any; }; diff --git a/plugins/catalog/src/data/utils.ts b/plugins/catalog/src/data/utils.ts index e54b39c7c0..645d6b845d 100644 --- a/plugins/catalog/src/data/utils.ts +++ b/plugins/catalog/src/data/utils.ts @@ -18,7 +18,7 @@ import { Entity } from '@backstage/catalog-model'; export function envelopeToComponent( envelope: Entity, - location: any, + location?: any, ): Component { return { name: envelope.metadata?.name ?? '', From 254d9089be2cb49ad3d202da4835eca6c3a6791b Mon Sep 17 00:00:00 2001 From: Sebastian Qvarfordt Date: Tue, 2 Jun 2020 15:36:31 +0200 Subject: [PATCH 038/192] Improved types slightly --- plugins/catalog/src/api/CatalogClient.ts | 15 ++++++--------- plugins/catalog/src/api/types.ts | 4 ++-- .../src/components/CatalogPage/CatalogPage.tsx | 14 ++++++++------ 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/plugins/catalog/src/api/CatalogClient.ts b/plugins/catalog/src/api/CatalogClient.ts index d6d717a085..20720d34bd 100644 --- a/plugins/catalog/src/api/CatalogClient.ts +++ b/plugins/catalog/src/api/CatalogClient.ts @@ -16,7 +16,7 @@ import { CatalogApi } from './types'; import { DescriptorEnvelope } from '../types'; -import { Entity } from '@backstage/catalog-model'; +import { Entity, Location } from '@backstage/catalog-model'; export class CatalogClient implements CatalogApi { private apiOrigin: string; @@ -43,22 +43,19 @@ export class CatalogClient implements CatalogApi { if (entity) return entity; throw new Error(`'Entity not found: ${name}`); } - async getLocationByEntity(entity: Entity): Promise { - const findLocationIdInEntity = (e: Entity) => { - return e.metadata.annotations - ? e.metadata.annotations['backstage.io/managed-by-location'] - : null; - }; + async getLocationByEntity(entity: Entity): Promise { + const findLocationIdInEntity = (e: Entity) => + e.metadata.annotations?.['backstage.io/managed-by-location']; const locationId = findLocationIdInEntity(entity); - if (!locationId) return null; + if (!locationId) return undefined; const response = await fetch( `${this.apiOrigin}${this.basePath}/locations/${locationId}`, ); if (response.ok) { const location = await response.json(); - if (location) return location; + if (location) return location.data; } throw new Error(`'Location not found: ${locationId}`); } diff --git a/plugins/catalog/src/api/types.ts b/plugins/catalog/src/api/types.ts index 845dbe8e83..9e8dc5fbac 100644 --- a/plugins/catalog/src/api/types.ts +++ b/plugins/catalog/src/api/types.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { createApiRef } from '@backstage/core'; -import { Entity } from '@backstage/catalog-model'; +import { Entity, Location } from '@backstage/catalog-model'; export const catalogApiRef = createApiRef({ id: 'plugin.catalog.service', @@ -25,5 +25,5 @@ export const catalogApiRef = createApiRef({ export interface CatalogApi { getEntities(): Promise; getEntityByName(name: string): Promise; - getLocationByEntity(entity: Entity): Promise; + getLocationByEntity(entity: Entity): Promise; } diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx index 4242f89fe1..479b5fee42 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx @@ -35,7 +35,7 @@ import { import { Button, makeStyles, Typography, Link } from '@material-ui/core'; import { filterGroups, defaultFilter } from '../../data/filters'; import GitHub from '@material-ui/icons/GitHub'; -import { Entity } from '@backstage/catalog-model'; +import { Entity, Location } from '@backstage/catalog-model'; const useStyles = makeStyles(theme => ({ contentWrapper: { @@ -48,6 +48,7 @@ const useStyles = makeStyles(theme => ({ import { catalogApiRef } from '../..'; import { envelopeToComponent } from '../../data/utils'; +import { Component } from '../../data/component'; const CatalogPage: FC<{}> = () => { const catalogApi = useApi(catalogApiRef); @@ -71,14 +72,12 @@ const CatalogPage: FC<{}> = () => { }; if (value) { - getLocationDataForEntities(value) - .then(location => location.map(l => l.data)) - .then(setLocations); + getLocationDataForEntities(value).then(setLocations); } }, [value, catalogApi]); const actions = [ - (rowData: any) => ({ + (rowData: Component) => ({ icon: GitHub, tooltop: 'View on GitHub', onClick: () => { @@ -92,7 +91,10 @@ const CatalogPage: FC<{}> = () => { }), ]; - const findLocationForEntity = (entity: Entity, l: any) => { + const findLocationForEntity = ( + entity: Entity, + l: Location[], + ): Location | undefined => { const entityLocationId = entity.metadata.annotations?.['backstage.io/managed-by-location']; return l.find((location: any) => location.id === entityLocationId); From d620646890a293509b1cd2cbd44bf6a5596887c5 Mon Sep 17 00:00:00 2001 From: Sebastian Qvarfordt Date: Tue, 2 Jun 2020 15:45:38 +0200 Subject: [PATCH 039/192] Updated types --- plugins/catalog/src/api/CatalogClient.ts | 3 ++- plugins/catalog/src/components/CatalogPage/CatalogPage.tsx | 4 +++- plugins/catalog/src/data/component.ts | 4 +++- plugins/catalog/src/data/utils.ts | 4 ++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/plugins/catalog/src/api/CatalogClient.ts b/plugins/catalog/src/api/CatalogClient.ts index 20720d34bd..bf308cb012 100644 --- a/plugins/catalog/src/api/CatalogClient.ts +++ b/plugins/catalog/src/api/CatalogClient.ts @@ -57,6 +57,7 @@ export class CatalogClient implements CatalogApi { const location = await response.json(); if (location) return location.data; } - throw new Error(`'Location not found: ${locationId}`); + + return undefined; } } diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx index 479b5fee42..fe21c7de31 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx @@ -72,7 +72,9 @@ const CatalogPage: FC<{}> = () => { }; if (value) { - getLocationDataForEntities(value).then(setLocations); + getLocationDataForEntities(value) + .then(location => location.filter(l => !!l)) + .then(setLocations); } }, [value, catalogApi]); diff --git a/plugins/catalog/src/data/component.ts b/plugins/catalog/src/data/component.ts index d53a6387fc..1a7935a196 100644 --- a/plugins/catalog/src/data/component.ts +++ b/plugins/catalog/src/data/component.ts @@ -13,9 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { Location } from '@backstage/catalog-model'; + export type Component = { name: string; kind: string; description: string; - location?: any; + location?: Location; }; diff --git a/plugins/catalog/src/data/utils.ts b/plugins/catalog/src/data/utils.ts index 645d6b845d..fe2ec62493 100644 --- a/plugins/catalog/src/data/utils.ts +++ b/plugins/catalog/src/data/utils.ts @@ -14,11 +14,11 @@ * limitations under the License. */ import { Component } from './component'; -import { Entity } from '@backstage/catalog-model'; +import { Entity, Location } from '@backstage/catalog-model'; export function envelopeToComponent( envelope: Entity, - location?: any, + location?: Location, ): Component { return { name: envelope.metadata?.name ?? '', From 4fd99fec251c86bd826744fc39bb7d1bc2583072 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 2 Jun 2020 17:05:49 +0200 Subject: [PATCH 040/192] feat(core-api/Storage): reworking the api for storage. get's should be sync --- .../src/apis/definitions/StorageApi.ts | 61 ++++--------------- 1 file changed, 12 insertions(+), 49 deletions(-) diff --git a/packages/core-api/src/apis/definitions/StorageApi.ts b/packages/core-api/src/apis/definitions/StorageApi.ts index 0cb5ccc14d..62a8fd6895 100644 --- a/packages/core-api/src/apis/definitions/StorageApi.ts +++ b/packages/core-api/src/apis/definitions/StorageApi.ts @@ -15,77 +15,40 @@ */ import { createApiRef } from '../ApiRef'; - -type UnsubscribeFromStore = () => void; -type SubscribeToStoreHandler = ({ - storeName, - key, - oldValue, - newValue, -}: { - storeName: string; - key: string; - oldValue?: T; - newValue?: T; -}) => void; +import { Observable } from '@backstage/core-api'; export type StorageApi = { /** * Get persistent data. - * @param {String} storeName Name of the store. - * @param {String?} key (Optional) Unique key associated with the data. - * If not key is specified,the whole store is returned. - * @param {String} key (Optional) Empty value to return if there is not data. + * + * @param {String} key Unique key associated with the data. * @return {Object} data The data that should is stored. */ - getFromStore( - storeName: string, - key: string, - defaultValue?: T, - ): Promise; + get(key: string): T | undefined; /** * Remove persistent data. * - * @param {String} storeName Name of the store. * @param {String} key Unique key associated with the data. */ - removeFromStore(storeName: string, key: string): Promise; + remove(key: string): Promise; /** - * Save persiswtent data. + * Save persistant data. * - * @param {String} storeName Name of the store. * @param {String} key Unique key associated with the data. - * @param {Object} data The data that should be stored. + * @return */ - saveToStore(storeName: string, key: string, data: any): Promise; + save(key: string, data: any): Promise; /** - * Callback for Changes in the store - * @callback subscribeHandler - * @param {String} storeName Name of the store. - * @param {String} key Unique key associated with the data. - * @param {Object} oldValue The old value that was in the store. - * @param {Object} newValue The new value that has been set in the store. - */ - /** - * Subscribe to Key changes in a store and get the new and old value * - * @param {String} storeName Name of the store. - * @param {String} key Unique key associated with the data. - * @param {subscribeHandler} handler Handler which is called with the old value and new value in the store. - * @returns {Function} Unsubscribe to changes in the store. + * @param {String} key Unique key associated with the data */ - subscribeToChange( - storeName: string, - key: string, - handler: SubscribeToStoreHandler, - ): UnsubscribeFromStore; + observe$(key: string): Observable; }; export const storageApiRef = createApiRef({ - id: 'core.user.settings', - description: - 'Provides the ability to modify settings that are personalised to the user', + id: 'core.storage', + description: 'Provides the ability to store data which is unique to the user', }); From 483fa94d0eee0f240bf706ff5d84b43793ab47e7 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Jun 2020 17:00:01 +0200 Subject: [PATCH 041/192] packages/core: make AppConfigLoader return an array, and added defaultConfigLoader + tests --- packages/app/src/App.tsx | 24 +++--- packages/cli/src/lib/bundler/config.ts | 6 ++ .../implementations/ConfigApi/ConfigReader.ts | 13 ++++ packages/core-api/src/app/App.tsx | 4 +- packages/core-api/src/app/types.ts | 5 +- .../core/src/api-wrappers/createApp.test.tsx | 74 +++++++++++++++++++ packages/core/src/api-wrappers/createApp.tsx | 41 +++++++++- 7 files changed, 152 insertions(+), 15 deletions(-) create mode 100644 packages/core/src/api-wrappers/createApp.test.tsx diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index c18169ae03..58876a6bb2 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -24,18 +24,20 @@ import apis from './apis'; const app = createApp({ apis, plugins: Object.values(plugins), - configLoader: async () => ({ - app: { - title: 'Backstage Example App', - baseUrl: 'http://localhost:3000', + configLoader: async () => [ + { + app: { + title: 'Backstage Example App', + baseUrl: 'http://localhost:3000', + }, + backend: { + baseUrl: 'http://localhost:7000', + }, + organization: { + name: 'Spotify', + }, }, - backend: { - baseUrl: 'http://localhost:7000', - }, - organization: { - name: 'Spotify', - }, - }), + ], }); const AppProvider = app.getProvider(); diff --git a/packages/cli/src/lib/bundler/config.ts b/packages/cli/src/lib/bundler/config.ts index a35c22e3bd..6a48b5bd21 100644 --- a/packages/cli/src/lib/bundler/config.ts +++ b/packages/cli/src/lib/bundler/config.ts @@ -51,6 +51,12 @@ export function createConfig( ); } + plugins.push( + new webpack.EnvironmentPlugin({ + APP_CONFIG: [], + }), + ); + return { mode: isDev ? 'development' : 'production', profile: false, diff --git a/packages/core-api/src/apis/implementations/ConfigApi/ConfigReader.ts b/packages/core-api/src/apis/implementations/ConfigApi/ConfigReader.ts index 7a5cf3b185..f6a8bce17b 100644 --- a/packages/core-api/src/apis/implementations/ConfigApi/ConfigReader.ts +++ b/packages/core-api/src/apis/implementations/ConfigApi/ConfigReader.ts @@ -15,6 +15,7 @@ */ import { ConfigApi, Config } from '../../definitions/ConfigApi'; +import { AppConfig } from '../../../app'; const CONFIG_KEY_PART_PATTERN = /^[a-z][a-z0-9]*(?:[-_][a-z][a-z0-9]*)*$/i; @@ -62,6 +63,18 @@ function validateString( export class ConfigReader implements ConfigApi { static nullReader = new ConfigReader({}); + static fromConfigs(configs: AppConfig[]): ConfigReader { + if (configs.length === 0) { + return new ConfigReader({}); + } + + // Merge together all configs info a single config with recursive fallback + // readers, giving the first config object in the array the highest priority. + return configs.reduceRight((previousReader, nextConfig) => { + return new ConfigReader(nextConfig, previousReader); + }, undefined); + } + constructor( private readonly data: JsonObject, private readonly fallback?: ConfigApi, diff --git a/packages/core-api/src/app/App.tsx b/packages/core-api/src/app/App.tsx index 4207a267af..282e0aa474 100644 --- a/packages/core-api/src/app/App.tsx +++ b/packages/core-api/src/app/App.tsx @@ -150,7 +150,7 @@ export class PrivateAppImpl implements BackstageApp { const Provider: FC<{}> = ({ children }) => { // Keeping this synchronous when a config loader isn't set simplifies tests a lot const hasConfig = Boolean(this.configLoader); - const config = useAsync(this.configLoader || (() => Promise.resolve({}))); + const config = useAsync(this.configLoader || (() => Promise.resolve([]))); let childNode = children; @@ -164,7 +164,7 @@ export class PrivateAppImpl implements BackstageApp { const appApis = ApiRegistry.from([ [appThemeApiRef, AppThemeSelector.createWithStorage(this.themes)], - [configApiRef, new ConfigReader(config.value ?? {})], + [configApiRef, ConfigReader.fromConfigs(config.value ?? [])], ]); const apis = new ApiAggregator(this.apis, appApis); diff --git a/packages/core-api/src/app/types.ts b/packages/core-api/src/app/types.ts index defc155a82..953a10cbb2 100644 --- a/packages/core-api/src/app/types.ts +++ b/packages/core-api/src/app/types.ts @@ -38,8 +38,11 @@ export type AppConfig = any; /** * A function that loads in the App config that will be accessible via the ConfigApi. + * + * If multiple config objects are returned in the array, values in the earlier configs + * will override later ones. */ -export type AppConfigLoader = () => Promise; +export type AppConfigLoader = () => Promise; export type AppOptions = { /** diff --git a/packages/core/src/api-wrappers/createApp.test.tsx b/packages/core/src/api-wrappers/createApp.test.tsx new file mode 100644 index 0000000000..30553d84a7 --- /dev/null +++ b/packages/core/src/api-wrappers/createApp.test.tsx @@ -0,0 +1,74 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { defaultConfigLoader } from './createApp'; + +describe('defaultConfigLoader', () => { + afterEach(() => { + delete process.env.APP_CONFIG; + }); + + it('loads static config', async () => { + Object.defineProperty(process.env, 'APP_CONFIG', { + configurable: true, + value: [{ my: 'config' }, { my: 'override-config' }] as any, + }); + const configs = await defaultConfigLoader(); + expect(configs).toEqual([{ my: 'config' }, { my: 'override-config' }]); + }); + + it('loads runtime config', async () => { + Object.defineProperty(process.env, 'APP_CONFIG', { + configurable: true, + value: [{ my: 'override-config' }, { my: 'config' }] as any, + }); + const configs = await (defaultConfigLoader as any)( + '{"my":"runtime-config"}', + ); + expect(configs).toEqual([ + { my: 'runtime-config' }, + { my: 'override-config' }, + { my: 'config' }, + ]); + }); + + it('fails to load invalid missing config', async () => { + await expect(defaultConfigLoader()).rejects.toThrow( + 'No static configuration provided', + ); + }); + + it('fails to load invalid static config', async () => { + Object.defineProperty(process.env, 'APP_CONFIG', { + configurable: true, + value: { my: 'invalid-config' } as any, + }); + await expect(defaultConfigLoader()).rejects.toThrow( + 'Static configuration has invalid format', + ); + }); + + it('fails to load bad runtime config', async () => { + Object.defineProperty(process.env, 'APP_CONFIG', { + configurable: true, + value: [{ my: 'config' }] as any, + }); + + await expect((defaultConfigLoader as any)('}')).rejects.toThrow( + 'Failed to load runtime configuration, SyntaxError: Unexpected token } in JSON at position 0', + ); + }); +}); diff --git a/packages/core/src/api-wrappers/createApp.tsx b/packages/core/src/api-wrappers/createApp.tsx index 7c605c4e18..c53a4765b7 100644 --- a/packages/core/src/api-wrappers/createApp.tsx +++ b/packages/core/src/api-wrappers/createApp.tsx @@ -20,6 +20,8 @@ import privateExports, { ApiRegistry, defaultSystemIcons, BootErrorPageProps, + AppConfigLoader, + AppConfig, } from '@backstage/core-api'; import { BrowserRouter as Router } from 'react-router-dom'; @@ -29,6 +31,43 @@ import { lightTheme, darkTheme } from '@backstage/theme'; const { PrivateAppImpl } = privateExports; +/** + * The default config loader, which expects that config is available at compile-time + * in `process.env.APP_CONFIG`. APP_CONFIG should be an array of config objects as + * returned by the config loader. + * + * It will also load runtime config from the __APP_INJECTED_RUNTIME_CONFIG__ string, + * which can be rewritten at runtime to contain an additional JSON config object. + * If runtime config is present, it will be placed first in the config array, overriding + * other config values. + */ +export const defaultConfigLoader: AppConfigLoader = async ( + // This string may be replaced at runtime to provide additional config. + // It should be replaced by a JSON-serialized config object. + // It's a param so we can test it, but at runtime this will always fall back to default. + runtimeConfigJson: string = '__APP_INJECTED_RUNTIME_CONFIG__', +) => { + const appConfig = process.env.APP_CONFIG; + if (!appConfig) { + throw new Error('No static configuration provided'); + } + if (!Array.isArray(appConfig)) { + throw new Error('Static configuration has invalid format'); + } + const configs = (appConfig.slice() as unknown) as AppConfig[]; + + // Avoiding this string also being replaced at runtime + if (runtimeConfigJson !== '__app_injected_runtime_config__'.toUpperCase()) { + try { + configs.unshift(JSON.parse(runtimeConfigJson)); + } catch (error) { + throw new Error(`Failed to load runtime configuration, ${error}`); + } + } + + return configs; +}; + // createApp is defined in core, and not core-api, since we need access // to the components inside core to provide defaults. // The actual implementation of the app class still lives in core-api, @@ -77,7 +116,7 @@ export function createApp(options?: AppOptions) { theme: darkTheme, }, ]; - const configLoader = options?.configLoader ?? (async () => ({})); + const configLoader = options?.configLoader ?? defaultConfigLoader; const app = new PrivateAppImpl({ apis, From 41dd61984c55a962dd2325d2a8384c389453fe32 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Jun 2020 17:29:31 +0200 Subject: [PATCH 042/192] packages/cli: make cli read app config and inject into APP_CONFIG at compile-time --- packages/cli/package.json | 1 + packages/cli/src/commands/app/build.ts | 2 ++ packages/cli/src/commands/app/serve.ts | 2 ++ packages/cli/src/commands/plugin/serve.ts | 2 ++ packages/cli/src/lib/app-config/index.ts | 18 ++++++++++ packages/cli/src/lib/app-config/loaders.ts | 41 ++++++++++++++++++++++ packages/cli/src/lib/app-config/types.ts | 17 +++++++++ packages/cli/src/lib/bundler/config.ts | 2 +- packages/cli/src/lib/bundler/types.ts | 4 +++ yarn.lock | 5 +++ 10 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 packages/cli/src/lib/app-config/index.ts create mode 100644 packages/cli/src/lib/app-config/loaders.ts create mode 100644 packages/cli/src/lib/app-config/types.ts diff --git a/packages/cli/package.json b/packages/cli/package.json index 20d9893a37..784df5de6b 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -79,6 +79,7 @@ "url-loader": "^4.1.0", "webpack": "^4.41.6", "webpack-dev-server": "^3.10.3", + "yaml": "^1.10.0", "yml-loader": "^2.1.0", "yn": "^4.0.0" }, diff --git a/packages/cli/src/commands/app/build.ts b/packages/cli/src/commands/app/build.ts index c654baa439..fad3e6db13 100644 --- a/packages/cli/src/commands/app/build.ts +++ b/packages/cli/src/commands/app/build.ts @@ -16,10 +16,12 @@ import { buildBundle } from '../../lib/bundler'; import { Command } from 'commander'; +import { loadConfig } from '../../lib/app-config'; export default async (cmd: Command) => { await buildBundle({ entry: 'src/index', statsJsonEnabled: cmd.stats, + appConfig: await loadConfig(), }); }; diff --git a/packages/cli/src/commands/app/serve.ts b/packages/cli/src/commands/app/serve.ts index 416f8f0151..19dfd9a7be 100644 --- a/packages/cli/src/commands/app/serve.ts +++ b/packages/cli/src/commands/app/serve.ts @@ -16,11 +16,13 @@ import { Command } from 'commander'; import { serveBundle } from '../../lib/bundler'; +import { loadConfig } from '../../lib/app-config'; export default async (cmd: Command) => { const waitForExit = await serveBundle({ entry: 'src/index', checksEnabled: cmd.check, + appConfig: await loadConfig(), }); await waitForExit(); diff --git a/packages/cli/src/commands/plugin/serve.ts b/packages/cli/src/commands/plugin/serve.ts index 8abbd92440..174d1fe4af 100644 --- a/packages/cli/src/commands/plugin/serve.ts +++ b/packages/cli/src/commands/plugin/serve.ts @@ -16,11 +16,13 @@ import { Command } from 'commander'; import { serveBundle } from '../../lib/bundler'; +import { loadConfig } from '../../lib/app-config'; export default async (cmd: Command) => { const waitForExit = await serveBundle({ entry: 'dev/index', checksEnabled: cmd.check, + appConfig: await loadConfig(), }); await waitForExit(); diff --git a/packages/cli/src/lib/app-config/index.ts b/packages/cli/src/lib/app-config/index.ts new file mode 100644 index 0000000000..e2c80f89e1 --- /dev/null +++ b/packages/cli/src/lib/app-config/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type { AppConfig } from './types'; +export { loadConfig } from './loaders'; diff --git a/packages/cli/src/lib/app-config/loaders.ts b/packages/cli/src/lib/app-config/loaders.ts new file mode 100644 index 0000000000..6e6a56e6c5 --- /dev/null +++ b/packages/cli/src/lib/app-config/loaders.ts @@ -0,0 +1,41 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AppConfig } from './types'; +import fs from 'fs-extra'; +import yaml from 'yaml'; +import { paths } from '../paths'; + +type LoadConfigOptions = { + // Config path, defaults to app-config.yaml in project root + configPath?: string; +}; + +export async function loadConfig( + options: LoadConfigOptions = {}, +): Promise { + // TODO: We'll want this to be a bit more elaborate, probably adding configs for + // specific env, and maybe local config for plugins. + const { configPath = paths.resolveTargetRoot('app-config.yaml') } = options; + + try { + const configYaml = await fs.readFile(configPath, 'utf8'); + const config = yaml.parse(configYaml); + return [config]; + } catch (error) { + throw new Error(`Failed to read static configuration file, ${error}`); + } +} diff --git a/packages/cli/src/lib/app-config/types.ts b/packages/cli/src/lib/app-config/types.ts new file mode 100644 index 0000000000..d15cbe3787 --- /dev/null +++ b/packages/cli/src/lib/app-config/types.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type AppConfig = any; diff --git a/packages/cli/src/lib/bundler/config.ts b/packages/cli/src/lib/bundler/config.ts index 6a48b5bd21..deb02a38c6 100644 --- a/packages/cli/src/lib/bundler/config.ts +++ b/packages/cli/src/lib/bundler/config.ts @@ -53,7 +53,7 @@ export function createConfig( plugins.push( new webpack.EnvironmentPlugin({ - APP_CONFIG: [], + APP_CONFIG: options.appConfig, }), ); diff --git a/packages/cli/src/lib/bundler/types.ts b/packages/cli/src/lib/bundler/types.ts index 4182226d69..1a9f49701c 100644 --- a/packages/cli/src/lib/bundler/types.ts +++ b/packages/cli/src/lib/bundler/types.ts @@ -15,16 +15,20 @@ */ import { BundlingPathsOptions } from './paths'; +import { AppConfig } from '../app-config'; export type BundlingOptions = { checksEnabled: boolean; isDev: boolean; + appConfig: AppConfig[]; }; export type ServeOptions = BundlingPathsOptions & { checksEnabled: boolean; + appConfig: AppConfig[]; }; export type BuildOptions = BundlingPathsOptions & { statsJsonEnabled: boolean; + appConfig: AppConfig[]; }; diff --git a/yarn.lock b/yarn.lock index a118f0cea2..019870cfc3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19293,6 +19293,11 @@ yaml@*, yaml@^1.9.2: dependencies: "@babel/runtime" "^7.9.2" +yaml@^1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + yaml@^1.7.2: version "1.8.3" resolved "https://registry.npmjs.org/yaml/-/yaml-1.8.3.tgz#2f420fca58b68ce3a332d0ca64be1d191dd3f87a" From d0fb818c4d2a4f286000dffe4bcd5dfa248d4a9a Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 2 Jun 2020 17:30:32 +0200 Subject: [PATCH 043/192] package/app: move app config to yaml --- app-config.yaml | 9 +++++++++ packages/app/src/App.tsx | 14 -------------- packages/cli/templates/default-app/app-config.yaml | 5 +++++ 3 files changed, 14 insertions(+), 14 deletions(-) create mode 100644 app-config.yaml create mode 100644 packages/cli/templates/default-app/app-config.yaml diff --git a/app-config.yaml b/app-config.yaml new file mode 100644 index 0000000000..6ff336c727 --- /dev/null +++ b/app-config.yaml @@ -0,0 +1,9 @@ +app: + title: Backstage Example App + baseUrl: http://localhost:3000 + +backend: + baseUrl: http://localhost:7000 + +organization: + name: Spotify diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 58876a6bb2..b4d01e067b 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -24,20 +24,6 @@ import apis from './apis'; const app = createApp({ apis, plugins: Object.values(plugins), - configLoader: async () => [ - { - app: { - title: 'Backstage Example App', - baseUrl: 'http://localhost:3000', - }, - backend: { - baseUrl: 'http://localhost:7000', - }, - organization: { - name: 'Spotify', - }, - }, - ], }); const AppProvider = app.getProvider(); diff --git a/packages/cli/templates/default-app/app-config.yaml b/packages/cli/templates/default-app/app-config.yaml new file mode 100644 index 0000000000..b4c53905de --- /dev/null +++ b/packages/cli/templates/default-app/app-config.yaml @@ -0,0 +1,5 @@ +app: + title: Scaffolded Backstage App + +organization: + name: Acme Corporation From 99a2387076fa845afd5a1201c78e0abe6d610d9f Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 2 Jun 2020 23:12:32 +0200 Subject: [PATCH 044/192] feat(core-api/Storage): Add the simple storage API for now with some simpler tests --- .../src/apis/definitions/StorageApi.ts | 8 +++- .../StorageApi/WebStorage.test.ts | 48 +++++++++++++++++++ .../implementations/StorageApi/WebStorage.ts | 42 ++++++++-------- 3 files changed, 74 insertions(+), 24 deletions(-) create mode 100644 packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts diff --git a/packages/core-api/src/apis/definitions/StorageApi.ts b/packages/core-api/src/apis/definitions/StorageApi.ts index 62a8fd6895..c8e72a518f 100644 --- a/packages/core-api/src/apis/definitions/StorageApi.ts +++ b/packages/core-api/src/apis/definitions/StorageApi.ts @@ -17,6 +17,11 @@ import { createApiRef } from '../ApiRef'; import { Observable } from '@backstage/core-api'; +export type ObservableMessage = { + key: string; + newValue?: T; +}; + export type StorageApi = { /** * Get persistent data. @@ -37,9 +42,8 @@ export type StorageApi = { * Save persistant data. * * @param {String} key Unique key associated with the data. - * @return */ - save(key: string, data: any): Promise; + set(key: string, data: any): Promise; /** * diff --git a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts new file mode 100644 index 0000000000..6509ba6edb --- /dev/null +++ b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { WebStorage } from './WebStorage'; +describe('WebStorage Storage API', () => { + it('should return undefined for values which are unset', async () => { + const storage = new WebStorage(); + + expect(storage.get('myfakekey')).toBeUndefined(); + }); + + it('should allow the setting and getting of the simple data structures', async () => { + const storage = new WebStorage(); + + await storage.set('myfakekey', 'helloimastring'); + await storage.set('mysecondfakekey', 1234); + await storage.set('mythirdfakekey', true); + + expect(storage.get('myfakekey')).toBe('helloimastring'); + expect(storage.get('mysecondfakekey')).toBe(1234); + expect(storage.get('mythirdfakekey')).toBe(true); + }); + + it('should allow setting of complex datastructures', async () => { + const storage = new WebStorage(); + + const mockData = { + something: 'here', + is: [{ super: { complex: [{ but: 'something', why: true }] } }], + }; + + await storage.set('myfakekey', mockData); + + expect(storage.get('myfakekey')).toEqual(mockData); + }); +}); diff --git a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts index c48a1ee931..cbcab6349e 100644 --- a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts +++ b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts @@ -13,39 +13,37 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { StorageApi } from '../../definitions'; +import { StorageApi, ObservableMessage } from '../../definitions'; +import { Observable } from '../../../types'; +import ObservableImpl from 'zen-observable'; export class WebStorage implements StorageApi { - async getFromStore( - storeName: string, - key: string = '', - defaultValue?: T, - ): Promise { - let store; + private readonly observable = new ObservableImpl(() => {}); + get(key: string): T | undefined { try { - store = JSON.parse(localStorage.getItem(storeName)!) || {}; + const storage = JSON.parse(localStorage.getItem(key)!); + return storage ?? undefined; } catch (e) { window.console.error( - `Error when parsing JSON config from storage for: ${storeName}`, + `Error when parsing JSON config from storage for: ${key}`, + e, ); - return defaultValue; } - if (key) { - return store[key] ?? defaultValue; - } - return store; + return undefined; } - async saveToStore(storeName: string, key: string, data: any): Promise { - const store = JSON.parse(localStorage.getItem(storeName)!) || {}; - store[key] = data; - localStorage.setItem(storeName, JSON.stringify(store)); + async set(key: string, data: T): Promise { + localStorage.setItem(key, JSON.stringify(data, null, 2)); } - async removeFromStore(storeName: string, key: string): Promise { - const store = JSON.parse(localStorage.getItem(storeName)!) || {}; - delete store[key]; - localStorage.setItem(storeName, JSON.stringify(store)); + async remove(key: string): Promise { + localStorage.removeItem(key); + } + + observe$(key: string): Observable { + return this.observable.filter( + ({ key: messageKey }) => messageKey === key, + ) as Observable; } } From 62b1799f516c82724bbddc9e6fadd0690f6f572c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 3 Jun 2020 09:21:35 +0200 Subject: [PATCH 045/192] Forgot one member of the higher order type --- plugins/catalog-backend/src/ingestion/types.ts | 1 + plugins/catalog-backend/src/service/router.test.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/catalog-backend/src/ingestion/types.ts b/plugins/catalog-backend/src/ingestion/types.ts index 018784bd0f..8fb56367a6 100644 --- a/plugins/catalog-backend/src/ingestion/types.ts +++ b/plugins/catalog-backend/src/ingestion/types.ts @@ -28,4 +28,5 @@ export type IngestionModel = { export type HigherOrderOperation = { addLocation(spec: LocationSpec): Promise; + refreshAllLocations(): Promise; }; diff --git a/plugins/catalog-backend/src/service/router.test.ts b/plugins/catalog-backend/src/service/router.test.ts index 0efc0a3be4..efddc7ed3d 100644 --- a/plugins/catalog-backend/src/service/router.test.ts +++ b/plugins/catalog-backend/src/service/router.test.ts @@ -48,6 +48,7 @@ describe('createRouter', () => { }; higherOrderOperation = { addLocation: jest.fn(), + refreshAllLocations: jest.fn(), }; const router = await createRouter({ entitiesCatalog, From 8a840b8426121fb82d9d5f5f58d098b2b66c93d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 3 Jun 2020 09:36:12 +0200 Subject: [PATCH 046/192] Tweak the router tests, and fix one error --- .../src/service/router.test.ts | 41 +++++++++++++------ plugins/catalog-backend/src/service/router.ts | 2 +- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/plugins/catalog-backend/src/service/router.test.ts b/plugins/catalog-backend/src/service/router.test.ts index efddc7ed3d..29b3f7ce04 100644 --- a/plugins/catalog-backend/src/service/router.test.ts +++ b/plugins/catalog-backend/src/service/router.test.ts @@ -81,6 +81,7 @@ describe('createRouter', () => { const response = await request(app).get('/entities?a=1&a=&a=3&b=4&c='); expect(response.status).toEqual(200); + expect(entitiesCatalog.entities).toHaveBeenCalledTimes(1); expect(entitiesCatalog.entities).toHaveBeenCalledWith([ { key: 'a', values: ['1', null, '3'] }, { key: 'b', values: ['4'] }, @@ -102,14 +103,19 @@ describe('createRouter', () => { const response = await request(app).get('/entities/by-uid/zzz'); + expect(entitiesCatalog.entityByUid).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entityByUid).toHaveBeenCalledWith('zzz'); expect(response.status).toEqual(200); expect(response.body).toEqual(expect.objectContaining(entity)); }); it('responds with a 404 for missing entities', async () => { entitiesCatalog.entityByUid.mockResolvedValue(undefined); + const response = await request(app).get('/entities/by-uid/zzz'); + expect(entitiesCatalog.entityByUid).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entityByUid).toHaveBeenCalledWith('zzz'); expect(response.status).toEqual(404); expect(response.text).toMatch(/uid/); }); @@ -119,16 +125,18 @@ describe('createRouter', () => { it('can fetch entity by name', async () => { const entity: Entity = { apiVersion: 'a', - kind: 'b', + kind: 'k', metadata: { - name: 'c', - namespace: 'd', + name: 'n', + namespace: 'ns', }, }; entitiesCatalog.entityByName.mockResolvedValue(entity); - const response = await request(app).get('/entities/by-name/b/d/c'); + const response = await request(app).get('/entities/by-name/k/ns/n'); + expect(entitiesCatalog.entityByName).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entityByName).toHaveBeenCalledWith('k', 'ns', 'n'); expect(response.status).toEqual(200); expect(response.body).toEqual(expect.objectContaining(entity)); }); @@ -136,8 +144,10 @@ describe('createRouter', () => { it('responds with a 404 for missing entities', async () => { entitiesCatalog.entityByName.mockResolvedValue(undefined); - const response = await request(app).get('/entities/by-name//b/d/c'); + const response = await request(app).get('/entities/by-name/b/d/c'); + expect(entitiesCatalog.entityByName).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.entityByName).toHaveBeenCalledWith('b', 'd', 'c'); expect(response.status).toEqual(404); expect(response.text).toMatch(/name/); }); @@ -150,9 +160,9 @@ describe('createRouter', () => { .set('Content-Type', 'application/json') .send(); + expect(entitiesCatalog.addOrUpdateEntity).not.toHaveBeenCalled(); expect(response.status).toEqual(400); expect(response.text).toMatch(/body/); - expect(entitiesCatalog.addOrUpdateEntity).not.toHaveBeenCalled(); }); it('passes the body down', async () => { @@ -172,13 +182,13 @@ describe('createRouter', () => { .send(entity) .set('Content-Type', 'application/json'); - expect(response.status).toEqual(200); - expect(response.body).toEqual(entity); expect(entitiesCatalog.addOrUpdateEntity).toHaveBeenCalledTimes(1); expect(entitiesCatalog.addOrUpdateEntity).toHaveBeenNthCalledWith( 1, entity, ); + expect(response.status).toEqual(200); + expect(response.body).toEqual(entity); }); }); @@ -188,8 +198,9 @@ describe('createRouter', () => { const response = await request(app).delete('/entities/by-uid/apa'); - expect(response.status).toEqual(204); expect(entitiesCatalog.removeEntityByUid).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.removeEntityByUid).toHaveBeenCalledWith('apa'); + expect(response.status).toEqual(204); }); it('responds with a 404 for missing entities', async () => { @@ -199,8 +210,9 @@ describe('createRouter', () => { const response = await request(app).delete('/entities/by-uid/apa'); - expect(response.status).toEqual(404); expect(entitiesCatalog.removeEntityByUid).toHaveBeenCalledTimes(1); + expect(entitiesCatalog.removeEntityByUid).toHaveBeenCalledWith('apa'); + expect(response.status).toEqual(404); }); }); @@ -230,8 +242,8 @@ describe('createRouter', () => { const response = await request(app).post('/locations').send(spec); - expect(response.status).toEqual(400); expect(higherOrderOperation.addLocation).not.toHaveBeenCalled(); + expect(response.status).toEqual(400); }); it('passes the body down', async () => { @@ -247,9 +259,14 @@ describe('createRouter', () => { const response = await request(app).post('/locations').send(spec); - expect(response.status).toEqual(201); expect(higherOrderOperation.addLocation).toHaveBeenCalledTimes(1); expect(higherOrderOperation.addLocation).toHaveBeenCalledWith(spec); + expect(response.status).toEqual(201); + expect(response.body).toEqual( + expect.objectContaining({ + location: { id: 'a', ...spec }, + }), + ); }); }); }); diff --git a/plugins/catalog-backend/src/service/router.ts b/plugins/catalog-backend/src/service/router.ts index 22d1f73730..a3da182416 100644 --- a/plugins/catalog-backend/src/service/router.ts +++ b/plugins/catalog-backend/src/service/router.ts @@ -69,8 +69,8 @@ export async function createRouter( const { kind, namespace, name } = req.params; const entity = await entitiesCatalog.entityByName( kind, - name, namespace, + name, ); if (!entity) { res From cb6ef6ca36c73bd511e64d03da2842f80b0e12a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 3 Jun 2020 10:12:34 +0200 Subject: [PATCH 047/192] Make local start of catalog work --- plugins/catalog-backend/package.json | 3 ++- plugins/catalog-backend/src/ingestion/index.ts | 2 +- .../src/service/standaloneApplication.ts | 17 +++++++++++++++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 5ec37295ed..fca79aef1b 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -6,7 +6,7 @@ "license": "Apache-2.0", "private": true, "scripts": { - "start": "tsc-watch --onFirstSuccess \"cross-env NODE_ENV=development nodemon dist/run.js\"", + "start": "backstage-cli watch-deps --build -- tsc-watch --onFirstSuccess \\\"cross-env NODE_ENV=development nodemon -r esm dist/run.js\\\"", "build": "tsc", "lint": "backstage-cli lint", "test": "backstage-cli test", @@ -19,6 +19,7 @@ "@backstage/catalog-model": "^0.1.1-alpha.6", "compression": "^1.7.4", "cors": "^2.8.5", + "esm": "^3.2.25", "express": "^4.17.1", "express-promise-router": "^3.0.3", "fs-extra": "^9.0.0", diff --git a/plugins/catalog-backend/src/ingestion/index.ts b/plugins/catalog-backend/src/ingestion/index.ts index 93af856656..6c530c7234 100644 --- a/plugins/catalog-backend/src/ingestion/index.ts +++ b/plugins/catalog-backend/src/ingestion/index.ts @@ -18,4 +18,4 @@ export * from './descriptor'; export { HigherOrderOperations } from './HigherOrderOperations'; export { IngestionModels } from './IngestionModels'; export * from './source'; -export type { IngestionModel } from './types'; +export type { HigherOrderOperation, IngestionModel } from './types'; diff --git a/plugins/catalog-backend/src/service/standaloneApplication.ts b/plugins/catalog-backend/src/service/standaloneApplication.ts index 126806c751..bdf296d06b 100644 --- a/plugins/catalog-backend/src/service/standaloneApplication.ts +++ b/plugins/catalog-backend/src/service/standaloneApplication.ts @@ -25,19 +25,27 @@ import express from 'express'; import helmet from 'helmet'; import { Logger } from 'winston'; import { EntitiesCatalog, LocationsCatalog } from '../catalog'; +import { HigherOrderOperation } from '../ingestion'; import { createRouter } from './router'; export interface ApplicationOptions { enableCors: boolean; entitiesCatalog: EntitiesCatalog; locationsCatalog?: LocationsCatalog; + higherOrderOperation?: HigherOrderOperation; logger: Logger; } export async function createStandaloneApplication( options: ApplicationOptions, ): Promise { - const { enableCors, entitiesCatalog, locationsCatalog, logger } = options; + const { + enableCors, + entitiesCatalog, + locationsCatalog, + higherOrderOperation, + logger, + } = options; const app = express(); app.use(helmet()); @@ -49,7 +57,12 @@ export async function createStandaloneApplication( app.use(requestLoggingHandler()); app.use( '/', - await createRouter({ entitiesCatalog, locationsCatalog, logger }), + await createRouter({ + entitiesCatalog, + locationsCatalog, + higherOrderOperation, + logger, + }), ); app.use(notFoundHandler()); app.use(errorHandler()); From a2a3d7ea2b74c49975a77a0cd743339fbab9cc79 Mon Sep 17 00:00:00 2001 From: Sebastian Qvarfordt Date: Wed, 3 Jun 2020 10:17:37 +0200 Subject: [PATCH 048/192] Fixed typo and added a type --- plugins/catalog/src/api/CatalogClient.ts | 2 +- plugins/catalog/src/components/CatalogPage/CatalogPage.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/catalog/src/api/CatalogClient.ts b/plugins/catalog/src/api/CatalogClient.ts index bf308cb012..abba8a7523 100644 --- a/plugins/catalog/src/api/CatalogClient.ts +++ b/plugins/catalog/src/api/CatalogClient.ts @@ -44,7 +44,7 @@ export class CatalogClient implements CatalogApi { throw new Error(`'Entity not found: ${name}`); } async getLocationByEntity(entity: Entity): Promise { - const findLocationIdInEntity = (e: Entity) => + const findLocationIdInEntity = (e: Entity): string | undefined => e.metadata.annotations?.['backstage.io/managed-by-location']; const locationId = findLocationIdInEntity(entity); diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx index fe21c7de31..24337337c9 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx @@ -81,7 +81,7 @@ const CatalogPage: FC<{}> = () => { const actions = [ (rowData: Component) => ({ icon: GitHub, - tooltop: 'View on GitHub', + tooltip: 'View on GitHub', onClick: () => { if (!rowData || !rowData.location) return; window.open(rowData.location.target, '_blank'); From e02a2d1e566926c46e6666b1f058d8456e2c86ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 3 Jun 2020 10:18:42 +0200 Subject: [PATCH 049/192] Update development-environment.md --- .../development-environment.md | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/getting-started/development-environment.md b/docs/getting-started/development-environment.md index 489116fcc8..26b432570f 100644 --- a/docs/getting-started/development-environment.md +++ b/docs/getting-started/development-environment.md @@ -1,16 +1,28 @@ # Development Environment +This section describes how to get set up for doing development on the Backstage repository. + +## Cloning the Repository + +After you have cloned the Backstage repository, you should run the following commands +once to set things up for development: + +```bash +$ yarn install # fetch dependency packages - may take a while + +$ yarn tsc # does a first run of type generation and checks +``` + ## Serving the Example App -Open a terminal window and start the web app using the following commands from the project root: +Open a terminal window and start the web app by using the following command from the project root. +Make sure you have run the above mentioned commands first. ```bash -$ yarn install # may take a while - $ yarn start ``` -The final `yarn start` command should open a local instance of Backstage in your browser, otherwise open one of the URLs printed in the terminal. +This should open a local instance of Backstage in your browser, otherwise open one of the URLs printed in the terminal. By default, backstage will start on port 3000, however you can override this by setting an environment variable `PORT` on your local machine. e.g. `export PORT=8080` then running `yarn start`. Or `PORT=8080 yarn start`. From f7d232c1a8aa4c0b0083be9e4f1d085d4e578b36 Mon Sep 17 00:00:00 2001 From: Sebastian Qvarfordt Date: Wed, 3 Jun 2020 10:34:53 +0200 Subject: [PATCH 050/192] Fixed hiding of github link actions when location isn't github --- plugins/catalog/src/components/CatalogPage/CatalogPage.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx index 24337337c9..09688bffb5 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx @@ -86,10 +86,8 @@ const CatalogPage: FC<{}> = () => { if (!rowData || !rowData.location) return; window.open(rowData.location.target, '_blank'); }, - isHidden: - rowData && rowData.location - ? rowData.location.type === 'github' - : false, + hidden: + rowData && rowData.location ? rowData.location.type !== 'github' : true, }), ]; From a47ebf902fb7f4d7663869cff03720239604f58a Mon Sep 17 00:00:00 2001 From: Sebastian Qvarfordt Date: Wed, 3 Jun 2020 10:49:58 +0200 Subject: [PATCH 051/192] Removed a few more any types --- plugins/catalog/src/components/CatalogPage/CatalogPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx index 09688bffb5..725d266fbf 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx @@ -53,7 +53,7 @@ import { Component } from '../../data/component'; const CatalogPage: FC<{}> = () => { const catalogApi = useApi(catalogApiRef); const { value, error, loading } = useAsync(() => catalogApi.getEntities()); - const [locations, setLocations] = useState([]); + const [locations, setLocations] = useState([]); const [selectedFilter, setSelectedFilter] = useState( defaultFilter, ); @@ -97,7 +97,7 @@ const CatalogPage: FC<{}> = () => { ): Location | undefined => { const entityLocationId = entity.metadata.annotations?.['backstage.io/managed-by-location']; - return l.find((location: any) => location.id === entityLocationId); + return l.find(location => location.id === entityLocationId); }; return ( From 241a5a89440f607d82a434197be102cebbbf6b07 Mon Sep 17 00:00:00 2001 From: Sebastian Qvarfordt Date: Wed, 3 Jun 2020 11:10:51 +0200 Subject: [PATCH 052/192] Convert Array to Array --- plugins/catalog/src/components/CatalogPage/CatalogPage.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx index 725d266fbf..5951365b6e 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx @@ -73,7 +73,10 @@ const CatalogPage: FC<{}> = () => { if (value) { getLocationDataForEntities(value) - .then(location => location.filter(l => !!l)) + .then( + (location): Location[] => + location.filter(l => !!l) as Array, + ) .then(setLocations); } }, [value, catalogApi]); From 5b9f77f1512042b156cd68cd6bee426c347d8f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20=C3=85lund?= Date: Wed, 3 Jun 2020 13:19:07 +0200 Subject: [PATCH 053/192] Fix image link in ADR 5 (#1125) --- docs/architecture-decisions/adr005-catalog-core-entities.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/architecture-decisions/adr005-catalog-core-entities.md b/docs/architecture-decisions/adr005-catalog-core-entities.md index 1014019f8a..8e20827280 100644 --- a/docs/architecture-decisions/adr005-catalog-core-entities.md +++ b/docs/architecture-decisions/adr005-catalog-core-entities.md @@ -16,7 +16,7 @@ Backstage should eventually support the following core entities: * **APIs** are the boundaries between different components * **Resources** are physical or virtual infrastructure needed to operate a component -![Catalog Core Entities][catalog-core-entities] +![Catalog Core Entities](catalog-core-entities.png) For now, we'll start by only implementing support for the Component entity in the Backstage catalog. This can later be extended to APIs, Resources and other potentially useful entities. @@ -36,7 +36,7 @@ spec: ### API APIs form an abstraction that allows large software ecosystems to scale. Thus, APIs are a first class citizen in the Backstage model and the primary way to discover existing functionality in the ecosystem. -APIs are implemented by components and make their boundaries explicit. They might be defined using an RPC IDL (eg in Protobuf, GraphQL or similar), a data schema (eg in Avro, TFRecord or similar), or as code interfaces (eg framework APIs in Swift, Kotlin, Java, C++, Typescript etc). In any case, APIs exposed by components need to be in a known machine-readable format so we can build further tooling and analysis on top. +APIs are implemented by components and make their boundaries explicit. They might be defined using an RPC IDL (e.g. in Protobuf, GraphQL or similar), a data schema (e.g. in Avro, TFRecord or similar), or as code interfaces (e.g. framework APIs in Swift, Kotlin, Java, C++, Typescript etc). In any case, APIs exposed by components need to be in a known machine-readable format so we can build further tooling and analysis on top. APIs are typically indexed from existing definitions in source control and thus wouldn't need their own descriptor files, but would be stored in the catalog somewhat like this (actual schema will evolve): ```yaml @@ -61,7 +61,7 @@ spec: ### Resource Resources are the infrastructure your software needs to operate at runtime like Bigtable databases, Pub/Sub topics, S3 buckets or CDNs. Modelling them together with components and APIs will allow us to visualize and create tooling around them in Backstage. -Resources are typically indexed from declarative definitions (eg Terraform, GCP Config Connector, AWS Cloud Formation) and/or inventories from cloud providers (eg GCP Asset Inventory) and thus wouldn't need their own descriptor files, but would be stored in the catalog somewhat like this (actual schema will evolve): +Resources are typically indexed from declarative definitions (e.g. Terraform, GCP Config Connector, AWS Cloud Formation) and/or inventories from cloud providers (e.g. GCP Asset Inventory) and thus wouldn't need their own descriptor files, but would be stored in the catalog somewhat like this (actual schema will evolve): ```yaml apiVersion: backstage.io/v1beta1 kind: Resource From 4da5cace1f8c2e4cc540ec93b7a914af57646c25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 3 Jun 2020 14:31:49 +0200 Subject: [PATCH 054/192] feat(cli): delete coverage dir during clean --- packages/cli/src/commands/clean/clean.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cli/src/commands/clean/clean.ts b/packages/cli/src/commands/clean/clean.ts index 2fa49fcc4a..91531a53ed 100644 --- a/packages/cli/src/commands/clean/clean.ts +++ b/packages/cli/src/commands/clean/clean.ts @@ -24,6 +24,7 @@ export default async function clean() { const packagePath = getPackagePath(cacheOptions.cacheDir); await fs.remove(cacheOptions.output); await fs.remove(packagePath); + await fs.remove(paths.resolveTarget('coverage')); } function getPackagePath(cacheDir: string) { From 38256679239b875ff88ce824fc70291730bd17d5 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 3 Jun 2020 14:41:47 +0200 Subject: [PATCH 055/192] feat(core-api/Storage): Added a simple implementatation of subscriptions --- .../StorageApi/WebStorage.test.ts | 59 ++++++++++++++++++- .../implementations/StorageApi/WebStorage.ts | 22 ++++++- 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts index 6509ba6edb..85343d58ff 100644 --- a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts +++ b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts @@ -27,7 +27,6 @@ describe('WebStorage Storage API', () => { await storage.set('myfakekey', 'helloimastring'); await storage.set('mysecondfakekey', 1234); await storage.set('mythirdfakekey', true); - expect(storage.get('myfakekey')).toBe('helloimastring'); expect(storage.get('mysecondfakekey')).toBe(1234); expect(storage.get('mythirdfakekey')).toBe(true); @@ -45,4 +44,62 @@ describe('WebStorage Storage API', () => { expect(storage.get('myfakekey')).toEqual(mockData); }); + + it('should subscribe to key changes when setting a new value', async () => { + const storage = new WebStorage(); + + const wrongKeyNextHandler = jest.fn(); + const selectedKeyNextHandler = jest.fn(); + const mockData = { hello: 'im a great new value' }; + + await new Promise(resolve => { + storage.observe$('correctKey').subscribe({ + next: (...args) => { + selectedKeyNextHandler(...args); + resolve(); + }, + }); + + storage.observe$('wrongKey').subscribe({ next: wrongKeyNextHandler }); + + storage.set('correctKey', mockData); + }); + + expect(wrongKeyNextHandler).not.toHaveBeenCalled(); + expect(selectedKeyNextHandler).toHaveBeenCalledTimes(1); + expect(selectedKeyNextHandler).toHaveBeenCalledWith({ + key: 'correctKey', + newValue: mockData, + }); + }); + + it('should subscribe to key changes when deleting a value', async () => { + const storage = new WebStorage(); + + const wrongKeyNextHandler = jest.fn(); + const selectedKeyNextHandler = jest.fn(); + const mockData = { hello: 'im a great new value' }; + + storage.set('correctKey', mockData); + + await new Promise(resolve => { + storage.observe$('correctKey').subscribe({ + next: (...args) => { + selectedKeyNextHandler(...args); + resolve(); + }, + }); + + storage.observe$('wrongKey').subscribe({ next: wrongKeyNextHandler }); + + storage.remove('correctKey'); + }); + + expect(wrongKeyNextHandler).not.toHaveBeenCalled(); + expect(selectedKeyNextHandler).toHaveBeenCalledTimes(1); + expect(selectedKeyNextHandler).toHaveBeenCalledWith({ + key: 'correctKey', + newValue: undefined, + }); + }); }); diff --git a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts index cbcab6349e..432c08e3d1 100644 --- a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts +++ b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts @@ -18,7 +18,19 @@ import { Observable } from '../../../types'; import ObservableImpl from 'zen-observable'; export class WebStorage implements StorageApi { - private readonly observable = new ObservableImpl(() => {}); + subscribers: Set< + ZenObservable.SubscriptionObserver + > = new Set(); + + private readonly observable = new ObservableImpl( + subscriber => { + this.subscribers.add(subscriber); + return () => { + this.subscribers.delete(subscriber); + }; + }, + ); + get(key: string): T | undefined { try { const storage = JSON.parse(localStorage.getItem(key)!); @@ -35,10 +47,18 @@ export class WebStorage implements StorageApi { async set(key: string, data: T): Promise { localStorage.setItem(key, JSON.stringify(data, null, 2)); + this.notifyChanges({ key, newValue: data }); } async remove(key: string): Promise { localStorage.removeItem(key); + this.notifyChanges({ key, newValue: undefined }); + } + + notifyChanges(message: ObservableMessage) { + for (const subscription of this.subscribers) { + subscription.next(message); + } } observe$(key: string): Observable { From f1ba79fec03fd209d1734e49cfbacac97537c8f7 Mon Sep 17 00:00:00 2001 From: blam Date: Wed, 3 Jun 2020 14:51:53 +0200 Subject: [PATCH 056/192] chore(core-api/Storage): Fixing order of the functions --- .../src/apis/definitions/StorageApi.ts | 2 +- .../implementations/StorageApi/WebStorage.ts | 30 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/core-api/src/apis/definitions/StorageApi.ts b/packages/core-api/src/apis/definitions/StorageApi.ts index c8e72a518f..e0bd2c7ed3 100644 --- a/packages/core-api/src/apis/definitions/StorageApi.ts +++ b/packages/core-api/src/apis/definitions/StorageApi.ts @@ -15,7 +15,7 @@ */ import { createApiRef } from '../ApiRef'; -import { Observable } from '@backstage/core-api'; +import { Observable } from '../../types'; export type ObservableMessage = { key: string; diff --git a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts index 432c08e3d1..a6a646d3dc 100644 --- a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts +++ b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts @@ -22,15 +22,6 @@ export class WebStorage implements StorageApi { ZenObservable.SubscriptionObserver > = new Set(); - private readonly observable = new ObservableImpl( - subscriber => { - this.subscribers.add(subscriber); - return () => { - this.subscribers.delete(subscriber); - }; - }, - ); - get(key: string): T | undefined { try { const storage = JSON.parse(localStorage.getItem(key)!); @@ -55,15 +46,24 @@ export class WebStorage implements StorageApi { this.notifyChanges({ key, newValue: undefined }); } - notifyChanges(message: ObservableMessage) { - for (const subscription of this.subscribers) { - subscription.next(message); - } - } - observe$(key: string): Observable { return this.observable.filter( ({ key: messageKey }) => messageKey === key, ) as Observable; } + + private notifyChanges(message: ObservableMessage) { + for (const subscription of this.subscribers) { + subscription.next(message); + } + } + + private readonly observable = new ObservableImpl( + subscriber => { + this.subscribers.add(subscriber); + return () => { + this.subscribers.delete(subscriber); + }; + }, + ); } From 8a86a1c4ba57d446cb616445ea99e5a27c2b4237 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2020 15:15:53 +0200 Subject: [PATCH 057/192] build(deps-dev): bump @types/codemirror from 0.0.93 to 0.0.95 (#1119) Bumps [@types/codemirror](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/codemirror) from 0.0.93 to 0.0.95. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/codemirror) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- plugins/graphiql/package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index e67461c83d..a3fee6e217 100644 --- a/plugins/graphiql/package.json +++ b/plugins/graphiql/package.json @@ -48,7 +48,7 @@ "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^10.2.4", - "@types/codemirror": "^0.0.93", + "@types/codemirror": "^0.0.95", "@types/jest": "^25.2.2", "@types/node": "^12.0.0", "@types/testing-library__jest-dom": "^5.0.4", diff --git a/yarn.lock b/yarn.lock index 019870cfc3..7bc9234e01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3422,10 +3422,10 @@ dependencies: "@types/node" "*" -"@types/codemirror@^0.0.93": - version "0.0.93" - resolved "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.93.tgz#74ce5e1132325cb2c88a9bb91fd819294fe0c8ed" - integrity sha512-7F2ksY4U5amV/bIkMTev0n22RWcFO2BBuFuFYmAJIT19gr3kDElr1phgjPsNKV/Pj301bujnMjSy5GlWla+cow== +"@types/codemirror@^0.0.95": + version "0.0.95" + resolved "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.95.tgz#8fe424989cd5a6d7848f124774d42ef34d91adb8" + integrity sha512-E7w4HS8/rR7Rxkga6j68n3/Mi4BJ870/OJJKRqytyWiM659KnbviSng/NPfM/FOjg7YL+5ruFF69FqoLChnPBw== dependencies: "@types/tern" "*" From f522182f32c58e6a996c69e8dcf9dc28160e0810 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2020 15:17:01 +0200 Subject: [PATCH 058/192] build(deps-dev): bump @storybook/addon-storysource from 5.3.18 to 5.3.19 (#1118) Bumps [@storybook/addon-storysource](https://github.com/storybookjs/storybook/tree/HEAD/addons/storysource) from 5.3.18 to 5.3.19. - [Release notes](https://github.com/storybookjs/storybook/releases) - [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md) - [Commits](https://github.com/storybookjs/storybook/commits/v5.3.19/addons/storysource) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- yarn.lock | 65 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 15 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7bc9234e01..af00a9eb55 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2585,15 +2585,15 @@ ts-dedent "^1.1.0" "@storybook/addon-storysource@^5.3.18": - version "5.3.18" - resolved "https://registry.npmjs.org/@storybook/addon-storysource/-/addon-storysource-5.3.18.tgz#003374d76c0898c3b74aa4cd008f444eb6b63c68" - integrity sha512-uMSu505rbcNErAYngV5raVRQ/eMiOtGNA88WxNzD/8h/0EVpEXlBAewiGzAmooNhCa/3O3iPuwka8Cky6aWPOA== + version "5.3.19" + resolved "https://registry.npmjs.org/@storybook/addon-storysource/-/addon-storysource-5.3.19.tgz#ae693e88db5d220cb256a9ef4a2366c300e8d88c" + integrity sha512-W7mIAHuxYT+b1huaHCHLkBAh2MbeWmF8CxeBCFiOgZaYYQUTDEh018HJF8u2AqiWSouRhcfzhTnGxOo0hNRBgw== dependencies: - "@storybook/addons" "5.3.18" - "@storybook/components" "5.3.18" - "@storybook/router" "5.3.18" - "@storybook/source-loader" "5.3.18" - "@storybook/theming" "5.3.18" + "@storybook/addons" "5.3.19" + "@storybook/components" "5.3.19" + "@storybook/router" "5.3.19" + "@storybook/source-loader" "5.3.19" + "@storybook/theming" "5.3.19" core-js "^3.0.1" estraverse "^4.2.0" loader-utils "^1.2.3" @@ -2616,7 +2616,7 @@ global "^4.3.2" util-deprecate "^1.0.2" -"@storybook/addons@^5.3.17": +"@storybook/addons@5.3.19", "@storybook/addons@^5.3.17": version "5.3.19" resolved "https://registry.npmjs.org/@storybook/addons/-/addons-5.3.19.tgz#3a7010697afd6df9a41b8c8a7351d9a06ff490a4" integrity sha512-Ky/k22p6i6FVNvs1VhuFyGvYJdcp+FgXqFgnPyY/OXJW/vPDapdElpTpHJZLFI9I2FQBDcygBPU5RXkumQ+KUQ== @@ -2770,6 +2770,33 @@ simplebar-react "^1.0.0-alpha.6" ts-dedent "^1.1.0" +"@storybook/components@5.3.19": + version "5.3.19" + resolved "https://registry.npmjs.org/@storybook/components/-/components-5.3.19.tgz#aac1f9eea1247cc85bd93b10fca803876fb84a6b" + integrity sha512-3g23/+ktlocaHLJKISu9Neu3XKa6aYP2ctDYkRtGchSB0Q55hQsUVGO+BEVuT7Pk2D59mVCxboBjxcRoPUY4pw== + dependencies: + "@storybook/client-logger" "5.3.19" + "@storybook/theming" "5.3.19" + "@types/react-syntax-highlighter" "11.0.4" + "@types/react-textarea-autosize" "^4.3.3" + core-js "^3.0.1" + global "^4.3.2" + lodash "^4.17.15" + markdown-to-jsx "^6.11.4" + memoizerific "^1.11.3" + polished "^3.3.1" + popper.js "^1.14.7" + prop-types "^15.7.2" + react "^16.8.3" + react-dom "^16.8.3" + react-focus-lock "^2.1.0" + react-helmet-async "^1.0.2" + react-popper-tooltip "^2.8.3" + react-syntax-highlighter "^11.0.2" + react-textarea-autosize "^7.1.0" + simplebar-react "^1.0.0-alpha.6" + ts-dedent "^1.1.0" + "@storybook/core-events@5.3.18": version "5.3.18" resolved "https://registry.npmjs.org/@storybook/core-events/-/core-events-5.3.18.tgz#e5d335f8a2c7dd46502b8f505006f1e111b46d49" @@ -2939,13 +2966,13 @@ qs "^6.6.0" util-deprecate "^1.0.2" -"@storybook/source-loader@5.3.18": - version "5.3.18" - resolved "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-5.3.18.tgz#39ba28d9664ab8204d6b04ee757772369931e7e5" - integrity sha512-oljmLt3KMu17W9FAaEgocsI6wrloWczS26SVXadzbDbL+8Tu6vTeFJSd6HcY+e4JIIKjuze0kmaVhpi6wwPbZQ== +"@storybook/source-loader@5.3.19": + version "5.3.19" + resolved "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-5.3.19.tgz#ff0a00731c24c61721d8b9d84152f8542913a3b7" + integrity sha512-srSZRPgEOUse8nRVnlazweB2QGp63mPqM0uofg8zYARyaYSOzkC155ymdeiHsmiBTS3X3I0FQE4+KnwiH7iLtw== dependencies: - "@storybook/addons" "5.3.18" - "@storybook/client-logger" "5.3.18" + "@storybook/addons" "5.3.19" + "@storybook/client-logger" "5.3.19" "@storybook/csf" "0.0.1" core-js "^3.0.1" estraverse "^4.2.0" @@ -12561,6 +12588,14 @@ markdown-it@^10.0.0: mdurl "^1.0.1" uc.micro "^1.0.5" +markdown-to-jsx@^6.11.4: + version "6.11.4" + resolved "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-6.11.4.tgz#b4528b1ab668aef7fe61c1535c27e837819392c5" + integrity sha512-3lRCD5Sh+tfA52iGgfs/XZiw33f7fFX9Bn55aNnVNUd2GzLDkOWyKYYD8Yju2B1Vn+feiEdgJs8T6Tg0xNokPw== + dependencies: + prop-types "^15.6.2" + unquote "^1.1.0" + markdown-to-jsx@^6.9.1, markdown-to-jsx@^6.9.3: version "6.11.0" resolved "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-6.11.0.tgz#a2e3f2bc781c3402d8bb0f8e0a12a186474623b0" From 903d2dd233f3784c04dff94e9adc90b1e3ed6306 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2020 15:19:00 +0200 Subject: [PATCH 059/192] build(deps-dev): bump lerna from 3.20.2 to 3.22.0 (#1116) Bumps [lerna](https://github.com/lerna/lerna/tree/HEAD/core/lerna) from 3.20.2 to 3.22.0. - [Release notes](https://github.com/lerna/lerna/releases) - [Changelog](https://github.com/lerna/lerna/blob/master/core/lerna/CHANGELOG.md) - [Commits](https://github.com/lerna/lerna/commits/v3.22.0/core/lerna) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- yarn.lock | 250 +++++++++++++++++++++++++----------------------------- 1 file changed, 116 insertions(+), 134 deletions(-) diff --git a/yarn.lock b/yarn.lock index af00a9eb55..5ad99a6b67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1482,14 +1482,14 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@lerna/add@3.20.0": - version "3.20.0" - resolved "https://registry.npmjs.org/@lerna/add/-/add-3.20.0.tgz#bea7edf36fc93fb72ec34cb9ba854c48d4abf309" - integrity sha512-AnH1oRIEEg/VDa3SjYq4x1/UglEAvrZuV0WssHUMN81RTZgQk3we+Mv3qZNddrZ/fBcZu2IAdN/EQ3+ie2JxKQ== +"@lerna/add@3.21.0": + version "3.21.0" + resolved "https://registry.npmjs.org/@lerna/add/-/add-3.21.0.tgz#27007bde71cc7b0a2969ab3c2f0ae41578b4577b" + integrity sha512-vhUXXF6SpufBE1EkNEXwz1VLW03f177G9uMOFMQkp6OJ30/PWg4Ekifuz9/3YfgB2/GH8Tu4Lk3O51P2Hskg/A== dependencies: "@evocateur/pacote" "^9.6.3" - "@lerna/bootstrap" "3.20.0" - "@lerna/command" "3.18.5" + "@lerna/bootstrap" "3.21.0" + "@lerna/command" "3.21.0" "@lerna/filter-options" "3.20.0" "@lerna/npm-conf" "3.16.0" "@lerna/validation-error" "3.13.0" @@ -1498,12 +1498,12 @@ p-map "^2.1.0" semver "^6.2.0" -"@lerna/bootstrap@3.20.0": - version "3.20.0" - resolved "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.20.0.tgz#635d71046830f208e851ab429a63da1747589e37" - integrity sha512-Wylullx3uthKE7r4izo09qeRGL20Y5yONlQEjPCfnbxCC2Elu+QcPu4RC6kqKQ7b+g7pdC3OOgcHZjngrwr5XQ== +"@lerna/bootstrap@3.21.0": + version "3.21.0" + resolved "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.21.0.tgz#bcd1b651be5b0970b20d8fae04c864548123aed6" + integrity sha512-mtNHlXpmvJn6JTu0KcuTTPl2jLsDNud0QacV/h++qsaKbhAaJr/FElNZ5s7MwZFUM3XaDmvWzHKaszeBMHIbBw== dependencies: - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/filter-options" "3.20.0" "@lerna/has-npm-version" "3.16.5" "@lerna/npm-install" "3.16.5" @@ -1527,13 +1527,13 @@ read-package-tree "^5.1.6" semver "^6.2.0" -"@lerna/changed@3.20.0": - version "3.20.0" - resolved "https://registry.npmjs.org/@lerna/changed/-/changed-3.20.0.tgz#66b97ebd6c8f8d207152ee524a0791846a9097ae" - integrity sha512-+hzMFSldbRPulZ0vbKk6RD9f36gaH3Osjx34wrrZ62VB4pKmjyuS/rxVYkCA3viPLHoiIw2F8zHM5BdYoDSbjw== +"@lerna/changed@3.21.0": + version "3.21.0" + resolved "https://registry.npmjs.org/@lerna/changed/-/changed-3.21.0.tgz#108e15f679bfe077af500f58248c634f1044ea0b" + integrity sha512-hzqoyf8MSHVjZp0gfJ7G8jaz+++mgXYiNs9iViQGA8JlN/dnWLI5sWDptEH3/B30Izo+fdVz0S0s7ydVE3pWIw== dependencies: "@lerna/collect-updates" "3.20.0" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/listable" "3.18.5" "@lerna/output" "3.13.0" @@ -1555,12 +1555,12 @@ execa "^1.0.0" strong-log-transformer "^2.0.0" -"@lerna/clean@3.20.0": - version "3.20.0" - resolved "https://registry.npmjs.org/@lerna/clean/-/clean-3.20.0.tgz#ba777e373ddeae63e57860df75d47a9e5264c5b2" - integrity sha512-9ZdYrrjQvR5wNXmHfDsfjWjp0foOkCwKe3hrckTzkAeQA1ibyz5llGwz5e1AeFrV12e2/OLajVqYfe+qdkZUgg== +"@lerna/clean@3.21.0": + version "3.21.0" + resolved "https://registry.npmjs.org/@lerna/clean/-/clean-3.21.0.tgz#c0b46b5300cc3dae2cda3bec14b803082da3856d" + integrity sha512-b/L9l+MDgE/7oGbrav6rG8RTQvRiZLO1zTcG17zgJAAuhlsPxJExMlh2DFwJEVi2les70vMhHfST3Ue1IMMjpg== dependencies: - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/filter-options" "3.20.0" "@lerna/prompt" "3.18.5" "@lerna/pulse-till-done" "3.13.0" @@ -1600,14 +1600,14 @@ npmlog "^4.1.2" slash "^2.0.0" -"@lerna/command@3.18.5": - version "3.18.5" - resolved "https://registry.npmjs.org/@lerna/command/-/command-3.18.5.tgz#14c6d2454adbfd365f8027201523e6c289cd3cd9" - integrity sha512-36EnqR59yaTU4HrR1C9XDFti2jRx0BgpIUBeWn129LZZB8kAB3ov1/dJNa1KcNRKp91DncoKHLY99FZ6zTNpMQ== +"@lerna/command@3.21.0": + version "3.21.0" + resolved "https://registry.npmjs.org/@lerna/command/-/command-3.21.0.tgz#9a2383759dc7b700dacfa8a22b2f3a6e190121f7" + integrity sha512-T2bu6R8R3KkH5YoCKdutKv123iUgUbW8efVjdGCDnCMthAQzoentOJfDeodBwn0P2OqCl3ohsiNVtSn9h78fyQ== dependencies: "@lerna/child-process" "3.16.5" "@lerna/package-graph" "3.18.5" - "@lerna/project" "3.18.0" + "@lerna/project" "3.21.0" "@lerna/validation-error" "3.13.0" "@lerna/write-log-file" "3.13.0" clone-deep "^4.0.1" @@ -1616,10 +1616,10 @@ is-ci "^2.0.0" npmlog "^4.1.2" -"@lerna/conventional-commits@3.18.5": - version "3.18.5" - resolved "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.18.5.tgz#08efd2e5b45acfaf3f151a53a3ec7ecade58a7bc" - integrity sha512-qcvXIEJ3qSgalxXnQ7Yxp5H9Ta5TVyai6vEor6AAEHc20WiO7UIdbLDCxBtiiHMdGdpH85dTYlsoYUwsCJu3HQ== +"@lerna/conventional-commits@3.22.0": + version "3.22.0" + resolved "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.22.0.tgz#2798f4881ee2ef457bdae027ab7d0bf0af6f1e09" + integrity sha512-z4ZZk1e8Mhz7+IS8NxHr64wyklHctCJyWpJKEZZPJiLFJ8yKto/x38O80R10pIzC0rr8Sy/OsjSH4bl0TbbgqA== dependencies: "@lerna/validation-error" "3.13.0" conventional-changelog-angular "^5.0.3" @@ -1642,14 +1642,14 @@ fs-extra "^8.1.0" npmlog "^4.1.2" -"@lerna/create@3.18.5": - version "3.18.5" - resolved "https://registry.npmjs.org/@lerna/create/-/create-3.18.5.tgz#11ac539f069248eaf7bc4c42e237784330f4fc47" - integrity sha512-cHpjocbpKmLopCuZFI7cKEM3E/QY8y+yC7VtZ4FQRSaLU8D8i2xXtXmYaP1GOlVNavji0iwoXjuNpnRMInIr2g== +"@lerna/create@3.22.0": + version "3.22.0" + resolved "https://registry.npmjs.org/@lerna/create/-/create-3.22.0.tgz#d6bbd037c3dc5b425fe5f6d1b817057c278f7619" + integrity sha512-MdiQQzCcB4E9fBF1TyMOaAEz9lUjIHp1Ju9H7f3lXze5JK6Fl5NYkouAvsLgY6YSIhXMY8AHW2zzXeBDY4yWkw== dependencies: "@evocateur/pacote" "^9.6.3" "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/npm-conf" "3.16.0" "@lerna/validation-error" "3.13.0" camelcase "^5.0.0" @@ -1674,23 +1674,23 @@ "@lerna/child-process" "3.16.5" npmlog "^4.1.2" -"@lerna/diff@3.18.5": - version "3.18.5" - resolved "https://registry.npmjs.org/@lerna/diff/-/diff-3.18.5.tgz#e9e2cb882f84d5b84f0487c612137305f07accbc" - integrity sha512-u90lGs+B8DRA9Z/2xX4YaS3h9X6GbypmGV6ITzx9+1Ga12UWGTVlKaCXBgONMBjzJDzAQOK8qPTwLA57SeBLgA== +"@lerna/diff@3.21.0": + version "3.21.0" + resolved "https://registry.npmjs.org/@lerna/diff/-/diff-3.21.0.tgz#e6df0d8b9916167ff5a49fcb02ac06424280a68d" + integrity sha512-5viTR33QV3S7O+bjruo1SaR40m7F2aUHJaDAC7fL9Ca6xji+aw1KFkpCtVlISS0G8vikUREGMJh+c/VMSc8Usw== dependencies: "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/validation-error" "3.13.0" npmlog "^4.1.2" -"@lerna/exec@3.20.0": - version "3.20.0" - resolved "https://registry.npmjs.org/@lerna/exec/-/exec-3.20.0.tgz#29f0c01aee2340eb46f90706731fef2062a49639" - integrity sha512-pS1mmC7kzV668rHLWuv31ClngqeXjeHC8kJuM+W2D6IpUVMGQHLcCTYLudFgQsuKGVpl0DGNYG+sjLhAPiiu6A== +"@lerna/exec@3.21.0": + version "3.21.0" + resolved "https://registry.npmjs.org/@lerna/exec/-/exec-3.21.0.tgz#17f07533893cb918a17b41bcc566dc437016db26" + integrity sha512-iLvDBrIE6rpdd4GIKTY9mkXyhwsJ2RvQdB9ZU+/NhR3okXfqKc6py/24tV111jqpXTtZUW6HNydT4dMao2hi1Q== dependencies: "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/filter-options" "3.20.0" "@lerna/profiler" "3.20.0" "@lerna/run-topologically" "3.18.5" @@ -1733,13 +1733,13 @@ ssri "^6.0.1" tar "^4.4.8" -"@lerna/github-client@3.16.5": - version "3.16.5" - resolved "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.16.5.tgz#2eb0235c3bf7a7e5d92d73e09b3761ab21f35c2e" - integrity sha512-rHQdn8Dv/CJrO3VouOP66zAcJzrHsm+wFuZ4uGAai2At2NkgKH+tpNhQy2H1PSC0Ezj9LxvdaHYrUzULqVK5Hw== +"@lerna/github-client@3.22.0": + version "3.22.0" + resolved "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.22.0.tgz#5d816aa4f76747ed736ae64ff962b8f15c354d95" + integrity sha512-O/GwPW+Gzr3Eb5bk+nTzTJ3uv+jh5jGho9BOqKlajXaOkMYGBELEAqV5+uARNGWZFvYAiF4PgqHb6aCUu7XdXg== dependencies: "@lerna/child-process" "3.16.5" - "@octokit/plugin-enterprise-rest" "^3.6.1" + "@octokit/plugin-enterprise-rest" "^6.0.1" "@octokit/rest" "^16.28.4" git-url-parse "^11.1.2" npmlog "^4.1.2" @@ -1766,13 +1766,13 @@ "@lerna/child-process" "3.16.5" semver "^6.2.0" -"@lerna/import@3.18.5": - version "3.18.5" - resolved "https://registry.npmjs.org/@lerna/import/-/import-3.18.5.tgz#a9c7d8601870729851293c10abd18b3707f7ba5e" - integrity sha512-PH0WVLEgp+ORyNKbGGwUcrueW89K3Iuk/DDCz8mFyG2IG09l/jOF0vzckEyGyz6PO5CMcz4TI1al/qnp3FrahQ== +"@lerna/import@3.22.0": + version "3.22.0" + resolved "https://registry.npmjs.org/@lerna/import/-/import-3.22.0.tgz#1a5f0394f38e23c4f642a123e5e1517e70d068d2" + integrity sha512-uWOlexasM5XR6tXi4YehODtH9Y3OZrFht3mGUFFT3OIl2s+V85xIGFfqFGMTipMPAGb2oF1UBLL48kR43hRsOg== dependencies: "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/prompt" "3.18.5" "@lerna/pulse-till-done" "3.13.0" "@lerna/validation-error" "3.13.0" @@ -1780,43 +1780,43 @@ fs-extra "^8.1.0" p-map-series "^1.0.0" -"@lerna/info@3.20.0": - version "3.20.0" - resolved "https://registry.npmjs.org/@lerna/info/-/info-3.20.0.tgz#3a5212f3029f2bc6255f9533bdf4bcb120ef329a" - integrity sha512-Rsz+KQF9mczbGUbPTrtOed1N0C+cA08Qz0eX/oI+NNjvsryZIju/o7uedG4I3P55MBiAioNrJI88fHH3eTgYug== +"@lerna/info@3.21.0": + version "3.21.0" + resolved "https://registry.npmjs.org/@lerna/info/-/info-3.21.0.tgz#76696b676fdb0f35d48c83c63c1e32bb5e37814f" + integrity sha512-0XDqGYVBgWxUquFaIptW2bYSIu6jOs1BtkvRTWDDhw4zyEdp6q4eaMvqdSap1CG+7wM5jeLCi6z94wS0AuiuwA== dependencies: - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/output" "3.13.0" envinfo "^7.3.1" -"@lerna/init@3.18.5": - version "3.18.5" - resolved "https://registry.npmjs.org/@lerna/init/-/init-3.18.5.tgz#86dd0b2b3290755a96975069b5cb007f775df9f5" - integrity sha512-oCwipWrha98EcJAHm8AGd2YFFLNI7AW9AWi0/LbClj1+XY9ah+uifXIgYGfTk63LbgophDd8936ZEpHMxBsbAg== +"@lerna/init@3.21.0": + version "3.21.0" + resolved "https://registry.npmjs.org/@lerna/init/-/init-3.21.0.tgz#1e810934dc8bf4e5386c031041881d3b4096aa5c" + integrity sha512-6CM0z+EFUkFfurwdJCR+LQQF6MqHbYDCBPyhu/d086LRf58GtYZYj49J8mKG9ktayp/TOIxL/pKKjgLD8QBPOg== dependencies: "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" fs-extra "^8.1.0" p-map "^2.1.0" write-json-file "^3.2.0" -"@lerna/link@3.18.5": - version "3.18.5" - resolved "https://registry.npmjs.org/@lerna/link/-/link-3.18.5.tgz#f24347e4f0b71d54575bd37cfa1794bc8ee91b18" - integrity sha512-xTN3vktJpkT7Nqc3QkZRtHO4bT5NvuLMtKNIBDkks0HpGxC9PRyyqwOoCoh1yOGbrWIuDezhfMg3Qow+6I69IQ== +"@lerna/link@3.21.0": + version "3.21.0" + resolved "https://registry.npmjs.org/@lerna/link/-/link-3.21.0.tgz#8be68ff0ccee104b174b5bbd606302c2f06e9d9b" + integrity sha512-tGu9GxrX7Ivs+Wl3w1+jrLi1nQ36kNI32dcOssij6bg0oZ2M2MDEFI9UF2gmoypTaN9uO5TSsjCFS7aR79HbdQ== dependencies: - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/package-graph" "3.18.5" "@lerna/symlink-dependencies" "3.17.0" p-map "^2.1.0" slash "^2.0.0" -"@lerna/list@3.20.0": - version "3.20.0" - resolved "https://registry.npmjs.org/@lerna/list/-/list-3.20.0.tgz#7e67cc29c5cf661cfd097e8a7c2d3dcce7a81029" - integrity sha512-fXTicPrfioVnRzknyPawmYIVkzDRBaQqk9spejS1S3O1DOidkihK0xxNkr8HCVC0L22w6f92g83qWDp2BYRUbg== +"@lerna/list@3.21.0": + version "3.21.0" + resolved "https://registry.npmjs.org/@lerna/list/-/list-3.21.0.tgz#42f76fafa56dea13b691ec8cab13832691d61da2" + integrity sha512-KehRjE83B1VaAbRRkRy6jLX1Cin8ltsrQ7FHf2bhwhRHK0S54YuA6LOoBnY/NtA8bHDX/Z+G5sMY78X30NS9tg== dependencies: - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/filter-options" "3.20.0" "@lerna/listable" "3.18.5" "@lerna/output" "3.13.0" @@ -1962,25 +1962,7 @@ npmlog "^4.1.2" upath "^1.2.0" -"@lerna/project@3.18.0": - version "3.18.0" - resolved "https://registry.npmjs.org/@lerna/project/-/project-3.18.0.tgz#56feee01daeb42c03cbdf0ed8a2a10cbce32f670" - integrity sha512-+LDwvdAp0BurOAWmeHE3uuticsq9hNxBI0+FMHiIai8jrygpJGahaQrBYWpwbshbQyVLeQgx3+YJdW2TbEdFWA== - dependencies: - "@lerna/package" "3.16.0" - "@lerna/validation-error" "3.13.0" - cosmiconfig "^5.1.0" - dedent "^0.7.0" - dot-prop "^4.2.0" - glob-parent "^5.0.0" - globby "^9.2.0" - load-json-file "^5.3.0" - npmlog "^4.1.2" - p-map "^2.1.0" - resolve-from "^4.0.0" - write-json-file "^3.2.0" - -"@lerna/project@^3.18.0": +"@lerna/project@3.21.0", "@lerna/project@^3.18.0": version "3.21.0" resolved "https://registry.npmjs.org/@lerna/project/-/project-3.21.0.tgz#5d784d2d10c561a00f20320bcdb040997c10502d" integrity sha512-xT1mrpET2BF11CY32uypV2GPtPVm6Hgtha7D81GQP9iAitk9EccrdNjYGt5UBYASl4CIDXBRxwmTTVGfrCx82A== @@ -2006,10 +1988,10 @@ inquirer "^6.2.0" npmlog "^4.1.2" -"@lerna/publish@3.20.2": - version "3.20.2" - resolved "https://registry.npmjs.org/@lerna/publish/-/publish-3.20.2.tgz#a45d29813099b3249657ea913d0dc3f8ebc5cc2e" - integrity sha512-N7Y6PdhJ+tYQPdI1tZum8W25cDlTp4D6brvRacKZusweWexxaopbV8RprBaKexkEX/KIbncuADq7qjDBdQHzaA== +"@lerna/publish@3.22.0": + version "3.22.0" + resolved "https://registry.npmjs.org/@lerna/publish/-/publish-3.22.0.tgz#7a3fb61026d3b7425f3b9a1849421f67d795c55d" + integrity sha512-8LBeTLBN8NIrCrLGykRu+PKrfrCC16sGCVY0/bzq9TDioR7g6+cY0ZAw653Qt/0Kr7rg3J7XxVNdzj3fvevlwA== dependencies: "@evocateur/libnpmaccess" "^3.1.2" "@evocateur/npm-registry-fetch" "^4.0.0" @@ -2017,7 +1999,7 @@ "@lerna/check-working-tree" "3.16.5" "@lerna/child-process" "3.16.5" "@lerna/collect-updates" "3.20.0" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/describe-ref" "3.16.5" "@lerna/log-packed" "3.16.0" "@lerna/npm-conf" "3.16.0" @@ -2032,7 +2014,7 @@ "@lerna/run-lifecycle" "3.16.2" "@lerna/run-topologically" "3.18.5" "@lerna/validation-error" "3.13.0" - "@lerna/version" "3.20.2" + "@lerna/version" "3.22.0" figgy-pudding "^3.5.1" fs-extra "^8.1.0" npm-package-arg "^6.1.0" @@ -2095,12 +2077,12 @@ figgy-pudding "^3.5.1" p-queue "^4.0.0" -"@lerna/run@3.20.0": - version "3.20.0" - resolved "https://registry.npmjs.org/@lerna/run/-/run-3.20.0.tgz#a479f7c42bdf9ebabb3a1e5a2bdebb7a8d201151" - integrity sha512-9U3AqeaCeB7KsGS9oyKNp62s9vYoULg/B4cqXTKZkc+OKL6QOEjYHYVSBcMK9lUXrMjCjDIuDSX3PnTCPxQ2Dw== +"@lerna/run@3.21.0": + version "3.21.0" + resolved "https://registry.npmjs.org/@lerna/run/-/run-3.21.0.tgz#2a35ec84979e4d6e42474fe148d32e5de1cac891" + integrity sha512-fJF68rT3veh+hkToFsBmUJ9MHc9yGXA7LSDvhziAojzOb0AI/jBDp6cEcDQyJ7dbnplba2Lj02IH61QUf9oW0Q== dependencies: - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/filter-options" "3.20.0" "@lerna/npm-run-script" "3.16.5" "@lerna/output" "3.13.0" @@ -2145,17 +2127,17 @@ dependencies: npmlog "^4.1.2" -"@lerna/version@3.20.2": - version "3.20.2" - resolved "https://registry.npmjs.org/@lerna/version/-/version-3.20.2.tgz#3709141c0f537741d9bc10cb24f56897bcb30428" - integrity sha512-ckBJMaBWc+xJen0cMyCE7W67QXLLrc0ELvigPIn8p609qkfNM0L0CF803MKxjVOldJAjw84b8ucNWZLvJagP/Q== +"@lerna/version@3.22.0": + version "3.22.0" + resolved "https://registry.npmjs.org/@lerna/version/-/version-3.22.0.tgz#67e1340c1904e9b339becd66429f32dd8ad65a55" + integrity sha512-6uhL6RL7/FeW6u1INEgyKjd5dwO8+IsbLfkfC682QuoVLS7VG6OOB+JmTpCvnuyYWI6fqGh1bRk9ww8kPsj+EA== dependencies: "@lerna/check-working-tree" "3.16.5" "@lerna/child-process" "3.16.5" "@lerna/collect-updates" "3.20.0" - "@lerna/command" "3.18.5" - "@lerna/conventional-commits" "3.18.5" - "@lerna/github-client" "3.16.5" + "@lerna/command" "3.21.0" + "@lerna/conventional-commits" "3.22.0" + "@lerna/github-client" "3.22.0" "@lerna/gitlab-client" "3.15.0" "@lerna/output" "3.13.0" "@lerna/prerelease-id-from-version" "3.16.0" @@ -2340,10 +2322,10 @@ is-plain-object "^3.0.0" universal-user-agent "^5.0.0" -"@octokit/plugin-enterprise-rest@^3.6.1": - version "3.6.2" - resolved "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-3.6.2.tgz#74de25bef21e0182b4fa03a8678cd00a4e67e561" - integrity sha512-3wF5eueS5OHQYuAEudkpN+xVeUsg8vYEMMenEzLphUZ7PRZ8OJtDcsreL3ad9zxXmBbaFWzLmFcdob5CLyZftA== +"@octokit/plugin-enterprise-rest@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" + integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== "@octokit/plugin-paginate-rest@^1.1.1": version "1.1.2" @@ -12041,26 +12023,26 @@ left-pad@^1.3.0: integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== lerna@^3.20.2: - version "3.20.2" - resolved "https://registry.npmjs.org/lerna/-/lerna-3.20.2.tgz#abf84e73055fe84ee21b46e64baf37b496c24864" - integrity sha512-bjdL7hPLpU3Y8CBnw/1ys3ynQMUjiK6l9iDWnEGwFtDy48Xh5JboR9ZJwmKGCz9A/sarVVIGwf1tlRNKUG9etA== + version "3.22.0" + resolved "https://registry.npmjs.org/lerna/-/lerna-3.22.0.tgz#da14d08f183ffe6eec566a4ef3f0e11afa621183" + integrity sha512-xWlHdAStcqK/IjKvjsSMHPZjPkBV1lS60PmsIeObU8rLljTepc4Sg/hncw4HWfQxPIewHAUTqhrxPIsqf9L2Eg== dependencies: - "@lerna/add" "3.20.0" - "@lerna/bootstrap" "3.20.0" - "@lerna/changed" "3.20.0" - "@lerna/clean" "3.20.0" + "@lerna/add" "3.21.0" + "@lerna/bootstrap" "3.21.0" + "@lerna/changed" "3.21.0" + "@lerna/clean" "3.21.0" "@lerna/cli" "3.18.5" - "@lerna/create" "3.18.5" - "@lerna/diff" "3.18.5" - "@lerna/exec" "3.20.0" - "@lerna/import" "3.18.5" - "@lerna/info" "3.20.0" - "@lerna/init" "3.18.5" - "@lerna/link" "3.18.5" - "@lerna/list" "3.20.0" - "@lerna/publish" "3.20.2" - "@lerna/run" "3.20.0" - "@lerna/version" "3.20.2" + "@lerna/create" "3.22.0" + "@lerna/diff" "3.21.0" + "@lerna/exec" "3.21.0" + "@lerna/import" "3.22.0" + "@lerna/info" "3.21.0" + "@lerna/init" "3.21.0" + "@lerna/link" "3.21.0" + "@lerna/list" "3.21.0" + "@lerna/publish" "3.22.0" + "@lerna/run" "3.21.0" + "@lerna/version" "3.22.0" import-local "^2.0.0" npmlog "^4.1.2" From 6ded51f598118686a6c8fec09f3b5cfea8aab1c4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2020 15:19:36 +0200 Subject: [PATCH 060/192] build(deps-dev): bump tsc-watch from 4.2.5 to 4.2.8 (#1100) Bumps [tsc-watch](https://github.com/gilamran/tsc-watch) from 4.2.5 to 4.2.8. - [Release notes](https://github.com/gilamran/tsc-watch/releases) - [Changelog](https://github.com/gilamran/tsc-watch/blob/master/CHANGELOG.md) - [Commits](https://github.com/gilamran/tsc-watch/commits) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5ad99a6b67..40e01e639c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6788,7 +6788,7 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@7.0.1, cross-spawn@^7.0.0, cross-spawn@^7.0.1: +cross-spawn@7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg== @@ -6806,7 +6806,7 @@ cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.2: +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -18127,9 +18127,9 @@ ts-pnp@^1.1.2: integrity sha512-CrG5GqAAzMT7144Cl+UIFP7mz/iIhiy+xQ6GGcnjTezhALT02uPMRw7tgDSESgB5MsfKt55+GPWw4ir1kVtMIQ== tsc-watch@^4.2.3: - version "4.2.5" - resolved "https://registry.npmjs.org/tsc-watch/-/tsc-watch-4.2.5.tgz#3ee680cfd02087bb76cbecd2d5f290a0d6302454" - integrity sha512-scXpL5SFJevvtKOtQIRxJvyEwCKSIZS9bDrO/cy/dWlETTVwSlfRm2WmakdRPM0Rg90DbYyJjkUr2z74HXcxzQ== + version "4.2.8" + resolved "https://registry.npmjs.org/tsc-watch/-/tsc-watch-4.2.8.tgz#cb8639bf507738dfa64590504f539a2f525d3a7b" + integrity sha512-EtWdmVZYFxTxSHqtmpowtvC/son28Hgl3qxYnD6sy+uGQXsWYDQxwmL8EneWca2kzAIYNZq3CGrUdK1jjbL4Vw== dependencies: cross-spawn "^5.1.0" node-cleanup "^2.1.2" From 239c1a0e3ff31c72481ca6b022935623cd20bcb5 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Wed, 3 Jun 2020 16:39:07 +0200 Subject: [PATCH 061/192] Add NavLink, NavButton components --- .../NavButton/NavButton.stories.tsx | 95 +++++++++++++++++++ .../components/NavButton/NavButton.test.jsx | 40 ++++++++ .../src/components/NavButton/NavButton.tsx | 29 ++++++ .../core/src/components/NavButton/index.ts | 17 ++++ .../components/NavLink/NavLink.stories.tsx | 94 ++++++++++++++++++ .../src/components/NavLink/NavLink.test.jsx | 40 ++++++++ .../core/src/components/NavLink/NavLink.tsx | 29 ++++++ packages/core/src/components/NavLink/index.ts | 17 ++++ packages/core/src/index.ts | 2 + 9 files changed, 363 insertions(+) create mode 100644 packages/core/src/components/NavButton/NavButton.stories.tsx create mode 100644 packages/core/src/components/NavButton/NavButton.test.jsx create mode 100644 packages/core/src/components/NavButton/NavButton.tsx create mode 100644 packages/core/src/components/NavButton/index.ts create mode 100644 packages/core/src/components/NavLink/NavLink.stories.tsx create mode 100644 packages/core/src/components/NavLink/NavLink.test.jsx create mode 100644 packages/core/src/components/NavLink/NavLink.tsx create mode 100644 packages/core/src/components/NavLink/index.ts diff --git a/packages/core/src/components/NavButton/NavButton.stories.tsx b/packages/core/src/components/NavButton/NavButton.stories.tsx new file mode 100644 index 0000000000..10ed2286cb --- /dev/null +++ b/packages/core/src/components/NavButton/NavButton.stories.tsx @@ -0,0 +1,95 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React, { FunctionComponentFactory } from 'react'; +import { NavButton } from './NavButton'; +import { + MemoryRouter, + Route, + useLocation, + NavLink as RouterNavLink, +} from 'react-router-dom'; +import { createRouteRef } from '@backstage/core-api'; + +const Location = () => { + const location = useLocation(); + return
Current location: {location.pathname}
; +}; + +export default { + title: 'NavButton', + component: NavButton, + decorators: [ + (storyFn: FunctionComponentFactory<{}>) => ( + +
+
+ +
+ {storyFn()} +
+
+ ), + ], +}; + +export const Default = () => { + const routeRef = createRouteRef({ + icon: () => null, + path: '/hello', + title: 'Hi there!', + }); + + return ( + <> + This button will utilise + the react-router MemoryRouter's navigation + +

{routeRef.title}

+
+ + ); +}; + +export const PassProps = () => { + const routeRef = createRouteRef({ + icon: () => null, + path: '/hello', + title: 'Hi there!', + }); + + return ( + <> + + This link + +  has props for both material-ui's component as well as for + react-router-dom's + +

{routeRef.title}

+
+ + ); +}; +PassProps.story = { + name: `Accepts material-ui Button's and react-router-dom Link's props`, +}; diff --git a/packages/core/src/components/NavButton/NavButton.test.jsx b/packages/core/src/components/NavButton/NavButton.test.jsx new file mode 100644 index 0000000000..7562b70b0e --- /dev/null +++ b/packages/core/src/components/NavButton/NavButton.test.jsx @@ -0,0 +1,40 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import { render, fireEvent } from '@testing-library/react'; +import { wrapInTestApp } from '@backstage/test-utils'; +import { NavButton } from './NavButton'; +import { MemoryRouter, Route } from 'react-router'; +import { act } from 'react-dom/test-utils'; + +describe('', () => { + it('navigates using react-router', async () => { + const testString = 'This is test string'; + const buttonLabel = 'Navigate!'; + const { getByText } = render( + wrapInTestApp( + + {buttonLabel} + {testString}{' '} + , + ), + ); + expect(() => getByText(testString)).toThrow(); + await act(async () => fireEvent.click(getByText(buttonLabel))); + expect(getByText(testString)).toBeInTheDocument(); + }); +}); diff --git a/packages/core/src/components/NavButton/NavButton.tsx b/packages/core/src/components/NavButton/NavButton.tsx new file mode 100644 index 0000000000..a2bca07934 --- /dev/null +++ b/packages/core/src/components/NavButton/NavButton.tsx @@ -0,0 +1,29 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { ComponentProps } from 'react'; +import { Button } from '@material-ui/core'; +import { Link as RouterLink } from 'react-router-dom'; + +type Props = ComponentProps & ComponentProps; + +/** + * Thin wrapper on top of material-ui's Button component + * Makes the Button to utilise react-router + */ +export const NavButton = React.forwardRef((props, ref) => ( +  will utilise the + react-router MemoryRouter's navigation

{routeRef.title}

@@ -65,23 +64,22 @@ export const Default = () => { export const PassProps = () => { const routeRef = createRouteRef({ - icon: () => null, path: '/hello', title: 'Hi there!', }); return ( <> - This link - +  has props for both material-ui's component as well as for react-router-dom's diff --git a/packages/core/src/components/NavButton/NavButton.test.jsx b/packages/core/src/components/Button/Button.test.jsx similarity index 90% rename from packages/core/src/components/NavButton/NavButton.test.jsx rename to packages/core/src/components/Button/Button.test.jsx index 7562b70b0e..2563d367c2 100644 --- a/packages/core/src/components/NavButton/NavButton.test.jsx +++ b/packages/core/src/components/Button/Button.test.jsx @@ -17,18 +17,18 @@ import React from 'react'; import { render, fireEvent } from '@testing-library/react'; import { wrapInTestApp } from '@backstage/test-utils'; -import { NavButton } from './NavButton'; +import { Button } from './Button'; import { MemoryRouter, Route } from 'react-router'; import { act } from 'react-dom/test-utils'; -describe('', () => { +describe(' {testString}{' '} , ), diff --git a/packages/core/src/components/NavButton/NavButton.tsx b/packages/core/src/components/Button/Button.tsx similarity index 73% rename from packages/core/src/components/NavButton/NavButton.tsx rename to packages/core/src/components/Button/Button.tsx index a2bca07934..ca45b3da7f 100644 --- a/packages/core/src/components/NavButton/NavButton.tsx +++ b/packages/core/src/components/Button/Button.tsx @@ -15,15 +15,16 @@ */ import React, { ComponentProps } from 'react'; -import { Button } from '@material-ui/core'; +import { Button as MaterialButton } from '@material-ui/core'; import { Link as RouterLink } from 'react-router-dom'; -type Props = ComponentProps & ComponentProps; +type Props = ComponentProps & + ComponentProps; /** * Thin wrapper on top of material-ui's Button component * Makes the Button to utilise react-router */ -export const NavButton = React.forwardRef((props, ref) => ( - - - - )} - + {formState === FormStates.Success && ( + setFormState(FormStates.Idle)} + classes={{ paper: classes.dialogPaper }} + /> + )} ); }; diff --git a/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.test.tsx b/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.test.tsx new file mode 100644 index 0000000000..284e83121c --- /dev/null +++ b/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.test.tsx @@ -0,0 +1,80 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { ComponentProps } from 'react'; +import { render, cleanup } from '@testing-library/react'; +import { RegisterComponentResultDialog } from './RegisterComponentResultDialog'; +import { ThemeProvider } from '@material-ui/core'; +import { lightTheme } from '@backstage/theme'; +import { MemoryRouter } from 'react-router-dom'; +import { Entity } from '@backstage/catalog-model'; + +const setup = ( + props?: Partial>, +) => ({ + rendered: render( + + + {}} + entities={[]} + {...props} + /> + + , + ), +}); +describe('RegisterComponentResultDialog', () => { + afterEach(() => cleanup()); + + it('should render', () => { + const { rendered } = setup(); + expect( + rendered.getByText('Component registration result'), + ).toBeInTheDocument(); + }); +}); + +it('should show a list of components if success', async () => { + const { rendered } = setup({ + entities: [ + { + kind: 'Component', + metadata: { + name: 'Component1', + }, + spec: { + type: 'website', + }, + }, + { + kind: 'Component', + metadata: { + name: 'Component2', + }, + spec: { + type: 'service', + }, + }, + ] as Entity[], + }); + + expect( + rendered.getByText('Following components have been succefully created:'), + ).toBeInTheDocument(); + expect(rendered.getByText('Component1')).toBeInTheDocument(); + expect(rendered.getByText('Component2')).toBeInTheDocument(); +}); diff --git a/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.tsx b/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.tsx new file mode 100644 index 0000000000..ead7323870 --- /dev/null +++ b/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.tsx @@ -0,0 +1,93 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { FC } from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + List, + ListItem, + Link, + Divider, + DialogActions, + Button, +} from '@material-ui/core'; +import { Entity } from '@backstage/catalog-model'; +import { StructuredMetadataTable } from '@backstage/core'; +import { generatePath } from 'react-router'; +import { + entityRoute, + rootRoute as catalogRootRoute, +} from '@backstage/plugin-catalog'; +import { Link as RouterLink } from 'react-router-dom'; + +type Props = { + onClose: () => void; + classes?: Record; + entities: Entity[]; +}; + +export const RegisterComponentResultDialog: FC = ({ + onClose, + classes, + entities, +}) => ( + + Component registration result + + + Following components have been succefully created: + + + {entities.map((entity: any, index: number) => ( + + + + {generatePath(entityRoute.path, { + name: entity.metadata.name, + })} + + ), + }} + /> + + {index < entities.length - 1 && } + + ))} + + + + + + +); diff --git a/plugins/register-component/src/components/RegisterComponentResultDialog/index.ts b/plugins/register-component/src/components/RegisterComponentResultDialog/index.ts new file mode 100644 index 0000000000..7ed25f3c20 --- /dev/null +++ b/plugins/register-component/src/components/RegisterComponentResultDialog/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { RegisterComponentResultDialog } from './RegisterComponentResultDialog'; From c2369b7be68c659b1367a141a91b77cf3c8859bb Mon Sep 17 00:00:00 2001 From: Sebastian Qvarfordt Date: Thu, 4 Jun 2020 17:05:51 +0200 Subject: [PATCH 116/192] Added working link button --- plugins/catalog/src/data/utils.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/plugins/catalog/src/data/utils.tsx b/plugins/catalog/src/data/utils.tsx index 71661ead53..dc72f1ce14 100644 --- a/plugins/catalog/src/data/utils.tsx +++ b/plugins/catalog/src/data/utils.tsx @@ -17,6 +17,13 @@ import React from 'react'; import { Component } from './component'; import { Entity, Location } from '@backstage/catalog-model'; import Edit from '@material-ui/icons/Edit'; +import IconButton from '@material-ui/core/IconButton'; +import { styled } from '@material-ui/core/styles'; + +const DescriptionWrapper = styled('span')({ + display: 'flex', + alignItems: 'center', +}); export function envelopeToComponent( envelope: Entity, @@ -26,10 +33,14 @@ export function envelopeToComponent( name: envelope.metadata?.name ?? '', kind: envelope.kind ?? 'unknown', description: ( - + {envelope.metadata?.annotations?.description ?? 'placeholder'} - - + + + + + + ), location, }; From 163be0eafe08e4128639156632a9b1038e219c9c Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 4 Jun 2020 17:06:09 +0200 Subject: [PATCH 117/192] Addressed PR comments --- plugins/catalog/src/api/CatalogClient.ts | 2 +- plugins/catalog/src/api/types.ts | 7 +++---- plugins/catalog/src/routes.ts | 10 +--------- .../RegisterComponentResultDialog.test.tsx | 6 ++++-- .../RegisterComponentResultDialog.tsx | 4 ++-- 5 files changed, 11 insertions(+), 18 deletions(-) diff --git a/plugins/catalog/src/api/CatalogClient.ts b/plugins/catalog/src/api/CatalogClient.ts index 2e019982dc..429ae5f0a2 100644 --- a/plugins/catalog/src/api/CatalogClient.ts +++ b/plugins/catalog/src/api/CatalogClient.ts @@ -62,7 +62,7 @@ export class CatalogClient implements CatalogApi { const { location, entities } = await response.json(); if (!location || entities.length === 0) - throw new Error(`'Location wasn't added: ${target}`); + throw new Error(`Location wasn't added: ${target}`); return { location, diff --git a/plugins/catalog/src/api/types.ts b/plugins/catalog/src/api/types.ts index 1418ea17fa..a01270e7d8 100644 --- a/plugins/catalog/src/api/types.ts +++ b/plugins/catalog/src/api/types.ts @@ -25,8 +25,7 @@ export const catalogApiRef = createApiRef({ export interface CatalogApi { getEntities(): Promise; getEntityByName(name: string): Promise; - addLocation( - type: string, - target: string, - ): Promise<{ location: Location; entities: Entity[] }>; + addLocation(type: string, target: string): Promise; } + +export type AddLocationResponse = { location: Location; entities: Entity[] }; diff --git a/plugins/catalog/src/routes.ts b/plugins/catalog/src/routes.ts index 830dc6d48f..6498d412b8 100644 --- a/plugins/catalog/src/routes.ts +++ b/plugins/catalog/src/routes.ts @@ -14,15 +14,7 @@ * limitations under the License. */ -/* - * Hi! - * - * Note that this is an EXAMPLE Backstage backend. Please check the README. - * - * Happy hacking! - */ - - import { createRouteRef } from '@backstage/core'; +import { createRouteRef } from '@backstage/core'; const NoIcon = () => null; diff --git a/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.test.tsx b/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.test.tsx index 284e83121c..d918e72489 100644 --- a/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.test.tsx +++ b/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.test.tsx @@ -43,7 +43,7 @@ describe('RegisterComponentResultDialog', () => { it('should render', () => { const { rendered } = setup(); expect( - rendered.getByText('Component registration result'), + rendered.getByText('Component Registration Result'), ).toBeInTheDocument(); }); }); @@ -73,7 +73,9 @@ it('should show a list of components if success', async () => { }); expect( - rendered.getByText('Following components have been succefully created:'), + rendered.getByText( + 'The following components have been succefully created:', + ), ).toBeInTheDocument(); expect(rendered.getByText('Component1')).toBeInTheDocument(); expect(rendered.getByText('Component2')).toBeInTheDocument(); diff --git a/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.tsx b/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.tsx index ead7323870..4d158526a0 100644 --- a/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.tsx +++ b/plugins/register-component/src/components/RegisterComponentResultDialog/RegisterComponentResultDialog.tsx @@ -48,10 +48,10 @@ export const RegisterComponentResultDialog: FC = ({ entities, }) => ( - Component registration result + Component Registration Result - Following components have been succefully created: + The following components have been succefully created: {entities.map((entity: any, index: number) => ( From f0a95a97623cf3a2b873352df6c4b75dd3df3428 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 4 Jun 2020 17:15:58 +0200 Subject: [PATCH 118/192] Fix types --- .../RegisterComponentPage/RegisterComponentPage.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.test.tsx b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.test.tsx index d35691eadc..ad47c3a41b 100644 --- a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.test.tsx +++ b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.test.tsx @@ -29,6 +29,7 @@ const catalogApi: jest.Mocked = { addLocation: jest.fn((_a, _b) => new Promise(() => {})), getEntities: jest.fn(), getEntityByName: jest.fn(), + getLocationByEntity: jest.fn(), }; const setup = () => ({ From c5425c5664c96cf4fcf97dd082f51d402594a49c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 4 Jun 2020 11:41:44 +0200 Subject: [PATCH 119/192] packages/cli,config,config-loader: point straight to src and build with build --- packages/cli/src/lib/tasks.ts | 5 +++++ packages/config-loader/package.json | 5 ++--- packages/config/package.json | 5 ++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/cli/src/lib/tasks.ts b/packages/cli/src/lib/tasks.ts index e32bb7fbce..f16022ee97 100644 --- a/packages/cli/src/lib/tasks.ts +++ b/packages/cli/src/lib/tasks.ts @@ -194,6 +194,11 @@ export async function installWithLocalDeps(dir: string) { delete depJson['main:src']; depJson.types = 'dist/index.d.ts'; + // Ugly hack until backend packages can point straight to source + if (name === 'config' || name === 'config-loader') { + depJson.main = 'dist/index.cjs.js'; + } + await fs .writeJSON(depJsonPath, depJson, { encoding: 'utf8', spaces: 2 }) .catch(error => { diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index afa1ac3ea2..9f403af7e8 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -16,11 +16,10 @@ "backstage" ], "license": "Apache-2.0", - "main": "dist/index.esm.js", - "main:src": "src/index.ts", + "main": "src/index.ts", "types": "src/index.ts", "scripts": { - "build": "backstage-cli plugin:build", + "build": "backstage-cli build", "lint": "backstage-cli lint", "test": "backstage-cli test", "prepack": "backstage-cli prepack", diff --git a/packages/config/package.json b/packages/config/package.json index 9371988ddd..244fbe5799 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -16,11 +16,10 @@ "backstage" ], "license": "Apache-2.0", - "main": "dist/index.esm.js", - "main:src": "src/index.ts", + "main": "src/index.ts", "types": "src/index.ts", "scripts": { - "build": "backstage-cli plugin:build", + "build": "backstage-cli build", "lint": "backstage-cli lint", "test": "backstage-cli test", "prepack": "backstage-cli prepack", From 8a0ccc1bcd179e682ac66f85fbbe0619da685010 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 4 Jun 2020 11:00:08 +0200 Subject: [PATCH 120/192] packages/cli: pass config reader to bundler --- packages/cli/src/commands/app/build.ts | 7 +++++-- packages/cli/src/commands/app/serve.ts | 7 +++++-- packages/cli/src/commands/plugin/serve.ts | 7 +++++-- packages/cli/src/lib/bundler/types.ts | 11 +++++++---- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/cli/src/commands/app/build.ts b/packages/cli/src/commands/app/build.ts index d09b2abcdd..4ecf54f532 100644 --- a/packages/cli/src/commands/app/build.ts +++ b/packages/cli/src/commands/app/build.ts @@ -14,14 +14,17 @@ * limitations under the License. */ -import { buildBundle } from '../../lib/bundler'; import { Command } from 'commander'; import { loadConfig } from '@backstage/config-loader'; +import { ConfigReader } from '@backstage/config'; +import { buildBundle } from '../../lib/bundler'; export default async (cmd: Command) => { + const appConfigs = await loadConfig(); await buildBundle({ entry: 'src/index', statsJsonEnabled: cmd.stats, - appConfig: await loadConfig(), + config: ConfigReader.fromConfigs(appConfigs), + appConfigs, }); }; diff --git a/packages/cli/src/commands/app/serve.ts b/packages/cli/src/commands/app/serve.ts index 5758aa2bf2..023a3a4663 100644 --- a/packages/cli/src/commands/app/serve.ts +++ b/packages/cli/src/commands/app/serve.ts @@ -15,14 +15,17 @@ */ import { Command } from 'commander'; -import { serveBundle } from '../../lib/bundler'; import { loadConfig } from '@backstage/config-loader'; +import { ConfigReader } from '@backstage/config'; +import { serveBundle } from '../../lib/bundler'; export default async (cmd: Command) => { + const appConfigs = await loadConfig(); const waitForExit = await serveBundle({ entry: 'src/index', checksEnabled: cmd.check, - appConfig: await loadConfig(), + config: ConfigReader.fromConfigs(appConfigs), + appConfigs, }); await waitForExit(); diff --git a/packages/cli/src/commands/plugin/serve.ts b/packages/cli/src/commands/plugin/serve.ts index 9cc6cf55d0..57b939fa63 100644 --- a/packages/cli/src/commands/plugin/serve.ts +++ b/packages/cli/src/commands/plugin/serve.ts @@ -15,14 +15,17 @@ */ import { Command } from 'commander'; -import { serveBundle } from '../../lib/bundler'; import { loadConfig } from '@backstage/config-loader'; +import { ConfigReader } from '@backstage/config'; +import { serveBundle } from '../../lib/bundler'; export default async (cmd: Command) => { + const appConfigs = await loadConfig(); const waitForExit = await serveBundle({ entry: 'dev/index', checksEnabled: cmd.check, - appConfig: await loadConfig(), + config: ConfigReader.fromConfigs(appConfigs), + appConfigs, }); await waitForExit(); diff --git a/packages/cli/src/lib/bundler/types.ts b/packages/cli/src/lib/bundler/types.ts index 9ebd668fea..332a105182 100644 --- a/packages/cli/src/lib/bundler/types.ts +++ b/packages/cli/src/lib/bundler/types.ts @@ -14,21 +14,24 @@ * limitations under the License. */ -import { AppConfig } from '@backstage/config'; +import { AppConfig, Config } from '@backstage/config'; import { BundlingPathsOptions } from './paths'; export type BundlingOptions = { checksEnabled: boolean; isDev: boolean; - appConfig: AppConfig[]; + config: Config; + appConfigs: AppConfig[]; }; export type ServeOptions = BundlingPathsOptions & { checksEnabled: boolean; - appConfig: AppConfig[]; + config: Config; + appConfigs: AppConfig[]; }; export type BuildOptions = BundlingPathsOptions & { statsJsonEnabled: boolean; - appConfig: AppConfig[]; + config: Config; + appConfigs: AppConfig[]; }; From 8269b81a6758d2c03ab85c63e34c9fb63d72b691 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 3 Jun 2020 15:27:08 +0200 Subject: [PATCH 121/192] packages/cli: mimic upcoming publishConfig behavior in prepack --- packages/cli/src/commands/pack.ts | 15 +++++++++------ packages/cli/src/lib/diff/handlers.ts | 4 ++++ packages/cli/src/lib/tasks.ts | 11 +++++------ 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/packages/cli/src/commands/pack.ts b/packages/cli/src/commands/pack.ts index ba9c7725ae..51c7e36086 100644 --- a/packages/cli/src/commands/pack.ts +++ b/packages/cli/src/commands/pack.ts @@ -17,18 +17,21 @@ import fs from 'fs-extra'; import { paths } from '../lib/paths'; +const SKIPPED_KEYS = ['access', 'registry', 'tag']; + export const pre = async () => { const pkgPath = paths.resolveTarget('package.json'); const pkg = await fs.readJson(pkgPath); - pkg.types = 'dist/index.d.ts'; + + for (const key of Object.keys(pkg.publishConfig ?? {})) { + if (!SKIPPED_KEYS.includes(key)) { + pkg[key] = pkg.publishConfig[key]; + } + } await fs.writeJson(pkgPath, pkg, { encoding: 'utf8', spaces: 2 }); }; export const post = async () => { - const pkgPath = paths.resolveTarget('package.json'); - - const pkg = await fs.readJson(pkgPath); - pkg.types = 'src/index.ts'; - await fs.writeJson(pkgPath, pkg, { encoding: 'utf8', spaces: 2 }); + // postpack is a noop for now, since it's not called anyway }; diff --git a/packages/cli/src/lib/diff/handlers.ts b/packages/cli/src/lib/diff/handlers.ts index c4efacb198..40e3d4c587 100644 --- a/packages/cli/src/lib/diff/handlers.ts +++ b/packages/cli/src/lib/diff/handlers.ts @@ -130,6 +130,10 @@ class PackageJsonHandler { // Publish config can be removed the the target, skip in that case if (!targetPublishConf) { + if (await this.prompt('Missing publishConfig, do you want to add it?')) { + this.targetPkg.publishConfig = pkgPublishConf; + await this.write(); + } return; } diff --git a/packages/cli/src/lib/tasks.ts b/packages/cli/src/lib/tasks.ts index f16022ee97..c9b2ca94ed 100644 --- a/packages/cli/src/lib/tasks.ts +++ b/packages/cli/src/lib/tasks.ts @@ -175,7 +175,7 @@ export async function installWithLocalDeps(dir: string) { // types to dist/index.d.ts and the main:src field is removed. // Without this we get type checking errors in the e2e test if (process.env.BACKSTAGE_E2E_CLI_TEST) { - Task.section('Patchling local dependencies for e2e tests'); + Task.section('Patching local dependencies for e2e tests'); for (const name of PATCH_PACKAGES) { await Task.forItem( @@ -192,11 +192,10 @@ export async function installWithLocalDeps(dir: string) { // We want dist to be used for e2e tests delete depJson['main:src']; - depJson.types = 'dist/index.d.ts'; - - // Ugly hack until backend packages can point straight to source - if (name === 'config' || name === 'config-loader') { - depJson.main = 'dist/index.cjs.js'; + for (const key of Object.keys(depJson.publishConfig)) { + if (key !== 'access') { + depJson[key] = depJson.publishConfig[key]; + } } await fs From 0d1655c65b5a109adc9dac6eb6eddd745e6fa932 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 4 Jun 2020 17:46:59 +0200 Subject: [PATCH 122/192] packages,plugins: use publishConfig to configure published entrypoints --- packages/catalog-model/package.json | 5 ++++- .../templates/default-app/plugins/welcome/package.json.hbs | 4 ++++ packages/cli/templates/default-plugin/package.json.hbs | 4 +++- packages/config-loader/package.json | 5 ++++- packages/config/package.json | 5 ++++- packages/core-api/package.json | 4 +++- packages/core/package.json | 4 +++- packages/dev-utils/package.json | 4 +++- packages/test-utils-core/package.json | 4 +++- packages/test-utils/package.json | 4 +++- packages/theme/package.json | 4 +++- plugins/catalog/package.json | 5 +++++ plugins/circleci/package.json | 5 +++++ plugins/explore/package.json | 5 +++++ plugins/graphiql/package.json | 4 +++- plugins/home-page/package.json | 5 +++++ plugins/lighthouse/package.json | 5 +++++ plugins/register-component/package.json | 5 +++++ plugins/scaffolder/package.json | 5 +++++ plugins/sentry/package.json | 5 +++++ plugins/tech-radar/package.json | 4 +++- plugins/welcome/package.json | 5 +++++ 22 files changed, 88 insertions(+), 12 deletions(-) diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index 2d6df2e34e..2de2e70e8e 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -8,7 +8,10 @@ "license": "Apache-2.0", "private": true, "publishConfig": { - "access": "public" + "access": "public", + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "types": "dist/index.d.ts" }, "scripts": { "build": "backstage-cli build", diff --git a/packages/cli/templates/default-app/plugins/welcome/package.json.hbs b/packages/cli/templates/default-app/plugins/welcome/package.json.hbs index b18839bab6..0bc8fd3d2f 100644 --- a/packages/cli/templates/default-app/plugins/welcome/package.json.hbs +++ b/packages/cli/templates/default-app/plugins/welcome/package.json.hbs @@ -5,6 +5,10 @@ "main:src": "src/index.ts", "types": "src/index.ts", "private": true, + "publishConfig": { + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, "scripts": { "build": "backstage-cli plugin:build", "start": "backstage-cli plugin:serve", diff --git a/packages/cli/templates/default-plugin/package.json.hbs b/packages/cli/templates/default-plugin/package.json.hbs index cd628b0406..c92795cc04 100644 --- a/packages/cli/templates/default-plugin/package.json.hbs +++ b/packages/cli/templates/default-plugin/package.json.hbs @@ -7,7 +7,9 @@ "license": "Apache-2.0", "private": true, "publishConfig": { - "access": "public" + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" }, "scripts": { "build": "backstage-cli plugin:build", diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 9f403af7e8..2641e988d6 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -4,7 +4,10 @@ "version": "0.1.1-alpha.6", "private": false, "publishConfig": { - "access": "public" + "access": "public", + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "types": "dist/index.d.ts" }, "homepage": "https://backstage.io", "repository": { diff --git a/packages/config/package.json b/packages/config/package.json index 244fbe5799..2ff5450a0b 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -4,7 +4,10 @@ "version": "0.1.1-alpha.6", "private": false, "publishConfig": { - "access": "public" + "access": "public", + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "types": "dist/index.d.ts" }, "homepage": "https://backstage.io", "repository": { diff --git a/packages/core-api/package.json b/packages/core-api/package.json index 39a776cf2b..c91a96ab31 100644 --- a/packages/core-api/package.json +++ b/packages/core-api/package.json @@ -4,7 +4,9 @@ "version": "0.1.1-alpha.6", "private": false, "publishConfig": { - "access": "public" + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" }, "homepage": "https://backstage.io", "repository": { diff --git a/packages/core/package.json b/packages/core/package.json index 11fd149f0c..6233f27065 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -4,7 +4,9 @@ "version": "0.1.1-alpha.6", "private": false, "publishConfig": { - "access": "public" + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" }, "homepage": "https://backstage.io", "repository": { diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index ab595ea9a7..eea0956a8b 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -4,7 +4,9 @@ "version": "0.1.1-alpha.6", "private": false, "publishConfig": { - "access": "public" + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" }, "homepage": "https://backstage.io", "repository": { diff --git a/packages/test-utils-core/package.json b/packages/test-utils-core/package.json index 1ebe1bf072..b1ef87729d 100644 --- a/packages/test-utils-core/package.json +++ b/packages/test-utils-core/package.json @@ -4,7 +4,9 @@ "version": "0.1.1-alpha.6", "private": false, "publishConfig": { - "access": "public" + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" }, "homepage": "https://backstage.io", "repository": { diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 136b6d6854..2a9320ee63 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -4,7 +4,9 @@ "version": "0.1.1-alpha.6", "private": false, "publishConfig": { - "access": "public" + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" }, "homepage": "https://backstage.io", "repository": { diff --git a/packages/theme/package.json b/packages/theme/package.json index a5d552a660..501ef6473e 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -4,7 +4,9 @@ "version": "0.1.1-alpha.6", "private": false, "publishConfig": { - "access": "public" + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" }, "homepage": "https://backstage.io", "repository": { diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 0cdc5d2618..5180406176 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -6,6 +6,11 @@ "types": "src/index.ts", "license": "Apache-2.0", "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, "scripts": { "build": "backstage-cli plugin:build", "start": "backstage-cli plugin:serve", diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index bbcac8e9eb..d58ea6b406 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -6,6 +6,11 @@ "types": "src/index.ts", "license": "Apache-2.0", "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, "proxy": { "/circleci/api": { "target": "https://circleci.com/api/v1.1", diff --git a/plugins/explore/package.json b/plugins/explore/package.json index 36e43a96e4..400d212e69 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -6,6 +6,11 @@ "types": "src/index.ts", "license": "Apache-2.0", "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, "scripts": { "build": "backstage-cli plugin:build", "lint": "backstage-cli lint", diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index a3fee6e217..d4141aa367 100644 --- a/plugins/graphiql/package.json +++ b/plugins/graphiql/package.json @@ -4,7 +4,9 @@ "version": "0.1.1-alpha.6", "private": false, "publishConfig": { - "access": "public" + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" }, "homepage": "https://github.com/spotify/backstage/tree/master/plugins/graphiql#readme", "repository": { diff --git a/plugins/home-page/package.json b/plugins/home-page/package.json index fa1236861c..54144cefe3 100644 --- a/plugins/home-page/package.json +++ b/plugins/home-page/package.json @@ -6,6 +6,11 @@ "types": "src/index.ts", "license": "Apache-2.0", "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, "scripts": { "build": "backstage-cli plugin:build", "start": "backstage-cli plugin:serve", diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index d8e2b53ace..fce604b609 100644 --- a/plugins/lighthouse/package.json +++ b/plugins/lighthouse/package.json @@ -6,6 +6,11 @@ "types": "src/index.ts", "license": "Apache-2.0", "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, "scripts": { "build": "backstage-cli plugin:build", "lint": "backstage-cli lint", diff --git a/plugins/register-component/package.json b/plugins/register-component/package.json index 053af6bb51..ac03939eef 100644 --- a/plugins/register-component/package.json +++ b/plugins/register-component/package.json @@ -6,6 +6,11 @@ "types": "src/index.ts", "license": "Apache-2.0", "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, "scripts": { "build": "backstage-cli plugin:build", "start": "backstage-cli plugin:serve", diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index 7f453fde48..9b2f214afe 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -6,6 +6,11 @@ "types": "src/index.ts", "license": "Apache-2.0", "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, "scripts": { "build": "backstage-cli plugin:build", "start": "backstage-cli plugin:serve", diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index 11decb4087..f539afa886 100644 --- a/plugins/sentry/package.json +++ b/plugins/sentry/package.json @@ -6,6 +6,11 @@ "types": "src/index.ts", "license": "Apache-2.0", "private": true, + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, "scripts": { "build": "backstage-cli plugin:build", "start": "backstage-cli plugin:serve", diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index 22568f8b97..5327ce7cfb 100644 --- a/plugins/tech-radar/package.json +++ b/plugins/tech-radar/package.json @@ -7,7 +7,9 @@ "license": "Apache-2.0", "private": false, "publishConfig": { - "access": "public" + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" }, "scripts": { "build": "backstage-cli plugin:build", diff --git a/plugins/welcome/package.json b/plugins/welcome/package.json index b05ef1145f..6debcc9c80 100644 --- a/plugins/welcome/package.json +++ b/plugins/welcome/package.json @@ -6,6 +6,11 @@ "types": "src/index.ts", "private": true, "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, "scripts": { "build": "backstage-cli plugin:build", "lint": "backstage-cli lint", From 945362723d3263a1f21c9bb957a215fb294ccc92 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 4 Jun 2020 11:01:40 +0200 Subject: [PATCH 123/192] packages/cli,app: read config to template html and set up public path --- packages/app/public/index.html | 29 +++++++------------ packages/cli/src/lib/bundler/config.ts | 26 +++++++++++++++-- packages/cli/src/lib/bundler/paths.ts | 19 ++++++++---- packages/cli/src/lib/bundler/server.ts | 4 ++- packages/cli/src/lib/bundler/transforms.ts | 13 +-------- .../cli/templates/default-app/app-config.yaml | 1 + 6 files changed, 52 insertions(+), 40 deletions(-) diff --git a/packages/app/public/index.html b/packages/app/public/index.html index 3d01107696..ea9208ca57 100644 --- a/packages/app/public/index.html +++ b/packages/app/public/index.html @@ -8,47 +8,38 @@ name="description" content="Backstage is an open platform for building developer portals" /> - + - - - + + - Backstage + <%= app.title %> - +
tpUDo@rE}y^H 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û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

+&wYywvxG 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 z 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%0Df!EusUIf{GR-X}Gri9HC?e-)Rz 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 z

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 z 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 v9laD>N@X} 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 CUM=+i delta 587942 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
gcyi!tiSJ1aVV*|uViqys*{aOq@Mq| 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�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 z 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

wAR8G>y!W3 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

C|?`rT><_ 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¨k)3$-Y4({-U$K8(^ab_vhW+xvo2)TQ4qI7h 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ⅅ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

RRMIjA0SY@Mp0n_O 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 z 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

@@ -142,22 +134,24 @@ const CatalogPage: FC<{}> = () => { onSelectedChange={onFilterSelected} /> - - envelopeToComponent( - val, - findLocationForEntity(val, locations), - ), - )) || - [] - } - loading={loading} - error={error} - actions={actions} - /> + {locations && ( + + envelopeToComponent( + val, + findLocationForEntity(val, locations) ?? undefined, + ), + )) || + [] + } + loading={loading} + error={error} + actions={actions} + /> + )} diff --git a/plugins/catalog/src/components/ComponentRemovalDialog/ComponentRemovalDialog.tsx b/plugins/catalog/src/components/ComponentRemovalDialog/ComponentRemovalDialog.tsx index b5a863cef8..a25e761dbb 100644 --- a/plugins/catalog/src/components/ComponentRemovalDialog/ComponentRemovalDialog.tsx +++ b/plugins/catalog/src/components/ComponentRemovalDialog/ComponentRemovalDialog.tsx @@ -25,6 +25,9 @@ import { useTheme, } from '@material-ui/core'; import { Component } from '../../data/component'; +import { useAsync } from 'react-use'; +import { useApi, Progress } from '@backstage/core'; +import { catalogApiRef } from '../../api/types'; type ComponentRemovalDialogProps = { onConfirm: () => any; diff --git a/plugins/catalog/src/data/utils.ts b/plugins/catalog/src/data/utils.ts index fe2ec62493..a3ce0c43ee 100644 --- a/plugins/catalog/src/data/utils.ts +++ b/plugins/catalog/src/data/utils.ts @@ -16,14 +16,22 @@ import { Component } from './component'; import { Entity, Location } from '@backstage/catalog-model'; -export function envelopeToComponent( +export const envelopeToComponent = ( envelope: Entity, location?: Location, -): Component { +): Component => { return { name: envelope.metadata?.name ?? '', kind: envelope.kind ?? 'unknown', description: envelope.metadata?.annotations?.description ?? 'placeholder', location, }; -} +}; +export const findLocationForEntity = ( + entity: Entity, + l: Location[], +): Location | undefined => { + const entityLocationId = + entity.metadata.annotations?.['backstage.io/managed-by-location']; + return l.find(location => location.id === entityLocationId); +}; From 29f7f1c333d02dd400f9fe7598b17de12878aed2 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Fri, 5 Jun 2020 11:55:08 +0200 Subject: [PATCH 138/192] fix: make locations fetching work --- .../src/components/CatalogPage/CatalogPage.tsx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx index 1597ae2135..ce983c991a 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx @@ -77,14 +77,13 @@ const CatalogPage: FC<{}> = () => { (location): Location[] => location.filter(loc => !!loc) as Array, ) - .then(location => { - if (isMounted()) return [location]; + .then(locs => { + if (isMounted()) return locs; return []; }); } return []; - }, [value, catalogApi, isMounted]); - + }, [value, catalogApi, isMounted, catalogApi]); const actions = [ (rowData: Component) => ({ icon: GitHub, @@ -139,12 +138,11 @@ const CatalogPage: FC<{}> = () => { titlePreamble={selectedFilter.label} components={ (value && - value.map(val => - envelopeToComponent( - val, - findLocationForEntity(val, locations) ?? undefined, - ), - )) || + value.map(val => { + const loc = + findLocationForEntity(val, locations) ?? undefined; + return envelopeToComponent(val, loc); + })) || [] } loading={loading} From c655a133a3b308a58fc199cbd0fd96907bc1cca5 Mon Sep 17 00:00:00 2001 From: Sebastian Qvarfordt Date: Fri, 5 Jun 2020 12:09:07 +0200 Subject: [PATCH 139/192] Slightly more robust edit link creation --- plugins/catalog/src/data/component.ts | 4 ++-- plugins/catalog/src/data/utils.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/catalog/src/data/component.ts b/plugins/catalog/src/data/component.ts index 692176a468..73b349391b 100644 --- a/plugins/catalog/src/data/component.ts +++ b/plugins/catalog/src/data/component.ts @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React from 'react'; +import { ReactNode } from 'react'; import { Location } from '@backstage/catalog-model'; export type Component = { name: string; kind: string; - description: React.ReactNode; + description: ReactNode; location?: Location; }; diff --git a/plugins/catalog/src/data/utils.tsx b/plugins/catalog/src/data/utils.tsx index 8c2476f867..5302fd75c2 100644 --- a/plugins/catalog/src/data/utils.tsx +++ b/plugins/catalog/src/data/utils.tsx @@ -25,7 +25,7 @@ const DescriptionWrapper = styled('span')({ alignItems: 'center', }); -const createEditLink = (url: string): string => url.replace('blob', 'edit'); +const createEditLink = (url: string): string => url.replace('/blob/', '/edit/'); export function envelopeToComponent( envelope: Entity, From bcb50c9325af02146da3ea20ca52595a5fba6145 Mon Sep 17 00:00:00 2001 From: Sebastian Qvarfordt Date: Fri, 5 Jun 2020 12:53:16 +0200 Subject: [PATCH 140/192] Different edit links depending on type. Only github for now though. --- plugins/catalog/src/data/utils.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/plugins/catalog/src/data/utils.tsx b/plugins/catalog/src/data/utils.tsx index 5302fd75c2..3f04883e34 100644 --- a/plugins/catalog/src/data/utils.tsx +++ b/plugins/catalog/src/data/utils.tsx @@ -25,7 +25,14 @@ const DescriptionWrapper = styled('span')({ alignItems: 'center', }); -const createEditLink = (url: string): string => url.replace('/blob/', '/edit/'); +const createEditLink = (location: Location): string => { + switch (location.type) { + case 'github': + return location.target.replace('/blob/', '/edit/'); + default: + return location.target; + } +}; export function envelopeToComponent( envelope: Entity, @@ -38,7 +45,7 @@ export function envelopeToComponent( {envelope.metadata?.annotations?.description ?? 'placeholder'} {location?.target ? ( - + From 241dc49797c3801782f56848a607da37e1b6a441 Mon Sep 17 00:00:00 2001 From: blam Date: Fri, 5 Jun 2020 14:05:01 +0200 Subject: [PATCH 141/192] chore(Catalog/Navigation): Added some basic tabs to the subheader grid area --- packages/core/src/layout/HeaderTabs/index.tsx | 48 +++++++++++++ .../components/CatalogFilter/StarredCount.tsx | 22 ++++++ .../components/CatalogPage/CatalogPage.tsx | 13 +++- yarn.lock | 69 ------------------- 4 files changed, 82 insertions(+), 70 deletions(-) create mode 100644 packages/core/src/layout/HeaderTabs/index.tsx create mode 100644 plugins/catalog/src/components/CatalogFilter/StarredCount.tsx diff --git a/packages/core/src/layout/HeaderTabs/index.tsx b/packages/core/src/layout/HeaderTabs/index.tsx new file mode 100644 index 0000000000..cdef267f95 --- /dev/null +++ b/packages/core/src/layout/HeaderTabs/index.tsx @@ -0,0 +1,48 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; + +import { makeStyles, Tabs, Tab } from '@material-ui/core'; + +const useStyles = makeStyles({ + wrapper: { + gridArea: 'pageSubheader', + }, +}); + +export const HeaderTabs: React.FC<{}> = () => { + const styles = useStyles(); + return ( +
+ + + + + + + + + +
+ ); +}; diff --git a/plugins/catalog/src/components/CatalogFilter/StarredCount.tsx b/plugins/catalog/src/components/CatalogFilter/StarredCount.tsx new file mode 100644 index 0000000000..20e1be1a9a --- /dev/null +++ b/plugins/catalog/src/components/CatalogFilter/StarredCount.tsx @@ -0,0 +1,22 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { useStarredEntities } from '../../hooks/useStarredEntites'; + +export const StarredCount: React.FC<{}> = () => { + const { starredEntities } = useStarredEntities(); + return {starredEntities.size}; +}; diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx index 779bcc7693..ef19e728e5 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx @@ -32,7 +32,15 @@ import { CatalogFilter, CatalogFilterItem, } from '../CatalogFilter/CatalogFilter'; -import { Button, makeStyles, Typography, Link } from '@material-ui/core'; +import { + Button, + makeStyles, + Typography, + Link, + AppBar, + Tabs, + Tab, +} from '@material-ui/core'; import { filterGroups, defaultFilter } from '../../data/filters'; import { Link as RouterLink } from 'react-router-dom'; import { rootRoute as scaffolderRootRoute } from '@backstage/plugin-scaffolder'; @@ -51,6 +59,7 @@ const useStyles = makeStyles(theme => ({ import { catalogApiRef } from '../..'; import { envelopeToComponent } from '../../data/utils'; import { Component } from '../../data/component'; +import { HeaderTabs } from '@backstage/core/src/layout/HeaderTabs'; const CatalogPage: FC<{}> = () => { const catalogApi = useApi(catalogApiRef); @@ -113,6 +122,7 @@ const CatalogPage: FC<{}> = () => {
+ = () => { } /> +

X)kenLLRFk$j-vY(?LM_>jC0>K`~%u; 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 Date: Fri, 5 Jun 2020 11:03:30 +0200 Subject: [PATCH 136/192] Replace blob with edit in link --- plugins/catalog/src/data/utils.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/plugins/catalog/src/data/utils.tsx b/plugins/catalog/src/data/utils.tsx index dc72f1ce14..8c2476f867 100644 --- a/plugins/catalog/src/data/utils.tsx +++ b/plugins/catalog/src/data/utils.tsx @@ -25,6 +25,8 @@ const DescriptionWrapper = styled('span')({ alignItems: 'center', }); +const createEditLink = (url: string): string => url.replace('blob', 'edit'); + export function envelopeToComponent( envelope: Entity, location?: Location, @@ -35,11 +37,13 @@ export function envelopeToComponent( description: ( {envelope.metadata?.annotations?.description ?? 'placeholder'} - - - - - + {location?.target ? ( + + + + + + ) : null} ), location, From e1477fa635127efa6790827a8e8bb8480721c1e2 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Fri, 5 Jun 2020 11:36:52 +0200 Subject: [PATCH 137/192] feature: extract getLocationById method, wrap location fetching in useAsync --- plugins/catalog/src/api/CatalogClient.ts | 26 ++++++--- plugins/catalog/src/api/types.ts | 2 + .../components/CatalogPage/CatalogPage.tsx | 56 +++++++++---------- .../ComponentRemovalDialog.tsx | 3 + plugins/catalog/src/data/utils.ts | 14 ++++- 5 files changed, 59 insertions(+), 42 deletions(-) diff --git a/plugins/catalog/src/api/CatalogClient.ts b/plugins/catalog/src/api/CatalogClient.ts index abba8a7523..804f2b3b6a 100644 --- a/plugins/catalog/src/api/CatalogClient.ts +++ b/plugins/catalog/src/api/CatalogClient.ts @@ -31,6 +31,22 @@ export class CatalogClient implements CatalogApi { this.apiOrigin = apiOrigin; this.basePath = basePath; } + async getLocationById(id: String): Promise { + const response = await fetch( + `${this.apiOrigin}${this.basePath}/locations/${id}`, + ); + if (response.ok) { + const location = await response.json(); + if (location) return location.data; + } + return undefined; + } + async getEntitiesByLocationId(id: string): Promise { + const response = await fetch( + `${this.apiOrigin}${this.basePath}/entities?backstage.io/managed-by-location=${id}`, + ); + return await response.json(); + } async getEntities(): Promise { const response = await fetch(`${this.apiOrigin}${this.basePath}/entities`); return await response.json(); @@ -50,14 +66,8 @@ export class CatalogClient implements CatalogApi { const locationId = findLocationIdInEntity(entity); if (!locationId) return undefined; - const response = await fetch( - `${this.apiOrigin}${this.basePath}/locations/${locationId}`, - ); - if (response.ok) { - const location = await response.json(); - if (location) return location.data; - } + const location = this.getLocationById(locationId); - return undefined; + return location; } } diff --git a/plugins/catalog/src/api/types.ts b/plugins/catalog/src/api/types.ts index 9e8dc5fbac..74184b8081 100644 --- a/plugins/catalog/src/api/types.ts +++ b/plugins/catalog/src/api/types.ts @@ -23,7 +23,9 @@ export const catalogApiRef = createApiRef({ }); export interface CatalogApi { + getLocationById(id: String): Promise; getEntities(): Promise; getEntityByName(name: string): Promise; + getEntitiesByLocationId(id: string): Promise; getLocationByEntity(entity: Entity): Promise; } diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx index 25d2618a9a..1597ae2135 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { FC, useCallback, useState, useEffect } from 'react'; +import React, { FC, useCallback, useState } from 'react'; import { Content, ContentHeader, @@ -47,13 +47,12 @@ const useStyles = makeStyles(theme => ({ })); import { catalogApiRef } from '../..'; -import { envelopeToComponent } from '../../data/utils'; +import { envelopeToComponent, findLocationForEntity } from '../../data/utils'; import { Component } from '../../data/component'; const CatalogPage: FC<{}> = () => { const catalogApi = useApi(catalogApiRef); const { value, error, loading } = useAsync(() => catalogApi.getEntities()); - const [locations, setLocations] = useState([]); const [selectedFilter, setSelectedFilter] = useState( defaultFilter, ); @@ -65,7 +64,7 @@ const CatalogPage: FC<{}> = () => { ); const styles = useStyles(); - useEffect(() => { + const { value: locations = [] } = useAsync(async () => { const getLocationDataForEntities = async (entities: Entity[]) => { return Promise.all( entities.map(entity => catalogApi.getLocationByEntity(entity)), @@ -76,12 +75,14 @@ const CatalogPage: FC<{}> = () => { getLocationDataForEntities(value) .then( (location): Location[] => - location.filter(l => !!l) as Array, + location.filter(loc => !!loc) as Array, ) .then(location => { - if (isMounted()) setLocations(location); + if (isMounted()) return [location]; + return []; }); } + return []; }, [value, catalogApi, isMounted]); const actions = [ @@ -97,15 +98,6 @@ const CatalogPage: FC<{}> = () => { }), ]; - const findLocationForEntity = ( - entity: Entity, - l: Location[], - ): Location | undefined => { - const entityLocationId = - entity.metadata.annotations?.['backstage.io/managed-by-location']; - return l.find(location => location.id === entityLocationId); - }; - return (

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

= ({ /> ); }; + export default CatalogTable; diff --git a/plugins/catalog/src/components/ComponentContextMenu/ComponentContextMenu.tsx b/plugins/catalog/src/components/ComponentContextMenu/ComponentContextMenu.tsx index 674d979f83..66c234e55e 100644 --- a/plugins/catalog/src/components/ComponentContextMenu/ComponentContextMenu.tsx +++ b/plugins/catalog/src/components/ComponentContextMenu/ComponentContextMenu.tsx @@ -13,22 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { FC, useEffect, useRef, useState } from 'react'; import { IconButton, ListItemIcon, - Menu, MenuItem, + MenuList, + Popover, Typography, } from '@material-ui/core'; import Cancel from '@material-ui/icons/Cancel'; import MoreVert from '@material-ui/icons/MoreVert'; import SwapHoriz from '@material-ui/icons/SwapHoriz'; +import React, { FC, useState } from 'react'; import { makeStyles } from '@material-ui/core/styles'; +// TODO(freben): It should probably instead be the case that Header sets the theme text color to white inside itself unconditionally instead const useStyles = makeStyles({ - menu: { - marginTop: 52, + button: { + color: 'white', }, }); @@ -39,52 +41,58 @@ type ComponentContextMenuProps = { const ComponentContextMenu: FC = ({ onUnregisterComponent, }) => { - const [menuOpen, setMenuOpen] = useState(false); - const menuAnchor = useRef(null); + const [anchorEl, setAnchorEl] = useState(); const classes = useStyles(); - useEffect(() => { - const globalCloseHandler = (event: any) => { - const menu = menuAnchor.current; - if (menu !== null && !menu.contains(event.target)) { - setMenuOpen(false); - } - }; + const onOpen = (event: React.SyntheticEvent) => { + setAnchorEl(event.currentTarget); + }; - window.addEventListener('click', globalCloseHandler); - return () => window.removeEventListener('click', globalCloseHandler); - }, [menuOpen]); + const onClose = () => { + setAnchorEl(undefined); + }; return ( -
+
setMenuOpen(!menuOpen)} + onClick={onOpen} data-testid="menu-button" + className={classes.button} > - - - - - - Unregister component - - - - - - More repository - - + + { + onClose(); + onUnregisterComponent(); + }} + > + + + + Unregister component + + + + + + Move repository + + +
); }; + export default ComponentContextMenu; diff --git a/plugins/catalog/src/components/ComponentMetadataCard/ComponentMetadataCard.test.tsx b/plugins/catalog/src/components/ComponentMetadataCard/ComponentMetadataCard.test.tsx index 62e3d52c29..5b6e7dfe07 100644 --- a/plugins/catalog/src/components/ComponentMetadataCard/ComponentMetadataCard.test.tsx +++ b/plugins/catalog/src/components/ComponentMetadataCard/ComponentMetadataCard.test.tsx @@ -23,6 +23,7 @@ describe('ComponentMetadataCard component', () => { const testComponent: Component = { name: 'test', kind: 'Component', + metadata: { name: 'test' }, description: 'Placeholder', }; const rendered = await render( diff --git a/plugins/catalog/src/components/ComponentRemovalDialog/ComponentRemovalDialog.tsx b/plugins/catalog/src/components/ComponentRemovalDialog/ComponentRemovalDialog.tsx index 7dde95c8f0..59c79cddc6 100644 --- a/plugins/catalog/src/components/ComponentRemovalDialog/ComponentRemovalDialog.tsx +++ b/plugins/catalog/src/components/ComponentRemovalDialog/ComponentRemovalDialog.tsx @@ -13,7 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { FC } from 'react'; + +import { Entity, LOCATION_ANNOTATION } from '@backstage/catalog-model'; +import { Progress, useApi } from '@backstage/core'; import { Button, Dialog, @@ -21,14 +23,16 @@ import { DialogContent, DialogContentText, DialogTitle, + Typography, useMediaQuery, useTheme, } from '@material-ui/core'; -import { Component } from '../../data/component'; +import Alert from '@material-ui/lab/Alert'; +import React, { FC } from 'react'; import { useAsync } from 'react-use'; -import { useApi } from '@backstage/core'; +import { AsyncState } from 'react-use/lib/useAsync'; import { catalogApiRef } from '../../api/types'; -import { Entity } from '@backstage/catalog-model'; +import { Component } from '../../data/component'; type ComponentRemovalDialogProps = { onConfirm: () => any; @@ -36,44 +40,81 @@ type ComponentRemovalDialogProps = { onClose: () => any; component: Component; }; + +function useColocatedEntities(component: Component): AsyncState { + const catalogApi = useApi(catalogApiRef); + return useAsync(async () => { + const myLocation = component.metadata.annotations?.[LOCATION_ANNOTATION]; + return myLocation + ? await catalogApi.getEntities({ [LOCATION_ANNOTATION]: myLocation }) + : []; + }, [catalogApi, component]); +} + const ComponentRemovalDialog: FC = ({ onConfirm, onCancel, onClose, component, }) => { - const catalogApi = useApi(catalogApiRef); - const { value } = useAsync(async () => { - let colocatedEntities: Array = []; - const locationId = component.location?.id; - if (locationId) { - colocatedEntities = await catalogApi.getEntitiesByLocationId(locationId); - } - return colocatedEntities; - }); + const { value: entities, loading, error } = useColocatedEntities(component); const theme = useTheme(); const fullScreen = useMediaQuery(theme.breakpoints.down('sm')); - const infoMessage = `This action will unregister ${ - value ? value.map(e => e.metadata.name).join(', ') : '' - } from location with target ${component.location?.target}. To undo, - just re-register the component in Backstage.`; + return ( Are you sure you want to unregister this component? - {infoMessage} + {loading ? : null} + {error ? ( + + + {error.toString()} + + + ) : null} + {entities ? ( + <> + + This action will unregister the following entities: + + +
    + {entities.map(e => ( +
  • {e.metadata.name}
  • + ))} +
+
+ + That are located at the following location: + + +
    +
  • + {entities[0]?.metadata?.annotations?.[LOCATION_ANNOTATION]} +
  • +
+
+ + To undo, just re-register the component in Backstage. + + + ) : null}
- - +
); }; + export default ComponentRemovalDialog; diff --git a/plugins/catalog/src/data/component.ts b/plugins/catalog/src/data/component.ts index 73b349391b..86749c6faa 100644 --- a/plugins/catalog/src/data/component.ts +++ b/plugins/catalog/src/data/component.ts @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { EntityMeta } from '@backstage/catalog-model'; import { ReactNode } from 'react'; -import { Location } from '@backstage/catalog-model'; export type Component = { name: string; kind: string; + metadata: EntityMeta; description: ReactNode; - location?: Location; }; diff --git a/plugins/catalog/src/data/utils.tsx b/plugins/catalog/src/data/utils.tsx index 93d28f5ca2..3e8e0458d6 100644 --- a/plugins/catalog/src/data/utils.tsx +++ b/plugins/catalog/src/data/utils.tsx @@ -13,23 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React from 'react'; -import { Component } from './component'; import { Entity, - Location, + LocationSpec, LOCATION_ANNOTATION, + EntityMeta, } from '@backstage/catalog-model'; -import Edit from '@material-ui/icons/Edit'; import IconButton from '@material-ui/core/IconButton'; import { styled } from '@material-ui/core/styles'; +import Edit from '@material-ui/icons/Edit'; +import React from 'react'; +import { Component } from './component'; const DescriptionWrapper = styled('span')({ display: 'flex', alignItems: 'center', }); -const createEditLink = (location: Location): string => { +const createEditLink = (location: LocationSpec): string => { switch (location.type) { case 'github': return location.target.replace('/blob/', '/edit/'); @@ -38,13 +39,12 @@ const createEditLink = (location: Location): string => { } }; -export function entityToComponent( - envelope: Entity, - location?: Location, -): Component { +export function entityToComponent(envelope: Entity): Component { + const location = findLocationForEntityMeta(envelope.metadata); return { name: envelope.metadata?.name ?? '', kind: envelope.kind ?? 'unknown', + metadata: envelope.metadata, description: ( {envelope.metadata?.annotations?.description ?? 'placeholder'} @@ -57,18 +57,28 @@ export function entityToComponent( ) : null} ), - location, }; } -export function findLocationForEntity( - entity: Entity, - locations: Location[], -): Location | undefined { - for (const loc of locations) { - if (loc.id === entity.metadata.annotations?.[LOCATION_ANNOTATION]) { - return loc; - } +export function findLocationForEntityMeta( + meta: EntityMeta, +): LocationSpec | undefined { + if (!meta) { + return undefined; } - return undefined; + + const annotation = meta.annotations?.[LOCATION_ANNOTATION]; + if (!annotation) { + return undefined; + } + + const separatorIndex = annotation.indexOf(':'); + if (separatorIndex === -1) { + return undefined; + } + + return { + type: annotation.substring(0, separatorIndex), + target: annotation.substring(separatorIndex + 1), + }; } diff --git a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.test.tsx b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.test.tsx index ca463550d1..48130124b7 100644 --- a/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.test.tsx +++ b/plugins/register-component/src/components/RegisterComponentPage/RegisterComponentPage.test.tsx @@ -31,7 +31,6 @@ const catalogApi: jest.Mocked = { getEntityByName: jest.fn(), getLocationByEntity: jest.fn(), getLocationById: jest.fn(), - getEntitiesByLocationId: jest.fn(), }; const setup = () => ({ From e2dc24d237d7c50ee1af4975776ff3027e9e9ce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 9 Jun 2020 10:26:37 +0200 Subject: [PATCH 185/192] Remove final DOM nesting warning --- .../ComponentRemovalDialog/ComponentRemovalDialog.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plugins/catalog/src/components/ComponentRemovalDialog/ComponentRemovalDialog.tsx b/plugins/catalog/src/components/ComponentRemovalDialog/ComponentRemovalDialog.tsx index 59c79cddc6..1318edcca0 100644 --- a/plugins/catalog/src/components/ComponentRemovalDialog/ComponentRemovalDialog.tsx +++ b/plugins/catalog/src/components/ComponentRemovalDialog/ComponentRemovalDialog.tsx @@ -69,11 +69,9 @@ const ComponentRemovalDialog: FC = ({ {loading ? : null} {error ? ( - - - {error.toString()} - - + + {error.toString()} + ) : null} {entities ? ( <> From 00d33f93e42d5dc01068cf0c48568fd91c9f968e Mon Sep 17 00:00:00 2001 From: Ben Lambert Date: Tue, 9 Jun 2020 13:28:40 +0200 Subject: [PATCH 186/192] Enable Filtering of the Catalog Page (#1143) * feat(catalog/Filters): Add ability to render a React component as the count. Good for loading states and async data rendering for counts. * chore(Catalog/filters): Updating the table so that we use loading states of the table rather than the panel * chore(Catalog/filters): added some nice things for enabling the filtering with some nice count componeents * feat(Catalog/filters): Fetch the correct data and added in enum types to make some nice resolvers * chore(Catalog/filters): Use the new enum type here * chore(Catalog/filters): Removing the unused import to fix lintig * chore(Catalog/filters): Addressing some PR comments * feat(catalog/filters): Making WebStorage return the same instance for the same bucket for subscriptions * chore(core/Storage): fixing some issues with different instances of the storage and adding tests for it * chore(catalog/filters): fixing some tests and trying to remove some of the act warnings in the tests --- .../StorageApi/WebStorage.test.ts | 9 +++ .../implementations/StorageApi/WebStorage.ts | 8 +- .../DismissableBanner.stories.tsx | 2 +- .../DismissableBanner.test.tsx | 2 +- .../DismissableBanner/DismissableBanner.tsx | 2 +- plugins/catalog/package.json | 4 +- .../CatalogFilter/AllServicesCount.tsx | 32 ++++++++ .../CatalogFilter/CatalogFilter.test.tsx | 38 +++++++-- .../CatalogFilter/CatalogFilter.tsx | 13 +-- .../CatalogFilter/StarredCount.test.tsx | 33 ++++++++ .../components/CatalogFilter/StarredCount.tsx | 22 +++++ .../CatalogPage/CatalogPage.test.tsx | 53 +++++------- .../components/CatalogPage/CatalogPage.tsx | 14 +++- .../CatalogTable/CatalogTable.test.tsx | 10 --- .../components/CatalogTable/CatalogTable.tsx | 17 ++-- .../ComponentContextMenu.test.tsx | 2 +- .../ComponentPage/ComponentPage.test.tsx | 9 ++- plugins/catalog/src/data/filters.ts | 39 +++++++-- .../catalog/src/hooks/useStarredEntites.ts | 43 ++++++++++ .../src/hooks/useStarredEntities.test.tsx | 80 +++++++++++++++++++ plugins/catalog/src/types.ts | 6 ++ yarn.lock | 40 ++++++++++ 22 files changed, 400 insertions(+), 78 deletions(-) create mode 100644 plugins/catalog/src/components/CatalogFilter/AllServicesCount.tsx create mode 100644 plugins/catalog/src/components/CatalogFilter/StarredCount.test.tsx create mode 100644 plugins/catalog/src/components/CatalogFilter/StarredCount.tsx create mode 100644 plugins/catalog/src/hooks/useStarredEntites.ts create mode 100644 plugins/catalog/src/hooks/useStarredEntities.test.tsx diff --git a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts index a96813347e..971b023629 100644 --- a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts +++ b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.test.ts @@ -15,6 +15,7 @@ */ import { WebStorage } from './WebStorage'; import { CreateStorageApiOptions, StorageApi } from '../../definitions'; + describe('WebStorage Storage API', () => { const mockErrorApi = { post: jest.fn(), error$: jest.fn() }; const createWebStorage = ( @@ -161,4 +162,12 @@ describe('WebStorage Storage API', () => { }), ); }); + + it('should return a singleton for the same namespace and same bucket', async () => { + const rootStorage = createWebStorage({ + namespace: '/Test/Mock/Thing/Thing ', + }); + + expect(rootStorage.forBucket('test')).toBe(rootStorage.forBucket('test')); + }); }); diff --git a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts index 8af8f760cf..b9b01cd20b 100644 --- a/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts +++ b/packages/core-api/src/apis/implementations/StorageApi/WebStorage.ts @@ -22,6 +22,8 @@ import { import { Observable } from '../../../types'; import ObservableImpl from 'zen-observable'; +const buckets = new Map(); + export class WebStorage implements StorageApi { constructor( private readonly namespace: string, @@ -46,7 +48,11 @@ export class WebStorage implements StorageApi { } forBucket(name: string): WebStorage { - return new WebStorage(`${this.namespace}/${name}`, this.errorApi); + const bucketPath = `${this.namespace}/${name}`; + if (!buckets.has(bucketPath)) { + buckets.set(bucketPath, new WebStorage(bucketPath, this.errorApi)); + } + return buckets.get(bucketPath)!; } async set(key: string, data: T): Promise { diff --git a/packages/core/src/components/DismissableBanner/DismissableBanner.stories.tsx b/packages/core/src/components/DismissableBanner/DismissableBanner.stories.tsx index 37d982b0f4..78307bd5a3 100644 --- a/packages/core/src/components/DismissableBanner/DismissableBanner.stories.tsx +++ b/packages/core/src/components/DismissableBanner/DismissableBanner.stories.tsx @@ -25,7 +25,7 @@ import { storageApiRef, StorageApi, WebStorage, -} from '@backstage/core'; +} from '@backstage/core-api'; export default { title: 'DismissableBanner', diff --git a/packages/core/src/components/DismissableBanner/DismissableBanner.test.tsx b/packages/core/src/components/DismissableBanner/DismissableBanner.test.tsx index b31641eb8f..b3a33fc089 100644 --- a/packages/core/src/components/DismissableBanner/DismissableBanner.test.tsx +++ b/packages/core/src/components/DismissableBanner/DismissableBanner.test.tsx @@ -25,7 +25,7 @@ import { CreateStorageApiOptions, StorageApi, WebStorage, -} from '@backstage/core'; +} from '@backstage/core-api'; describe('', () => { let apis: ApiRegistry; diff --git a/packages/core/src/components/DismissableBanner/DismissableBanner.tsx b/packages/core/src/components/DismissableBanner/DismissableBanner.tsx index 76c27827ec..e174ac8d55 100644 --- a/packages/core/src/components/DismissableBanner/DismissableBanner.tsx +++ b/packages/core/src/components/DismissableBanner/DismissableBanner.tsx @@ -15,7 +15,7 @@ */ import React, { FC, ReactNode, useState, useEffect } from 'react'; -import { useApi, storageApiRef } from '@backstage/core'; +import { useApi, storageApiRef } from '@backstage/core-api'; import { useObservable } from 'react-use'; import classNames from 'classnames'; import { makeStyles, Theme } from '@material-ui/core'; diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index 28bfcb0af0..e19869c946 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -42,11 +42,13 @@ "@backstage/test-utils": "^0.1.1-alpha.6", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", + "@testing-library/react-hooks": "^3.3.0", "@testing-library/user-event": "^10.2.4", "@types/jest": "^25.2.2", "@types/node": "^12.0.0", "@types/testing-library__jest-dom": "^5.0.4", - "jest-fetch-mock": "^3.0.3" + "jest-fetch-mock": "^3.0.3", + "react-test-renderer": "^16.13.1" }, "files": [ "dist/**/*.{js,d.ts}" diff --git a/plugins/catalog/src/components/CatalogFilter/AllServicesCount.tsx b/plugins/catalog/src/components/CatalogFilter/AllServicesCount.tsx new file mode 100644 index 0000000000..07879770b7 --- /dev/null +++ b/plugins/catalog/src/components/CatalogFilter/AllServicesCount.tsx @@ -0,0 +1,32 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { useApi } from '@backstage/core'; +import { catalogApiRef } from '../../api/types'; +import { useAsync } from 'react-use'; +import { CircularProgress, useTheme } from '@material-ui/core'; + +export const AllServicesCount: React.FC<{}> = () => { + const theme = useTheme(); + const catalogApi = useApi(catalogApiRef); + const { value, loading } = useAsync(() => catalogApi.getEntities()); + + if (loading) { + return ; + } + + return {value?.length ?? '-'}; +}; diff --git a/plugins/catalog/src/components/CatalogFilter/CatalogFilter.test.tsx b/plugins/catalog/src/components/CatalogFilter/CatalogFilter.test.tsx index ec44f53777..6246726fab 100644 --- a/plugins/catalog/src/components/CatalogFilter/CatalogFilter.test.tsx +++ b/plugins/catalog/src/components/CatalogFilter/CatalogFilter.test.tsx @@ -18,6 +18,7 @@ import React from 'react'; import { render, fireEvent } from '@testing-library/react'; import { wrapInTestApp } from '@backstage/test-utils'; import { CatalogFilter, CatalogFilterGroup } from './CatalogFilter'; +import { FilterGroupItem } from '../../types'; describe('Catalog Filter', () => { it('should render the different groups', async () => { @@ -40,11 +41,11 @@ describe('Catalog Filter', () => { name: 'Test Group 1', items: [ { - id: 'first', + id: FilterGroupItem.ALL, label: 'First Label', }, { - id: 'second', + id: FilterGroupItem.STARRED, label: 'Second Label', }, ], @@ -67,12 +68,12 @@ describe('Catalog Filter', () => { name: 'Test Group 1', items: [ { - id: 'first', + id: FilterGroupItem.ALL, label: 'First Label', count: 100, }, { - id: 'second', + id: FilterGroupItem.STARRED, label: 'Second Label', count: 400, }, @@ -96,12 +97,12 @@ describe('Catalog Filter', () => { name: 'Test Group 1', items: [ { - id: 'first', + id: FilterGroupItem.ALL, label: 'First Label', count: 100, }, { - id: 'second', + id: FilterGroupItem.STARRED, label: 'Second Label', count: 400, }, @@ -128,4 +129,29 @@ describe('Catalog Filter', () => { expect(onSelectedChangeHandler).toHaveBeenCalledWith(item); }); + + it('should render a component when a function is passed to the count component', async () => { + const mockGroups: CatalogFilterGroup[] = [ + { + name: 'Test Group 1', + items: [ + { + id: FilterGroupItem.ALL, + label: 'First Label', + count: () => BACKSTAGE!, + }, + { + id: FilterGroupItem.STARRED, + label: 'Second Label', + count: 400, + }, + ], + }, + ]; + const { findByText } = render( + wrapInTestApp(), + ); + + expect(await findByText('BACKSTAGE!')).toBeInTheDocument(); + }); }); diff --git a/plugins/catalog/src/components/CatalogFilter/CatalogFilter.tsx b/plugins/catalog/src/components/CatalogFilter/CatalogFilter.tsx index eb45d8a80b..6541a4df8d 100644 --- a/plugins/catalog/src/components/CatalogFilter/CatalogFilter.tsx +++ b/plugins/catalog/src/components/CatalogFilter/CatalogFilter.tsx @@ -25,13 +25,12 @@ import { makeStyles, } from '@material-ui/core'; import type { IconComponent } from '@backstage/core'; - +import { FilterGroupItem } from '../../types'; export type CatalogFilterItem = { - id: string; + id: FilterGroupItem; label: string; icon?: IconComponent; - count?: number; - loading?: boolean; + count?: number | React.FC; }; export type CatalogFilterGroup = { @@ -105,7 +104,11 @@ export const CatalogFilter: React.FC = ({ {item.label} - {item.count} + {typeof item.count === 'function' ? ( + + ) : ( + item.count + )} ))} diff --git a/plugins/catalog/src/components/CatalogFilter/StarredCount.test.tsx b/plugins/catalog/src/components/CatalogFilter/StarredCount.test.tsx new file mode 100644 index 0000000000..57581e98f2 --- /dev/null +++ b/plugins/catalog/src/components/CatalogFilter/StarredCount.test.tsx @@ -0,0 +1,33 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from 'react'; +import { render } from '@testing-library/react'; +import { wrapInTestApp } from '@backstage/test-utils'; +import { StarredCount } from './StarredCount'; +import * as Hooks from '../../hooks/useStarredEntites'; + +describe('Starred Count', () => { + it('should render the count returned from the hook', async () => { + jest.spyOn(Hooks, 'useStarredEntities').mockReturnValue({ + starredEntities: new Set(['id1', 'id2', 'id3', 'id4']), + }); + + const { findByText } = render(wrapInTestApp()); + + expect(await findByText('4')).toBeInTheDocument(); + }); +}); diff --git a/plugins/catalog/src/components/CatalogFilter/StarredCount.tsx b/plugins/catalog/src/components/CatalogFilter/StarredCount.tsx new file mode 100644 index 0000000000..20e1be1a9a --- /dev/null +++ b/plugins/catalog/src/components/CatalogFilter/StarredCount.tsx @@ -0,0 +1,22 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { useStarredEntities } from '../../hooks/useStarredEntites'; + +export const StarredCount: React.FC<{}> = () => { + const { starredEntities } = useStarredEntities(); + return {starredEntities.size}; +}; diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.test.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.test.tsx index 238a5a4043..c2130d5110 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.test.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.test.tsx @@ -18,47 +18,34 @@ import React from 'react'; import { render } from '@testing-library/react'; import CatalogPage from './CatalogPage'; import { - ApiProvider, ApiRegistry, - CreateStorageApiOptions, + ApiProvider, errorApiRef, storageApiRef, - StorageApi, WebStorage, } from '@backstage/core'; -import { wrapInTestApp } from '@backstage/test-utils'; +import { wrapInTestApp, MockErrorApi } from '@backstage/test-utils'; import { catalogApiRef } from '../..'; import { CatalogApi } from '../../api/types'; import { Entity } from '@backstage/catalog-model'; -const errorApi = { post: () => {} }; -const catalogApi: Partial = { - getEntities: () => - Promise.resolve([ - { - metadata: { - name: 'Entity1', - }, - apiVersion: 'backstage.io/v1beta1', - kind: 'Component', - }, - ] as Entity[]), - getLocationByEntity: () => - Promise.resolve({ id: 'id', type: 'github', target: 'url' }), -}; - -const mockWebStorageErrorApi = { post: jest.fn(), error$: jest.fn() }; -const createWebStorage = ( - args?: Partial, -): StorageApi => { - return WebStorage.create({ - errorApi: mockWebStorageErrorApi, - ...args, - }); -}; -const storageApi = createWebStorage(); - describe('CatalogPage', () => { + const mockErrorApi = new MockErrorApi(); + const catalogApi: Partial = { + getEntities: () => + Promise.resolve([ + { + metadata: { + name: 'Entity1', + }, + apiVersion: 'backstage.io/v1beta1', + kind: 'Component', + }, + ] as Entity[]), + getLocationByEntity: () => + Promise.resolve({ id: 'id', type: 'github', target: 'url' }), + }; + // this test right now causes some red lines in the log output when running tests // related to some theme issues in mui-table // https://github.com/mbrn/material-table/issues/1293 @@ -67,9 +54,9 @@ describe('CatalogPage', () => { wrapInTestApp( diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx index 452254a3cf..859449c715 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx @@ -27,19 +27,22 @@ import { useApi, } from '@backstage/core'; import { rootRoute as scaffolderRootRoute } from '@backstage/plugin-scaffolder'; -import { Button, Link, makeStyles, Typography } from '@material-ui/core'; +import { Button, makeStyles, Typography, Link } from '@material-ui/core'; import GitHub from '@material-ui/icons/GitHub'; import React, { FC, useCallback, useState } from 'react'; import { Link as RouterLink } from 'react-router-dom'; import { useAsync } from 'react-use'; import { catalogApiRef } from '../..'; import { Component } from '../../data/component'; -import { defaultFilter, filterGroups } from '../../data/filters'; +import { defaultFilter, filterGroups, dataResolvers } from '../../data/filters'; import { entityToComponent, findLocationForEntityMeta } from '../../data/utils'; import { CatalogFilter, CatalogFilterItem, } from '../CatalogFilter/CatalogFilter'; + +import { useStarredEntities } from '../../hooks/useStarredEntites'; + import CatalogTable from '../CatalogTable/CatalogTable'; const useStyles = makeStyles(theme => ({ @@ -57,15 +60,20 @@ const useStyles = makeStyles(theme => ({ const CatalogPage: FC<{}> = () => { const catalogApi = useApi(catalogApiRef); - const { value, error, loading } = useAsync(() => catalogApi.getEntities()); + const { starredEntities } = useStarredEntities(); const [selectedFilter, setSelectedFilter] = useState( defaultFilter, ); + const { value, error, loading } = useAsync( + () => dataResolvers[selectedFilter.id]({ catalogApi, starredEntities }), + [selectedFilter.id], + ); const onFilterSelected = useCallback( selected => setSelectedFilter(selected), [], ); + const styles = useStyles(); const actions = [ diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx index ac7abe235a..41693188f1 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.test.tsx @@ -41,16 +41,6 @@ const components: Component[] = [ ]; describe('CatalogTable component', () => { - it('should render loading when loading prop it set to true', async () => { - const rendered = render( - wrapInTestApp( - , - ), - ); - const progress = await rendered.findByTestId('progress'); - expect(progress).toBeInTheDocument(); - }); - it('should render error message when error is passed in props', async () => { const rendered = render( wrapInTestApp( diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx index e918cc13aa..cd91838b06 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx @@ -13,12 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Progress, Table, TableColumn } from '@backstage/core'; +import { Table, TableColumn } from '@backstage/core'; import { Link } from '@material-ui/core'; import { Alert } from '@material-ui/lab'; import React, { FC } from 'react'; -import { generatePath, Link as RouterLink } from 'react-router-dom'; +import { Link as RouterLink, generatePath } from 'react-router-dom'; import { Component } from '../../data/component'; + import { entityRoute } from '../../routes'; const columns: TableColumn[] = [ @@ -60,9 +61,7 @@ const CatalogTable: FC = ({ titlePreamble, actions, }) => { - if (loading) { - return ; - } else if (error) { + if (error) { return (
@@ -74,8 +73,14 @@ const CatalogTable: FC = ({ return (
{ it('should call onUnregisterComponent on button click', async () => { await act(async () => { const mockCallback = jest.fn(); - const menu = await render( + const menu = render( , ); const button = await menu.findByTestId('menu-button'); diff --git a/plugins/catalog/src/components/ComponentPage/ComponentPage.test.tsx b/plugins/catalog/src/components/ComponentPage/ComponentPage.test.tsx index f580a84d8a..252f2d4e3f 100644 --- a/plugins/catalog/src/components/ComponentPage/ComponentPage.test.tsx +++ b/plugins/catalog/src/components/ComponentPage/ComponentPage.test.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ import ComponentPage from './ComponentPage'; -import { render } from '@testing-library/react'; +import { render, wait } from '@testing-library/react'; import * as React from 'react'; import { wrapInTestApp } from '@backstage/test-utils'; import { ApiProvider, ApiRegistry, errorApiRef } from '@backstage/core'; @@ -38,7 +38,7 @@ const errorApi = { post: () => {} }; describe('ComponentPage', () => { it('should redirect to component table page when name is not provided', async () => { const props = getTestProps(''); - await render( + render( wrapInTestApp( { , ), ); - expect(props.history.push).toHaveBeenCalledWith('/catalog'); + + await wait(() => + expect(props.history.push).toHaveBeenCalledWith('/catalog'), + ); }); }); diff --git a/plugins/catalog/src/data/filters.ts b/plugins/catalog/src/data/filters.ts index 1b0a2a407c..1fcdfa27a2 100644 --- a/plugins/catalog/src/data/filters.ts +++ b/plugins/catalog/src/data/filters.ts @@ -19,21 +19,26 @@ import { } from '../components/CatalogFilter/CatalogFilter'; import SettingsIcon from '@material-ui/icons/Settings'; import StarIcon from '@material-ui/icons/Star'; +import { StarredCount } from '../components/CatalogFilter/StarredCount'; +import { AllServicesCount } from '../components/CatalogFilter/AllServicesCount'; +import { FilterGroupItem } from '../types'; +import { CatalogApi } from '../..'; +import { Entity } from '@backstage/catalog-model'; export const filterGroups: CatalogFilterGroup[] = [ { name: 'Personal', items: [ { - id: 'owned', + id: FilterGroupItem.OWNED, label: 'Owned', - count: 123, + count: 0, icon: SettingsIcon, }, { - id: 'starred', + id: FilterGroupItem.STARRED, label: 'Starred', - count: 10, + count: StarredCount, icon: StarIcon, }, ], @@ -43,12 +48,34 @@ export const filterGroups: CatalogFilterGroup[] = [ name: 'Company', items: [ { - id: 'all', + id: FilterGroupItem.ALL, label: 'All Services', - count: 123, + count: AllServicesCount, }, ], }, ]; +type ResolverFunction = ({ + catalogApi, + starredEntities, +}: { + catalogApi: CatalogApi; + starredEntities: Set; +}) => Promise; + +export const dataResolvers: Record = { + [FilterGroupItem.OWNED]: async () => [], + [FilterGroupItem.ALL]: async ({ catalogApi }) => { + return catalogApi.getEntities(); + }, + [FilterGroupItem.STARRED]: async ({ catalogApi, starredEntities }) => { + const allEntities = await catalogApi.getEntities(); + + return allEntities.filter(entity => + starredEntities.has(entity.metadata.name), + ); + }, +}; + export const defaultFilter: CatalogFilterItem = filterGroups[0].items[0]; diff --git a/plugins/catalog/src/hooks/useStarredEntites.ts b/plugins/catalog/src/hooks/useStarredEntites.ts new file mode 100644 index 0000000000..631991e9b0 --- /dev/null +++ b/plugins/catalog/src/hooks/useStarredEntites.ts @@ -0,0 +1,43 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { useState, useEffect } from 'react'; +import { useApi, storageApiRef } from '@backstage/core'; +import { useObservable } from 'react-use'; + +export const useStarredEntities = () => { + const storageApi = useApi(storageApiRef); + const settingsStore = storageApi.forBucket('settings'); + const rawStarredItems = settingsStore.get('starredEntities') ?? []; + + const [starredEntities, setStarredEntities] = useState( + new Set(rawStarredItems), + ); + + const observedItems = useObservable( + settingsStore.observe$('starredEntities'), + ); + + useEffect(() => { + if (observedItems?.newValue) { + const currentValue = observedItems?.newValue ?? []; + setStarredEntities(new Set(currentValue)); + } + }, [observedItems?.newValue]); + + return { + starredEntities, + }; +}; diff --git a/plugins/catalog/src/hooks/useStarredEntities.test.tsx b/plugins/catalog/src/hooks/useStarredEntities.test.tsx new file mode 100644 index 0000000000..49890b7238 --- /dev/null +++ b/plugins/catalog/src/hooks/useStarredEntities.test.tsx @@ -0,0 +1,80 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { renderHook } from '@testing-library/react-hooks'; +import { useStarredEntities } from './useStarredEntites'; +import { + ApiProvider, + ApiRegistry, + storageApiRef, + WebStorage, + StorageApi, +} from '@backstage/core'; +import { MockErrorApi } from '@backstage/test-utils'; + +describe('useStarredEntities', () => { + let mockStorage: StorageApi | undefined; + + const wrapper: React.FC<{}> = ({ children }) => { + return ( + + {children} + + ); + }; + + beforeEach(() => { + mockStorage = new WebStorage('@backstage', new MockErrorApi()).forBucket( + Date.now().toString(), // TODO(blam): need something that changes every test run for now until the MockStorage is implemented + ); + }); + it('should return an empty set for when there is no items in storage', async () => { + const { result } = renderHook(() => useStarredEntities(), { wrapper }); + + expect(result.current.starredEntities.size).toBe(0); + }); + it('should return a set with the current items when there is items in storage', async () => { + const expectedIds = ['i', 'am', 'some', 'test', 'ids']; + const store = mockStorage?.forBucket('settings'); + await store?.set('starredEntities', expectedIds); + + const { result } = renderHook(() => useStarredEntities(), { wrapper }); + + for (const item of expectedIds) { + expect(result.current.starredEntities.has(item)).toBeTruthy(); + } + }); + it('should listen to changes when the storage is set elsewhere', async () => { + const store = mockStorage?.forBucket('settings'); + + const { result, waitForNextUpdate } = renderHook( + () => useStarredEntities(), + { wrapper }, + ); + + expect(result.current.starredEntities.size).toBe(0); + expect(result.current.starredEntities.has('something')).toBeFalsy(); + + // Make this happen after awaiting for the next update so we can + // catch when the hook re-renders with the latest data + setTimeout(() => store?.set('starredEntities', ['something']), 1); + + await waitForNextUpdate(); + + expect(result.current.starredEntities.size).toBe(1); + expect(result.current.starredEntities.has('something')).toBeTruthy(); + }); +}); diff --git a/plugins/catalog/src/types.ts b/plugins/catalog/src/types.ts index 0f91e1ed8e..42f156ecb7 100644 --- a/plugins/catalog/src/types.ts +++ b/plugins/catalog/src/types.ts @@ -157,3 +157,9 @@ export type KindParser = { envelope: DescriptorEnvelope, ): Promise; }; + +export enum FilterGroupItem { + ALL = 'ALL', + STARRED = 'STARRED', + OWNED = 'OWNED', +} diff --git a/yarn.lock b/yarn.lock index 074e666e55..2b7246b230 100644 --- a/yarn.lock +++ b/yarn.lock @@ -891,6 +891,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.5.4": + version "7.10.2" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839" + integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.3.3", "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": version "7.8.6" resolved "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" @@ -3279,6 +3286,14 @@ lodash "^4.17.15" redent "^3.0.0" +"@testing-library/react-hooks@^3.3.0": + version "3.3.0" + resolved "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-3.3.0.tgz#dc217bfce8e7c34a99c811d73d23feef957b7c1d" + integrity sha512-rE9geI1+HJ6jqXkzzJ6abREbeud6bLF8OmF+Vyc7gBoPwZAEVBYjbC1up5nNoVfYBhO5HUwdD4u9mTehAUeiyw== + dependencies: + "@babel/runtime" "^7.5.4" + "@types/testing-library__react-hooks" "^3.0.0" + "@testing-library/react@^9.3.2": version "9.5.0" resolved "https://registry.npmjs.org/@testing-library/react/-/react-9.5.0.tgz#71531655a7890b61e77a1b39452fbedf0472ca5e" @@ -3910,6 +3925,13 @@ dependencies: "@types/react" "*" +"@types/react-test-renderer@*": + version "16.9.2" + resolved "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.9.2.tgz#e1c408831e8183e5ad748fdece02214a7c2ab6c5" + integrity sha512-4eJr1JFLIAlWhzDkBCkhrOIWOvOxcCAfQh+jiKg7l/nNZcCIL2MHl2dZhogIFKyHzedVWHaVP1Yydq/Ruu4agw== + dependencies: + "@types/react" "*" + "@types/react-textarea-autosize@^4.3.3": version "4.3.5" resolved "https://registry.npmjs.org/@types/react-textarea-autosize/-/react-textarea-autosize-4.3.5.tgz#6c4d2753fa1864c98c0b2b517f67bb1f6e4c46de" @@ -4067,6 +4089,14 @@ dependencies: "@types/jest" "*" +"@types/testing-library__react-hooks@^3.0.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@types/testing-library__react-hooks/-/testing-library__react-hooks-3.2.0.tgz#52f3a109bef06080e3b1e3ae7ea1c014ce859897" + integrity sha512-dE8iMTuR5lzB+MqnxlzORlXzXyCL0EKfzH0w/lau20OpkHD37EaWjZDz0iNG8b71iEtxT4XKGmSKAGVEqk46mw== + dependencies: + "@types/react" "*" + "@types/react-test-renderer" "*" + "@types/testing-library__react@^9.1.2": version "9.1.3" resolved "https://registry.npmjs.org/@types/testing-library__react/-/testing-library__react-9.1.3.tgz#35eca61cc6ea923543796f16034882a1603d7302" @@ -15617,6 +15647,16 @@ react-syntax-highlighter@^12.2.1: prismjs "^1.8.4" refractor "^2.4.1" +react-test-renderer@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.13.1.tgz#de25ea358d9012606de51e012d9742e7f0deabc1" + integrity sha512-Sn2VRyOK2YJJldOqoh8Tn/lWQ+ZiKhyZTPtaO0Q6yNj+QDbmRkVFap6pZPy3YQk8DScRDfyqm/KxKYP9gCMRiQ== + dependencies: + object-assign "^4.1.1" + prop-types "^15.6.2" + react-is "^16.8.6" + scheduler "^0.19.1" + react-textarea-autosize@^7.1.0: version "7.1.2" resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-7.1.2.tgz#70fdb333ef86bcca72717e25e623e90c336e2cda" From 40e95c06a8b546e21b933528e93b42f9267ac4c9 Mon Sep 17 00:00:00 2001 From: Sebastian Qvarfordt Date: Tue, 9 Jun 2020 14:21:30 +0200 Subject: [PATCH 187/192] Moved edit button in catalog to actions menu --- .../components/CatalogPage/CatalogPage.tsx | 25 +++++++++++++ .../catalog/src/data/{utils.tsx => utils.ts} | 36 ++----------------- 2 files changed, 28 insertions(+), 33 deletions(-) rename plugins/catalog/src/data/{utils.tsx => utils.ts} (57%) diff --git a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx index 859449c715..3bd09af0bd 100644 --- a/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx +++ b/plugins/catalog/src/components/CatalogPage/CatalogPage.tsx @@ -26,9 +26,11 @@ import { SupportButton, useApi, } from '@backstage/core'; +import { LocationSpec } from '@backstage/catalog-model'; import { rootRoute as scaffolderRootRoute } from '@backstage/plugin-scaffolder'; import { Button, makeStyles, Typography, Link } from '@material-ui/core'; import GitHub from '@material-ui/icons/GitHub'; +import Edit from '@material-ui/icons/Edit'; import React, { FC, useCallback, useState } from 'react'; import { Link as RouterLink } from 'react-router-dom'; import { useAsync } from 'react-use'; @@ -89,6 +91,29 @@ const CatalogPage: FC<{}> = () => { hidden: location ? location?.type !== 'github' : true, }; }, + (rowData: Component) => { + const createEditLink = (location: LocationSpec): string => { + switch (location.type) { + case 'github': + return location.target.replace('/blob/', '/edit/'); + default: + return location.target; + } + }; + + const location = findLocationForEntityMeta(rowData.metadata); + + return { + icon: Edit, + tooltip: 'Edit', + iconProps: { size: 'small' }, + onClick: () => { + if (!location) return; + window.open(createEditLink(location), '_blank'); + }, + hidden: location ? location?.type !== 'github' : true, + }; + }, ]; // TODO: replace me with the proper tabs implemntation diff --git a/plugins/catalog/src/data/utils.tsx b/plugins/catalog/src/data/utils.ts similarity index 57% rename from plugins/catalog/src/data/utils.tsx rename to plugins/catalog/src/data/utils.ts index 3e8e0458d6..b731268c41 100644 --- a/plugins/catalog/src/data/utils.tsx +++ b/plugins/catalog/src/data/utils.ts @@ -19,44 +19,14 @@ import { LOCATION_ANNOTATION, EntityMeta, } from '@backstage/catalog-model'; -import IconButton from '@material-ui/core/IconButton'; -import { styled } from '@material-ui/core/styles'; -import Edit from '@material-ui/icons/Edit'; -import React from 'react'; import { Component } from './component'; -const DescriptionWrapper = styled('span')({ - display: 'flex', - alignItems: 'center', -}); - -const createEditLink = (location: LocationSpec): string => { - switch (location.type) { - case 'github': - return location.target.replace('/blob/', '/edit/'); - default: - return location.target; - } -}; - export function entityToComponent(envelope: Entity): Component { - const location = findLocationForEntityMeta(envelope.metadata); return { - name: envelope.metadata?.name ?? '', - kind: envelope.kind ?? 'unknown', + name: envelope.metadata.name, + kind: envelope.kind, metadata: envelope.metadata, - description: ( - - {envelope.metadata?.annotations?.description ?? 'placeholder'} - {location?.target ? ( - - - - - - ) : null} - - ), + description: envelope.metadata.annotations?.description ?? 'placeholder', }; } From c53bafc5f9d864a738ea2cb4a66454f03b10ef9c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 9 Jun 2020 14:24:56 +0200 Subject: [PATCH 188/192] v0.1.1-alpha.7 --- lerna.json | 2 +- packages/app/package.json | 28 ++++++++++++------------- packages/backend-common/package.json | 4 ++-- packages/backend/package.json | 18 ++++++++-------- packages/catalog-model/package.json | 4 ++-- packages/cli/package.json | 6 +++--- packages/config-loader/package.json | 4 ++-- packages/config/package.json | 2 +- packages/core-api/package.json | 10 ++++----- packages/core/package.json | 12 +++++------ packages/dev-utils/package.json | 10 ++++----- packages/storybook/package.json | 4 ++-- packages/test-utils-core/package.json | 2 +- packages/test-utils/package.json | 10 ++++----- packages/theme/package.json | 4 ++-- plugins/auth-backend/package.json | 12 +++++------ plugins/catalog-backend/package.json | 8 +++---- plugins/catalog/package.json | 18 ++++++++-------- plugins/circleci/package.json | 10 ++++----- plugins/explore/package.json | 12 +++++------ plugins/graphiql/package.json | 12 +++++------ plugins/home-page/package.json | 10 ++++----- plugins/identity-backend/package.json | 6 +++--- plugins/lighthouse/package.json | 12 +++++------ plugins/register-component/package.json | 14 ++++++------- plugins/scaffolder-backend/package.json | 6 +++--- plugins/scaffolder/package.json | 10 ++++----- plugins/sentry-backend/package.json | 6 +++--- plugins/sentry/package.json | 10 ++++----- plugins/tech-radar/package.json | 12 +++++------ plugins/welcome/package.json | 10 ++++----- 31 files changed, 144 insertions(+), 144 deletions(-) diff --git a/lerna.json b/lerna.json index 5be143e0ef..2feea0137f 100644 --- a/lerna.json +++ b/lerna.json @@ -2,5 +2,5 @@ "packages": ["packages/*", "plugins/*"], "npmClient": "yarn", "useWorkspaces": true, - "version": "0.1.1-alpha.6" + "version": "0.1.1-alpha.7" } diff --git a/packages/app/package.json b/packages/app/package.json index 15681d0548..6e314c3fe0 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,21 +1,21 @@ { "name": "example-app", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "private": true, "dependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/plugin-catalog": "^0.1.1-alpha.6", - "@backstage/plugin-circleci": "^0.1.1-alpha.6", - "@backstage/plugin-explore": "^0.1.1-alpha.6", - "@backstage/plugin-home-page": "^0.1.1-alpha.6", - "@backstage/plugin-lighthouse": "^0.1.1-alpha.6", - "@backstage/plugin-register-component": "^0.1.1-alpha.6", - "@backstage/plugin-scaffolder": "^0.1.1-alpha.6", - "@backstage/plugin-sentry": "^0.1.1-alpha.6", - "@backstage/plugin-tech-radar": "^0.1.1-alpha.6", - "@backstage/plugin-welcome": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/core": "^0.1.1-alpha.7", + "@backstage/plugin-catalog": "^0.1.1-alpha.7", + "@backstage/plugin-circleci": "^0.1.1-alpha.7", + "@backstage/plugin-explore": "^0.1.1-alpha.7", + "@backstage/plugin-home-page": "^0.1.1-alpha.7", + "@backstage/plugin-lighthouse": "^0.1.1-alpha.7", + "@backstage/plugin-register-component": "^0.1.1-alpha.7", + "@backstage/plugin-scaffolder": "^0.1.1-alpha.7", + "@backstage/plugin-sentry": "^0.1.1-alpha.7", + "@backstage/plugin-tech-radar": "^0.1.1-alpha.7", + "@backstage/plugin-welcome": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "prop-types": "^15.7.2", diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 847f034550..94dd222c41 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-common", "description": "Common functionality library for Backstage backends", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist", "types": "src/index.ts", "private": false, @@ -32,7 +32,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", "@types/express": "^4.17.6", "@types/http-errors": "^1.6.3", "@types/morgan": "^1.9.0", diff --git a/packages/backend/package.json b/packages/backend/package.json index 51fe04e51d..65e2976489 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist", "types": "src/index.ts", "private": true, @@ -17,13 +17,13 @@ "migrate:create": "knex migrate:make -x ts" }, "dependencies": { - "@backstage/backend-common": "^0.1.1-alpha.6", - "@backstage/catalog-model": "^0.1.1-alpha.6", - "@backstage/plugin-auth-backend": "^0.1.1-alpha.6", - "@backstage/plugin-catalog-backend": "^0.1.1-alpha.6", - "@backstage/plugin-identity-backend": "^0.1.1-alpha.6", - "@backstage/plugin-scaffolder-backend": "^0.1.1-alpha.6", - "@backstage/plugin-sentry-backend": "^0.1.1-alpha.6", + "@backstage/backend-common": "^0.1.1-alpha.7", + "@backstage/catalog-model": "^0.1.1-alpha.7", + "@backstage/plugin-auth-backend": "^0.1.1-alpha.7", + "@backstage/plugin-catalog-backend": "^0.1.1-alpha.7", + "@backstage/plugin-identity-backend": "^0.1.1-alpha.7", + "@backstage/plugin-scaffolder-backend": "^0.1.1-alpha.7", + "@backstage/plugin-sentry-backend": "^0.1.1-alpha.7", "compression": "^1.7.4", "cors": "^2.8.5", "esm": "^3.2.25", @@ -34,7 +34,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", "@types/compression": "^1.7.0", "@types/cors": "^2.8.6", "@types/express": "^4.17.6", diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json index 2de2e70e8e..d2a63560e3 100644 --- a/packages/catalog-model/package.json +++ b/packages/catalog-model/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/catalog-model", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist/index.cjs.js", "module": "dist/index.esm.js", "main:src": "src/index.ts", @@ -26,7 +26,7 @@ "yup": "^0.28.5" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", "@types/jest": "^25.2.2", "@types/lodash": "^4.14.151", "@types/yup": "^0.28.2", diff --git a/packages/cli/package.json b/packages/cli/package.json index 30e56bf353..58b6c3fd84 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli", "description": "CLI for developing Backstage plugins and apps", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "private": false, "publishConfig": { "access": "public" @@ -29,8 +29,8 @@ "backstage-cli": "bin/backstage-cli" }, "dependencies": { - "@backstage/config": "^0.1.1-alpha.6", - "@backstage/config-loader": "^0.1.1-alpha.6", + "@backstage/config": "^0.1.1-alpha.7", + "@backstage/config-loader": "^0.1.1-alpha.7", "@hot-loader/react-dom": "^16.13.0", "@lerna/package-graph": "^3.18.5", "@lerna/project": "^3.18.0", diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 2641e988d6..7018dc40a8 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config-loader", "description": "Config loading functionality used by Backstage backend, and CLI", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "private": false, "publishConfig": { "access": "public", @@ -30,7 +30,7 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/config": "^0.1.1-alpha.6", + "@backstage/config": "^0.1.1-alpha.7", "fs-extra": "^9.0.0", "yaml": "^1.9.2" }, diff --git a/packages/config/package.json b/packages/config/package.json index 2ff5450a0b..c67264d4c9 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/config", "description": "Config API used by Backstage core, backend, and CLI", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "private": false, "publishConfig": { "access": "public", diff --git a/packages/core-api/package.json b/packages/core-api/package.json index c91a96ab31..f08b03a77e 100644 --- a/packages/core-api/package.json +++ b/packages/core-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-api", "description": "Internal Core API used by Backstage plugins and apps", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "private": false, "publishConfig": { "access": "public", @@ -30,8 +30,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/config": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/config": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@types/react": "^16.9", @@ -42,8 +42,8 @@ "zen-observable": "^0.8.15" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/test-utils-core": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/test-utils-core": "^0.1.1-alpha.7", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^10.2.4", diff --git a/packages/core/package.json b/packages/core/package.json index 6233f27065..8a476a58d5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core", "description": "Core API used by Backstage plugins and apps", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "private": false, "publishConfig": { "access": "public", @@ -30,9 +30,9 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/config": "^0.1.1-alpha.6", - "@backstage/core-api": "0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/config": "^0.1.1-alpha.7", + "@backstage/core-api": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -55,8 +55,8 @@ "react-use": "^14.2.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/test-utils": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/test-utils": "^0.1.1-alpha.7", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^10.2.4", diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index eea0956a8b..01753db4d8 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/dev-utils", "description": "Utilities for developing Backstage plugins.", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "private": false, "publishConfig": { "access": "public", @@ -30,10 +30,10 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/test-utils": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/core": "^0.1.1-alpha.7", + "@backstage/test-utils": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@testing-library/jest-dom": "^5.7.0", diff --git a/packages/storybook/package.json b/packages/storybook/package.json index 883fb1452a..132bf29c72 100644 --- a/packages/storybook/package.json +++ b/packages/storybook/package.json @@ -1,6 +1,6 @@ { "name": "storybook", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "description": "Storybook build for core package", "private": true, "scripts": { @@ -14,7 +14,7 @@ ] }, "dependencies": { - "@backstage/theme": "^0.1.1-alpha.6" + "@backstage/theme": "^0.1.1-alpha.7" }, "devDependencies": { "@storybook/addon-actions": "^5.3.17", diff --git a/packages/test-utils-core/package.json b/packages/test-utils-core/package.json index b1ef87729d..f0b98add94 100644 --- a/packages/test-utils-core/package.json +++ b/packages/test-utils-core/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/test-utils-core", "description": "Utilities to test Backstage core", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "private": false, "publishConfig": { "access": "public", diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 2a9320ee63..f48fe65c30 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/test-utils", "description": "Utilities to test Backstage plugins and apps.", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "private": false, "publishConfig": { "access": "public", @@ -30,10 +30,10 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/core-api": "^0.1.1-alpha.6", - "@backstage/test-utils-core": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/core-api": "^0.1.1-alpha.7", + "@backstage/test-utils-core": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", diff --git a/packages/theme/package.json b/packages/theme/package.json index 501ef6473e..8b017d4cf9 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/theme", "description": "material-ui theme for use with Backstage.", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "private": false, "publishConfig": { "access": "public", @@ -32,7 +32,7 @@ "@material-ui/core": "^4.9.1" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6" + "@backstage/cli": "^0.1.1-alpha.7" }, "files": [ "dist/**/*.{js,d.ts}" diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index d662f3eb6c..f45a1cbf7a 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-auth-backend", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist", "types": "src/index.ts", "license": "Apache-2.0", @@ -15,8 +15,9 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.1.1-alpha.6", + "@backstage/backend-common": "^0.1.1-alpha.7", "@types/cookie-parser": "^1.4.2", + "@types/jwt-decode": "2.2.1", "@types/passport": "^1.0.3", "@types/passport-github2": "^1.2.4", "@types/passport-google-oauth20": "^2.0.3", @@ -28,18 +29,17 @@ "express-promise-router": "^3.0.3", "fs-extra": "^9.0.0", "helmet": "^3.22.0", + "jwt-decode": "2.2.0", "morgan": "^1.10.0", "passport": "^0.4.1", "passport-github2": "^0.1.12", "passport-google-oauth20": "^2.0.0", "passport-saml": "^1.3.3", "winston": "^3.2.1", - "yn": "^4.0.0", - "jwt-decode": "2.2.0", - "@types/jwt-decode": "2.2.1" + "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", "@types/body-parser": "^1.19.0", "@types/passport-saml": "^1.1.2", "jest-fetch-mock": "^3.0.3", diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index 253959c61b..7490d1221a 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog-backend", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist", "types": "src/index.ts", "license": "Apache-2.0", @@ -16,8 +16,8 @@ "mock-data": "./scripts/mock-data" }, "dependencies": { - "@backstage/backend-common": "^0.1.1-alpha.6", - "@backstage/catalog-model": "^0.1.1-alpha.6", + "@backstage/backend-common": "^0.1.1-alpha.7", + "@backstage/catalog-model": "^0.1.1-alpha.7", "compression": "^1.7.4", "cors": "^2.8.5", "esm": "^3.2.25", @@ -37,7 +37,7 @@ "yup": "^0.28.5" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", "@types/lodash": "^4.14.151", "@types/node-fetch": "^2.5.7", "@types/supertest": "^2.0.8", diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index e19869c946..7b8c1ccc70 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-catalog", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist/index.esm.js", "main:src": "src/index.ts", "types": "src/index.ts", @@ -22,11 +22,11 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/catalog-model": "^0.1.1-alpha.6", - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/plugin-scaffolder": "^0.1.1-alpha.6", - "@backstage/plugin-sentry": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/catalog-model": "^0.1.1-alpha.7", + "@backstage/core": "^0.1.1-alpha.7", + "@backstage/plugin-scaffolder": "^0.1.1-alpha.7", + "@backstage/plugin-sentry": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -37,9 +37,9 @@ "react-use": "^14.2.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/dev-utils": "^0.1.1-alpha.6", - "@backstage/test-utils": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/dev-utils": "^0.1.1-alpha.7", + "@backstage/test-utils": "^0.1.1-alpha.7", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/react-hooks": "^3.3.0", diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index d58ea6b406..c1570eaaad 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-circleci", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist/index.esm.js", "main:src": "src/index.ts", "types": "src/index.ts", @@ -31,8 +31,8 @@ "postpack": "backstage-cli postpack" }, "dependencies": { - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/core": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -47,8 +47,8 @@ "react-use": "^14.2.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/dev-utils": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/dev-utils": "^0.1.1-alpha.7", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^10.2.4", diff --git a/plugins/explore/package.json b/plugins/explore/package.json index 400d212e69..15df6fae75 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-explore", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist/index.esm.js", "main:src": "src/index.ts", "types": "src/index.ts", @@ -22,8 +22,8 @@ "start": "backstage-cli plugin:serve" }, "dependencies": { - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/core": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -33,9 +33,9 @@ "react-use": "^14.2.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/dev-utils": "^0.1.1-alpha.6", - "@backstage/test-utils": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/dev-utils": "^0.1.1-alpha.7", + "@backstage/test-utils": "^0.1.1-alpha.7", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^10.2.4", diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index d4141aa367..1132ced6da 100644 --- a/plugins/graphiql/package.json +++ b/plugins/graphiql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphiql", "description": "Backstage plugin for browsing GraphQL APIs", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "private": false, "publishConfig": { "access": "public", @@ -32,8 +32,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/core": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -44,9 +44,9 @@ "react-use": "^14.2.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/dev-utils": "^0.1.1-alpha.6", - "@backstage/test-utils": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/dev-utils": "^0.1.1-alpha.7", + "@backstage/test-utils": "^0.1.1-alpha.7", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^10.2.4", diff --git a/plugins/home-page/package.json b/plugins/home-page/package.json index 54144cefe3..cf4b077dfc 100644 --- a/plugins/home-page/package.json +++ b/plugins/home-page/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-home-page", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist/index.esm.js", "main:src": "src/index.ts", "types": "src/index.ts", @@ -22,8 +22,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/core": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -32,8 +32,8 @@ "react-use": "^14.2.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/dev-utils": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/dev-utils": "^0.1.1-alpha.7", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^10.2.4", diff --git a/plugins/identity-backend/package.json b/plugins/identity-backend/package.json index 30512ee658..922ff8412d 100644 --- a/plugins/identity-backend/package.json +++ b/plugins/identity-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-identity-backend", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist", "types": "src/index.ts", "license": "Apache-2.0", @@ -15,7 +15,7 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.1.1-alpha.6", + "@backstage/backend-common": "^0.1.1-alpha.7", "compression": "^1.7.4", "cors": "^2.8.5", "express": "^4.17.1", @@ -27,7 +27,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", "jest-fetch-mock": "^3.0.3", "tsc-watch": "^4.2.3" }, diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index fce604b609..eeb6bfa0bd 100644 --- a/plugins/lighthouse/package.json +++ b/plugins/lighthouse/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-lighthouse", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist/index.esm.js", "main:src": "src/index.ts", "types": "src/index.ts", @@ -22,8 +22,8 @@ "start": "backstage-cli plugin:serve" }, "dependencies": { - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/core": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -34,9 +34,9 @@ "react-use": "^14.2.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/dev-utils": "^0.1.1-alpha.6", - "@backstage/test-utils": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/dev-utils": "^0.1.1-alpha.7", + "@backstage/test-utils": "^0.1.1-alpha.7", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^10.2.4", diff --git a/plugins/register-component/package.json b/plugins/register-component/package.json index 3f14d2f4cb..f1b28e99d2 100644 --- a/plugins/register-component/package.json +++ b/plugins/register-component/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-register-component", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist/index.esm.js", "main:src": "src/index.ts", "types": "src/index.ts", @@ -22,10 +22,10 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/catalog-model": "^0.1.1-alpha.6", - "@backstage/plugin-catalog": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/catalog-model": "^0.1.1-alpha.7", + "@backstage/core": "^0.1.1-alpha.7", + "@backstage/plugin-catalog": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -37,8 +37,8 @@ "react-use": "^14.2.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/dev-utils": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/dev-utils": "^0.1.1-alpha.7", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^10.2.4", diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 244294cd42..2fa5462fcc 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder-backend", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist", "types": "src/index.ts", "license": "Apache-2.0", @@ -14,7 +14,7 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.1.1-alpha.6", + "@backstage/backend-common": "^0.1.1-alpha.7", "compression": "^1.7.4", "cors": "^2.8.5", "dockerode": "^3.2.0", @@ -27,7 +27,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", "@types/fs-extra": "^9.0.1", "@types/supertest": "^2.0.8", "supertest": "^4.0.2" diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index b03fc39772..bc54e5f7c5 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-scaffolder", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist/index.esm.js", "main:src": "src/index.ts", "types": "src/index.ts", @@ -22,8 +22,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/core": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -33,8 +33,8 @@ "react-use": "^14.2.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/dev-utils": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/dev-utils": "^0.1.1-alpha.7", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^10.2.4", diff --git a/plugins/sentry-backend/package.json b/plugins/sentry-backend/package.json index 3d4abb8790..c9d7a585e4 100644 --- a/plugins/sentry-backend/package.json +++ b/plugins/sentry-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sentry-backend", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist", "types": "src/index.ts", "license": "Apache-2.0", @@ -15,7 +15,7 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.1.1-alpha.6", + "@backstage/backend-common": "^0.1.1-alpha.7", "axios": "^0.19.2", "compression": "^1.7.4", "cors": "^2.8.5", @@ -28,7 +28,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", "jest-fetch-mock": "^3.0.3", "tsc-watch": "^4.2.3" }, diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index f539afa886..cdf2025cb8 100644 --- a/plugins/sentry/package.json +++ b/plugins/sentry/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-sentry", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist/index.esm.js", "main:src": "src/index.ts", "types": "src/index.ts", @@ -22,8 +22,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/core": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -34,8 +34,8 @@ "timeago.js": "^4.0.2" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/dev-utils": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/dev-utils": "^0.1.1-alpha.7", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^10.2.4", diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index 5327ce7cfb..a5befefe2f 100644 --- a/plugins/tech-radar/package.json +++ b/plugins/tech-radar/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-radar", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist/index.esm.js", "main:src": "src/index.ts", "types": "src/index.ts", @@ -22,9 +22,9 @@ "start": "backstage-cli plugin:serve" }, "dependencies": { - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/test-utils-core": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/core": "^0.1.1-alpha.7", + "@backstage/test-utils-core": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -37,8 +37,8 @@ "react-use": "^14.2.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/dev-utils": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/dev-utils": "^0.1.1-alpha.7", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^10.2.4", diff --git a/plugins/welcome/package.json b/plugins/welcome/package.json index 6debcc9c80..fd6aa917b4 100644 --- a/plugins/welcome/package.json +++ b/plugins/welcome/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-welcome", - "version": "0.1.1-alpha.6", + "version": "0.1.1-alpha.7", "main": "dist/index.esm.js", "main:src": "src/index.ts", "types": "src/index.ts", @@ -22,8 +22,8 @@ "start": "backstage-cli plugin:serve" }, "dependencies": { - "@backstage/core": "^0.1.1-alpha.6", - "@backstage/theme": "^0.1.1-alpha.6", + "@backstage/core": "^0.1.1-alpha.7", + "@backstage/theme": "^0.1.1-alpha.7", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -33,8 +33,8 @@ "react-use": "^14.2.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.6", - "@backstage/dev-utils": "^0.1.1-alpha.6", + "@backstage/cli": "^0.1.1-alpha.7", + "@backstage/dev-utils": "^0.1.1-alpha.7", "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^10.2.4", From c8294b32857e18f0b525da6ecfd1e0251b2d4348 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 9 Jun 2020 14:27:28 +0200 Subject: [PATCH 189/192] docs: added prettier config --- docs/prettier.config.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 docs/prettier.config.js diff --git a/docs/prettier.config.js b/docs/prettier.config.js new file mode 100644 index 0000000000..6fab539fb2 --- /dev/null +++ b/docs/prettier.config.js @@ -0,0 +1,21 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Use Object.assign since we haven't configured eslint for ... support in here +module.exports = Object.assign({}, require('@spotify/prettier-config'), { + proseWrap: 'always', + printWidth: 80, +}); From 250db6cc2a3f505aa1206a860e760ffc8bc3c625 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 9 Jun 2020 15:55:44 +0200 Subject: [PATCH 190/192] docs: added plantuml generation script --- docs/generate-uml.sh | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100755 docs/generate-uml.sh diff --git a/docs/generate-uml.sh b/docs/generate-uml.sh new file mode 100755 index 0000000000..55117838ea --- /dev/null +++ b/docs/generate-uml.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# This script uses plantuml to generate SVG images from inline plantuml descriptions. +# See ./auth/oauth.md for an example. +# +# You need to have plantuml installed (brew install plantuml, or some other method). +# +# Either call directly to generate diagrams for all markdown files in this directory, +# or add a --watch flag to rebuild SVGs on changes. + +cd "$( dirname "${BASH_SOURCE[0]}" )" + +if [[ "$1" == '--watch' ]]; then + npx --no-install nodemon --ext md --exec './generate-uml.sh' +fi + +grep '@startuml' -rl --include '*.md' . | while read -r file ; do + echo "Generating : $file" + plantuml -tsvg "$file" 2> >(grep -v "CoreText note:") +done From 4f3375073db11872897165356d3e2d96ef259e78 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 9 Jun 2020 18:19:47 +0200 Subject: [PATCH 191/192] docs/auth: added overview, oauth description and glossary --- docs/auth/glossary.md | 26 ++++++ docs/auth/oauth-popup-flow.svg | 56 ++++++++++++ docs/auth/oauth.md | 151 +++++++++++++++++++++++++++++++++ docs/auth/overview.md | 44 ++++++++++ 4 files changed, 277 insertions(+) create mode 100644 docs/auth/glossary.md create mode 100644 docs/auth/oauth-popup-flow.svg create mode 100644 docs/auth/oauth.md create mode 100644 docs/auth/overview.md diff --git a/docs/auth/glossary.md b/docs/auth/glossary.md new file mode 100644 index 0000000000..6408587273 --- /dev/null +++ b/docs/auth/glossary.md @@ -0,0 +1,26 @@ +# Glossary + +- **Popup** - A separate browser window opened on top of the previous one. +- **OAuth** - More specifically OAuth 2.0, a standard protocol for + authorization. See [oauth.net/2/](https://oauth.net/2/). +- **OpenID Connect** - A layer on top of OAuth which standardises + authentication. See + [en.wikipedia.org/wiki/OpenID_Connect](https://en.wikipedia.org/wiki/OpenID_Connect). +- **JWT** - JSON Web Token, a popular JSON based token format that is commonly + encrypted and/or signed, see + [en.wikipedia.org/wiki/JSON_Web_Token](https://en.wikipedia.org/wiki/JSON_Web_Token) +- **Scope** - A string that describes a certain type of access that can be + granted to a user using OAuth. +- **Access token** - A token that gives access to perform actions on behalf of a + user. It will commonly have a short expiry time, and be limited to a set of + scopes. Part of the OAuth protocol. +- **ID token** - A JWT used to prove a user's identity, containing for example + the user's email. Part of OpenID Connect. +- **Offline access** - OAuth flow that results in both a refresh and access + token, where the refresh token has a long expiration or never expires, and can + be used to request more access tokens in the future. This lets the user go + "offline" with respect to the token issuer, but still be able to request more + tokens at a later time without further direct interaction for the user. +- **Code grant** - OAuth flow where the client receives an authorization code + that is passed to the backend to be exchanged for an access token and possibly + refresh token. diff --git a/docs/auth/oauth-popup-flow.svg b/docs/auth/oauth-popup-flow.svg new file mode 100644 index 0000000000..4d9e79787a --- /dev/null +++ b/docs/auth/oauth-popup-flow.svg @@ -0,0 +1,56 @@ +OAuth Consent and Refresh FlowBrowserBrowserPopup WindowPopup Windowauth-backend pluginauth-backend pluginConsent ScreenConsent ScreenOAuth ProviderOAuth ProviderComponents on page ask for anaccess token with greaterscope than the existing session.Open popupGET /auth/<provider>/start?scope=some%20scopesRedirect to consent screen withrandom nonce in OAuth state andshort-lived cookie with the same nonce.GET /consent_url?redirect_uri=<redirect_uri>?nonce=<n>where redirect_uri=<app-origin>/auth/<provider>/handler/frameUser consents toaccess the new scope.Redirect to given redirect URL, with authorization codeGET /auth/<provider>/handler/frame?code=<c>&nonce=<n>Request includes the previously set none cookieVerify that the nonce in the cookiematches the nonce in the OAuth stateAuthorization CodeClient IDClient SecretVerify and generate tokensAccess Token(ID Token)(Refresh Token)ScopeExpire TimeSmall HTML page with inlined response payloadStore Refresh Token in HTTP-only cookiepostMessage() with tokens and info or errorClose selfA later point when a refreshis needed. Either because ofa reload or an expiring session.GET /auth/<provider>/tokenRefresh Token cookie includedRefresh TokenClient IDClient SecretAccess Token(ID Token)ScopeExpire TimeTokens and info \ No newline at end of file diff --git a/docs/auth/oauth.md b/docs/auth/oauth.md new file mode 100644 index 0000000000..519cfe1d85 --- /dev/null +++ b/docs/auth/oauth.md @@ -0,0 +1,151 @@ +# OAuth and OpenID Connect + +This section describes how Backstage allows plugins to request OAuth Access +Tokens and OpenID Connect ID Tokens on behalf of the user, to be used for auth +to various third party APIs. + +## Summary + +There are occasions when the user wants to perform actions towards third party +services that require authorization via OAuth. Backstage provides standardized +[Utility APIs](../getting-started/utility-apis.md) such as the +[GoogleAuthApi](../../packages/core-api/src/apis/definitions/auth.ts) for that +use-case. Backstage also includes a set of implementations of these APIs that +integrate with the [auth-backend](../../plugins/auth-backend) plugin to provide +a popup-based OAuth flow. + +## Background + +Access control in OAuth is implemented in terms of scope, which is a list of +permissions given to the app. An OAuth service can issue Access Tokens that are +tied to a certain set of scopes, such as viewing profile information, reading +and/or writing user data in the service. The scope format and handling is +specific to each OAuth provider, and the set of available scopes are typically +found in the documentation describing the auth solution of the provider, for +example +[developers.google.com/identity/protocols/oauth2/scopes](https://developers.google.com/identity/protocols/oauth2/scopes). + +As a part of logging in with an OAuth provider, the user needs to consent to +both the login itself and the set of scopes that the app is requesting to use. +This is done by loading a page provided by the OAuth provider, where a user can +choose an account to log in with, and accept or reject the request. If the user +accepts the login request, a token is issued, and any holder of the token can +use it to make authenticated requests towards the third party service. + +## OAuth in @backstage/core-api and auth-backend + +The default OAuth implementation in Backstage is based on an OAuth server-side +offline access flow, which means that it uses the backend as a helper in order +to trade credentials. A benefit of this type of flow is that it does not require +the use of third party cookies, and is robust on a wide selection of browsers +and privacy browsing plugins, strict security settings, etc. + +The implementation also uses a popup-based flow, where auth requests are handled +in a new popup window that is opened by the app. By using a popup-based flow it +is possible to request authentication at any point in the app, without requiring +a redirect. Because of this there is no need to ask for all scopes upfront, or +interrupt the app with a redirect and forcing plugin authors to take care in +restoring state after a redirect has been make. All in all it makes it much +easier to make authenticated requests inside a plugin. + +## OAuth Flow + +The following describes the OAuth flow implemented by the +[auth-backend](../../plugins/auth-backend) and +[DefaultAuthConnector](../../packages/core-api/src/lib/AuthConnector/DefaultAuthConnector.ts) +in `@backstage/core-api`. + +Component and APIs can request Access or ID Tokens from any available Auth +provider. If there already exists a cached fresh token that covers (at least) +the requested scopes, it will be returned immediately. If the OAuth provider +implements token refreshes, this check will also trigger a token refresh attempt +if no session is a available. + +If new scopes are requested, or the user is not yet logged in with that +provider, a dialog is shown informing the user that they need to log in with the +specified provider. If the user agrees to continue, a separate popup window is +opened that implements the entire consent flow. + +The popup window is pointed to the `/start` endpoint of the auth provider in the +`auth-backend` plugin, which then redirects to the OAuth consent screen of the +provider. The consent screen is controlled by the OAuth provider, and will do +things like prompting the user to log in with an account, and possibly reviewing +the set of requested scopes. If the login request is accepted, the popup window +will be redirected back to the `/handler/frame` endpoint of the auth backend. +The redirect URL will contain a short-term authorization code, which is picked +up by the backend and exchanged for long-term tokens via a call to the OAuth +provider. The Access and possibly ID Token is then handed back to the main +Backstage page via `postMessage`. If the OAuth provider implements offline +refresh, a refresh token will be stored in an HTTP-only cookie scoped to the +specific provider in the `auth-backend` plugin. + +To protect against certain attacks, the above flow also includes a simple nonce +check and a lightweight CSRF protection header. The nonce check is done to +protect against attacks where an attacker tricks a user to log in with an +account of the attacker's choosing in order to gather data. In the first part of +the flow where the popup is directed to the `/start` endpoint, a nonce is +generated and placed in both a cookie and the OAuth state. The nonces received +in the cookie and OAuth state in the redirect handler are then checked, and the +auth attempt will fail if they're not valid. The CSRF protection for the +`/refresh` and `/logout` endpoints is implemented by simply checking for the +presence of a `X-Requested-With` header. + +The target origin of the `postMessage` is also of importance to keep the flow +secure. It is configured to a single value for each auth provider and +environment. Without a single configured origin, any page could open a popup and +request an access token. + +### Sequence Diagram + +The following diagram visualizes the flow described in the previous section. + + + +![](oauth-popup-flow.svg) diff --git a/docs/auth/overview.md b/docs/auth/overview.md new file mode 100644 index 0000000000..2806b2dccf --- /dev/null +++ b/docs/auth/overview.md @@ -0,0 +1,44 @@ +# User Authentication and Authorization in Backstage + +## Summary + +The purpose of the Auth APIs in Backstage are to identify the user, and to +provide a way for plugins to request access to 3rd party services on behalf of +the user (OAuth). This documentation focuses on the implementation of that +solution and how to extend it. For documentation on how to consume the Auth APIs +in a plugin, see [TODO](#TODO). + +### Accessing Third Party Services + +The main pattern for talking to third party services in Backstage is +user-to-server requests, where short-lived OAuth Access Tokens are requested by +plugins to authenticate calls to external services. These calls can be made +either directly to the services or through a backend plugin or service. + +By relying on user-to-server calls we keep the coupling between the frontend and +backend low, and provide a much lower barrier for plugins to make use of third +party services. This is in comparison to for example a session-based system, +where access tokens are stored server-side. Such a solution would require a much +deeper coupling between the auth backend plugin, its session storage, and other +backend plugins or separate services. A goal of Backstage is to make it as easy +as possible to create new plugins, and an auth solution based on user-to-server +OAuth helps in that regard. + +The method with which frontend plugins request access to third party services is +through [Utility APIs](../getting-started/utility-apis.md) for each service +provider. For a full list of providers, see [TODO](#TODO). + +### Identity - TODO + +This documentation currently only covers the OAuth use-case, as identity +management is not settled yet and part of an +[upcoming milestone](https://github.com/spotify/backstage/milestone/12). + +## Further Reading + +More details are provided in dedicated sections of the documentation. + +- [OAuth](./oauth): Description of the generic OAuth flow implemented by the + [auth-backend](../../plugins/auth-backend). +- [Glossary](./glossary): Glossary of some common terms related to the auth + flows. From a633dce818a9692bd2d9fd898bf589877e027063 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 9 Jun 2020 19:50:41 +0200 Subject: [PATCH 192/192] docs: format with prettier (#1218) --- docs/FAQ.md | 283 ++++++++++++------ .../adr002-default-catalog-file-format.md | 145 ++++----- .../adr003-avoid-default-exports.md | 47 ++- .../adr004-module-export-structure.md | 44 ++- .../adr005-catalog-core-entities.md | 51 +++- docs/architecture-terminology.md | 15 +- docs/auth/add-auth-provider.md | 71 +++-- docs/create-an-app.md | 19 +- docs/design.md | 114 +++++-- docs/getting-started/Plugin development.md | 18 +- docs/getting-started/README.md | 4 +- docs/getting-started/app-custom-theme.md | 44 ++- .../contributing-to-storybook.md | 13 +- docs/getting-started/create-a-plugin.md | 21 +- .../development-environment.md | 30 +- docs/getting-started/structure-of-a-plugin.md | 33 +- docs/getting-started/utility-apis.md | 138 +++++---- docs/publishing.md | 17 +- docs/reference/createPlugin-feature-flags.md | 7 +- docs/reference/createPlugin-router.md | 6 +- 20 files changed, 756 insertions(+), 364 deletions(-) diff --git a/docs/FAQ.md b/docs/FAQ.md index 100e3e19de..5fb131528a 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -4,35 +4,67 @@ ### Can we call Backstage something different? So that it fits our company better? -Yes, Backstage is just a platform for building your own developer portal. We happen to call our internal version Backstage, as well, as a reference to our music roots. You can call your version whatever suits your team, company, or brand. +Yes, Backstage is just a platform for building your own developer portal. We +happen to call our internal version Backstage, as well, as a reference to our +music roots. You can call your version whatever suits your team, company, or +brand. ### Is Backstage a monitoring platform? -No, but it can be! Backstage is designed to be a developer portal for all your infrastructure tooling, services, and documentation. So, it's not a monitoring platform — but that doesn't mean you can't integrate a monitoring tool into Backstage by writing [a plugin](https://github.com/spotify/faq#what-is-a-plugin-in-backstage). +No, but it can be! Backstage is designed to be a developer portal for all your +infrastructure tooling, services, and documentation. So, it's not a monitoring +platform — but that doesn't mean you can't integrate a monitoring tool into +Backstage by writing +[a plugin](https://github.com/spotify/faq#what-is-a-plugin-in-backstage). ### How is Backstage licensed? -Backstage was released as free and open software by Spotify and is licensed under [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0). +Backstage was released as free and open software by Spotify and is licensed +under [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0). ### Why did we open source Backstage? -We hope to see Backstage become the infrastructure standard everywhere. When we saw how much Backstage improved developer experience and productivity internally, we wanted to share those gains. After all, if Backstage can create order in an engineering environment as open and diverse as ours, then we're pretty sure it can create order (and boost productivity) anywhere. To learn more, read our blog post, "[What the heck is Backstage anyway?](https://backstage.io/blog/2020/03/18/what-is-backstage)" +We hope to see Backstage become the infrastructure standard everywhere. When we +saw how much Backstage improved developer experience and productivity +internally, we wanted to share those gains. After all, if Backstage can create +order in an engineering environment as open and diverse as ours, then we're +pretty sure it can create order (and boost productivity) anywhere. To learn +more, read our blog post, +"[What the heck is Backstage anyway?](https://backstage.io/blog/2020/03/18/what-is-backstage)" ### Will Spotify's internal plugins be open sourced, too? -Yes, we've already started releasing open source versions of some of the plugins we use here, and we'll continue to do so. [Plugins](https://github.com/spotify/faq#what-is-a-plugin-in-backstage) are the building blocks of functionality in Backstage. We have over 120 plugins inside Spotify — many of those are specialized for our use, so will remain internal and proprietary to us. But we estimate that about a third of our existing plugins make good open source candidates. (And we'll probably end up writing some brand new ones, too.) -​ +Yes, we've already started releasing open source versions of some of the plugins +we use here, and we'll continue to do so. +[Plugins](https://github.com/spotify/faq#what-is-a-plugin-in-backstage) are the +building blocks of functionality in Backstage. We have over 120 plugins inside +Spotify — many of those are specialized for our use, so will remain internal and +proprietary to us. But we estimate that about a third of our existing plugins +make good open source candidates. (And we'll probably end up writing some brand +new ones, too.) ​ + ### What's the roadmap for Backstage? -​ -We envision three phases, which you can learn about in [our project roadmap](https://github.com/spotify/backstage#project-roadmap). Even though the open source version of Backstage is relatively new compared to our internal version, we have already begun work on various aspects of all three phases. Looking at the [milestones for active issues](https://github.com/spotify/backstage/milestones) will also give you a sense of our progress. + +​ We envision three phases, which you can learn about in +[our project roadmap](https://github.com/spotify/backstage#project-roadmap). +Even though the open source version of Backstage is relatively new compared to +our internal version, we have already begun work on various aspects of all three +phases. Looking at the +[milestones for active issues](https://github.com/spotify/backstage/milestones) +will also give you a sense of our progress. ### My company doesn't have thousands of developers or services. Is Backstage overkill? -Not at all! A core reason to adopt Backstage is to standardize how software is built at your company. It's easier to decide on those standards as a small company, and grows in importance as the company grows. Backstage sets a foundation, and an early investment in your infrastructure becomes even more valuable as you grow. +Not at all! A core reason to adopt Backstage is to standardize how software is +built at your company. It's easier to decide on those standards as a small +company, and grows in importance as the company grows. Backstage sets a +foundation, and an early investment in your infrastructure becomes even more +valuable as you grow. ### Our company has a strong design language system/brand that we want to incorporate. Does Backstage support this? -Yes! The Backstage UI is built using Material-UI. With the theming capabilities of Material-UI, you are able to adapt the interface to your brand guidelines. +Yes! The Backstage UI is built using Material-UI. With the theming capabilities +of Material-UI, you are able to adapt the interface to your brand guidelines. ## Technical FAQ: @@ -40,96 +72,155 @@ Yes! The Backstage UI is built using Material-UI. With the theming capabilities The short answer is that's what we've been using in Backstage internally. -The original decision was based on Google's Material Design being a thorough, well thought out and complete design system, with many mature and powerful libraries implemented in both the system itself and auxiliary components that we knew that we would like to use. +The original decision was based on Google's Material Design being a thorough, +well thought out and complete design system, with many mature and powerful +libraries implemented in both the system itself and auxiliary components that we +knew that we would like to use. + +It strikes a good balance between power, customizability, and ease of use. A +core focus of Backstage is to make plugin developers productive with as few +hurdles as possible. Material-UI lets plugin makers get going easily with both +well-known tech and a large flora of components. ​ -It strikes a good balance between power, customizability, and ease of use. A core focus of Backstage is to make plugin developers productive with as few hurdles as possible. Material-UI lets plugin makers get going easily with both well-known tech and a large flora of components. -​ ### What technology does Backstage use? -​ -The code base is a large-scale React application that uses TypeScript. For [Phase 2](https://github.com/spotify/backstage#project-roadmap), we plan to use Node.js and GraphQL. -​ -### What is the end-to-end user flow? The happy path story. -​ -There are three main user profiles for Backstage: the integrator, the contributor, and the software engineer. -​ -The **integrator** hosts the Backstage app and configures which plugins are available to use in the app. -​ -The **contributor** adds functionality to the app by writing plugins. -​ -The **software engineer** uses the app's functionality and interacts with its plugins. -​ -### What is a "plugin" in Backstage? -​ -Plugins are what provide the feature functionality in Backstage. They are used to integrate different systems into Backstage's frontend, so that the developer gets a consistent UX, no matter what tool or service is being accessed on the other side. -​ -Each plugin is treated as a self-contained web app and can include almost any type of content. Plugins all use a common set of platform APIs and reusable UI components. Plugins can fetch data either from the backend or an API exposed through the proxy. -​ -Learn more about [the different components](https://github.com/spotify/backstage#overview) that make up Backstage. -​ -### Do I have to write plugins in TypeScript? -​ -No, you can use JavaScript if you prefer. -​ -We want to keep the Backstage core APIs in TypeScript, but aren't forcing it on individual plugins. -​ -### How do I find out if a plugin already exists? -​ -Before you write a plugin, [search the plugin issues](https://github.com/spotify/backstage/issues?q=is%3Aissue+label%3Aplugin+) to see if it already exists or is in the works. If no one's thought of it yet, great! Open a new issue as [a plugin suggestion](https://github.com/spotify/backstage/issues/new/choose) and describe what your plugin will do. This will help coordinate our contributors' efforts and avoid duplicating existing functionality. -​ -In the future, we will create [a plugin gallery](https://github.com/spotify/backstage/issues/260) where people can browse and search for all available plugins. -​ -### Which plugin is used the most at Spotify? -​ -By far, our most-used plugin is our TechDocs plugin, which we use for creating technical documentation. Our philosophy at Spotify is to treat "docs like code", where you write documentation using the same workflow as you write your code. This makes it easier to create, find, and update documentation. We hope to release [the open source version](https://github.com/spotify/backstage/issues/687) in the future. (See also: "[Will Spotify's internal plugins be open sourced, too?](https://github.com/spotify/faq#will-spotifys-internal-plugins-be-open-sourced-too)" above) -​ -### Are you planning to have plugins baked into the repo? Or should they be developed in separate repos? -​ -Contributors can add open source plugins to the plugins directory in [this monorepo](https://github.com/spotify/backstage). Integrators can then configure which open source plugins are available to use in their instance of the app. Open source plugins are downloaded as npm packages published in the open source repository. -​ -While we encourage using the open source model, we know there are cases where contributors might want to experiment internally or keep their plugins closed source. Contributors writing closed source plugins should develop them in the plugins directory in their own Backstage repository. Integrators also configure closed source plugins locally from the monorepo. -​ -### Any plans for integrating with other repository managers, such as GitLab or Bitbucket? -​ -We chose GitHub because it is the tool that we are most familiar with, so that will naturally lead to integrations for GitHub being developed at an early stage. -​ -Hosting this project on GitHub does not exclude integrations with alternatives, such as GitLab or Bitbucket. We believe that in time there will be plugins that will provide functionality for these tools as well. Hopefully, contributed by the community! -​ -Also note, implementations of Backstage can be hosted wherever you feel suits your needs best. -​ -### Who maintains Backstage? -​ -Spotify will maintain the open source core, but we envision different parts of the project being maintained by various companies and contributors. We also envision a large, diverse ecosystem of open source plugins, which would be maintained by their original authors/contributors or by the community. -​ -When it comes to [deployment](https://github.com/spotify/backstage/blob/master/DEPLOYMENT.md), the system integrator (typically, the infrastructure team in your organization) maintains Backstage in your own environment. -​ -### Does Spotify provide a managed version of Backstage? -​ -No, this is not a service offering. We build the piece of software, and someone in your infrastructure team is responsible for [deploying](https://github.com/spotify/backstage/blob/master/DEPLOYMENT.md) and maintaining it. -​ -### How secure is Backstage? -​ -We take security seriously. When it comes to packages and code we scan our repositories periodically and update our packages to the latest versions. When it comes to deployment of Backstage within an organisation it depends on the deployment and security setup in your organisation. Reach out to us on [Discord](https://discord.gg/MUpMjP2) if you have specific queries. -Please report sensitive security issues via Spotify's [bug-bounty program](https://hackerone.com/spotify) rather than GitHub. -​ +​ The code base is a large-scale React application that uses TypeScript. For +[Phase 2](https://github.com/spotify/backstage#project-roadmap), we plan to use +Node.js and GraphQL. ​ + +### What is the end-to-end user flow? The happy path story. + +​ There are three main user profiles for Backstage: the integrator, the +contributor, and the software engineer. ​ The **integrator** hosts the Backstage +app and configures which plugins are available to use in the app. ​ The +**contributor** adds functionality to the app by writing plugins. ​ The +**software engineer** uses the app's functionality and interacts with its +plugins. ​ + +### What is a "plugin" in Backstage? + +​ Plugins are what provide the feature functionality in Backstage. They are used +to integrate different systems into Backstage's frontend, so that the developer +gets a consistent UX, no matter what tool or service is being accessed on the +other side. ​ Each plugin is treated as a self-contained web app and can include +almost any type of content. Plugins all use a common set of platform APIs and +reusable UI components. Plugins can fetch data either from the backend or an API +exposed through the proxy. ​ Learn more about +[the different components](https://github.com/spotify/backstage#overview) that +make up Backstage. ​ + +### Do I have to write plugins in TypeScript? + +​ No, you can use JavaScript if you prefer. ​ We want to keep the Backstage core +APIs in TypeScript, but aren't forcing it on individual plugins. ​ + +### How do I find out if a plugin already exists? + +​ Before you write a plugin, +[search the plugin issues](https://github.com/spotify/backstage/issues?q=is%3Aissue+label%3Aplugin+) +to see if it already exists or is in the works. If no one's thought of it yet, +great! Open a new issue as +[a plugin suggestion](https://github.com/spotify/backstage/issues/new/choose) +and describe what your plugin will do. This will help coordinate our +contributors' efforts and avoid duplicating existing functionality. ​ In the +future, we will create +[a plugin gallery](https://github.com/spotify/backstage/issues/260) where people +can browse and search for all available plugins. ​ + +### Which plugin is used the most at Spotify? + +​ By far, our most-used plugin is our TechDocs plugin, which we use for creating +technical documentation. Our philosophy at Spotify is to treat "docs like code", +where you write documentation using the same workflow as you write your code. +This makes it easier to create, find, and update documentation. We hope to +release +[the open source version](https://github.com/spotify/backstage/issues/687) in +the future. (See also: +"[Will Spotify's internal plugins be open sourced, too?](https://github.com/spotify/faq#will-spotifys-internal-plugins-be-open-sourced-too)" +above) ​ + +### Are you planning to have plugins baked into the repo? Or should they be developed in separate repos? + +​ Contributors can add open source plugins to the plugins directory in +[this monorepo](https://github.com/spotify/backstage). Integrators can then +configure which open source plugins are available to use in their instance of +the app. Open source plugins are downloaded as npm packages published in the +open source repository. ​ While we encourage using the open source model, we +know there are cases where contributors might want to experiment internally or +keep their plugins closed source. Contributors writing closed source plugins +should develop them in the plugins directory in their own Backstage repository. +Integrators also configure closed source plugins locally from the monorepo. ​ + +### Any plans for integrating with other repository managers, such as GitLab or Bitbucket? + +​ We chose GitHub because it is the tool that we are most familiar with, so that +will naturally lead to integrations for GitHub being developed at an early +stage. ​ Hosting this project on GitHub does not exclude integrations with +alternatives, such as GitLab or Bitbucket. We believe that in time there will be +plugins that will provide functionality for these tools as well. Hopefully, +contributed by the community! ​ Also note, implementations of Backstage can be +hosted wherever you feel suits your needs best. ​ + +### Who maintains Backstage? + +​ Spotify will maintain the open source core, but we envision different parts of +the project being maintained by various companies and contributors. We also +envision a large, diverse ecosystem of open source plugins, which would be +maintained by their original authors/contributors or by the community. ​ When it +comes to +[deployment](https://github.com/spotify/backstage/blob/master/DEPLOYMENT.md), +the system integrator (typically, the infrastructure team in your organization) +maintains Backstage in your own environment. ​ + +### Does Spotify provide a managed version of Backstage? + +​ No, this is not a service offering. We build the piece of software, and +someone in your infrastructure team is responsible for +[deploying](https://github.com/spotify/backstage/blob/master/DEPLOYMENT.md) and +maintaining it. ​ + +### How secure is Backstage? + +​ We take security seriously. When it comes to packages and code we scan our +repositories periodically and update our packages to the latest versions. When +it comes to deployment of Backstage within an organisation it depends on the +deployment and security setup in your organisation. Reach out to us on +[Discord](https://discord.gg/MUpMjP2) if you have specific queries. + +Please report sensitive security issues via Spotify's +[bug-bounty program](https://hackerone.com/spotify) rather than GitHub. ​ + ### Does Backstage collect any information that is shared with Spotify? -​ -No. Backstage does not collect any telemetry from any third party using the platform. Spotify, and the open source community, does have access to [GitHub Insights](https://github.com/features/insights), which contains information such as contributors, commits, traffic, and dependencies. -​ -Backstage is an open platform, but you are in control of your own data. You control who has access to any data you provide to your version of Backstage and who that data is shared with. -​ + +​ No. Backstage does not collect any telemetry from any third party using the +platform. Spotify, and the open source community, does have access to +[GitHub Insights](https://github.com/features/insights), which contains +information such as contributors, commits, traffic, and dependencies. ​ +Backstage is an open platform, but you are in control of your own data. You +control who has access to any data you provide to your version of Backstage and +who that data is shared with. ​ + ### Can Backstage be used to build something other than a developer portal? -​ -Yes. The core frontend framework could be used for building any large-scale web application where (1) multiple teams are building separate parts of the app, and (2) you want the overall experience to be consistent. -​ -That being said, in [Phase 2](https://github.com/spotify/backstage#project-roadmap) of the project we will add features that are needed for developer portals and systems for managing software ecosystems. Our ambition will be to keep Backstage modular. -​ + +​ Yes. The core frontend framework could be used for building any large-scale +web application where (1) multiple teams are building separate parts of the app, +and (2) you want the overall experience to be consistent. ​ That being said, in +[Phase 2](https://github.com/spotify/backstage#project-roadmap) of the project +we will add features that are needed for developer portals and systems for +managing software ecosystems. Our ambition will be to keep Backstage modular. ​ + ### How can I get involved? -​ -Jump right in! Come help us fix some of the [early bugs and first issues](https://github.com/spotify/backstage/labels/good%20first%20issue) or reach [a new milestone](https://github.com/spotify/backstage/milestones). Or write an open source plugin for Backstage, like this [Lighthouse plugin](https://github.com/spotify/backstage/tree/master/plugins/lighthouse). -​ -See all the ways you can [contribute here](https://github.com/spotify/backstage/blob/master/CONTRIBUTING.md). We'd love to have you as part of the community. -​ + +​ Jump right in! Come help us fix some of the +[early bugs and first issues](https://github.com/spotify/backstage/labels/good%20first%20issue) +or reach [a new milestone](https://github.com/spotify/backstage/milestones). Or +write an open source plugin for Backstage, like this +[Lighthouse plugin](https://github.com/spotify/backstage/tree/master/plugins/lighthouse). +​ See all the ways you can +[contribute here](https://github.com/spotify/backstage/blob/master/CONTRIBUTING.md). +We'd love to have you as part of the community. ​ + ### Can I join the Backstage team? -​ -If you're interested in being part of the Backstage team, reach out to [fossopportunities@spotify.com](mailto:fossopportunities@spotify.com) + +​ If you're interested in being part of the Backstage team, reach out to +[fossopportunities@spotify.com](mailto:fossopportunities@spotify.com) diff --git a/docs/architecture-decisions/adr002-default-catalog-file-format.md b/docs/architecture-decisions/adr002-default-catalog-file-format.md index 23db32cc9c..6cf649aedf 100644 --- a/docs/architecture-decisions/adr002-default-catalog-file-format.md +++ b/docs/architecture-decisions/adr002-default-catalog-file-format.md @@ -6,22 +6,22 @@ ## Background -Backstage comes with a software catalog functionality, that you can use to -track all your software components and more. It can be powered by data from -various sources, and one of them that is included with the package, is a -custom database backed catalog. It has the ability to keep itself updated -automatically based on the contents of little descriptor files in your -version control system of choice. Developers create these files and maintain -them side by side with their code, and the catalog system reacts accordingly. +Backstage comes with a software catalog functionality, that you can use to track +all your software components and more. It can be powered by data from various +sources, and one of them that is included with the package, is a custom database +backed catalog. It has the ability to keep itself updated automatically based on +the contents of little descriptor files in your version control system of +choice. Developers create these files and maintain them side by side with their +code, and the catalog system reacts accordingly. This ADR describes the default format of these descriptor files. ### Inspiration -Internally at Spotify, a home grown software catalog system is used heavily -and forms a core part of Backstage and other important pieces of the -infrastructure. The user experience, learnings and certain pieces of metadata -from that catalog are being carried over to the open source effort. +Internally at Spotify, a home grown software catalog system is used heavily and +forms a core part of Backstage and other important pieces of the infrastructure. +The user experience, learnings and certain pieces of metadata from that catalog +are being carried over to the open source effort. The file format described herein, also draws heavy inspiration from the [kubernetes object format](https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/). @@ -35,9 +35,9 @@ inside Backstage, or by push events from a CI/CD pipelines, or by webhook triggers from the version control system, etc. Each file describes one or more entities in accordance with the -[Backstage System Model](https://github.com/spotify/backstage/issues/390). -All of these entities have a common stucture and nomenclature, and they are -stored in the software catalog from which they then can be queried. +[Backstage System Model](https://github.com/spotify/backstage/issues/390). All +of these entities have a common stucture and nomenclature, and they are stored +in the software catalog from which they then can be queried. Entities have distinct names, and they may reference each other by those names. @@ -70,9 +70,9 @@ spec: ``` The root fields `apiVersion`, `kind`, `metadata`, and `spec` are part of the -_envelope_, defining the overall structure of all kinds of entity. Likewise, -the `name`, `namespace`, `labels`, and `annotations` metadata fields are of -special significance and have reserved purposes and distinct shapes. +_envelope_, defining the overall structure of all kinds of entity. Likewise, the +`name`, `namespace`, `labels`, and `annotations` metadata fields are of special +significance and have reserved purposes and distinct shapes. See below for details about these fields. @@ -88,30 +88,31 @@ first versions of the catalog will focus on the `Component` kind. The `apiVersion`is the version of specification format for that particular entity that this file is written against. The version is used for being able to -evolve the format, and the tuple of `apiVersion` and `kind` should be enough -for a parser to know how to interpret the contents of the rest of the document. +evolve the format, and the tuple of `apiVersion` and `kind` should be enough for +a parser to know how to interpret the contents of the rest of the document. Backstage specific entities have an `apiVersion` that is prefixed with -`backstage.io/`, to distinguish them from other types of object that share -the same type of structure. This may be relevant when co-hosting these +`backstage.io/`, to distinguish them from other types of object that share the +same type of structure. This may be relevant when co-hosting these specifications with e.g. kubernetes object manifests. -Early versions of the catalog will be using beta versions, e.g. `backstage.io/v1beta1`, -to signal that the format may still change. After that, we will be using -`backstage.io/v1` and up. +Early versions of the catalog will be using beta versions, e.g. +`backstage.io/v1beta1`, to signal that the format may still change. After that, +we will be using `backstage.io/v1` and up. ### `metadata` -A structure that contains metadata about the entity, i.e. things that aren't directly -part of the entity specification itself. See below for more details about this structure. +A structure that contains metadata about the entity, i.e. things that aren't +directly part of the entity specification itself. See below for more details +about this structure. ### `spec` The actual specification data that describes the entity. -The precise structure of the `spec` depends on the `apiVersion` and `kind` combination, -and some kinds may not even have a `spec` at all. See further down in this document for -the specification structure of specific kinds. +The precise structure of the `spec` depends on the `apiVersion` and `kind` +combination, and some kinds may not even have a `spec` at all. See further down +in this document for the specification structure of specific kinds. ## Metadata @@ -119,27 +120,31 @@ The `metadata` root field has the following nested structure. ### `name` -The name of the entity. This name is both meant for human eyes to recognize the entity, -and for machines and other components to reference the entity (e.g. in URLs or from -other entity specification files). +The name of the entity. This name is both meant for human eyes to recognize the +entity, and for machines and other components to reference the entity (e.g. in +URLs or from other entity specification files). -Names must be unique per kind, within a given namespace (if specified), at any point in -time. Names may be reused at a later time, after an entity is deleted from the registry. +Names must be unique per kind, within a given namespace (if specified), at any +point in time. Names may be reused at a later time, after an entity is deleted +from the registry. -Names are required to follow a certain format. Entities that do not follow those rules -will not be accepted for registration in the catalog. The ruleset is configurable to fit -your organization's needs, but the default behavior is as follows. +Names are required to follow a certain format. Entities that do not follow those +rules will not be accepted for registration in the catalog. The ruleset is +configurable to fit your organization's needs, but the default behavior is as +follows. - Strings of length at least 1, and at most 63 -- Must consist of sequences of `[a-z0-9A-Z]` possibly separated by one of `[-_.]` +- Must consist of sequences of `[a-z0-9A-Z]` possibly separated by one of + `[-_.]` Example: `visits-tracking-service`, `CircleciBuildsDs_avro_gcs` -In addition to this, names are passed through a normalization function and then compared -to the same normalized form of other entity names and made sure to not collide. This rule -of uniqueness exists to avoid situations where e.g. both `my-component` and `MyComponent` -are registered side by side, which leads to confusion and risk. The normalization function -is also configurable, but the default behavior is as follows. +In addition to this, names are passed through a normalization function and then +compared to the same normalized form of other entity names and made sure to not +collide. This rule of uniqueness exists to avoid situations where e.g. both +`my-component` and `MyComponent` are registered side by side, which leads to +confusion and risk. The normalization function is also configurable, but the +default behavior is as follows. - Strip out all characters outside of the set `[a-zA-Z0-9]` - Convert to lowercase @@ -148,55 +153,59 @@ Example: `CircleciBuildsDs_avro_gcs` -> `circlecibuildsdsavrogcs` ### `namespace` -The `name` of a namespace that the entity belongs to. This field is optional, and currently -has no special semantics apart from bounding the name uniqueness constraint if specified. -It is reserved for future use and may get broader semantic implication. +The `name` of a namespace that the entity belongs to. This field is optional, +and currently has no special semantics apart from bounding the name uniqueness +constraint if specified. It is reserved for future use and may get broader +semantic implication. Namespaces may also be part of the catalog, and are `v1` / `Namespace` entities, i.e. not Backstage specific but the same as in Kubernetes. ### `description` -A human readable description of the entity, to be shown in Backstage. Should be kept short -and informative, suitable to give an overview of the entity's purpose at a glance. More -detailed explanations and documentation should be placed elsewhere. +A human readable description of the entity, to be shown in Backstage. Should be +kept short and informative, suitable to give an overview of the entity's purpose +at a glance. More detailed explanations and documentation should be placed +elsewhere. ### `labels` -Labels are optional key/value pairs of that are attached to the entity, and their use is -identical to [kubernetes object labels](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/). +Labels are optional key/value pairs of that are attached to the entity, and +their use is identical to +[kubernetes object labels](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/). -Their main purpose is for references to other entities, and for information that is -in one way or another classifying for the current entity. They are often used as values -in queries or filters. +Their main purpose is for references to other entities, and for information that +is in one way or another classifying for the current entity. They are often used +as values in queries or filters. Both the key and the value are strings, subject to the following restrictions. -Keys have an optional prefix followed by a slash, and then the name part which is required. -The prefix must be a valid lowercase domain name, at most 253 characters in total. The name -part must be sequences of `[a-zA-Z0-9]` separated by any of `[-_.]`, at most 63 characters -in total. +Keys have an optional prefix followed by a slash, and then the name part which +is required. The prefix must be a valid lowercase domain name, at most 253 +characters in total. The name part must be sequences of `[a-zA-Z0-9]` separated +by any of `[-_.]`, at most 63 characters in total. -The `backstage.io/` prefix is reserved for use by Backstage core components. Some keys such as -`system` also have predefined semantics. +The `backstage.io/` prefix is reserved for use by Backstage core components. +Some keys such as `system` also have predefined semantics. Values are strings that follow the same restrictions as `name` above. ### `annotations` An object with arbitrary non-identifying metadata attached to the entity, -identical in use to [kubernetes object annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/). +identical in use to +[kubernetes object annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/). -Their purpose is mainly, but not limited, to reference into external systems. This could -for example be a reference to the git ref the entity was ingested from, to monitoring -and logging systems, to pagerduty schedules, etc. +Their purpose is mainly, but not limited, to reference into external systems. +This could for example be a reference to the git ref the entity was ingested +from, to monitoring and logging systems, to pagerduty schedules, etc. Both the key and the value are strings, subject to the following restrictions. -Keys have an optional prefix followed by a slash, and then the name part which is required. -The prefix must be a valid lowercase domain name, at most 253 characters in total. The name -part must be sequences of `[a-zA-Z0-9]` separated by any of `[-_.]`, at most 63 characters -in total. +Keys have an optional prefix followed by a slash, and then the name part which +is required. The prefix must be a valid lowercase domain name, at most 253 +characters in total. The name part must be sequences of `[a-zA-Z0-9]` separated +by any of `[-_.]`, at most 63 characters in total. The `backstage.io/` prefix is reserved for use by Backstage core components. diff --git a/docs/architecture-decisions/adr003-avoid-default-exports.md b/docs/architecture-decisions/adr003-avoid-default-exports.md index 20a402e9c2..7becebaa4b 100644 --- a/docs/architecture-decisions/adr003-avoid-default-exports.md +++ b/docs/architecture-decisions/adr003-avoid-default-exports.md @@ -6,30 +6,50 @@ ## Context -When CommonJS was the primary authoring format, the best practice was to export only one thing from a module using the `module.exports = ...` format. This aligned with the [UNIX philosophy](https://en.wikipedia.org/wiki/Unix_philosophy) of "Do one thing well". The module would be consumed (`const localName = require('the-module');`) without having to know the internal structure. +When CommonJS was the primary authoring format, the best practice was to export +only one thing from a module using the `module.exports = ...` format. This +aligned with the +[UNIX philosophy](https://en.wikipedia.org/wiki/Unix_philosophy) of "Do one +thing well". The module would be consumed +(`const localName = require('the-module');`) without having to know the internal +structure. -Now, ESModules are the primary authoring format. They have numerous benefits, such as compile-time verification of exports, and standards-defined semantics. They have a similar mechanism known as "default exports", which allows for a consumer to `import localName from 'the-module';`. This is implicitly the same as `import { default as localName } from 'the-module';`. +Now, ESModules are the primary authoring format. They have numerous benefits, +such as compile-time verification of exports, and standards-defined semantics. +They have a similar mechanism known as "default exports", which allows for a +consumer to `import localName from 'the-module';`. This is implicitly the same +as `import { default as localName } from 'the-module';`. -However, there are numerous reasons to avoid default exports, as documented by others before: +However, there are numerous reasons to avoid default exports, as documented by +others before: - https://humanwhocodes.com/blog/2019/01/stop-using-default-exports-javascript-module/ A summary: -- They add indirection by encouraging a developer to create local names for modules, increasing cognitive load and slowing down code comprehension: `import TheListThing from 'not-a-list-thing';`. -- They thwart tools, such as IDEs, that can automatically rename and refactor code. -- They promote typos and mistakes, as the imported member is completely up to the consuming developer to define. -- They are ugly in CommonJS interop, as the default property must be manually specified by the consumer. This is often hidden by Babel's module interop. -- They break re-exports due to name conflicts, forcing the developer to manually name each. +- They add indirection by encouraging a developer to create local names for + modules, increasing cognitive load and slowing down code comprehension: + `import TheListThing from 'not-a-list-thing';`. +- They thwart tools, such as IDEs, that can automatically rename and refactor + code. +- They promote typos and mistakes, as the imported member is completely up to + the consuming developer to define. +- They are ugly in CommonJS interop, as the default property must be manually + specified by the consumer. This is often hidden by Babel's module interop. +- They break re-exports due to name conflicts, forcing the developer to manually + name each. -Using named exports helps prevent needing to rename symbols, which has myriad benefts. A few are: +Using named exports helps prevent needing to rename symbols, which has myriad +benefts. A few are: - IDE tools like "Find All References" and "Go To Definition" function - Manual codebase searching ("grep", etc) is easier with a unique symbol ## Decision -We will stop using default exports except when absolutely necessary (such as [`React.lazy`](https://reactjs.org/docs/code-splitting.html#reactlazy) modules). A workaround exists for those that would prefer to never use `default`: +We will stop using default exports except when absolutely necessary (such as +[`React.lazy`](https://reactjs.org/docs/code-splitting.html#reactlazy) modules). +A workaround exists for those that would prefer to never use `default`: ```ts const Component = React.lazy(() => @@ -39,6 +59,9 @@ const Component = React.lazy(() => ## Consequences -We will actively work to remove them from our codebases, being as explicit as possible. Have a connected component? `export const ConnectedComponent = connect(Component)`. +We will actively work to remove them from our codebases, being as explicit as +possible. Have a connected component? +`export const ConnectedComponent = connect(Component)`. -We will add tools, such as lint rules, to help migrate away from default exports. +We will add tools, such as lint rules, to help migrate away from default +exports. diff --git a/docs/architecture-decisions/adr004-module-export-structure.md b/docs/architecture-decisions/adr004-module-export-structure.md index 56c675f069..54132773c9 100644 --- a/docs/architecture-decisions/adr004-module-export-structure.md +++ b/docs/architecture-decisions/adr004-module-export-structure.md @@ -6,7 +6,8 @@ ## Context -With a growing number of exports of packages like `@backstage/core`, it is becoming more and more difficult to answer questions such as +With a growing number of exports of packages like `@backstage/core`, it is +becoming more and more difficult to answer questions such as > Is the export in this module also exported by the package? @@ -14,12 +15,19 @@ or > What is exported from this directory? -We currently do not use any pattern for how to structure exports. There is a mix of package-level re-exports deep into the directory tree, shallow re-exports for each directory, exports using `*` and explicit lists of each symbol, etc. -The mix and lack of predictability makes it difficult to reason about the boundaries of a module, and for example knowing whether is is safe to export a symbol in a given file. +We currently do not use any pattern for how to structure exports. There is a mix +of package-level re-exports deep into the directory tree, shallow re-exports for +each directory, exports using `*` and explicit lists of each symbol, etc. The +mix and lack of predictability makes it difficult to reason about the boundaries +of a module, and for example knowing whether is is safe to export a symbol in a +given file. ## Decision -We will make each exported symbol traceable through index files all the way down to the root of the package, `src/index.ts`. Each index file will only re-export from its own immediate directory children, and only index files will have re-exports. This gives a file tree similar to this: +We will make each exported symbol traceable through index files all the way down +to the root of the package, `src/index.ts`. Each index file will only re-export +from its own immediate directory children, and only index files will have +re-exports. This gives a file tree similar to this: ```text index.ts @@ -33,16 +41,25 @@ lib/index.ts /helper.ts ``` -To check whether for example `SubComponentY` is exported from the package, it should be possible to traverse the index files towards the root, starting at the adjacent one. If there is any index file that doesn't export the previous one, the symbol is not publicly exported. For example, if `components/ComponentX/index.ts` exports `SubComponentY`, but `components/index.ts` does not re-export `./ComponentX`, one should be certain that `SubComponentY` is not exported outside the package. This rule would be broken if for example the root `index.ts` re-exports `./components/ComponentX` +To check whether for example `SubComponentY` is exported from the package, it +should be possible to traverse the index files towards the root, starting at the +adjacent one. If there is any index file that doesn't export the previous one, +the symbol is not publicly exported. For example, if +`components/ComponentX/index.ts` exports `SubComponentY`, but +`components/index.ts` does not re-export `./ComponentX`, one should be certain +that `SubComponentY` is not exported outside the package. This rule would be +broken if for example the root `index.ts` re-exports `./components/ComponentX` -In addition, index files that are re-exporting other index files should always use wildcard form, that is: +In addition, index files that are re-exporting other index files should always +use wildcard form, that is: ```ts // in components/index.ts export * from './ComponentX'; ``` -Index files that are re-exporting symbols from non-index files should always enumerate all exports, that is: +Index files that are re-exporting symbols from non-index files should always +enumerate all exports, that is: ```ts // in components/ComponentX/index.ts @@ -50,14 +67,16 @@ export { ComponentX } from './ComponentX'; export type { ComponentXProps } from './ComponentX'; ``` -Internal cross-directory imports are allowed from non-index modules to index modules, for example: +Internal cross-directory imports are allowed from non-index modules to index +modules, for example: ```ts // in components/ComponentX/ComponentX.tsx import { UtilityX } from '../../lib/UtilityX'; ``` -Imports that bypass an index file are discouraged, but may sometimes be necessary, for example: +Imports that bypass an index file are discouraged, but may sometimes be +necessary, for example: ```ts // in components/ComponentX/ComponentX.tsx @@ -66,6 +85,9 @@ import { helperFunc } from '../../lib/UtilityX/helper'; ## Consequences -We will actively work to rework the export structure in our codebase, prioritizing the library packages such as `@backstage/core` and `@backstage/backend-common`. +We will actively work to rework the export structure in our codebase, +prioritizing the library packages such as `@backstage/core` and +`@backstage/backend-common`. -If possible, we will add tools, such as lint rules, to help enforce the export structure. +If possible, we will add tools, such as lint rules, to help enforce the export +structure. diff --git a/docs/architecture-decisions/adr005-catalog-core-entities.md b/docs/architecture-decisions/adr005-catalog-core-entities.md index ca2a66f6b9..578eb72b91 100644 --- a/docs/architecture-decisions/adr005-catalog-core-entities.md +++ b/docs/architecture-decisions/adr005-catalog-core-entities.md @@ -6,7 +6,8 @@ ## Context -We want to standardize on a few core entities that we are tracking in the Backstage catalog. This allows us to build specific plugins around them. +We want to standardize on a few core entities that we are tracking in the +Backstage catalog. This allows us to build specific plugins around them. ## Decision @@ -14,17 +15,26 @@ Backstage should eventually support the following core entities: - **Components** are individual pieces of software - **APIs** are the boundaries between different components -- **Resources** are physical or virtual infrastructure needed to operate a component +- **Resources** are physical or virtual infrastructure needed to operate a + component ![Catalog Core Entities](catalog-core-entities.png) -For now, we'll start by only implementing support for the Component entity in the Backstage catalog. This can later be extended to APIs, Resources and other potentially useful entities. +For now, we'll start by only implementing support for the Component entity in +the Backstage catalog. This can later be extended to APIs, Resources and other +potentially useful entities. ### Component -A component is a piece of software, for example a mobile application feature, web site, backend service or data pipeline (list not exhaustive). A component can be tracked in source control, or use some existing open source or commercial software. It can implement APIs for other components to consume. In turn it might depend on APIs implemented by other components, or resources that are attached to it at runtime. +A component is a piece of software, for example a mobile application feature, +web site, backend service or data pipeline (list not exhaustive). A component +can be tracked in source control, or use some existing open source or commercial +software. It can implement APIs for other components to consume. In turn it +might depend on APIs implemented by other components, or resources that are +attached to it at runtime. -Component entities are typically defined in YAML descriptor files next to the code of the component, and could look like this (actual schema will evolve): +Component entities are typically defined in YAML descriptor files next to the +code of the component, and could look like this (actual schema will evolve): ```yaml apiVersion: backstage.io/v1beta1 @@ -37,11 +47,20 @@ spec: ### API -APIs form an abstraction that allows large software ecosystems to scale. Thus, APIs are a first class citizen in the Backstage model and the primary way to discover existing functionality in the ecosystem. +APIs form an abstraction that allows large software ecosystems to scale. Thus, +APIs are a first class citizen in the Backstage model and the primary way to +discover existing functionality in the ecosystem. -APIs are implemented by components and make their boundaries explicit. They might be defined using an RPC IDL (e.g. in Protobuf, GraphQL or similar), a data schema (e.g. in Avro, TFRecord or similar), or as code interfaces (e.g. framework APIs in Swift, Kotlin, Java, C++, Typescript etc). In any case, APIs exposed by components need to be in a known machine-readable format so we can build further tooling and analysis on top. +APIs are implemented by components and make their boundaries explicit. They +might be defined using an RPC IDL (e.g. in Protobuf, GraphQL or similar), a data +schema (e.g. in Avro, TFRecord or similar), or as code interfaces (e.g. +framework APIs in Swift, Kotlin, Java, C++, Typescript etc). In any case, APIs +exposed by components need to be in a known machine-readable format so we can +build further tooling and analysis on top. -APIs are typically indexed from existing definitions in source control and thus wouldn't need their own descriptor files, but would be stored in the catalog somewhat like this (actual schema will evolve): +APIs are typically indexed from existing definitions in source control and thus +wouldn't need their own descriptor files, but would be stored in the catalog +somewhat like this (actual schema will evolve): ```yaml apiVersion: backstage.io/v1beta1 @@ -54,9 +73,11 @@ spec: service HelloService { rpc SayHello (HelloRequest) returns (HelloResponse); } + message HelloRequest { string greeting = 1; } + message HelloResponse { string reply = 1; } @@ -64,9 +85,16 @@ spec: ### Resource -Resources are the infrastructure your software needs to operate at runtime like Bigtable databases, Pub/Sub topics, S3 buckets or CDNs. Modelling them together with components and APIs will allow us to visualize and create tooling around them in Backstage. +Resources are the infrastructure your software needs to operate at runtime like +Bigtable databases, Pub/Sub topics, S3 buckets or CDNs. Modelling them together +with components and APIs will allow us to visualize and create tooling around +them in Backstage. -Resources are typically indexed from declarative definitions (e.g. Terraform, GCP Config Connector, AWS Cloud Formation) and/or inventories from cloud providers (e.g. GCP Asset Inventory) and thus wouldn't need their own descriptor files, but would be stored in the catalog somewhat like this (actual schema will evolve): +Resources are typically indexed from declarative definitions (e.g. Terraform, +GCP Config Connector, AWS Cloud Formation) and/or inventories from cloud +providers (e.g. GCP Asset Inventory) and thus wouldn't need their own descriptor +files, but would be stored in the catalog somewhat like this (actual schema will +evolve): ```yaml apiVersion: backstage.io/v1beta1 @@ -80,4 +108,5 @@ spec: ## Consequences -We will continue fleshing out support for the Component entity in the Backstage catalog. +We will continue fleshing out support for the Component entity in the Backstage +catalog. diff --git a/docs/architecture-terminology.md b/docs/architecture-terminology.md index 1570607896..836b2cfa99 100644 --- a/docs/architecture-terminology.md +++ b/docs/architecture-terminology.md @@ -1,9 +1,18 @@ # Architecture and Terminology -Backstage is constructed out of three parts. We separate Backstage in this way because we see three groups of contributors that work with Backstage in three different ways. +Backstage is constructed out of three parts. We separate Backstage in this way +because we see three groups of contributors that work with Backstage in three +different ways. - Core - Base functionality built by core devs in the open source project. -- App - The app is an instance of a Backstage app that is deployed and tweaked. The app ties together core functionality with additional plugins. The app is built and maintained by app developers, usually a productivity team within a company. -- Plugins - Additional functionality to make your Backstage app useful for your company. Plugins can be specific to a company or open sourced and reusable. At Spotify we have over 100 plugins built by over 50 different teams. It has been very powerful to get contributions from various infrastructure teams added into a single unified developer experience. +- App - The app is an instance of a Backstage app that is deployed and tweaked. + The app ties together core functionality with additional plugins. The app is + built and maintained by app developers, usually a productivity team within a + company. +- Plugins - Additional functionality to make your Backstage app useful for your + company. Plugins can be specific to a company or open sourced and reusable. At + Spotify we have over 100 plugins built by over 50 different teams. It has been + very powerful to get contributions from various infrastructure teams added + into a single unified developer experience. [Back to Docs](README.md) diff --git a/docs/auth/add-auth-provider.md b/docs/auth/add-auth-provider.md index 4bbbec88bb..33f1d335a0 100644 --- a/docs/auth/add-auth-provider.md +++ b/docs/auth/add-auth-provider.md @@ -2,17 +2,21 @@ ## Passport -We chose [Passport](http://www.passportjs.org/) as our authentication platform due to its comprehensive set of supported authentication [strategies](http://www.passportjs.org/packages/). +We chose [Passport](http://www.passportjs.org/) as our authentication platform +due to its comprehensive set of supported authentication +[strategies](http://www.passportjs.org/packages/). ## How to add a new strategy provider ### Quick guide -[1.](#installing-the-dependencies) Install the passport-js based provider package. +[1.](#installing-the-dependencies) Install the passport-js based provider +package. [2.](#create-implementation) Create a new folder structure for the provider. -[3.](#adding-an-oauth-based-provider) Implement the provider, extending the suitable framework if needed. +[3.](#adding-an-oauth-based-provider) Implement the provider, extending the +suitable framework if needed. [4.](#hook-it-up-to-the-backend) Add the provider to the backend. @@ -26,7 +30,8 @@ yarn add @types/passport-provider-a ### Create implementation -Make a new folder with the name of the provider following the below file structure: +Make a new folder with the name of the provider following the below file +structure: ```bash plugins/auth-backend/src/providers/providerA @@ -34,13 +39,16 @@ plugins/auth-backend/src/providers/providerA └── provider.ts ``` -**`plugins/auth-backend/src/providers/providerA/provider.ts`** defines the provider class which implements a handler for the chosen framework. +**`plugins/auth-backend/src/providers/providerA/provider.ts`** defines the +provider class which implements a handler for the chosen framework. #### Adding an OAuth based provider -If we're adding an `OAuth` based provider we would implement the [OAuthProviderHandlers](#OAuthProviderHandlers) interface. +If we're adding an `OAuth` based provider we would implement the +[OAuthProviderHandlers](#OAuthProviderHandlers) interface. -The provider class takes the provider's configuration as a class parameter. It also imports the `Strategy` from the passport package. +The provider class takes the provider's configuration as a class parameter. It +also imports the `Strategy` from the passport package. ```ts import { Strategy as ProviderAStrategy } from 'passport-provider-a'; @@ -64,9 +72,11 @@ export class ProviderAAuthProvider implements OAuthProviderHandlers { #### Adding an non-OAuth based provider -_**Note**: We have prioritized OAuth-based providers and non-OAuth providers should be considered experimental._ +_**Note**: We have prioritized OAuth-based providers and non-OAuth providers +should be considered experimental._ -An non-`OAuth` based provider could implement [AuthProviderRouteHandlers](#AuthProviderRouteHandlers) instead. +An non-`OAuth` based provider could implement +[AuthProviderRouteHandlers](#AuthProviderRouteHandlers) instead. ```ts export class ProviderAAuthProvider implements AuthProviderRouteHandlers { @@ -90,9 +100,12 @@ export class ProviderAAuthProvider implements AuthProviderRouteHandlers { #### Create method -Each provider exports a create method that creates the provider instance, optionally extending a supported authorization framework. This method exists to allow for flexibility if additional frameworks are supported in the future. +Each provider exports a create method that creates the provider instance, +optionally extending a supported authorization framework. This method exists to +allow for flexibility if additional frameworks are supported in the future. -Implementing OAuth by returning an instance of `OAuthProvider` based of the provider's class: +Implementing OAuth by returning an instance of `OAuthProvider` based of the +provider's class: ```ts export function createProviderAProvider(config: AuthProviderConfig) { @@ -102,7 +115,9 @@ export function createProviderAProvider(config: AuthProviderConfig) { } ``` -Not extending with OAuth, the main difference here is that the create method is returning a instance of the class without adding the OAuth authorization framework to it. +Not extending with OAuth, the main difference here is that the create method is +returning a instance of the class without adding the OAuth authorization +framework to it. ```ts export function createProviderAProvider(config: AuthProviderConfig) { @@ -112,14 +127,22 @@ export function createProviderAProvider(config: AuthProviderConfig) { #### Verify Callback -> Strategies require what is known as a verify callback. The purpose of a verify callback is to find the user that possesses a set of credentials. -> When Passport authenticates a request, it parses the credentials contained in the request. It then invokes the verify callback with those credentials as arguments [...]. If the credentials are valid, the verify callback invokes done to supply Passport with the user that authenticated. +> Strategies require what is known as a verify callback. The purpose of a verify +> callback is to find the user that possesses a set of credentials. When +> Passport authenticates a request, it parses the credentials contained in the +> request. It then invokes the verify callback with those credentials as +> arguments [...]. If the credentials are valid, the verify callback invokes +> done to supply Passport with the user that authenticated. > -> If the credentials are not valid (for example, if the password is incorrect), done should be invoked with false instead of a user to indicate an authentication failure. +> If the credentials are not valid (for example, if the password is incorrect), +> done should be invoked with false instead of a user to indicate an +> authentication failure. > > http://www.passportjs.org/docs/configure/ -**`plugins/auth-backend/src/providers/providerA/index.ts`** is simply re-exporting the create method to be used for hooking the provider up to the backend. +**`plugins/auth-backend/src/providers/providerA/index.ts`** is simply +re-exporting the create method to be used for hooking the provider up to the +backend. ```ts export { createProviderAProvider } from './provider'; @@ -127,7 +150,9 @@ export { createProviderAProvider } from './provider'; ### Hook it up to the backend -**`plugins/auth-backend/src/providers/config.ts`** The provider needs to be configured properly so you need to add it to the list of configured providers, all of which implement [AuthProviderConfig](#AuthProviderConfig): +**`plugins/auth-backend/src/providers/config.ts`** The provider needs to be +configured properly so you need to add it to the list of configured providers, +all of which implement [AuthProviderConfig](#AuthProviderConfig): ```ts export const providers = [ @@ -138,7 +163,10 @@ export const providers = [ }, ``` -**`plugins/auth-backend/src/providers/factories.ts`** When the `auth-backend` starts it sets up routing for all the available providers by calling `createAuthProviderRouter` on each provider. You need to import the create method from the provider and add it to the factory: +**`plugins/auth-backend/src/providers/factories.ts`** When the `auth-backend` +starts it sets up routing for all the available providers by calling +`createAuthProviderRouter` on each provider. You need to import the create +method from the provider and add it to the factory: ```ts import { createProviderAProvider } from './providerA'; @@ -157,11 +185,14 @@ router.post('/auth/providerA/logout'); router.get('/auth/providerA/refresh'); // if supported ``` -As you can see each endpoint is prefixed with both `/auth` and its provider name. +As you can see each endpoint is prefixed with both `/auth` and its provider +name. ### Test the new provider -You can `curl -i localhost:7000/auth/providerA/start` and which should provide a `302` redirect with a `Location` header. Paste the url from that header into a web browser and you should be able to trigger the authorization flow. +You can `curl -i localhost:7000/auth/providerA/start` and which should provide a +`302` redirect with a `Location` header. Paste the url from that header into a +web browser and you should be able to trigger the authorization flow. --- diff --git a/docs/create-an-app.md b/docs/create-an-app.md index 8c8050c2ff..b69ff1508c 100644 --- a/docs/create-an-app.md +++ b/docs/create-an-app.md @@ -1,12 +1,16 @@ # Backstage App -To get set up quickly with your own Backstage project you can create a Backstage App. +To get set up quickly with your own Backstage project you can create a Backstage +App. -A Backstage App is a monorepo setup with `lerna` that includes everything you need to run Backstage in your own environment. +A Backstage App is a monorepo setup with `lerna` that includes everything you +need to run Backstage in your own environment. ## Create an app -To create a Backstage app, you will need to have [NodeJS](https://nodejs.org/en/download/) Active LTS Release installed (currently v12). +To create a Backstage app, you will need to have +[NodeJS](https://nodejs.org/en/download/) Active LTS Release installed +(currently v12). With `npx`: @@ -14,13 +18,15 @@ With `npx`: npx @backstage/cli create-app ``` -This will create a new Backstage App inside the current folder. The name of the app-folder is the name that was provided when prompted. +This will create a new Backstage App inside the current folder. The name of the +app-folder is the name that was provided when prompted.

create app

-Inside that directory, it will generate all the files and folder structure needed for you to run your app. +Inside that directory, it will generate all the files and folder structure +needed for you to run your app. ### Folder structure @@ -69,4 +75,5 @@ cd my-backstage-app yarn start ``` -_When `yarn start` is ready it should open up a browser window displaying your app, if not you can navigate to `http://localhost:3000`._ +_When `yarn start` is ready it should open up a browser window displaying your +app, if not you can navigate to `http://localhost:3000`._ diff --git a/docs/design.md b/docs/design.md index bcbf0bbdc5..e3816bd2e5 100644 --- a/docs/design.md +++ b/docs/design.md @@ -1,70 +1,134 @@ ![header](designheader.png) -Much like Backstage Open Source, this is a *living* document! We'll keep this updated as we evolve our practices! +Much like Backstage Open Source, this is a _living_ document! We'll keep this +updated as we evolve our practices! ## 📚 Our Philosophy ### Iterative -Backstage Open Source is a newly launched endeavor, and we’re excited to scale up our design practices! With that said, we’ll be working closely with you, the community, and iterating and experimenting as we go to see what works best. As a continual work in progress, we aspire to release early and often. Not only that, we are committed to working with developers to create a seamless and easy handoff. If you’re curious to see how we grow and would like to play a role in that growth, check out the issues in this GitHub repo! +Backstage Open Source is a newly launched endeavor, and we’re excited to scale +up our design practices! With that said, we’ll be working closely with you, the +community, and iterating and experimenting as we go to see what works best. As a +continual work in progress, we aspire to release early and often. Not only that, +we are committed to working with developers to create a seamless and easy +handoff. If you’re curious to see how we grow and would like to play a role in +that growth, check out the issues in this GitHub repo! ### Collaborative -The Backstage Design Team is small but mighty, and we truly cherish the amazing opportunity we have to work with the Backstage Open Source community! Have an idea? A component request? Feel free to communicate with us via [Discord](https://discord.gg/EBHEGzX) (*#design* channel). Collaboration trumps individual speed, and we want to work with you to make Backstage work for all of our users. +The Backstage Design Team is small but mighty, and we truly cherish the amazing +opportunity we have to work with the Backstage Open Source community! Have an +idea? A component request? Feel free to communicate with us via +[Discord](https://discord.gg/EBHEGzX) (_#design_ channel). Collaboration trumps +individual speed, and we want to work with you to make Backstage work for all of +our users. ### Transparent -There are a lot of exciting things coming up and we want to keep you in the loop! Keep an eye on our Milestones in GitHub to see where we’re headed. We’ll also be posting updates in the *#design* channel on [Discord](https://discord.gg/EBHEGzX). Not only that, we want to keep you informed on the decisions we’ve made and why we’ve made them. +There are a lot of exciting things coming up and we want to keep you in the +loop! Keep an eye on our Milestones in GitHub to see where we’re headed. We’ll +also be posting updates in the _#design_ channel on +[Discord](https://discord.gg/EBHEGzX). Not only that, we want to keep you +informed on the decisions we’ve made and why we’ve made them. ## 🛠 Our Practice -The chart below details how we work. ***Stay tuned***: We are currently in the process of securing a Figma workspace for Backstage Open Source, and we plan on referencing Figma documents to share specs and prototypes with the community. + +The chart below details how we work. **_Stay tuned_**: We are currently in the +process of securing a Figma workspace for Backstage Open Source, and we plan on +referencing Figma documents to share specs and prototypes with the community. ### Creating a New Design Component -| Step 1 | Step 2 | Step 3 | Step 4 | Step 5 | Step 6 | -|:---|:---|:---|:---|:---|:---| -| Platform design team submits an issue to **spotify/Backstage GitHub** with a potential component. | Backstage community offers feedback or approval on **spotify/Backstage GitHub**. | Platform design team adjusts accordingly (as they see fit) and update the Figma DLS document. | Designed component is added to **spotify/Backstage GitHub** as an issue. | External or internal Backstage open source contributors build the component. | External or internal contributors add the component to the **Backstage Storybook**. 🎉 | +| Step 1 | Step 2 | Step 3 | Step 4 | Step 5 | Step 6 | +| :------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------- | :--------------------------------------------------------------------------- | :------------------------------------------------------------------------------------- | +| Platform design team submits an issue to **spotify/Backstage GitHub** with a potential component. | Backstage community offers feedback or approval on **spotify/Backstage GitHub**. | Platform design team adjusts accordingly (as they see fit) and update the Figma DLS document. | Designed component is added to **spotify/Backstage GitHub** as an issue. | External or internal Backstage open source contributors build the component. | External or internal contributors add the component to the **Backstage Storybook**. 🎉 | ### Building for Backstage -| Step 1 | Step 2 | Step 3 | Step 4 | -|:---|:---|:---|:---| -| External or internal contributors use Backstage and come up with an idea of an entity to build for Backstage. |External or internal contributors refer to the Backstage Open Source design system documentation in the Figma DLS document. | External or internal contributors leverage the components and tokens from the Backstage Storybook. | External or internal contributors build their Backstage entity. | -| Step 5 | Step 6 | Step 7 | Step 8 | -|:---|:---|:---|:---| -| External or internal contributors make a pull request for their entity on spotify/Backstage GitHub for review. | Platform designers and devs review the entity and submit feedback or approval on spotify/Backstage GitHub. | External or internal contributors make the changes, pull request is approved and the entity is merged. It’s live on Backstage! 🎉 | If the entity happens to be or include a UX component, it’s added to Backstage Storybook as well. | +| Step 1 | Step 2 | Step 3 | Step 4 | +| :------------------------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------- | +| External or internal contributors use Backstage and come up with an idea of an entity to build for Backstage. | External or internal contributors refer to the Backstage Open Source design system documentation in the Figma DLS document. | External or internal contributors leverage the components and tokens from the Backstage Storybook. | External or internal contributors build their Backstage entity. | +| Step 5 | Step 6 | Step 7 | Step 8 | +| :------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------ | +| External or internal contributors make a pull request for their entity on spotify/Backstage GitHub for review. | Platform designers and devs review the entity and submit feedback or approval on spotify/Backstage GitHub. | External or internal contributors make the changes, pull request is approved and the entity is merged. It’s live on Backstage! 🎉 | If the entity happens to be or include a UX component, it’s added to Backstage Storybook as well. | -The following diagram shows the relationship between the Backstage Design System and our foundation, which comprises of [Material UI](https://material-ui.com/) that is shaped by user experience and user interface decisions made by our Backstage Design Team. Also note, we encourage you to take the core experience we’ve crafted and add custom theming to better represent your organization! +The following diagram shows the relationship between the Backstage Design System +and our foundation, which comprises of [Material UI](https://material-ui.com/) +that is shaped by user experience and user interface decisions made by our +Backstage Design Team. Also note, we encourage you to take the core experience +we’ve crafted and add custom theming to better represent your organization! ![dls](DLS.png) - ## ✅ Our Priorities + ### Backstage Design System -This is the set of building blocks for Backstage contributors to leverage as they create rad plugins for Backstage! Why reinvent the wheel when you can use components that have already been vetted by our team and the Backstage community? In the spirit of crafting a cohesive and consistent user experience across all of Backstage, we strongly urge all plugin developers to utilize our Storybook as a reference. Our design system is new and evolving, and we’ll be building it up with your help! + +This is the set of building blocks for Backstage contributors to leverage as +they create rad plugins for Backstage! Why reinvent the wheel when you can use +components that have already been vetted by our team and the Backstage +community? In the spirit of crafting a cohesive and consistent user experience +across all of Backstage, we strongly urge all plugin developers to utilize our +Storybook as a reference. Our design system is new and evolving, and we’ll be +building it up with your help! + ### Core Backstage User Experience -This is the universal user experience that is shared amongst all Backstage users. From more concrete aspects like the plugins marketplace to more abstract ones like end-to-end workflows on Backstage, we’ll be working with the community to create a core user experience that best serves you and your organization. + +This is the universal user experience that is shared amongst all Backstage +users. From more concrete aspects like the plugins marketplace to more abstract +ones like end-to-end workflows on Backstage, we’ll be working with the community +to create a core user experience that best serves you and your organization. ## ⭐️ How to Contribute -### Pick up an issue! -In the beginning, most of our issues will be centered around creating universal components for our Backstage Design System and adding them to our Storybook so plugin developers can reference them. We’ll also be creating issues that are focused on building up our core Backstage user experience. We’ll be labeling our issues in GitHub with ‘design’ and/or ‘storybook’ - so feel free to browse and tackle the tasks that interest you. If you have any questions regarding an issue, you can ask them in the comments section of the issue or on [Discord](https://discord.gg/EBHEGzX). We absolutely adore our external contributors and will send you virtual semlas for your contributions! + +### Pick up an issue! + +In the beginning, most of our issues will be centered around creating universal +components for our Backstage Design System and adding them to our Storybook so +plugin developers can reference them. We’ll also be creating issues that are +focused on building up our core Backstage user experience. We’ll be labeling our +issues in GitHub with ‘design’ and/or ‘storybook’ - so feel free to browse and +tackle the tasks that interest you. If you have any questions regarding an +issue, you can ask them in the comments section of the issue or on +[Discord](https://discord.gg/EBHEGzX). We absolutely adore our external +contributors and will send you virtual semlas for your contributions! ### Request a component. -Create an issue (label it design and assign it to katz95) or send us a message on [Discord](https://discord.gg/EBHEGzX) (*#design* channel) with details of what the component is and its relevant use cases. Your request will be reviewed by our design team and you should hear back from us within 1-2 business days. We’ll get back to you and let you know whether your requested component will get picked up by our team as something to be added to our design system. + +Create an issue (label it design and assign it to katz95) or send us a message +on [Discord](https://discord.gg/EBHEGzX) (_#design_ channel) with details of +what the component is and its relevant use cases. Your request will be reviewed +by our design team and you should hear back from us within 1-2 business days. +We’ll get back to you and let you know whether your requested component will get +picked up by our team as something to be added to our design system. ## ✏️ Resources -**[Storybook](http://storybook.backstage.io/)** - where you can view our components. If you’d like to help build up our design system, you can also add components we’ve designed to the Storybook as well. -**[Discord](https://discord.gg/EBHEGzX)** - all design questions should be directed to the *#design* channel. +**[Storybook](http://storybook.backstage.io/)** - where you can view our +components. If you’d like to help build up our design system, you can also add +components we’ve designed to the Storybook as well. + +**[Discord](https://discord.gg/EBHEGzX)** - all design questions should be +directed to the _#design_ channel. **Documentation** + - Patterns (stay tuned) - Figma files/libraries (stay tuned) ## 🔮 Future -### Contributions from designers -Are you a designer at an organisation that’s implementing Backstage? A designer who’s fascinated by the developer productivity problem space? A designer who’s curious about open source design? We’d love for you to contribute. Behind the scenes, we’re setting up a few foundational elements to make sure that contributing to Backstage as a designer is easy. From styling guidelines to UX principles to Figma documents, we’ll make sure you’re equipped to chip in on this project. We’re excited to work with you! In the meantime, we’d love to hear from you on [Discord](https://discord.gg/EBHEGzX). +### Contributions from designers + +Are you a designer at an organisation that’s implementing Backstage? A designer +who’s fascinated by the developer productivity problem space? A designer who’s +curious about open source design? We’d love for you to contribute. Behind the +scenes, we’re setting up a few foundational elements to make sure that +contributing to Backstage as a designer is easy. From styling guidelines to UX +principles to Figma documents, we’ll make sure you’re equipped to chip in on +this project. We’re excited to work with you! In the meantime, we’d love to hear +from you on [Discord](https://discord.gg/EBHEGzX). [Back to Docs](../README.md) diff --git a/docs/getting-started/Plugin development.md b/docs/getting-started/Plugin development.md index 0f578151a2..41918b5de2 100644 --- a/docs/getting-started/Plugin development.md +++ b/docs/getting-started/Plugin development.md @@ -2,10 +2,10 @@ Backstage plugins provide features to a Backstage App. -Each plugin is treated as a self-contained web app and can include almost any type of content. -Plugins all use a common set of platform APIs and reusable UI components. -Plugins can fetch data from external sources using the regular browser APIs or by depending on -external modules to do the work. +Each plugin is treated as a self-contained web app and can include almost any +type of content. Plugins all use a common set of platform APIs and reusable UI +components. Plugins can fetch data from external sources using the regular +browser APIs or by depending on external modules to do the work.