From 6f58e92fc76107f31f86fca2d23ab6a02fc41b25 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Wed, 29 Apr 2020 16:34:35 +0200 Subject: [PATCH 01/90] Create plugin draft --- README.html | 138 ++++++++++++++++ packages/app/package.json | 1 + packages/app/src/plugins.ts | 2 +- plugins/circleci/.eslintrc.js | 3 + plugins/circleci/README.md | 6 + plugins/circleci/package.json | 38 +++++ .../ExampleComponent.test.tsx | 34 ++++ .../ExampleComponent/ExampleComponent.tsx | 59 +++++++ .../src/components/ExampleComponent/index.ts | 17 ++ .../ExampleFetchComponent.test.tsx | 28 ++++ .../ExampleFetchComponent.tsx | 151 ++++++++++++++++++ .../components/ExampleFetchComponent/index.ts | 17 ++ plugins/circleci/src/index.ts | 17 ++ plugins/circleci/src/plugin.test.ts | 23 +++ plugins/circleci/src/plugin.ts | 24 +++ plugins/circleci/src/setupTests.ts | 18 +++ plugins/circleci/tsconfig.json | 7 + yarn.lock | 23 ++- 18 files changed, 604 insertions(+), 2 deletions(-) create mode 100644 README.html create mode 100644 plugins/circleci/.eslintrc.js create mode 100644 plugins/circleci/README.md create mode 100644 plugins/circleci/package.json create mode 100644 plugins/circleci/src/components/ExampleComponent/ExampleComponent.test.tsx create mode 100644 plugins/circleci/src/components/ExampleComponent/ExampleComponent.tsx create mode 100644 plugins/circleci/src/components/ExampleComponent/index.ts create mode 100644 plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx create mode 100644 plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx create mode 100644 plugins/circleci/src/components/ExampleFetchComponent/index.ts create mode 100644 plugins/circleci/src/index.ts create mode 100644 plugins/circleci/src/plugin.test.ts create mode 100644 plugins/circleci/src/plugin.ts create mode 100644 plugins/circleci/src/setupTests.ts create mode 100644 plugins/circleci/tsconfig.json diff --git a/README.html b/README.html new file mode 100644 index 0000000000..e9a0e9c19e --- /dev/null +++ b/README.html @@ -0,0 +1,138 @@ + + + + + + +README.html + + + + + +
+headline +
headline
+
+ +

Backstage

+ +

License + +Discord +Code style +

+ +

What is Backstage?

+ +

Backstage is an open platform for building developer portals.

+ +

The philosophy behind Backstage is simple: Don’t expose your engineers to the full complexity of your infrastructure tooling. Engineers should be shipping code β€” not figuring out a whole new toolset every time they want to implement the basics. Backstage allows you add “stuff” (tooling, services, features, etc.) by adding a plugin, instead of building a new tool. This saves you work and avoids the need of your team to learn how to use and support yet another tool.

+ +

For more information go to backstage.io or join our Discord chatroom.

+ +

What problem does Backstage solve?

+ +

As companies grow, their infrastructure systems get messier. Backstage unifies all your infrastructure tooling, services, and documentation with a single, consistent UI.

+ +

This blog post provides more examples of how Backstage is used inside Spotify:

+ +

https://labs.spotify.com/2020/03/17/what-the-heck-is-backstage-anyway/

+ +

Project roadmap

+ +

We created Backstage about 4 years ago. While our internal version of Backstage has had the benefit of time to mature and evolve, the first iteration of our open source version is still nascent. We are envisioning three phases of the project and we have already begun work on various aspects of these phases:

+ + + +

Check out our Milestones and open RFCs how they relate to the three Phases outlined above.

+ +

Our vision for Backstage is for it to become the trusted standard toolbox (read: UX layer) for the open source infrastructure landscape. Think of it like Kubernetes for developer experience. We realize this is an ambitious goal. We can’t do it alone. If this sounds interesting or you’d like to help us shape our product vision, we’d love to talk. You can email me directly: alund@spotify.com.

+ +

Overview

+ +

The Backstage platform consists of a number of different components:

+ + + +

* not yet released

+ +
+overview +
overview
+
+ +

Getting started

+ +

To run a Backstage app, you will need to have the following installed:

+ + + +

After cloning this repo, open a terminal window and start the web app using the following commands from the project root:

+ +
yarn install
+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.

+ +

And thats it! You are good to go πŸ‘

+ +

Next step

+ +

Take a look at the Getting Started guide to learn more about how to extend the functionality with Plugins.

+ +

Documentation

+ + + +

Contributing

+ +

We would love your help in building Backstage! See CONTRIBUTING for more information.

+ +

Community

+ + + +

Or, if you are an open source developer and are interested in joining our team, please reach out to foss-opportunities@spotify.com

+ +

License

+ +

Copyright 2020 Spotify AB.

+ +

Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0

+ + + diff --git a/packages/app/package.json b/packages/app/package.json index 7ccb6c9a91..da1d02a5be 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -20,6 +20,7 @@ "dependencies": { "@backstage/cli": "^0.1.1-alpha.4", "@backstage/core": "^0.1.1-alpha.4", + "@backstage/plugin-circleci": "^0.1.1-alpha.4", "@backstage/plugin-home-page": "^0.1.1-alpha.4", "@backstage/plugin-inventory": "^0.1.1-alpha.4", "@backstage/plugin-lighthouse": "^0.1.1-alpha.4", diff --git a/packages/app/src/plugins.ts b/packages/app/src/plugins.ts index a7e425b869..31546c6ba6 100644 --- a/packages/app/src/plugins.ts +++ b/packages/app/src/plugins.ts @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - export { plugin as HomePagePlugin } from '@backstage/plugin-home-page'; export { plugin as WelcomePlugin } from '@backstage/plugin-welcome'; export { plugin as LighthousePlugin } from '@backstage/plugin-lighthouse'; export { plugin as InventoryPlugin } from '@backstage/plugin-inventory'; export { plugin as TechRadar } from '@backstage/plugin-tech-radar'; +export { plugin as Circleci } from '@backstage/plugin-circleci'; diff --git a/plugins/circleci/.eslintrc.js b/plugins/circleci/.eslintrc.js new file mode 100644 index 0000000000..13573efa9c --- /dev/null +++ b/plugins/circleci/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: [require.resolve('@backstage/cli/config/eslint')], +}; diff --git a/plugins/circleci/README.md b/plugins/circleci/README.md new file mode 100644 index 0000000000..46d48e9411 --- /dev/null +++ b/plugins/circleci/README.md @@ -0,0 +1,6 @@ +# Title +Welcome to the circleci plugin! + +## Sub-section 1 + +## Sub-section 2 diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json new file mode 100644 index 0000000000..80603f4029 --- /dev/null +++ b/plugins/circleci/package.json @@ -0,0 +1,38 @@ +{ + "name": "@backstage/plugin-circleci", + "version": "0.1.1-alpha.4", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts", + "license": "Apache-2.0", + "private": true, + "scripts": { + "build": "backstage-cli plugin:build", + "lint": "backstage-cli lint", + "test": "backstage-cli test", + "clean": "backstage-cli clean" + }, + "devDependencies": { + "@backstage/cli": "^0.1.1-alpha.4", + "@testing-library/jest-dom": "^4.2.4", + "@testing-library/react": "^9.3.2", + "@testing-library/user-event": "^7.1.2", + "@types/jest": "^24.0.0", + "@types/node": "^12.0.0", + "@types/testing-library__jest-dom": "5.0.2", + "jest-fetch-mock": "^3.0.3" + }, + "dependencies": { + "@backstage/core": "^0.1.1-alpha.4", + "@backstage/theme": "^0.1.1-alpha.4", + "@material-ui/core": "^4.9.1", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "4.0.0-alpha.45", + "circleci-api": "^4.0.0", + "react": "16.13.1", + "react-dom": "16.13.1", + "react-use": "^13.0.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/circleci/src/components/ExampleComponent/ExampleComponent.test.tsx b/plugins/circleci/src/components/ExampleComponent/ExampleComponent.test.tsx new file mode 100644 index 0000000000..ef0f3f9632 --- /dev/null +++ b/plugins/circleci/src/components/ExampleComponent/ExampleComponent.test.tsx @@ -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 React from 'react'; +import { render } from '@testing-library/react'; +import mockFetch from 'jest-fetch-mock'; +import ExampleComponent from './ExampleComponent'; +import { ThemeProvider } from '@material-ui/core'; +import { lightTheme } from '@backstage/theme'; + +describe('ExampleComponent', () => { + it('should render', () => { + mockFetch.mockResponse(() => new Promise(() => {})); + const rendered = render( + + + , + ); + expect(rendered.getByText('Welcome to circleci!')).toBeInTheDocument(); + }); +}); diff --git a/plugins/circleci/src/components/ExampleComponent/ExampleComponent.tsx b/plugins/circleci/src/components/ExampleComponent/ExampleComponent.tsx new file mode 100644 index 0000000000..72b5e0e798 --- /dev/null +++ b/plugins/circleci/src/components/ExampleComponent/ExampleComponent.tsx @@ -0,0 +1,59 @@ +/* + * 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 { Typography, Grid } from '@material-ui/core'; +import { + InfoCard, + Header, + Page, + pageTheme, + Content, + ContentHeader, + HeaderLabel, + SupportButton, +} from '@backstage/core'; +import ExampleFetchComponent from '../ExampleFetchComponent'; + +const ExampleComponent: FC<{}> = () => ( + +
+ + +
+ + + A description of your plugin goes here. + + + + + + All content should be wrapped in a card like this. + + + + + + + + + + +
+); + +export default ExampleComponent; diff --git a/plugins/circleci/src/components/ExampleComponent/index.ts b/plugins/circleci/src/components/ExampleComponent/index.ts new file mode 100644 index 0000000000..e785d45082 --- /dev/null +++ b/plugins/circleci/src/components/ExampleComponent/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 { default } from './ExampleComponent'; diff --git a/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx b/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx new file mode 100644 index 0000000000..7fecdc6f11 --- /dev/null +++ b/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx @@ -0,0 +1,28 @@ +/* + * 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 mockFetch from 'jest-fetch-mock'; +import ExampleFetchComponent from './ExampleFetchComponent'; + +describe('ExampleFetchComponent', () => { + it('should render', async () => { + mockFetch.mockResponse(() => new Promise(() => {})); + const rendered = render(); + expect(await rendered.findByTestId('progress')).toBeInTheDocument(); + }); +}); diff --git a/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx b/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx new file mode 100644 index 0000000000..7342da7d71 --- /dev/null +++ b/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx @@ -0,0 +1,151 @@ +/* + * 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 { makeStyles } from '@material-ui/core/styles'; +import Table from '@material-ui/core/Table'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableContainer from '@material-ui/core/TableContainer'; +import TableHead from '@material-ui/core/TableHead'; +import TableRow from '@material-ui/core/TableRow'; +import Alert from '@material-ui/lab/Alert'; +import { useAsync } from 'react-use'; +import { Progress } from '@backstage/core'; + +import { CircleCI, GitType, CircleCIOptions } from "circleci-api"; + +const CIRCLECI_TOKEN: string = "943aa82531ccaab192b4c4bc614507dff31c094c"; + +// Configure the factory with some defaults +const options: CircleCIOptions = { + // Required for all requests + token: CIRCLECI_TOKEN, // Set your CircleCi API token + + // Optional + // Anything set here can be overriden when making the request + + // Git information is required for project/build/etc endpoints + vcs: { + type: GitType.GITHUB, // default: github + owner: "CircleCITest3", + repo: "circleci-test" + }, + + // Optional query params for requests + // options: { + // branch: "master", // default: master + // } +}; + +const api = new CircleCI(options); + +api.builds() + .then((v) => console.log("token is valid")) + .catch(() => console.error("invalid token")); + + +const useStyles = makeStyles({ + table: { + minWidth: 650, + }, + avatar: { + height: 32, + width: 32, + borderRadius: '50%', + }, +}); + +type User = { + gender: string; // "male" + name: { + title: string; // "Mr", + first: string; // "Duane", + last: string; // "Reed" + }; + location: object; // {street: {number: 5060, name: "Hickory Creek Dr"}, city: "Albany", state: "New South Wales",…} + email: string; // "duane.reed@example.com" + login: object; // {uuid: "4b785022-9a23-4ab9-8a23-cb3fb43969a9", username: "blackdog796", password: "patch",…} + dob: object; // {date: "1983-06-22T12:30:23.016Z", age: 37} + registered: object; // {date: "2006-06-13T18:48:28.037Z", age: 14} + phone: string; // "07-2154-5651" + cell: string; // "0405-592-879" + id: { + name: string; // "TFN", + value: string; // "796260432" + }; + picture: { medium: string }; // {medium: "https://randomuser.me/api/portraits/men/95.jpg",…} + nat: string; // "AU" +}; + +type DenseTableProps = { + users: User[]; +}; + +export const DenseTable: FC = ({ users }) => { + const classes = useStyles(); + + return ( + + + + + Avatar + Name + Email + Nationality + + + + {users.map(user => ( + + + {user.name.first} + + + {user.name.first} {user.name.last} + + {user.email} + {user.nat} + + ))} + +
+
+ ); +}; + +const ExampleFetchComponent: FC<{}> = () => { + // const { value, loading, error } = useAsync(async (): Promise => { + // const response = await fetch('https://randomuser.me/api/?results=20'); + // const data = await response.json(); + // return data.results; + // }, []); + + if (loading) { + return ; + } else if (error) { + return {error.message}; + } + + return ; +}; + +export default ExampleFetchComponent; diff --git a/plugins/circleci/src/components/ExampleFetchComponent/index.ts b/plugins/circleci/src/components/ExampleFetchComponent/index.ts new file mode 100644 index 0000000000..28482f9fe1 --- /dev/null +++ b/plugins/circleci/src/components/ExampleFetchComponent/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 { default } from './ExampleFetchComponent'; diff --git a/plugins/circleci/src/index.ts b/plugins/circleci/src/index.ts new file mode 100644 index 0000000000..3a0a0fe2d3 --- /dev/null +++ b/plugins/circleci/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 { plugin } from './plugin'; diff --git a/plugins/circleci/src/plugin.test.ts b/plugins/circleci/src/plugin.test.ts new file mode 100644 index 0000000000..821a503257 --- /dev/null +++ b/plugins/circleci/src/plugin.test.ts @@ -0,0 +1,23 @@ +/* + * 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 { plugin } from './plugin'; + +describe('circleci', () => { + it('should export plugin', () => { + expect(plugin).toBeDefined(); + }); +}); diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts new file mode 100644 index 0000000000..2c56b4eec2 --- /dev/null +++ b/plugins/circleci/src/plugin.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. + */ +import { createPlugin } from '@backstage/core'; +import ExampleComponent from './components/ExampleFetchComponent'; + +export const plugin = createPlugin({ + id: 'circleci', + register({ router }) { + router.registerRoute('/circleci', ExampleComponent); + }, +}); diff --git a/plugins/circleci/src/setupTests.ts b/plugins/circleci/src/setupTests.ts new file mode 100644 index 0000000000..1a907ab8e6 --- /dev/null +++ b/plugins/circleci/src/setupTests.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. + */ + +import '@testing-library/jest-dom/extend-expect'; +require('jest-fetch-mock').enableMocks(); diff --git a/plugins/circleci/tsconfig.json b/plugins/circleci/tsconfig.json new file mode 100644 index 0000000000..7b73db2f0f --- /dev/null +++ b/plugins/circleci/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src"], + "compilerOptions": { + "baseUrl": "src" + } +} diff --git a/yarn.lock b/yarn.lock index f17fc840c8..cd2016d0d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5290,6 +5290,13 @@ aws4@^1.8.0: resolved "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== +axios@^0.19.0: + version "0.19.2" + resolved "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" + integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== + dependencies: + follow-redirects "1.5.10" + axobject-query@^2.0.2: version "2.1.2" resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799" @@ -6460,6 +6467,13 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +circleci-api@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/circleci-api/-/circleci-api-4.0.0.tgz#d773fe68f4a59e1968881269883a23b0805b3546" + integrity sha512-D/THFyhOv6THSkYXJhrOLIOmV7fmyDqgs1+pBFMAqDR+ywXszxa2Dqx1Zw+YD3O2zD2y5LQOifCDT96VidRG7Q== + dependencies: + axios "^0.19.0" + class-utils@^0.3.5: version "0.3.6" resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" @@ -7769,7 +7783,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: dependencies: ms "2.0.0" -debug@3.1.0: +debug@3.1.0, debug@=3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== @@ -9499,6 +9513,13 @@ focus-lock@^0.6.6: resolved "https://registry.npmjs.org/focus-lock/-/focus-lock-0.6.6.tgz#98119a755a38cfdbeda0280eaa77e307eee850c7" integrity sha512-Dx69IXGCq1qsUExWuG+5wkiMqVM/zGx/reXSJSLogECwp3x6KeNQZ+NAetgxEFpnC41rD8U3+jRCW68+LNzdtw== +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + follow-redirects@^1.0.0: version "1.10.0" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb" From cbda9adb450aae3d0e7e24eff4935eaa57485968 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Wed, 29 Apr 2020 17:05:29 +0200 Subject: [PATCH 02/90] feat: token input and showing list of builds --- .../ExampleComponent/ExampleComponent.tsx | 65 +++++++------ .../ExampleFetchComponent.tsx | 94 ++++++++++--------- plugins/circleci/src/plugin.ts | 2 +- 3 files changed, 90 insertions(+), 71 deletions(-) diff --git a/plugins/circleci/src/components/ExampleComponent/ExampleComponent.tsx b/plugins/circleci/src/components/ExampleComponent/ExampleComponent.tsx index 72b5e0e798..966debd11f 100644 --- a/plugins/circleci/src/components/ExampleComponent/ExampleComponent.tsx +++ b/plugins/circleci/src/components/ExampleComponent/ExampleComponent.tsx @@ -14,8 +14,8 @@ * limitations under the License. */ -import React, { FC } from 'react'; -import { Typography, Grid } from '@material-ui/core'; +import React, { FC, useState } from 'react'; +import { Typography, Grid, Input } from '@material-ui/core'; import { InfoCard, Header, @@ -28,32 +28,41 @@ import { } from '@backstage/core'; import ExampleFetchComponent from '../ExampleFetchComponent'; -const ExampleComponent: FC<{}> = () => ( - -
- - -
- - - A description of your plugin goes here. - - - - - - All content should be wrapped in a card like this. - - +const ExampleComponent: FC<{}> = () => { + const [token, setToken] = useState(''); + + return ( + +
+ + +
+ + + A description of your plugin goes here. + + + + + + Please paste your CircleCI token here + setToken(e.target.value)} + type="password" + value={token} + > + + + + + + + + - - - - - -
-
-
-); + + + ); +}; export default ExampleComponent; diff --git a/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx b/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx index 7342da7d71..c9bed14117 100644 --- a/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx +++ b/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx @@ -7,14 +7,14 @@ * * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software + * Unless required by applicable law or agreed to in wr iting, 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 React, { FC, useRef, useEffect } from 'react'; import { makeStyles } from '@material-ui/core/styles'; import Table from '@material-ui/core/Table'; import TableBody from '@material-ui/core/TableBody'; @@ -22,41 +22,22 @@ import TableCell from '@material-ui/core/TableCell'; import TableContainer from '@material-ui/core/TableContainer'; import TableHead from '@material-ui/core/TableHead'; import TableRow from '@material-ui/core/TableRow'; -import Alert from '@material-ui/lab/Alert'; +// import Alert from '@material-ui/lab/Alert'; import { useAsync } from 'react-use'; -import { Progress } from '@backstage/core'; +// import { Progress } from '@backstage/core'; -import { CircleCI, GitType, CircleCIOptions } from "circleci-api"; +import { CircleCI, GitType, CircleCIOptions, BuildSummary } from 'circleci-api'; -const CIRCLECI_TOKEN: string = "943aa82531ccaab192b4c4bc614507dff31c094c"; +// const CIRCLECI_TOKEN: string = '943aa82531ccaab192b4c4bc614507dff31c094c'; // Configure the factory with some defaults -const options: CircleCIOptions = { - // Required for all requests - token: CIRCLECI_TOKEN, // Set your CircleCi API token - // Optional - // Anything set here can be overriden when making the request - - // Git information is required for project/build/etc endpoints - vcs: { - type: GitType.GITHUB, // default: github - owner: "CircleCITest3", - repo: "circleci-test" - }, - - // Optional query params for requests - // options: { - // branch: "master", // default: master - // } -}; - -const api = new CircleCI(options); - -api.builds() - .then((v) => console.log("token is valid")) - .catch(() => console.error("invalid token")); +// const api = new CircleCI(options); +// api +// .builds() +// .then(d => console.log('token is valid', d)) +// .catch(() => console.error('invalid token')); const useStyles = makeStyles({ table: { @@ -131,21 +112,50 @@ export const DenseTable: FC = ({ users }) => { ); }; +const options: Partial = { + // Required for all requests + // token: CIRCLECI_TOKEN, // Set your CircleCi API token -const ExampleFetchComponent: FC<{}> = () => { - // const { value, loading, error } = useAsync(async (): Promise => { - // const response = await fetch('https://randomuser.me/api/?results=20'); - // const data = await response.json(); - // return data.results; - // }, []); + // Optional + // Anything set here can be overriden when making the request - if (loading) { - return ; - } else if (error) { - return {error.message}; - } + // Git information is required for project/build/etc endpoints + vcs: { + type: GitType.GITHUB, // default: github + owner: 'CircleCITest3', + repo: 'circleci-test', + }, - return ; + // Optional query params for requests + // options: { + // branch: "master", // default: master + // } +}; + +const BuildList: React.FC<{ builds: BuildSummary[] }> = ({ builds }) => ( +
    + {builds.map(build => ( +
  • + #{build.build_num} ({build.subject}) +
  • + ))} +
+); +const ExampleFetchComponent: FC<{ token: string }> = ({ token }) => { + const api = useRef(null); + useEffect(() => { + if (token !== '') api.current = new CircleCI({ ...options, token }); + }, [token]); + + const { value, loading, error } = useAsync(() => { + if (api.current) return api.current.builds(); + return Promise.reject('Api token not provided'); + }, [token]); + + if (loading) return
loading
; + if (error) return
{JSON.stringify(error, null, 2)}
; + + return ; }; export default ExampleFetchComponent; diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index 2c56b4eec2..4aec241bdb 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { createPlugin } from '@backstage/core'; -import ExampleComponent from './components/ExampleFetchComponent'; +import ExampleComponent from './components/ExampleComponent'; export const plugin = createPlugin({ id: 'circleci', From 564c0954ec08827baeead75a678cf60ea87eb760 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 30 Apr 2020 11:29:43 +0200 Subject: [PATCH 03/90] feat(circleci-plugin): nice table view --- .../src/components/CITable/CITable.tsx | 87 ++++++++++ .../circleci/src/components/CITable/index.ts | 1 + .../components/CircleCIFetch/CirleCIFetch.tsx | 88 ++++++++++ .../src/components/CircleCIFetch/index.ts | 1 + .../CircleCIPage.tsx} | 10 +- .../src/components/CircleCIPage/index.ts | 1 + .../ExampleComponent.test.tsx | 34 ---- .../src/components/ExampleComponent/index.ts | 17 -- .../ExampleFetchComponent.test.tsx | 28 --- .../ExampleFetchComponent.tsx | 161 ------------------ .../components/ExampleFetchComponent/index.ts | 17 -- plugins/circleci/src/plugin.ts | 4 +- 12 files changed, 185 insertions(+), 264 deletions(-) create mode 100644 plugins/circleci/src/components/CITable/CITable.tsx create mode 100644 plugins/circleci/src/components/CITable/index.ts create mode 100644 plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx create mode 100644 plugins/circleci/src/components/CircleCIFetch/index.ts rename plugins/circleci/src/components/{ExampleComponent/ExampleComponent.tsx => CircleCIPage/CircleCIPage.tsx} (87%) create mode 100644 plugins/circleci/src/components/CircleCIPage/index.ts delete mode 100644 plugins/circleci/src/components/ExampleComponent/ExampleComponent.test.tsx delete mode 100644 plugins/circleci/src/components/ExampleComponent/index.ts delete mode 100644 plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx delete mode 100644 plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx delete mode 100644 plugins/circleci/src/components/ExampleFetchComponent/index.ts diff --git a/plugins/circleci/src/components/CITable/CITable.tsx b/plugins/circleci/src/components/CITable/CITable.tsx new file mode 100644 index 0000000000..21cb03ce6c --- /dev/null +++ b/plugins/circleci/src/components/CITable/CITable.tsx @@ -0,0 +1,87 @@ +// Idea for this component to be somehow reusable representation of CI table view +import React, { FC } from 'react'; +import { makeStyles } from '@material-ui/core/styles'; +import Table from '@material-ui/core/Table'; +import TableBody from '@material-ui/core/TableBody'; +import TableCell from '@material-ui/core/TableCell'; +import TableContainer from '@material-ui/core/TableContainer'; +import TableHead from '@material-ui/core/TableHead'; +import TableRow from '@material-ui/core/TableRow'; + +const useStyles = makeStyles({ + table: { + minWidth: 650, + }, + avatar: { + height: 32, + width: 32, + borderRadius: '50%', + }, +}); + +export type CITableBuildInfo = { + id: string; + buildName: string; + source: { + branchName: string; + commit: { + hash: string; + url: string; + }; + }; + status: 'success' | 'pending' | 'error'; + tests?: { + total: number; + passed: number; + skipped: number; + failed: number; + testUrl: string; //fixme better name + }; + onRetriggerClick: () => void; +}; + +export const CITable: FC<{ + builds: CITableBuildInfo[]; +}> = ({ builds }) => { + const classes = useStyles(); + + return ( + + + + + Build + Source + Status + Tests + Retrigger + + + + {builds.map(build => ( + + {build.buildName} + +
+
{build.source.branchName}
+
{build.source.commit.hash}
+
+
+ {build.status} + + {build.tests && ( + <> + {build.tests.passed}/{build.tests.total} ( + {build.tests.failed ? build.tests.failed + ', ' : ''} + {build.tests.skipped ? build.tests.skipped : ''}) + + )} + + Retrigger +
+ ))} +
+
+
+ ); +}; diff --git a/plugins/circleci/src/components/CITable/index.ts b/plugins/circleci/src/components/CITable/index.ts new file mode 100644 index 0000000000..279634bce6 --- /dev/null +++ b/plugins/circleci/src/components/CITable/index.ts @@ -0,0 +1 @@ +export { CITable, CITableBuildInfo } from './CITable'; diff --git a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx new file mode 100644 index 0000000000..9ca7f93a0a --- /dev/null +++ b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx @@ -0,0 +1,88 @@ +/* + * 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 wr iting, 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, useRef, useEffect } from 'react'; + +// import Alert from '@material-ui/lab/Alert'; +import { useAsync } from 'react-use'; +// import { Progress } from '@backstage/core'; + +import { CircleCI, GitType, CircleCIOptions, BuildSummary } from 'circleci-api'; + +import { CITable, CITableBuildInfo } from '../CITable'; +const options: Partial = { + // Required for all requests + // token: CIRCLECI_TOKEN, // Set your CircleCi API token + + // Optional + // Anything set here can be overriden when making the request + + // Git information is required for project/build/etc endpoints + vcs: { + type: GitType.GITHUB, // default: github + owner: 'CircleCITest3', + repo: 'circleci-test', + }, + + // Optional query params for requests + // options: { + // branch: "master", // default: master + // } +}; + +const transform = (buildsData: BuildSummary[]): CITableBuildInfo[] => { + return buildsData.map(buildData => { + const tableBuildInfo: CITableBuildInfo = { + id: String(buildData.build_num), + buildName: String(buildData.subject), + onRetriggerClick: () => null, + source: { + branchName: String(buildData.branch), + commit: { + hash: String(buildData.vcs_revision), + url: 'todo', + }, + }, + status: String(buildData.status) as 'success' | 'error' | 'pending', + tests: { + failed: 0, + passed: 10, + skipped: 3, + testUrl: 'nourlnow', + total: 13, + }, + }; + return tableBuildInfo; + }); +}; + +export const CircleCIFetch: FC<{ token: string }> = ({ token }) => { + const api = useRef(null); + useEffect(() => { + if (token !== '') api.current = new CircleCI({ ...options, token }); + }, [token]); + + const { value, loading, error } = useAsync(() => { + if (api.current) return api.current.builds(); + return Promise.reject('Api token not provided'); + }, [token]); + + if (loading) return
loading
; + if (error) return
{JSON.stringify(error, null, 2)}
; + + const builds = transform(value || []); + return ; +}; diff --git a/plugins/circleci/src/components/CircleCIFetch/index.ts b/plugins/circleci/src/components/CircleCIFetch/index.ts new file mode 100644 index 0000000000..e204a791cd --- /dev/null +++ b/plugins/circleci/src/components/CircleCIFetch/index.ts @@ -0,0 +1 @@ +export { CircleCIFetch } from './CirleCIFetch'; diff --git a/plugins/circleci/src/components/ExampleComponent/ExampleComponent.tsx b/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx similarity index 87% rename from plugins/circleci/src/components/ExampleComponent/ExampleComponent.tsx rename to plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx index 966debd11f..f27ac80a6f 100644 --- a/plugins/circleci/src/components/ExampleComponent/ExampleComponent.tsx +++ b/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx @@ -26,9 +26,9 @@ import { HeaderLabel, SupportButton, } from '@backstage/core'; -import ExampleFetchComponent from '../ExampleFetchComponent'; +import { CircleCIFetch } from '../CircleCIFetch'; -const ExampleComponent: FC<{}> = () => { +export const CircleCIPage: FC<{}> = () => { const [token, setToken] = useState(''); return ( @@ -55,8 +55,8 @@ const ExampleComponent: FC<{}> = () => { - - + + @@ -65,4 +65,4 @@ const ExampleComponent: FC<{}> = () => { ); }; -export default ExampleComponent; +export default CircleCIPage; diff --git a/plugins/circleci/src/components/CircleCIPage/index.ts b/plugins/circleci/src/components/CircleCIPage/index.ts new file mode 100644 index 0000000000..188ed6d61f --- /dev/null +++ b/plugins/circleci/src/components/CircleCIPage/index.ts @@ -0,0 +1 @@ +export { CircleCIPage } from './CircleCIPage'; diff --git a/plugins/circleci/src/components/ExampleComponent/ExampleComponent.test.tsx b/plugins/circleci/src/components/ExampleComponent/ExampleComponent.test.tsx deleted file mode 100644 index ef0f3f9632..0000000000 --- a/plugins/circleci/src/components/ExampleComponent/ExampleComponent.test.tsx +++ /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 React from 'react'; -import { render } from '@testing-library/react'; -import mockFetch from 'jest-fetch-mock'; -import ExampleComponent from './ExampleComponent'; -import { ThemeProvider } from '@material-ui/core'; -import { lightTheme } from '@backstage/theme'; - -describe('ExampleComponent', () => { - it('should render', () => { - mockFetch.mockResponse(() => new Promise(() => {})); - const rendered = render( - - - , - ); - expect(rendered.getByText('Welcome to circleci!')).toBeInTheDocument(); - }); -}); diff --git a/plugins/circleci/src/components/ExampleComponent/index.ts b/plugins/circleci/src/components/ExampleComponent/index.ts deleted file mode 100644 index e785d45082..0000000000 --- a/plugins/circleci/src/components/ExampleComponent/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 { default } from './ExampleComponent'; diff --git a/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx b/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx deleted file mode 100644 index 7fecdc6f11..0000000000 --- a/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.test.tsx +++ /dev/null @@ -1,28 +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 React from 'react'; -import { render } from '@testing-library/react'; -import mockFetch from 'jest-fetch-mock'; -import ExampleFetchComponent from './ExampleFetchComponent'; - -describe('ExampleFetchComponent', () => { - it('should render', async () => { - mockFetch.mockResponse(() => new Promise(() => {})); - const rendered = render(); - expect(await rendered.findByTestId('progress')).toBeInTheDocument(); - }); -}); diff --git a/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx b/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx deleted file mode 100644 index c9bed14117..0000000000 --- a/plugins/circleci/src/components/ExampleFetchComponent/ExampleFetchComponent.tsx +++ /dev/null @@ -1,161 +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 wr iting, 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, useRef, useEffect } from 'react'; -import { makeStyles } from '@material-ui/core/styles'; -import Table from '@material-ui/core/Table'; -import TableBody from '@material-ui/core/TableBody'; -import TableCell from '@material-ui/core/TableCell'; -import TableContainer from '@material-ui/core/TableContainer'; -import TableHead from '@material-ui/core/TableHead'; -import TableRow from '@material-ui/core/TableRow'; -// import Alert from '@material-ui/lab/Alert'; -import { useAsync } from 'react-use'; -// import { Progress } from '@backstage/core'; - -import { CircleCI, GitType, CircleCIOptions, BuildSummary } from 'circleci-api'; - -// const CIRCLECI_TOKEN: string = '943aa82531ccaab192b4c4bc614507dff31c094c'; - -// Configure the factory with some defaults - -// const api = new CircleCI(options); - -// api -// .builds() -// .then(d => console.log('token is valid', d)) -// .catch(() => console.error('invalid token')); - -const useStyles = makeStyles({ - table: { - minWidth: 650, - }, - avatar: { - height: 32, - width: 32, - borderRadius: '50%', - }, -}); - -type User = { - gender: string; // "male" - name: { - title: string; // "Mr", - first: string; // "Duane", - last: string; // "Reed" - }; - location: object; // {street: {number: 5060, name: "Hickory Creek Dr"}, city: "Albany", state: "New South Wales",…} - email: string; // "duane.reed@example.com" - login: object; // {uuid: "4b785022-9a23-4ab9-8a23-cb3fb43969a9", username: "blackdog796", password: "patch",…} - dob: object; // {date: "1983-06-22T12:30:23.016Z", age: 37} - registered: object; // {date: "2006-06-13T18:48:28.037Z", age: 14} - phone: string; // "07-2154-5651" - cell: string; // "0405-592-879" - id: { - name: string; // "TFN", - value: string; // "796260432" - }; - picture: { medium: string }; // {medium: "https://randomuser.me/api/portraits/men/95.jpg",…} - nat: string; // "AU" -}; - -type DenseTableProps = { - users: User[]; -}; - -export const DenseTable: FC = ({ users }) => { - const classes = useStyles(); - - return ( - - - - - Avatar - Name - Email - Nationality - - - - {users.map(user => ( - - - {user.name.first} - - - {user.name.first} {user.name.last} - - {user.email} - {user.nat} - - ))} - -
-
- ); -}; -const options: Partial = { - // Required for all requests - // token: CIRCLECI_TOKEN, // Set your CircleCi API token - - // Optional - // Anything set here can be overriden when making the request - - // Git information is required for project/build/etc endpoints - vcs: { - type: GitType.GITHUB, // default: github - owner: 'CircleCITest3', - repo: 'circleci-test', - }, - - // Optional query params for requests - // options: { - // branch: "master", // default: master - // } -}; - -const BuildList: React.FC<{ builds: BuildSummary[] }> = ({ builds }) => ( -
    - {builds.map(build => ( -
  • - #{build.build_num} ({build.subject}) -
  • - ))} -
-); -const ExampleFetchComponent: FC<{ token: string }> = ({ token }) => { - const api = useRef(null); - useEffect(() => { - if (token !== '') api.current = new CircleCI({ ...options, token }); - }, [token]); - - const { value, loading, error } = useAsync(() => { - if (api.current) return api.current.builds(); - return Promise.reject('Api token not provided'); - }, [token]); - - if (loading) return
loading
; - if (error) return
{JSON.stringify(error, null, 2)}
; - - return ; -}; - -export default ExampleFetchComponent; diff --git a/plugins/circleci/src/components/ExampleFetchComponent/index.ts b/plugins/circleci/src/components/ExampleFetchComponent/index.ts deleted file mode 100644 index 28482f9fe1..0000000000 --- a/plugins/circleci/src/components/ExampleFetchComponent/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 { default } from './ExampleFetchComponent'; diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index 4aec241bdb..5c1eca9be3 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -14,11 +14,11 @@ * limitations under the License. */ import { createPlugin } from '@backstage/core'; -import ExampleComponent from './components/ExampleComponent'; +import { CircleCIPage } from './components/CircleCIPage'; export const plugin = createPlugin({ id: 'circleci', register({ router }) { - router.registerRoute('/circleci', ExampleComponent); + router.registerRoute('/circleci', CircleCIPage); }, }); From a0c9155272a8fbf44550471b0de1778d4de9740a Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Thu, 30 Apr 2020 11:55:22 +0200 Subject: [PATCH 04/90] feat: build name, status and ID --- .../src/components/CITable/CITable.tsx | 4 ++- .../components/CircleCIFetch/CirleCIFetch.tsx | 25 +++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/plugins/circleci/src/components/CITable/CITable.tsx b/plugins/circleci/src/components/CITable/CITable.tsx index 21cb03ce6c..7da9709f68 100644 --- a/plugins/circleci/src/components/CITable/CITable.tsx +++ b/plugins/circleci/src/components/CITable/CITable.tsx @@ -29,7 +29,7 @@ export type CITableBuildInfo = { url: string; }; }; - status: 'success' | 'pending' | 'error'; + status: string; tests?: { total: number; passed: number; @@ -50,6 +50,7 @@ export const CITable: FC<{ + ID Build Source Status @@ -60,6 +61,7 @@ export const CITable: FC<{ {builds.map(build => ( + {build.id} {build.buildName}
diff --git a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx index 9ca7f93a0a..fff0c25e50 100644 --- a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx +++ b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx @@ -43,11 +43,32 @@ const options: Partial = { // } }; +// "lifecycle" : "finished", // :queued, :scheduled, :not_run, :not_running, :running or :finished +// "outcome" : "failed", // :canceled, :infrastructure_fail, :timedout, :failed, :no_tests or :success + +const makeReadableStatus = (status: string | undefined) => { + if (typeof status === 'undefined') return "" + return ({ + retried: 'Retried', + canceled: 'Canceled', + infrastructure_fail: 'Infra fail', + timedout: 'Timedout', + not_run: 'Not run', + running: 'Running', + failed: 'Failed', + queued: 'Queued', + scheduled: 'Scheduled', + not_running: 'Not running', + no_tests: 'No tests', + fixed: 'Fixed', + success: 'Success', + } as Record)[status]}; + const transform = (buildsData: BuildSummary[]): CITableBuildInfo[] => { return buildsData.map(buildData => { const tableBuildInfo: CITableBuildInfo = { id: String(buildData.build_num), - buildName: String(buildData.subject), + buildName: buildData.subject ? String(buildData.subject) : '', onRetriggerClick: () => null, source: { branchName: String(buildData.branch), @@ -56,7 +77,7 @@ const transform = (buildsData: BuildSummary[]): CITableBuildInfo[] => { url: 'todo', }, }, - status: String(buildData.status) as 'success' | 'error' | 'pending', + status: makeReadableStatus(buildData.status), tests: { failed: 0, passed: 10, From 60828973825e1234faa5180846494d73999abf59 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 30 Apr 2020 16:19:00 +0200 Subject: [PATCH 05/90] feat: proper api flow implementation --- packages/app/src/apis.ts | 4 +- plugins/circleci/src/api/index.ts | 61 +++++++++++++++++++ .../components/CircleCIFetch/CirleCIFetch.tsx | 58 ++++++------------ .../components/CircleCIPage/CircleCIPage.tsx | 20 ++---- .../src/components/LoginCard/LoginCard.tsx | 46 ++++++++++++++ .../src/components/LoginCard/index.ts | 1 + plugins/circleci/src/index.ts | 1 + 7 files changed, 137 insertions(+), 54 deletions(-) create mode 100644 plugins/circleci/src/api/index.ts create mode 100644 plugins/circleci/src/components/LoginCard/LoginCard.tsx create mode 100644 plugins/circleci/src/components/LoginCard/index.ts diff --git a/packages/app/src/apis.ts b/packages/app/src/apis.ts index a24a25e205..c00aee1f5c 100644 --- a/packages/app/src/apis.ts +++ b/packages/app/src/apis.ts @@ -36,6 +36,8 @@ import { loadSampleData, } from '@backstage/plugin-tech-radar'; +import { CircleCIApi, circleCIApiRef } from '@backstage/plugin-circleci'; + const builder = ApiRegistry.builder(); export const alertApiForwarder = new AlertApiForwarder(); @@ -43,7 +45,7 @@ builder.add(alertApiRef, alertApiForwarder); export const errorApiForwarder = new ErrorApiForwarder(alertApiForwarder); builder.add(errorApiRef, errorApiForwarder); - +builder.add(circleCIApiRef, new CircleCIApi()); builder.add(featureFlagsApiRef, new FeatureFlags()); builder.add(lighthouseApiRef, new LighthouseRestApi('http://localhost:3003')); diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts new file mode 100644 index 0000000000..849ac4ce1a --- /dev/null +++ b/plugins/circleci/src/api/index.ts @@ -0,0 +1,61 @@ +/* + * 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 { CircleCI, GitType, CircleCIOptions } from 'circleci-api'; +import { ApiRef } from '@backstage/core'; + +const options: Partial = { + // Required for all requests + // token: CIRCLECI_TOKEN, // Set your CircleCi API token + + // Optional + // Anything set here can be overriden when making the request + + // Git information is required for project/build/etc endpoints + vcs: { + type: GitType.GITHUB, // default: github + owner: 'CircleCITest3', + repo: 'circleci-test', + }, +}; + +export class CircleCIApi { + api: null | CircleCI = null; + constuctor() {} + async authenticate(token: string) { + try { + if (token === '') return Promise.reject(); + this.api = new CircleCI({ ...options, token }); + // await this.api.me(); + return Promise.resolve(); + } catch (e) { + this.api = null; + return this.cantAuth(); + } + } + async cantAuth() { + return Promise.reject("Can't auth"); + } + async getBuilds() { + if (!this.api) return this.cantAuth(); + return this.api.builds(); + } +} + +export const circleCIApiRef = new ApiRef({ + id: 'plugin.circleci.service', + description: 'Used by the CircleCI plugin to make requests', +}); diff --git a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx index fff0c25e50..50ca39b3a6 100644 --- a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx +++ b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx @@ -14,40 +14,22 @@ * limitations under the License. */ -import React, { FC, useRef, useEffect } from 'react'; +import React, { FC } from 'react'; // import Alert from '@material-ui/lab/Alert'; -import { useAsync } from 'react-use'; // import { Progress } from '@backstage/core'; -import { CircleCI, GitType, CircleCIOptions, BuildSummary } from 'circleci-api'; +import { BuildSummary } from 'circleci-api'; import { CITable, CITableBuildInfo } from '../CITable'; -const options: Partial = { - // Required for all requests - // token: CIRCLECI_TOKEN, // Set your CircleCi API token - - // Optional - // Anything set here can be overriden when making the request - - // Git information is required for project/build/etc endpoints - vcs: { - type: GitType.GITHUB, // default: github - owner: 'CircleCITest3', - repo: 'circleci-test', - }, - - // Optional query params for requests - // options: { - // branch: "master", // default: master - // } -}; +import { circleCIApiRef } from 'api'; +import { useApi } from '@backstage/core'; // "lifecycle" : "finished", // :queued, :scheduled, :not_run, :not_running, :running or :finished // "outcome" : "failed", // :canceled, :infrastructure_fail, :timedout, :failed, :no_tests or :success const makeReadableStatus = (status: string | undefined) => { - if (typeof status === 'undefined') return "" + if (typeof status === 'undefined') return ''; return ({ retried: 'Retried', canceled: 'Canceled', @@ -62,7 +44,8 @@ const makeReadableStatus = (status: string | undefined) => { no_tests: 'No tests', fixed: 'Fixed', success: 'Success', - } as Record)[status]}; + } as Record)[status]; +}; const transform = (buildsData: BuildSummary[]): CITableBuildInfo[] => { return buildsData.map(buildData => { @@ -90,20 +73,19 @@ const transform = (buildsData: BuildSummary[]): CITableBuildInfo[] => { }); }; -export const CircleCIFetch: FC<{ token: string }> = ({ token }) => { - const api = useRef(null); - useEffect(() => { - if (token !== '') api.current = new CircleCI({ ...options, token }); - }, [token]); +export const CircleCIFetch: FC<{}> = () => { + const [builds, setBuilds] = React.useState([]); + const api = useApi(circleCIApiRef); - const { value, loading, error } = useAsync(() => { - if (api.current) return api.current.builds(); - return Promise.reject('Api token not provided'); - }, [token]); + React.useEffect(() => { + const intervalId = setInterval(() => { + if (!api.api) return; + api.getBuilds().then(setBuilds); + }, 1500); + return () => clearInterval(intervalId); + }, []); - if (loading) return
loading
; - if (error) return
{JSON.stringify(error, null, 2)}
; - - const builds = transform(value || []); - return ; + if (!api.api) return
Not authenticated
; + const transformedBuilds = transform(builds || []); + return ; }; diff --git a/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx b/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx index f27ac80a6f..23ac5c0d7d 100644 --- a/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx +++ b/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx @@ -14,8 +14,8 @@ * limitations under the License. */ -import React, { FC, useState } from 'react'; -import { Typography, Grid, Input } from '@material-ui/core'; +import React, { FC } from 'react'; +import { Grid } from '@material-ui/core'; import { InfoCard, Header, @@ -27,10 +27,9 @@ import { SupportButton, } from '@backstage/core'; import { CircleCIFetch } from '../CircleCIFetch'; +import { LoginCard } from '../LoginCard'; export const CircleCIPage: FC<{}> = () => { - const [token, setToken] = useState(''); - return (
@@ -43,20 +42,11 @@ export const CircleCIPage: FC<{}> = () => { - - - Please paste your CircleCI token here - setToken(e.target.value)} - type="password" - value={token} - > - - + - + diff --git a/plugins/circleci/src/components/LoginCard/LoginCard.tsx b/plugins/circleci/src/components/LoginCard/LoginCard.tsx new file mode 100644 index 0000000000..09c0514064 --- /dev/null +++ b/plugins/circleci/src/components/LoginCard/LoginCard.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { + Typography, + Button, + TextField, + List, + ListItem, +} from '@material-ui/core'; +import { Person as PersonIcon } from '@material-ui/icons'; +import { InfoCard, useApi } from '@backstage/core'; +import { circleCIApiRef } from 'api'; + +export const LoginCard = () => { + const [token, setToken] = React.useState(''); + const api = useApi(circleCIApiRef); + + return ( + + + CircleCI Auth + + + + setToken(e.target.value)} + /> + + + + + + + + ); +}; diff --git a/plugins/circleci/src/components/LoginCard/index.ts b/plugins/circleci/src/components/LoginCard/index.ts new file mode 100644 index 0000000000..1d3c3bcf3e --- /dev/null +++ b/plugins/circleci/src/components/LoginCard/index.ts @@ -0,0 +1 @@ +export * from './LoginCard'; diff --git a/plugins/circleci/src/index.ts b/plugins/circleci/src/index.ts index 3a0a0fe2d3..d67bc6a864 100644 --- a/plugins/circleci/src/index.ts +++ b/plugins/circleci/src/index.ts @@ -15,3 +15,4 @@ */ export { plugin } from './plugin'; +export * from './api'; From 00efbfe87ef481b66b4e8b4570344b77cb5c77f5 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 30 Apr 2020 16:37:07 +0200 Subject: [PATCH 06/90] feat: save token to session storage and read from it --- .../src/components/LoginCard/LoginCard.tsx | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/plugins/circleci/src/components/LoginCard/LoginCard.tsx b/plugins/circleci/src/components/LoginCard/LoginCard.tsx index 09c0514064..806f218cf9 100644 --- a/plugins/circleci/src/components/LoginCard/LoginCard.tsx +++ b/plugins/circleci/src/components/LoginCard/LoginCard.tsx @@ -10,10 +10,36 @@ import { Person as PersonIcon } from '@material-ui/icons'; import { InfoCard, useApi } from '@backstage/core'; import { circleCIApiRef } from 'api'; +const useSessionStorage = (key: string): [string, (value: string) => void] => { + const [value, setter] = React.useState(sessionStorage.getItem(key) ?? ''); + const setValue = (newValue: string) => { + sessionStorage.setItem(key, newValue); + setter(sessionStorage.getItem(key) ?? ''); + }; + + React.useEffect(() => { + const storageChangeHandle = (e: StorageEvent) => { + if (e.storageArea !== sessionStorage) return; + if (e.key !== key) return; + if (e.newValue !== e.oldValue) { + setter(e.newValue ?? ''); + } + }; + window.addEventListener('storage', storageChangeHandle); + return () => window.removeEventListener('storage', storageChangeHandle); + }, [key, setter]); + + return [value, setValue]; +}; export const LoginCard = () => { - const [token, setToken] = React.useState(''); + const [token, setToken] = useSessionStorage(circleCIApiRef.id); const api = useApi(circleCIApiRef); + React.useEffect(() => { + if (token && token !== '') { + api.authenticate(token); + } + }, []); return ( From cf963ceae8258e00abda8730324f3f4139649d21 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 4 May 2020 13:46:15 +0200 Subject: [PATCH 07/90] Add owner and repo options to authenticate method --- plugins/circleci/src/api/index.ts | 25 +++++++++++------- .../src/components/LoginCard/LoginCard.tsx | 26 ++++++++++++++++--- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index 849ac4ce1a..aadb2b144d 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -14,8 +14,15 @@ * limitations under the License. */ -import { CircleCI, GitType, CircleCIOptions } from 'circleci-api'; +import { CircleCI, GitType, CircleCIOptions, GitInfo } from 'circleci-api'; import { ApiRef } from '@backstage/core'; +import { default } from '../../../../packages/core/src/components/Status/Status.stories'; + +const defaultVcsOptions: GitInfo = { + type: GitType.GITHUB, // default: github + owner: 'CircleCITest3', + repo: 'circleci-test', +} const options: Partial = { // Required for all requests @@ -25,20 +32,20 @@ const options: Partial = { // Anything set here can be overriden when making the request // Git information is required for project/build/etc endpoints - vcs: { - type: GitType.GITHUB, // default: github - owner: 'CircleCITest3', - repo: 'circleci-test', - }, + vcs: defaultVcsOptions }; export class CircleCIApi { api: null | CircleCI = null; constuctor() {} - async authenticate(token: string) { + async authenticate({token, owner, repo}: {token: string, owner: string, repo: string}) { try { - if (token === '') return Promise.reject(); - this.api = new CircleCI({ ...options, token }); + if (token === '' || owner === '' || repo === '') return Promise.reject(); + this.api = new CircleCI({ ...options, token, vcs: { + type: GitType.GITHUB, // default: github + owner, + repo, + }}); // await this.api.me(); return Promise.resolve(); } catch (e) { diff --git a/plugins/circleci/src/components/LoginCard/LoginCard.tsx b/plugins/circleci/src/components/LoginCard/LoginCard.tsx index 806f218cf9..e50ca4bc0b 100644 --- a/plugins/circleci/src/components/LoginCard/LoginCard.tsx +++ b/plugins/circleci/src/components/LoginCard/LoginCard.tsx @@ -32,12 +32,15 @@ const useSessionStorage = (key: string): [string, (value: string) => void] => { return [value, setValue]; }; export const LoginCard = () => { - const [token, setToken] = useSessionStorage(circleCIApiRef.id); + const [token, setToken] = useSessionStorage(circleCIApiRef.id + '_token'); + const [owner, setOwner] = useSessionStorage(circleCIApiRef.id + '_owner'); + const [repo, setRepo] = useSessionStorage(circleCIApiRef.id + '_repo'); + const api = useApi(circleCIApiRef); React.useEffect(() => { if (token && token !== '') { - api.authenticate(token); + api.authenticate({token, owner, repo}); } }, []); return ( @@ -55,13 +58,28 @@ export const LoginCard = () => { onChange={e => setToken(e.target.value)} /> - + + setOwner(e.target.value)} + /> + + + setRepo(e.target.value)} + /> + From f7088027118212bf6f41488afb72cdad1990b746 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 4 May 2020 14:53:01 +0200 Subject: [PATCH 08/90] Move owner/repo form into CircleCIFetch component --- plugins/circleci/src/api/index.ts | 21 +++++----- .../src/components/CITable/CITable.tsx | 1 - .../components/CircleCIFetch/CirleCIFetch.tsx | 14 +++++-- .../src/components/LoginCard/LoginCard.tsx | 22 +--------- .../components/ProjectInput/ProjectInput.tsx | 42 +++++++++++++++++++ 5 files changed, 64 insertions(+), 36 deletions(-) create mode 100644 plugins/circleci/src/components/ProjectInput/ProjectInput.tsx diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index aadb2b144d..34eaae4b35 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { CircleCI, GitType, CircleCIOptions, GitInfo } from 'circleci-api'; +import { CircleCI, GitType, CircleCIOptions, GitInfo, getBuildSummaries } from 'circleci-api'; import { ApiRef } from '@backstage/core'; -import { default } from '../../../../packages/core/src/components/Status/Status.stories'; +//import { default } from '../../../../packages/core/src/components/Status/Status.stories'; const defaultVcsOptions: GitInfo = { type: GitType.GITHUB, // default: github @@ -37,16 +37,14 @@ const options: Partial = { export class CircleCIApi { api: null | CircleCI = null; + token: string = ''; constuctor() {} - async authenticate({token, owner, repo}: {token: string, owner: string, repo: string}) { + async authenticate(token: string) { try { - if (token === '' || owner === '' || repo === '') return Promise.reject(); - this.api = new CircleCI({ ...options, token, vcs: { - type: GitType.GITHUB, // default: github - owner, - repo, - }}); + if (token === '') return Promise.reject(); + this.api = new CircleCI({ ...options, token}); // await this.api.me(); + this.token = token; return Promise.resolve(); } catch (e) { this.api = null; @@ -56,9 +54,10 @@ export class CircleCIApi { async cantAuth() { return Promise.reject("Can't auth"); } - async getBuilds() { + async getBuilds({repo, owner}: {repo: string, owner: string}) { if (!this.api) return this.cantAuth(); - return this.api.builds(); + if (owner === '' || repo === '') return Promise.reject(); + return getBuildSummaries(this.token, {vcs: {...defaultVcsOptions, owner, repo}}); } } diff --git a/plugins/circleci/src/components/CITable/CITable.tsx b/plugins/circleci/src/components/CITable/CITable.tsx index 7da9709f68..a6b607a216 100644 --- a/plugins/circleci/src/components/CITable/CITable.tsx +++ b/plugins/circleci/src/components/CITable/CITable.tsx @@ -7,7 +7,6 @@ import TableCell from '@material-ui/core/TableCell'; import TableContainer from '@material-ui/core/TableContainer'; import TableHead from '@material-ui/core/TableHead'; import TableRow from '@material-ui/core/TableRow'; - const useStyles = makeStyles({ table: { minWidth: 650, diff --git a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx index 50ca39b3a6..855fea6243 100644 --- a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx +++ b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import React, { FC } from 'react'; +import React, { FC, useState } from 'react'; // import Alert from '@material-ui/lab/Alert'; // import { Progress } from '@backstage/core'; @@ -24,6 +24,7 @@ import { BuildSummary } from 'circleci-api'; import { CITable, CITableBuildInfo } from '../CITable'; import { circleCIApiRef } from 'api'; import { useApi } from '@backstage/core'; +import { ProjectInput } from 'components/ProjectInput/ProjectInput'; // "lifecycle" : "finished", // :queued, :scheduled, :not_run, :not_running, :running or :finished // "outcome" : "failed", // :canceled, :infrastructure_fail, :timedout, :failed, :no_tests or :success @@ -73,19 +74,24 @@ const transform = (buildsData: BuildSummary[]): CITableBuildInfo[] => { }); }; + export const CircleCIFetch: FC<{}> = () => { + const [vcsOptions, setVcsOptions] = useState({owner: '', repo: ''}); const [builds, setBuilds] = React.useState([]); const api = useApi(circleCIApiRef); React.useEffect(() => { const intervalId = setInterval(() => { if (!api.api) return; - api.getBuilds().then(setBuilds); + api.getBuilds(vcsOptions).then(setBuilds); }, 1500); return () => clearInterval(intervalId); }, []); - if (!api.api) return
Not authenticated
; const transformedBuilds = transform(builds || []); - return ; + return <> + { + setVcsOptions(info); + api.getBuilds(info).then(setBuilds)}}/> + {!api.api ?
Not authenticated
: }; }; diff --git a/plugins/circleci/src/components/LoginCard/LoginCard.tsx b/plugins/circleci/src/components/LoginCard/LoginCard.tsx index e50ca4bc0b..23ff5ee1d1 100644 --- a/plugins/circleci/src/components/LoginCard/LoginCard.tsx +++ b/plugins/circleci/src/components/LoginCard/LoginCard.tsx @@ -33,14 +33,12 @@ const useSessionStorage = (key: string): [string, (value: string) => void] => { }; export const LoginCard = () => { const [token, setToken] = useSessionStorage(circleCIApiRef.id + '_token'); - const [owner, setOwner] = useSessionStorage(circleCIApiRef.id + '_owner'); - const [repo, setRepo] = useSessionStorage(circleCIApiRef.id + '_repo'); const api = useApi(circleCIApiRef); React.useEffect(() => { if (token && token !== '') { - api.authenticate({token, owner, repo}); + api.authenticate(token); } }, []); return ( @@ -58,28 +56,12 @@ export const LoginCard = () => { onChange={e => setToken(e.target.value)} />
- - setOwner(e.target.value)} - /> - - - setRepo(e.target.value)} - /> - diff --git a/plugins/circleci/src/components/ProjectInput/ProjectInput.tsx b/plugins/circleci/src/components/ProjectInput/ProjectInput.tsx new file mode 100644 index 0000000000..79ca532f70 --- /dev/null +++ b/plugins/circleci/src/components/ProjectInput/ProjectInput.tsx @@ -0,0 +1,42 @@ +import { useState, FC } from "react"; +import { List, ListItem, TextField, Button } from "@material-ui/core"; +import React from "react"; + +export const ProjectInput:FC<{ + setGitInfo: (info: {owner: string, repo: string}) => void + }> = ({setGitInfo}) => { + + const [owner, setOwner] = useState(''); + const [repo, setRepo] = useState(''); + + return ( + + + setOwner(e.target.value)} + /> + + + setRepo(e.target.value)} + /> + + + + + + ); +}; \ No newline at end of file From a6dcc9b2e31c2dc17a2902382ca28033a4f23ffd Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 4 May 2020 15:48:07 +0200 Subject: [PATCH 09/90] feat: settings page --- plugins/circleci/src/api/index.ts | 90 ++++++++++++------- .../components/CircleCIFetch/CirleCIFetch.tsx | 17 +++- .../components/CircleCIPage/CircleCIPage.tsx | 11 +-- .../src/components/LoginCard/LoginCard.tsx | 72 --------------- .../src/components/LoginCard/index.ts | 1 - .../components/SettingsPage/SettingsPage.tsx | 83 +++++++++++++++++ .../src/components/SettingsPage/index.ts | 1 + plugins/circleci/src/plugin.ts | 2 + 8 files changed, 160 insertions(+), 117 deletions(-) delete mode 100644 plugins/circleci/src/components/LoginCard/LoginCard.tsx delete mode 100644 plugins/circleci/src/components/LoginCard/index.ts create mode 100644 plugins/circleci/src/components/SettingsPage/SettingsPage.tsx create mode 100644 plugins/circleci/src/components/SettingsPage/index.ts diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index 849ac4ce1a..b3de6758cc 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -17,45 +17,69 @@ import { CircleCI, GitType, CircleCIOptions } from 'circleci-api'; import { ApiRef } from '@backstage/core'; -const options: Partial = { - // Required for all requests - // token: CIRCLECI_TOKEN, // Set your CircleCi API token - - // Optional - // Anything set here can be overriden when making the request - - // Git information is required for project/build/etc endpoints +const defaultOptions: Partial = { vcs: { - type: GitType.GITHUB, // default: github + type: GitType.GITHUB, owner: 'CircleCITest3', repo: 'circleci-test', }, }; - -export class CircleCIApi { - api: null | CircleCI = null; - constuctor() {} - async authenticate(token: string) { - try { - if (token === '') return Promise.reject(); - this.api = new CircleCI({ ...options, token }); - // await this.api.me(); - return Promise.resolve(); - } catch (e) { - this.api = null; - return this.cantAuth(); - } - } - async cantAuth() { - return Promise.reject("Can't auth"); - } - async getBuilds() { - if (!this.api) return this.cantAuth(); - return this.api.builds(); - } -} - export const circleCIApiRef = new ApiRef({ id: 'plugin.circleci.service', description: 'Used by the CircleCI plugin to make requests', }); + +export class CircleCIApi { + token: string = ''; + private options: Partial; + + authed: boolean = false; + constructor(options?: Partial) { + this.options = Object.assign(Object.create(null), defaultOptions, options); + } + + setToken(token: string) { + this.token = token; + this.persistToken(); + } + + async restorePersistedToken() { + if (this.authed) return Promise.resolve(); + const key = circleCIApiRef.id; + const persistedToken = sessionStorage.getItem(key); + if (persistedToken) { + this.token = persistedToken; + return Promise.resolve(); + } + return Promise.reject(); + } + + async persistToken() { + if (this.authed) return; + const key = circleCIApiRef.id; + sessionStorage.setItem(key, this.token); + } + + async validateToken() { + if (!this.token || this.token === '') { + return Promise.reject('Wrong token'); + } + + // TODO: switch towards using personal token + await this.api.builds(); + this.authed = true; + return Promise.resolve(); + } + + private get api() { + return new CircleCI({ ...this.options, token: this.token }); + } + + async getBuilds() { + return this.api.builds(); + } + + async getUser() { + return this.api.me(); + } +} diff --git a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx index 50ca39b3a6..6e27d3e51e 100644 --- a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx +++ b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx @@ -74,18 +74,27 @@ const transform = (buildsData: BuildSummary[]): CITableBuildInfo[] => { }; export const CircleCIFetch: FC<{}> = () => { + const [authed, setAuthed] = React.useState(false); const [builds, setBuilds] = React.useState([]); const api = useApi(circleCIApiRef); React.useEffect(() => { - const intervalId = setInterval(() => { - if (!api.api) return; + const intervalId = setInterval(async () => { + if (!authed) { + await api.restorePersistedToken(); + await api + .validateToken() + .then(() => { + setAuthed(true); + }) + .catch(() => setAuthed(false)); + } api.getBuilds().then(setBuilds); }, 1500); return () => clearInterval(intervalId); - }, []); + }, [authed]); - if (!api.api) return
Not authenticated
; + if (!authed) return
Not authenticated
; const transformedBuilds = transform(builds || []); return ; }; diff --git a/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx b/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx index 23ac5c0d7d..a37d5e633d 100644 --- a/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx +++ b/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx @@ -15,7 +15,7 @@ */ import React, { FC } from 'react'; -import { Grid } from '@material-ui/core'; +import { Grid, Button } from '@material-ui/core'; import { InfoCard, Header, @@ -27,7 +27,6 @@ import { SupportButton, } from '@backstage/core'; import { CircleCIFetch } from '../CircleCIFetch'; -import { LoginCard } from '../LoginCard'; export const CircleCIPage: FC<{}> = () => { return ( @@ -37,15 +36,13 @@ export const CircleCIPage: FC<{}> = () => {
- + + A description of your plugin goes here. - - - - + diff --git a/plugins/circleci/src/components/LoginCard/LoginCard.tsx b/plugins/circleci/src/components/LoginCard/LoginCard.tsx deleted file mode 100644 index 806f218cf9..0000000000 --- a/plugins/circleci/src/components/LoginCard/LoginCard.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import React from 'react'; -import { - Typography, - Button, - TextField, - List, - ListItem, -} from '@material-ui/core'; -import { Person as PersonIcon } from '@material-ui/icons'; -import { InfoCard, useApi } from '@backstage/core'; -import { circleCIApiRef } from 'api'; - -const useSessionStorage = (key: string): [string, (value: string) => void] => { - const [value, setter] = React.useState(sessionStorage.getItem(key) ?? ''); - const setValue = (newValue: string) => { - sessionStorage.setItem(key, newValue); - setter(sessionStorage.getItem(key) ?? ''); - }; - - React.useEffect(() => { - const storageChangeHandle = (e: StorageEvent) => { - if (e.storageArea !== sessionStorage) return; - if (e.key !== key) return; - if (e.newValue !== e.oldValue) { - setter(e.newValue ?? ''); - } - }; - window.addEventListener('storage', storageChangeHandle); - return () => window.removeEventListener('storage', storageChangeHandle); - }, [key, setter]); - - return [value, setValue]; -}; -export const LoginCard = () => { - const [token, setToken] = useSessionStorage(circleCIApiRef.id); - const api = useApi(circleCIApiRef); - - React.useEffect(() => { - if (token && token !== '') { - api.authenticate(token); - } - }, []); - return ( - - - CircleCI Auth - - - - setToken(e.target.value)} - /> - - - - - - - - ); -}; diff --git a/plugins/circleci/src/components/LoginCard/index.ts b/plugins/circleci/src/components/LoginCard/index.ts deleted file mode 100644 index 1d3c3bcf3e..0000000000 --- a/plugins/circleci/src/components/LoginCard/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './LoginCard'; diff --git a/plugins/circleci/src/components/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/components/SettingsPage/SettingsPage.tsx new file mode 100644 index 0000000000..5b4487bb32 --- /dev/null +++ b/plugins/circleci/src/components/SettingsPage/SettingsPage.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import { Button, TextField, List, Grid, ListItem } from '@material-ui/core'; +import { circleCIApiRef } from 'api'; +import { + InfoCard, + useApi, + Header, + Page, + pageTheme, + Content, + ContentHeader, + HeaderLabel, + SupportButton, +} from '@backstage/core'; + +export const SettingsPage = () => { + const [authed, setAuthed] = React.useState(false); + const [token, setToken] = React.useState(''); + const api = useApi(circleCIApiRef); + + React.useEffect(() => { + api + .restorePersistedToken() + .then(() => api.validateToken()) + .then(() => setAuthed(true)) + .catch(() => setAuthed(false)); + }, []); + + return ( + +
+ + +
+ + + + A description of your plugin goes here. + + + + + + {authed ? ( + <>Already authed + ) : ( + <> + + setToken(e.target.value)} + /> + + + + + + + )} + + + + + +
+ ); +}; diff --git a/plugins/circleci/src/components/SettingsPage/index.ts b/plugins/circleci/src/components/SettingsPage/index.ts new file mode 100644 index 0000000000..f533f5abe0 --- /dev/null +++ b/plugins/circleci/src/components/SettingsPage/index.ts @@ -0,0 +1 @@ +export * from './SettingsPage'; diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index 5c1eca9be3..458a7f27bc 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -15,10 +15,12 @@ */ import { createPlugin } from '@backstage/core'; import { CircleCIPage } from './components/CircleCIPage'; +import { SettingsPage } from './components/SettingsPage'; export const plugin = createPlugin({ id: 'circleci', register({ router }) { router.registerRoute('/circleci', CircleCIPage); + router.registerRoute('/circleci/settings', SettingsPage); }, }); From 31d05b1f922ce0b7ea0fe03b40a96a8ca1e8b75b Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 4 May 2020 20:58:39 +0200 Subject: [PATCH 10/90] feat: circleCI backend proxy --- packages/app/package.json | 1 + packages/app/src/plugins.ts | 1 + packages/backend/package.json | 1 + packages/backend/src/index.ts | 2 ++ plugins/circleci-backend/.eslintrc.js | 3 +++ plugins/circleci-backend/README.md | 6 ++++++ plugins/circleci-backend/package.json | 23 ++++++++++++++++++++++ plugins/circleci-backend/src/index.ts | 27 ++++++++++++++++++++++++++ plugins/circleci-backend/tsconfig.json | 15 ++++++++++++++ plugins/circleci/src/api/index.ts | 11 +++++------ yarn.lock | 15 ++++++++++++-- 11 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 plugins/circleci-backend/.eslintrc.js create mode 100644 plugins/circleci-backend/README.md create mode 100644 plugins/circleci-backend/package.json create mode 100644 plugins/circleci-backend/src/index.ts create mode 100644 plugins/circleci-backend/tsconfig.json diff --git a/packages/app/package.json b/packages/app/package.json index da1d02a5be..e88bd46a54 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -21,6 +21,7 @@ "@backstage/cli": "^0.1.1-alpha.4", "@backstage/core": "^0.1.1-alpha.4", "@backstage/plugin-circleci": "^0.1.1-alpha.4", + "@backstage/plugin-circleci-backend": "^0.1.1-alpha.4", "@backstage/plugin-home-page": "^0.1.1-alpha.4", "@backstage/plugin-inventory": "^0.1.1-alpha.4", "@backstage/plugin-lighthouse": "^0.1.1-alpha.4", diff --git a/packages/app/src/plugins.ts b/packages/app/src/plugins.ts index 31546c6ba6..b46bf2ace8 100644 --- a/packages/app/src/plugins.ts +++ b/packages/app/src/plugins.ts @@ -19,3 +19,4 @@ export { plugin as LighthousePlugin } from '@backstage/plugin-lighthouse'; export { plugin as InventoryPlugin } from '@backstage/plugin-inventory'; export { plugin as TechRadar } from '@backstage/plugin-tech-radar'; export { plugin as Circleci } from '@backstage/plugin-circleci'; +// export { plugin as CircleciBackend } from '@backstage/plugin-circleci-backend'; diff --git a/packages/backend/package.json b/packages/backend/package.json index 0530f04452..13d64a0a13 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -16,6 +16,7 @@ }, "dependencies": { "@backstage/plugin-inventory-backend": "0.1.1-alpha.4", + "@backstage/plugin-circleci-backend": "0.1.1-alpha.4", "compression": "^1.7.4", "cors": "^2.8.5", "express": "^4.17.1", diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index fd8015c328..da1a4f3dc3 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -28,6 +28,7 @@ import helmet from 'helmet'; import compression from 'compression'; import { testRouter } from './test'; import { router as inventoryRouter } from '@backstage/plugin-inventory-backend'; +import { router as circleCIRouter } from '@backstage/plugin-circleci-backend'; const DEFAULT_PORT = 7000; @@ -40,6 +41,7 @@ app.use(compression()); app.use(express.json()); app.use('/test', testRouter); app.use('/inventory', inventoryRouter); +app.use('/circleci', circleCIRouter); app.listen(PORT, () => { console.log(`Listening on port ${PORT}`); diff --git a/plugins/circleci-backend/.eslintrc.js b/plugins/circleci-backend/.eslintrc.js new file mode 100644 index 0000000000..13573efa9c --- /dev/null +++ b/plugins/circleci-backend/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: [require.resolve('@backstage/cli/config/eslint')], +}; diff --git a/plugins/circleci-backend/README.md b/plugins/circleci-backend/README.md new file mode 100644 index 0000000000..91e60e3e6b --- /dev/null +++ b/plugins/circleci-backend/README.md @@ -0,0 +1,6 @@ +# Title +Welcome to the circleci-backend plugin! + +## Sub-section 1 + +## Sub-section 2 diff --git a/plugins/circleci-backend/package.json b/plugins/circleci-backend/package.json new file mode 100644 index 0000000000..6535deba10 --- /dev/null +++ b/plugins/circleci-backend/package.json @@ -0,0 +1,23 @@ +{ + "name": "@backstage/plugin-circleci-backend", + "version": "0.1.1-alpha.4", + "main": "dist", + "license": "Apache-2.0", + "private": true, + "scripts": { + "build": "tsc", + "lint": "backstage-cli lint", + "test": "backstage-cli test", + "clean": "backstage-cli clean" + }, + "devDependencies": { + "@backstage/cli": "^0.1.1-alpha.4" + }, + "dependencies": { + "express": "^4.17.1", + "http-proxy-middleware": "^1.0.3" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/circleci-backend/src/index.ts b/plugins/circleci-backend/src/index.ts new file mode 100644 index 0000000000..45bf47b884 --- /dev/null +++ b/plugins/circleci-backend/src/index.ts @@ -0,0 +1,27 @@ +/* + * 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 httpProxy from 'http-proxy'; + +// Simple proxy for handling CORS for now +const proxy = httpProxy.createServer({ + target: 'https://circleci.com/api/v1.1', + changeOrigin: true, +}); +proxy.on('error', e => console.error(e)); +export const router = express(); +router.use('/api', (req, res) => proxy.web(req, res)); diff --git a/plugins/circleci-backend/tsconfig.json b/plugins/circleci-backend/tsconfig.json new file mode 100644 index 0000000000..b463ac102f --- /dev/null +++ b/plugins/circleci-backend/tsconfig.json @@ -0,0 +1,15 @@ +{ + "include": ["src"], + "compilerOptions": { + "baseUrl": "src", + "outDir": "dist", + "incremental": true, + "sourceMap": true, + "declaration": true, + "strict": true, + "target": "es5", + "module": "commonjs", + "esModuleInterop": true, + "types": ["node", "jest"] + } +} diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index 70068f29ba..d42023c657 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -18,6 +18,7 @@ import { CircleCI, GitType, CircleCIOptions } from 'circleci-api'; import { ApiRef } from '@backstage/core'; const defaultOptions: Partial = { + circleHost: 'http://backstage.localhost:7000/circleci/api', vcs: { type: GitType.GITHUB, owner: 'CircleCITest3', @@ -59,10 +60,10 @@ export class CircleCIApi { const persistedToken = sessionStorage.getItem(key); let persistedVCSOptions: {} | undefined; try { - persistedVCSOptions = JSON.parse(sessionStorage.getItem(key + '_options') as string); - } catch(e) { - - } + persistedVCSOptions = JSON.parse( + sessionStorage.getItem(key + '_options') as string, + ); + } catch (e) {} if (persistedToken && persistedVCSOptions) { this.token = persistedToken; this.options.vcs = persistedVCSOptions; @@ -71,8 +72,6 @@ export class CircleCIApi { return Promise.reject(); } - - async persistToken() { if (this.authed) return; const key = circleCIApiRef.id; diff --git a/yarn.lock b/yarn.lock index cd2016d0d0..b3b8467ce5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4003,7 +4003,7 @@ "@types/http-proxy" "*" "@types/node" "*" -"@types/http-proxy@*": +"@types/http-proxy@*", "@types/http-proxy@^1.17.3": version "1.17.4" resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz#e7c92e3dbe3e13aa799440ff42e6d3a17a9d045b" integrity sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q== @@ -10759,7 +10759,18 @@ http-proxy-middleware@0.19.1: lodash "^4.17.11" micromatch "^3.1.10" -http-proxy@^1.17.0: +http-proxy-middleware@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.0.3.tgz#f73daad8dac622d51fe1769960c914b9b1f75a72" + integrity sha512-GHvPeBD+A357zS5tHjzj6ISrVOjjCiy0I92bdyTJz0pNmIjFxO0NX/bX+xkGgnclKQE/5hHAB9JEQ7u9Pw4olg== + dependencies: + "@types/http-proxy" "^1.17.3" + http-proxy "^1.18.0" + is-glob "^4.0.1" + lodash "^4.17.15" + micromatch "^4.0.2" + +http-proxy@^1.17.0, http-proxy@^1.18.0: version "1.18.0" resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== From f028801f39602cb82eed6ea8ca67b50e2ca1a5de Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 4 May 2020 21:41:38 +0200 Subject: [PATCH 11/90] feat: retry --- plugins/circleci/src/api/index.ts | 4 ++ .../src/components/CITable/CITable.tsx | 37 +++++++++++++++++-- .../components/CircleCIFetch/CirleCIFetch.tsx | 22 +++++++---- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index d42023c657..93916f82bb 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -93,6 +93,10 @@ export class CircleCIApi { return new CircleCI({ ...this.options, token: this.token }); } + async retry(buildId: string) { + return this.api.retry(Number(buildId)); + } + async getBuilds() { return this.api.builds(); } diff --git a/plugins/circleci/src/components/CITable/CITable.tsx b/plugins/circleci/src/components/CITable/CITable.tsx index a6b607a216..0e867f8b2c 100644 --- a/plugins/circleci/src/components/CITable/CITable.tsx +++ b/plugins/circleci/src/components/CITable/CITable.tsx @@ -7,6 +7,15 @@ import TableCell from '@material-ui/core/TableCell'; import TableContainer from '@material-ui/core/TableContainer'; import TableHead from '@material-ui/core/TableHead'; import TableRow from '@material-ui/core/TableRow'; +import Button from '@material-ui/core/Button'; +import { + StatusRunning, + StatusFailed, + StatusOK, + StatusPending, + StatusNA, +} from '@backstage/core'; + const useStyles = makeStyles({ table: { minWidth: 650, @@ -36,7 +45,25 @@ export type CITableBuildInfo = { failed: number; testUrl: string; //fixme better name }; - onRetriggerClick: () => void; + onRetryClick: () => void; +}; + +// :retried, :canceled, :infrastructure_fail, :timedout, :not_run, :running, :failed, :queued, :scheduled, :not_running, :no_tests, :fixed, :success +const getStatusComponent = (status: string) => { + switch (status.toLowerCase()) { + case 'queued': + case 'scheduled': + return ; + case 'running': + return ; + case 'failed': + return ; + case 'success': + return ; + case 'canceled': + default: + return ; + } }; export const CITable: FC<{ @@ -54,7 +81,7 @@ export const CITable: FC<{ Source Status Tests - Retrigger + Actions @@ -68,7 +95,7 @@ export const CITable: FC<{
{build.source.commit.hash}
- {build.status} + {getStatusComponent(build.status)} {build.tests && ( <> @@ -78,7 +105,9 @@ export const CITable: FC<{ )} - Retrigger + + +
))}
diff --git a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx index 71d0e0c29b..226b995a72 100644 --- a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx +++ b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx @@ -47,12 +47,15 @@ const makeReadableStatus = (status: string | undefined) => { } as Record)[status]; }; -const transform = (buildsData: BuildSummary[]): CITableBuildInfo[] => { +const transform = ( + buildsData: BuildSummary[], + api: typeof circleCIApiRef.T, +): CITableBuildInfo[] => { return buildsData.map(buildData => { const tableBuildInfo: CITableBuildInfo = { id: String(buildData.build_num), buildName: buildData.subject ? String(buildData.subject) : '', - onRetriggerClick: () => null, + onRetryClick: () => api.retry(String(buildData.build_num)), source: { branchName: String(buildData.branch), commit: { @@ -73,7 +76,6 @@ const transform = (buildsData: BuildSummary[]): CITableBuildInfo[] => { }); }; - export const CircleCIFetch: FC<{}> = () => { const [authed, setAuthed] = React.useState(false); const [builds, setBuilds] = React.useState([]); @@ -96,8 +98,14 @@ export const CircleCIFetch: FC<{}> = () => { }, [authed]); if (!authed) return
Not authenticated
; - const transformedBuilds = transform(builds || []); - return <> - - {!api.authed ?
Not authenticated
: }; + const transformedBuilds = transform(builds || [], api); + return ( + <> + {!api.authed ? ( +
Not authenticated
+ ) : ( + + )} + + ); }; From 08a3033942a6d3516305333b5d9166e377ac3330 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 4 May 2020 22:42:48 +0200 Subject: [PATCH 12/90] feat: react-router links, some ui edits --- plugins/circleci/package.json | 1 + .../src/components/CITable/CITable.tsx | 54 +++++++++++++------ .../components/CircleCIFetch/CirleCIFetch.tsx | 6 ++- .../components/CircleCIPage/CircleCIPage.tsx | 52 +++++++++++------- .../components/SettingsPage/SettingsPage.tsx | 13 ++--- plugins/circleci/src/plugin.ts | 4 +- 6 files changed, 84 insertions(+), 46 deletions(-) diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 80603f4029..73b10d4fa5 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -30,6 +30,7 @@ "circleci-api": "^4.0.0", "react": "16.13.1", "react-dom": "16.13.1", + "react-router": "^5.1.2", "react-use": "^13.0.0" }, "files": [ diff --git a/plugins/circleci/src/components/CITable/CITable.tsx b/plugins/circleci/src/components/CITable/CITable.tsx index 0e867f8b2c..882f52fbe0 100644 --- a/plugins/circleci/src/components/CITable/CITable.tsx +++ b/plugins/circleci/src/components/CITable/CITable.tsx @@ -1,15 +1,22 @@ // Idea for this component to be somehow reusable representation of CI table view import React, { FC } from 'react'; import { makeStyles } from '@material-ui/core/styles'; -import Table from '@material-ui/core/Table'; -import TableBody from '@material-ui/core/TableBody'; -import TableCell from '@material-ui/core/TableCell'; -import TableContainer from '@material-ui/core/TableContainer'; -import TableHead from '@material-ui/core/TableHead'; -import TableRow from '@material-ui/core/TableRow'; -import Button from '@material-ui/core/Button'; import { - StatusRunning, + Button, + Table, + TableBody, + TableCell, + TableHead, + TableContainer, + TableRow, + Link, + CircularProgress, + List, + ListItem, + ListItemText, +} from '@material-ui/core'; +import { Replay as RetryIcon } from '@material-ui/icons'; +import { StatusFailed, StatusOK, StatusPending, @@ -30,6 +37,7 @@ const useStyles = makeStyles({ export type CITableBuildInfo = { id: string; buildName: string; + buildUrl?: string; source: { branchName: string; commit: { @@ -55,7 +63,7 @@ const getStatusComponent = (status: string) => { case 'scheduled': return ; case 'running': - return ; + return ; case 'failed': return ; case 'success': @@ -79,7 +87,7 @@ export const CITable: FC<{ ID Build Source - Status + Status Tests Actions
@@ -88,14 +96,24 @@ export const CITable: FC<{ {builds.map(build => ( {build.id} - {build.buildName} -
-
{build.source.branchName}
-
{build.source.commit.hash}
-
+ + {build.buildName} + +
+ + + + + + + + + + + + {getStatusComponent(build.status)} - {getStatusComponent(build.status)} {build.tests && ( <> @@ -106,7 +124,9 @@ export const CITable: FC<{ )} - +
))} diff --git a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx index 226b995a72..59c667182f 100644 --- a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx +++ b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx @@ -54,7 +54,10 @@ const transform = ( return buildsData.map(buildData => { const tableBuildInfo: CITableBuildInfo = { id: String(buildData.build_num), - buildName: buildData.subject ? String(buildData.subject) : '', + buildName: buildData.subject + ? buildData.subject + + (buildData.retry_of ? ` (retry of #${buildData.retry_of})` : '') + : '', onRetryClick: () => api.retry(String(buildData.build_num)), source: { branchName: String(buildData.branch), @@ -64,6 +67,7 @@ const transform = ( }, }, status: makeReadableStatus(buildData.status), + buildUrl: buildData.build_url, tests: { failed: 0, passed: 10, diff --git a/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx b/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx index a37d5e633d..32812b1ade 100644 --- a/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx +++ b/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx @@ -15,7 +15,10 @@ */ import React, { FC } from 'react'; +import { Route } from 'react-router'; +import { Link as RouterLink } from 'react-router-dom'; import { Grid, Button } from '@material-ui/core'; +import { Settings as SettingsIcon } from '@material-ui/icons'; import { InfoCard, Header, @@ -27,28 +30,39 @@ import { SupportButton, } from '@backstage/core'; import { CircleCIFetch } from '../CircleCIFetch'; - +import { SettingsPage } from '../SettingsPage'; export const CircleCIPage: FC<{}> = () => { return ( - -
- - -
- - - - A description of your plugin goes here. - - - - - - + <> + + +
+ + +
+ + + + + A description of your plugin goes here. + + + + + + + + -
-
-
+ + + ); }; diff --git a/plugins/circleci/src/components/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/components/SettingsPage/SettingsPage.tsx index ea3c8fb3a6..4c377f090c 100644 --- a/plugins/circleci/src/components/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/components/SettingsPage/SettingsPage.tsx @@ -13,12 +13,12 @@ import { SupportButton, } from '@backstage/core'; import { ProjectInput } from 'components/ProjectInput/ProjectInput'; +import { Link as RouterLink } from 'react-router-dom'; export const SettingsPage = () => { - const [authed, setAuthed] = React.useState(false); - const [token, setToken] = React.useState(''); - const api = useApi(circleCIApiRef); + const [authed, setAuthed] = React.useState(api.authed); + const [token, setToken] = React.useState(''); React.useEffect(() => { api @@ -36,7 +36,9 @@ export const SettingsPage = () => { - + A description of your plugin goes here. @@ -77,8 +79,7 @@ export const SettingsPage = () => { )} - - api.setVCSOptions(info)}/> + api.setVCSOptions(info)} /> diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index 458a7f27bc..05d3710d40 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -15,12 +15,10 @@ */ import { createPlugin } from '@backstage/core'; import { CircleCIPage } from './components/CircleCIPage'; -import { SettingsPage } from './components/SettingsPage'; export const plugin = createPlugin({ id: 'circleci', register({ router }) { - router.registerRoute('/circleci', CircleCIPage); - router.registerRoute('/circleci/settings', SettingsPage); + router.registerRoute('/circleci', CircleCIPage, { exact: false }); }, }); From 21ac45698a8804ce5b74857c22090097f1845699 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 4 May 2020 23:10:14 +0200 Subject: [PATCH 13/90] feat: visual adjustments --- plugins/circleci/src/api/index.ts | 4 +- .../src/components/CITable/CITable.tsx | 42 ++++++++----------- .../components/CircleCIFetch/CirleCIFetch.tsx | 14 +++---- .../components/ProjectInput/ProjectInput.tsx | 26 +++++++----- .../components/SettingsPage/SettingsPage.tsx | 13 ++++-- 5 files changed, 53 insertions(+), 46 deletions(-) diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index 93916f82bb..955daf3fba 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -31,8 +31,8 @@ export const circleCIApiRef = new ApiRef({ }); export class CircleCIApi { - token: string = ''; - private options: Partial; + private token: string = ''; + options: Partial; authed: boolean = false; constructor(options?: Partial) { diff --git a/plugins/circleci/src/components/CITable/CITable.tsx b/plugins/circleci/src/components/CITable/CITable.tsx index 882f52fbe0..5efb0edb9f 100644 --- a/plugins/circleci/src/components/CITable/CITable.tsx +++ b/plugins/circleci/src/components/CITable/CITable.tsx @@ -11,9 +11,6 @@ import { TableRow, Link, CircularProgress, - List, - ListItem, - ListItemText, } from '@material-ui/core'; import { Replay as RetryIcon } from '@material-ui/icons'; import { @@ -78,7 +75,7 @@ export const CITable: FC<{ builds: CITableBuildInfo[]; }> = ({ builds }) => { const classes = useStyles(); - + const isTestDataAvailable = builds.some(build => build.tests); return (
@@ -88,8 +85,8 @@ export const CITable: FC<{ BuildSourceStatus - Tests - Actions + {isTestDataAvailable && Tests} + Actions @@ -102,28 +99,25 @@ export const CITable: FC<{ - - - - - - - - + {build.source.branchName} +
+ {build.source.commit.hash}
{getStatusComponent(build.status)} - - {build.tests && ( - <> - {build.tests.passed}/{build.tests.total} ( - {build.tests.failed ? build.tests.failed + ', ' : ''} - {build.tests.skipped ? build.tests.skipped : ''}) - - )} - - + {build.tests && ( + + { + <> + {build.tests.passed}/{build.tests.total} ( + {build.tests.failed ? build.tests.failed + ', ' : ''} + {build.tests.skipped ? build.tests.skipped : ''}) + + } + + )} + diff --git a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx index 59c667182f..92d4ca5ce2 100644 --- a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx +++ b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx @@ -68,13 +68,13 @@ const transform = ( }, status: makeReadableStatus(buildData.status), buildUrl: buildData.build_url, - tests: { - failed: 0, - passed: 10, - skipped: 3, - testUrl: 'nourlnow', - total: 13, - }, + // tests: { + // failed: 0, + // passed: 10, + // skipped: 3, + // testUrl: 'nourlnow', + // total: 13, + // }, }; return tableBuildInfo; }); diff --git a/plugins/circleci/src/components/ProjectInput/ProjectInput.tsx b/plugins/circleci/src/components/ProjectInput/ProjectInput.tsx index 79ca532f70..046cd171b9 100644 --- a/plugins/circleci/src/components/ProjectInput/ProjectInput.tsx +++ b/plugins/circleci/src/components/ProjectInput/ProjectInput.tsx @@ -1,14 +1,20 @@ -import { useState, FC } from "react"; -import { List, ListItem, TextField, Button } from "@material-ui/core"; -import React from "react"; +import { useState, FC, useEffect } from 'react'; +import { List, ListItem, TextField, Button } from '@material-ui/core'; +import React from 'react'; -export const ProjectInput:FC<{ - setGitInfo: (info: {owner: string, repo: string}) => void - }> = ({setGitInfo}) => { - +export const ProjectInput: FC<{ + setGitInfo: (info: { owner: string; repo: string }) => void; + apiGitInfo?: { owner?: string; repo?: string }; +}> = ({ setGitInfo, apiGitInfo = {} }) => { const [owner, setOwner] = useState(''); const [repo, setRepo] = useState(''); - + + useEffect(() => { + if (apiGitInfo.owner !== owner && apiGitInfo.owner) + setOwner(apiGitInfo.owner); + if (apiGitInfo.repo !== repo && apiGitInfo.repo) setRepo(apiGitInfo.repo); + }, [apiGitInfo]); + return ( @@ -34,9 +40,9 @@ export const ProjectInput:FC<{ color="primary" onClick={() => setGitInfo({ owner, repo })} > - Load + Save ); -}; \ No newline at end of file +}; diff --git a/plugins/circleci/src/components/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/components/SettingsPage/SettingsPage.tsx index 4c377f090c..8a0ba78118 100644 --- a/plugins/circleci/src/components/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/components/SettingsPage/SettingsPage.tsx @@ -41,8 +41,8 @@ export const SettingsPage = () => { A description of your plugin goes here. - - + + {authed ? ( @@ -79,7 +79,14 @@ export const SettingsPage = () => { )} - api.setVCSOptions(info)} /> + + + + api.setVCSOptions(info)} + /> + From 7bda356234cc4d7dd8fbc271a77dffa47fd45a6f Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 4 May 2020 23:11:59 +0200 Subject: [PATCH 14/90] feat: start:backend package.json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 03c9b411fe..beddf9cab8 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ }, "scripts": { "start": "yarn workspace example-app start", + "start:backend": "yarn workspace example-backend start", "bundle": "yarn build && yarn workspace example-app bundle", "build": "lerna run build", "clean": "lerna run clean", From 9e7bc707280740d5c78aefcb10b9685bafc68fa6 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Tue, 5 May 2020 11:23:37 +0200 Subject: [PATCH 15/90] Restructure pages --- .../src/pages/BuildsPage/BuildsPage.tsx | 33 ++++++++++++++++++ .../circleci/src/pages/BuildsPage/index.ts | 1 + .../CircleCIPage/CircleCIPage.tsx | 34 +++---------------- .../CircleCIPage/index.ts | 0 .../SettingsPage/SettingsPage.tsx | 8 +---- .../SettingsPage/index.ts | 0 plugins/circleci/src/plugin.ts | 3 +- 7 files changed, 40 insertions(+), 39 deletions(-) create mode 100644 plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx create mode 100644 plugins/circleci/src/pages/BuildsPage/index.ts rename plugins/circleci/src/{components => pages}/CircleCIPage/CircleCIPage.tsx (54%) rename plugins/circleci/src/{components => pages}/CircleCIPage/index.ts (100%) rename plugins/circleci/src/{components => pages}/SettingsPage/SettingsPage.tsx (91%) rename plugins/circleci/src/{components => pages}/SettingsPage/index.ts (100%) diff --git a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx new file mode 100644 index 0000000000..cb8b3500ef --- /dev/null +++ b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx @@ -0,0 +1,33 @@ +import React, { FC } from 'react'; +import { Link as RouterLink } from 'react-router-dom'; +import { + Content, + ContentHeader, + SupportButton, + InfoCard, +} from '@backstage/core'; +import { Button, Grid } from '@material-ui/core'; +import { CircleCIFetch } from 'components/CircleCIFetch'; +import { Settings as SettingsIcon } from '@material-ui/icons'; + +export const BuildsPage: FC<{}> = () => ( + + + + A description of your plugin goes here. + + + + + + + + + +); diff --git a/plugins/circleci/src/pages/BuildsPage/index.ts b/plugins/circleci/src/pages/BuildsPage/index.ts new file mode 100644 index 0000000000..94086cd569 --- /dev/null +++ b/plugins/circleci/src/pages/BuildsPage/index.ts @@ -0,0 +1 @@ +export * from './BuildsPage'; diff --git a/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx b/plugins/circleci/src/pages/CircleCIPage/CircleCIPage.tsx similarity index 54% rename from plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx rename to plugins/circleci/src/pages/CircleCIPage/CircleCIPage.tsx index 32812b1ade..e648c20b3a 100644 --- a/plugins/circleci/src/components/CircleCIPage/CircleCIPage.tsx +++ b/plugins/circleci/src/pages/CircleCIPage/CircleCIPage.tsx @@ -16,51 +16,25 @@ import React, { FC } from 'react'; import { Route } from 'react-router'; -import { Link as RouterLink } from 'react-router-dom'; -import { Grid, Button } from '@material-ui/core'; -import { Settings as SettingsIcon } from '@material-ui/icons'; import { - InfoCard, Header, Page, pageTheme, - Content, - ContentHeader, HeaderLabel, - SupportButton, } from '@backstage/core'; -import { CircleCIFetch } from '../CircleCIFetch'; import { SettingsPage } from '../SettingsPage'; +import { BuildsPage } from '../BuildsPage/BuildsPage'; export const CircleCIPage: FC<{}> = () => { return ( <> -
- - - - - A description of your plugin goes here. - - - - - - - - - - + + +
); diff --git a/plugins/circleci/src/components/CircleCIPage/index.ts b/plugins/circleci/src/pages/CircleCIPage/index.ts similarity index 100% rename from plugins/circleci/src/components/CircleCIPage/index.ts rename to plugins/circleci/src/pages/CircleCIPage/index.ts diff --git a/plugins/circleci/src/components/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx similarity index 91% rename from plugins/circleci/src/components/SettingsPage/SettingsPage.tsx rename to plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 8a0ba78118..95e2c86662 100644 --- a/plugins/circleci/src/components/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -4,12 +4,10 @@ import { circleCIApiRef } from 'api'; import { InfoCard, useApi, - Header, Page, pageTheme, Content, ContentHeader, - HeaderLabel, SupportButton, } from '@backstage/core'; import { ProjectInput } from 'components/ProjectInput/ProjectInput'; @@ -30,10 +28,6 @@ export const SettingsPage = () => { return ( -
- - -
A description of your plugin goes here. - + diff --git a/plugins/circleci/src/components/SettingsPage/index.ts b/plugins/circleci/src/pages/SettingsPage/index.ts similarity index 100% rename from plugins/circleci/src/components/SettingsPage/index.ts rename to plugins/circleci/src/pages/SettingsPage/index.ts diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index 05d3710d40..c05feb2059 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -14,8 +14,7 @@ * limitations under the License. */ import { createPlugin } from '@backstage/core'; -import { CircleCIPage } from './components/CircleCIPage'; - +import { CircleCIPage } from './pages/CircleCIPage'; export const plugin = createPlugin({ id: 'circleci', register({ router }) { From 20ef06f6f30d9c3e549e497ffe08b2eb41a2cfa8 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Tue, 5 May 2020 12:46:43 +0200 Subject: [PATCH 16/90] Add detailed view page with a list of build steps --- plugins/circleci/src/api/index.ts | 4 ++ .../src/components/CITable/CITable.tsx | 4 +- .../src/pages/CircleCIPage/CircleCIPage.tsx | 7 +-- .../DetailedViewPage/DetailedViewPage.tsx | 51 +++++++++++++++++++ 4 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index 955daf3fba..362657326e 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -104,4 +104,8 @@ export class CircleCIApi { async getUser() { return this.api.me(); } + + async getBuild(buildId: string) { + return this.api.build(parseInt(buildId, 10)); + } } diff --git a/plugins/circleci/src/components/CITable/CITable.tsx b/plugins/circleci/src/components/CITable/CITable.tsx index 5efb0edb9f..465fae24e0 100644 --- a/plugins/circleci/src/components/CITable/CITable.tsx +++ b/plugins/circleci/src/components/CITable/CITable.tsx @@ -9,10 +9,10 @@ import { TableHead, TableContainer, TableRow, - Link, CircularProgress, } from '@material-ui/core'; import { Replay as RetryIcon } from '@material-ui/icons'; +import { Link } from 'react-router-dom'; import { StatusFailed, StatusOK, @@ -94,7 +94,7 @@ export const CITable: FC<{ {build.id} - + {build.buildName} diff --git a/plugins/circleci/src/pages/CircleCIPage/CircleCIPage.tsx b/plugins/circleci/src/pages/CircleCIPage/CircleCIPage.tsx index e648c20b3a..fe0ef0f1ce 100644 --- a/plugins/circleci/src/pages/CircleCIPage/CircleCIPage.tsx +++ b/plugins/circleci/src/pages/CircleCIPage/CircleCIPage.tsx @@ -23,7 +23,8 @@ import { HeaderLabel, } from '@backstage/core'; import { SettingsPage } from '../SettingsPage'; -import { BuildsPage } from '../BuildsPage/BuildsPage'; +import { BuildsPage } from '../BuildsPage'; +import { DetailedViewPage } from '../DetailedViewPage'; export const CircleCIPage: FC<{}> = () => { return ( <> @@ -33,8 +34,8 @@ export const CircleCIPage: FC<{}> = () => { - - + +
); diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx new file mode 100644 index 0000000000..e7441b979a --- /dev/null +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -0,0 +1,51 @@ +import React, { FC } from 'react'; +import { Content, InfoCard, useApi } from '@backstage/core'; +import { Grid, List, ListItem } from '@material-ui/core'; +import { PluginHeader } from 'components/PluginHeader'; +import { BuildWithSteps, BuildStep } from 'circleci-api'; +import { circleCIApiRef } from 'api'; +// import { LazyLog } from 'react-lazylog'; +import { useParams } from 'react-router-dom'; + +export const DetailedViewPage: FC<{}> = () => { + let { buildId = '' } = useParams(); + + console.log(useParams()); + + const [authed, setAuthed] = React.useState(false); + + //@ts-ignore + const [build, setBuild] = React.useState({}); + const api = useApi(circleCIApiRef); + + React.useEffect(() => { + const getBuildAsync = async () => { + if (!authed) { + await api.restorePersistedSettings(); + await api + .validateToken() + .then(() => { + setAuthed(true); + }) + .catch(() => setAuthed(false)); + } + api.getBuild(buildId).then(setBuild); + }; + getBuildAsync(); + }, [authed, buildId]); + + return ( + + + + + + + {build.steps && build.steps.map(({name}: {name: string}) => ({name}))} + + + + + + ); +}; From 950830571e21fd0ae49e9816e6027e18ce0d0985 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Tue, 5 May 2020 16:44:39 +0200 Subject: [PATCH 17/90] Add ugly log visualization --- plugins/circleci/src/api/index.ts | 1 + .../components/ActionOutput/ActionOutput.tsx | 14 +++++ .../src/components/ActionOutput/index.ts | 1 + .../components/PluginHeader/PluginHeader.tsx | 18 +++++++ .../src/components/PluginHeader/index.ts | 1 + .../DetailedViewPage/DetailedViewPage.tsx | 54 +++++++++++++------ .../src/pages/DetailedViewPage/index.ts | 1 + 7 files changed, 74 insertions(+), 16 deletions(-) create mode 100644 plugins/circleci/src/components/ActionOutput/ActionOutput.tsx create mode 100644 plugins/circleci/src/components/ActionOutput/index.ts create mode 100644 plugins/circleci/src/components/PluginHeader/PluginHeader.tsx create mode 100644 plugins/circleci/src/components/PluginHeader/index.ts create mode 100644 plugins/circleci/src/pages/DetailedViewPage/index.ts diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index 362657326e..7ce157057b 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -31,6 +31,7 @@ export const circleCIApiRef = new ApiRef({ }); export class CircleCIApi { + private token: string = ''; options: Partial; diff --git a/plugins/circleci/src/components/ActionOutput/ActionOutput.tsx b/plugins/circleci/src/components/ActionOutput/ActionOutput.tsx new file mode 100644 index 0000000000..79f8954a73 --- /dev/null +++ b/plugins/circleci/src/components/ActionOutput/ActionOutput.tsx @@ -0,0 +1,14 @@ +import React, { useEffect, useState, FC } from 'react'; + +export const ActionOutput: FC<{ url: string }> = ({ url }) => { + //@ts-ignore + const [messages, setMessages] = useState([]); + useEffect(() => { + fetch(url) + .then(res => res.json()) + .then((messages) => { + messages && setMessages(messages.map(({message}: {message: string}) => message)) + }); + }, [url]); + return
{messages}
; +}; diff --git a/plugins/circleci/src/components/ActionOutput/index.ts b/plugins/circleci/src/components/ActionOutput/index.ts new file mode 100644 index 0000000000..1e4fd5dfac --- /dev/null +++ b/plugins/circleci/src/components/ActionOutput/index.ts @@ -0,0 +1 @@ +export { ActionOutput } from './ActionOutput'; diff --git a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx new file mode 100644 index 0000000000..f725a979a9 --- /dev/null +++ b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { Link as RouterLink } from 'react-router-dom'; +import { ContentHeader, SupportButton } from '@backstage/core'; +import { Button } from '@material-ui/core'; +import { Settings as SettingsIcon } from '@material-ui/icons'; + +export const PluginHeader = () => ( + + + A description of your plugin goes here. + +); diff --git a/plugins/circleci/src/components/PluginHeader/index.ts b/plugins/circleci/src/components/PluginHeader/index.ts new file mode 100644 index 0000000000..e9231f1318 --- /dev/null +++ b/plugins/circleci/src/components/PluginHeader/index.ts @@ -0,0 +1 @@ +export * from './PluginHeader'; diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx index e7441b979a..ce1b87b36a 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -2,20 +2,16 @@ import React, { FC } from 'react'; import { Content, InfoCard, useApi } from '@backstage/core'; import { Grid, List, ListItem } from '@material-ui/core'; import { PluginHeader } from 'components/PluginHeader'; -import { BuildWithSteps, BuildStep } from 'circleci-api'; +import { BuildWithSteps, BuildStepAction } from 'circleci-api'; import { circleCIApiRef } from 'api'; -// import { LazyLog } from 'react-lazylog'; import { useParams } from 'react-router-dom'; +import { ActionOutput } from '../../components/ActionOutput/ActionOutput'; export const DetailedViewPage: FC<{}> = () => { let { buildId = '' } = useParams(); - console.log(useParams()); - const [authed, setAuthed] = React.useState(false); - - //@ts-ignore - const [build, setBuild] = React.useState({}); + const [build, setBuild] = React.useState(null); const api = useApi(circleCIApiRef); React.useEffect(() => { @@ -33,19 +29,45 @@ export const DetailedViewPage: FC<{}> = () => { }; getBuildAsync(); }, [authed, buildId]); - return ( - - - - - {build.steps && build.steps.map(({name}: {name: string}) => ({name}))} - - + {!api.authed ? ( +
Not authenticated
+ ) : ( + + + + + -
+ )}
); }; + +const BuildsList: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( + + {build && + build.steps && + build.steps.map( + ({ name, actions }: { name: string; actions: BuildStepAction[] }) => ( + + {name} +
+ +
+ ), + )} +
+); + +const ActionsList: FC<{ actions: BuildStepAction[] }> = ({ actions }) => ( + + {actions.map((action: BuildStepAction) => ( + + + + ))} + +); diff --git a/plugins/circleci/src/pages/DetailedViewPage/index.ts b/plugins/circleci/src/pages/DetailedViewPage/index.ts new file mode 100644 index 0000000000..578eec4e64 --- /dev/null +++ b/plugins/circleci/src/pages/DetailedViewPage/index.ts @@ -0,0 +1 @@ +export * from './DetailedViewPage'; From 8a9241619ef1516bbb4d58a75166b02310b00382 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Tue, 5 May 2020 22:40:43 +0200 Subject: [PATCH 18/90] Implement logs visualization --- .../components/ActionOutput/ActionOutput.tsx | 45 ++++++++++++++++--- .../DetailedViewPage/DetailedViewPage.tsx | 25 +++++------ 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/plugins/circleci/src/components/ActionOutput/ActionOutput.tsx b/plugins/circleci/src/components/ActionOutput/ActionOutput.tsx index 79f8954a73..b8d1564040 100644 --- a/plugins/circleci/src/components/ActionOutput/ActionOutput.tsx +++ b/plugins/circleci/src/components/ActionOutput/ActionOutput.tsx @@ -1,14 +1,47 @@ import React, { useEffect, useState, FC } from 'react'; +import { + ExpansionPanel, + ExpansionPanelSummary, + Typography, + ExpansionPanelDetails, +} from '@material-ui/core'; -export const ActionOutput: FC<{ url: string }> = ({ url }) => { - //@ts-ignore +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import { BuildStepAction } from 'circleci-api'; + +export const ActionOutput: FC<{ + url: string; + name: string; + action: BuildStepAction; +}> = ({ url, name }) => { const [messages, setMessages] = useState([]); useEffect(() => { fetch(url) .then(res => res.json()) - .then((messages) => { - messages && setMessages(messages.map(({message}: {message: string}) => message)) - }); + .then(actionOutput => { + actionOutput && + setMessages( + actionOutput.map(({ message }: { message: string }) => message), + ); + }); }, [url]); - return
{messages}
; + console.log(messages); + return ( + + } + aria-controls="panel1a-content" + id="panel1a-header" + > + {name} + + + {messages.length === 0 + ? 'Nothing here...' + : messages.map(message => ( +

{message}

+ ))} +
+
+ ); }; diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx index ce1b87b36a..53fe2fea3e 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -1,6 +1,6 @@ import React, { FC } from 'react'; import { Content, InfoCard, useApi } from '@backstage/core'; -import { Grid, List, ListItem } from '@material-ui/core'; +import { Grid, Box } from '@material-ui/core'; import { PluginHeader } from 'components/PluginHeader'; import { BuildWithSteps, BuildStepAction } from 'circleci-api'; import { circleCIApiRef } from 'api'; @@ -37,8 +37,9 @@ export const DetailedViewPage: FC<{}> = () => { ) : ( - + + )} @@ -47,27 +48,21 @@ export const DetailedViewPage: FC<{}> = () => { }; const BuildsList: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( - + {build && build.steps && build.steps.map( ({ name, actions }: { name: string; actions: BuildStepAction[] }) => ( - - {name} -
- -
+ ), )} -
+ ); -const ActionsList: FC<{ actions: BuildStepAction[] }> = ({ actions }) => ( - +const ActionsList: FC<{ actions: BuildStepAction[], name: string }> = ({ actions, name }) => ( + {actions.map((action: BuildStepAction) => ( - - - + ))} - + ); From 633f592f81151e47dd3568e5c01dae7632ee9285 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Wed, 6 May 2020 10:31:49 +0200 Subject: [PATCH 19/90] feat: move proxy to devserver --- package.json | 1 - packages/app/package.json | 3 +-- packages/app/src/setupProxy.js | 7 +++++++ packages/backend/package.json | 1 - packages/backend/src/index.ts | 2 -- plugins/circleci-backend/.eslintrc.js | 3 --- plugins/circleci-backend/README.md | 6 ------ plugins/circleci-backend/package.json | 23 ---------------------- plugins/circleci-backend/src/index.ts | 27 -------------------------- plugins/circleci-backend/tsconfig.json | 15 -------------- plugins/circleci/src/api/index.ts | 2 +- plugins/circleci/src/index.ts | 1 + plugins/circleci/src/plugin.ts | 4 +++- plugins/circleci/src/proxy.ts | 12 ++++++++++++ yarn.lock | 7 ------- 15 files changed, 25 insertions(+), 89 deletions(-) create mode 100644 packages/app/src/setupProxy.js delete mode 100644 plugins/circleci-backend/.eslintrc.js delete mode 100644 plugins/circleci-backend/README.md delete mode 100644 plugins/circleci-backend/package.json delete mode 100644 plugins/circleci-backend/src/index.ts delete mode 100644 plugins/circleci-backend/tsconfig.json create mode 100644 plugins/circleci/src/proxy.ts diff --git a/package.json b/package.json index beddf9cab8..03c9b411fe 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,6 @@ }, "scripts": { "start": "yarn workspace example-app start", - "start:backend": "yarn workspace example-backend start", "bundle": "yarn build && yarn workspace example-app bundle", "build": "lerna run build", "clean": "lerna run clean", diff --git a/packages/app/package.json b/packages/app/package.json index e88bd46a54..8e75937fd8 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -4,7 +4,6 @@ "private": true, "devDependencies": { "@testing-library/cypress": "^6.0.0", - "@types/jquery": "^3.3.34", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^7.1.2", @@ -15,13 +14,13 @@ "cross-env": "^7.0.0", "cypress": "^4.2.0", "eslint-plugin-cypress": "^2.10.3", + "http-proxy-middleware": "^1.0.3", "start-server-and-test": "^1.10.11" }, "dependencies": { "@backstage/cli": "^0.1.1-alpha.4", "@backstage/core": "^0.1.1-alpha.4", "@backstage/plugin-circleci": "^0.1.1-alpha.4", - "@backstage/plugin-circleci-backend": "^0.1.1-alpha.4", "@backstage/plugin-home-page": "^0.1.1-alpha.4", "@backstage/plugin-inventory": "^0.1.1-alpha.4", "@backstage/plugin-lighthouse": "^0.1.1-alpha.4", diff --git a/packages/app/src/setupProxy.js b/packages/app/src/setupProxy.js new file mode 100644 index 0000000000..65ed973923 --- /dev/null +++ b/packages/app/src/setupProxy.js @@ -0,0 +1,7 @@ +const { proxySettings } = require('@backstage/plugin-circleci'); +const { createProxyMiddleware } = require('http-proxy-middleware'); + +module.exports = (/** @type {import('express').Application} */ app) => + Object.entries(proxySettings).forEach(([url, settings]) => + app.use(url, createProxyMiddleware(settings)), + ); diff --git a/packages/backend/package.json b/packages/backend/package.json index 13d64a0a13..0530f04452 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -16,7 +16,6 @@ }, "dependencies": { "@backstage/plugin-inventory-backend": "0.1.1-alpha.4", - "@backstage/plugin-circleci-backend": "0.1.1-alpha.4", "compression": "^1.7.4", "cors": "^2.8.5", "express": "^4.17.1", diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index da1a4f3dc3..fd8015c328 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -28,7 +28,6 @@ import helmet from 'helmet'; import compression from 'compression'; import { testRouter } from './test'; import { router as inventoryRouter } from '@backstage/plugin-inventory-backend'; -import { router as circleCIRouter } from '@backstage/plugin-circleci-backend'; const DEFAULT_PORT = 7000; @@ -41,7 +40,6 @@ app.use(compression()); app.use(express.json()); app.use('/test', testRouter); app.use('/inventory', inventoryRouter); -app.use('/circleci', circleCIRouter); app.listen(PORT, () => { console.log(`Listening on port ${PORT}`); diff --git a/plugins/circleci-backend/.eslintrc.js b/plugins/circleci-backend/.eslintrc.js deleted file mode 100644 index 13573efa9c..0000000000 --- a/plugins/circleci-backend/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: [require.resolve('@backstage/cli/config/eslint')], -}; diff --git a/plugins/circleci-backend/README.md b/plugins/circleci-backend/README.md deleted file mode 100644 index 91e60e3e6b..0000000000 --- a/plugins/circleci-backend/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Title -Welcome to the circleci-backend plugin! - -## Sub-section 1 - -## Sub-section 2 diff --git a/plugins/circleci-backend/package.json b/plugins/circleci-backend/package.json deleted file mode 100644 index 6535deba10..0000000000 --- a/plugins/circleci-backend/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "@backstage/plugin-circleci-backend", - "version": "0.1.1-alpha.4", - "main": "dist", - "license": "Apache-2.0", - "private": true, - "scripts": { - "build": "tsc", - "lint": "backstage-cli lint", - "test": "backstage-cli test", - "clean": "backstage-cli clean" - }, - "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.4" - }, - "dependencies": { - "express": "^4.17.1", - "http-proxy-middleware": "^1.0.3" - }, - "files": [ - "dist" - ] -} diff --git a/plugins/circleci-backend/src/index.ts b/plugins/circleci-backend/src/index.ts deleted file mode 100644 index 45bf47b884..0000000000 --- a/plugins/circleci-backend/src/index.ts +++ /dev/null @@ -1,27 +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 express from 'express'; -import httpProxy from 'http-proxy'; - -// Simple proxy for handling CORS for now -const proxy = httpProxy.createServer({ - target: 'https://circleci.com/api/v1.1', - changeOrigin: true, -}); -proxy.on('error', e => console.error(e)); -export const router = express(); -router.use('/api', (req, res) => proxy.web(req, res)); diff --git a/plugins/circleci-backend/tsconfig.json b/plugins/circleci-backend/tsconfig.json deleted file mode 100644 index b463ac102f..0000000000 --- a/plugins/circleci-backend/tsconfig.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "include": ["src"], - "compilerOptions": { - "baseUrl": "src", - "outDir": "dist", - "incremental": true, - "sourceMap": true, - "declaration": true, - "strict": true, - "target": "es5", - "module": "commonjs", - "esModuleInterop": true, - "types": ["node", "jest"] - } -} diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index 955daf3fba..afbd74f28f 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -18,7 +18,7 @@ import { CircleCI, GitType, CircleCIOptions } from 'circleci-api'; import { ApiRef } from '@backstage/core'; const defaultOptions: Partial = { - circleHost: 'http://backstage.localhost:7000/circleci/api', + circleHost: '/circleci/api', vcs: { type: GitType.GITHUB, owner: 'CircleCITest3', diff --git a/plugins/circleci/src/index.ts b/plugins/circleci/src/index.ts index d67bc6a864..33b8fe0067 100644 --- a/plugins/circleci/src/index.ts +++ b/plugins/circleci/src/index.ts @@ -16,3 +16,4 @@ export { plugin } from './plugin'; export * from './api'; +export * from './proxy'; diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index 05d3710d40..458a7f27bc 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -15,10 +15,12 @@ */ import { createPlugin } from '@backstage/core'; import { CircleCIPage } from './components/CircleCIPage'; +import { SettingsPage } from './components/SettingsPage'; export const plugin = createPlugin({ id: 'circleci', register({ router }) { - router.registerRoute('/circleci', CircleCIPage, { exact: false }); + router.registerRoute('/circleci', CircleCIPage); + router.registerRoute('/circleci/settings', SettingsPage); }, }); diff --git a/plugins/circleci/src/proxy.ts b/plugins/circleci/src/proxy.ts new file mode 100644 index 0000000000..397b9b3c56 --- /dev/null +++ b/plugins/circleci/src/proxy.ts @@ -0,0 +1,12 @@ +import type {Options} from 'http-proxy-middleware'; + +export const proxySettings: Record = { + '/circleci/api': { + target: 'https://circleci.com/api/v1.1', + changeOrigin: true, + logLevel: 'debug', + pathRewrite: { + '^/circleci/api/': '/', + }, + }, +}; diff --git a/yarn.lock b/yarn.lock index b3b8467ce5..d337b98883 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4072,13 +4072,6 @@ dependencies: "@types/sizzle" "*" -"@types/jquery@^3.3.34": - version "3.3.34" - resolved "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.34.tgz#0d3b94057063d3854adaeb579652048fec07ba6c" - integrity sha512-lW9vsVL53Xu/Nj4gi2hNmHGc4u3KKghjqTkAlO0kF5GIOPxbqqnQpgqJBzmn3yXLrPqHb6cmNJ6URnS23Vtvbg== - dependencies: - "@types/sizzle" "*" - "@types/js-cookie@2.2.5": version "2.2.5" resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.5.tgz#38dfaacae8623b37cc0b0d27398e574e3fc28b1e" From 6b44dd110c5ca3b009f15b4f8e6cac6c95f061b2 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Wed, 6 May 2020 11:18:49 +0200 Subject: [PATCH 20/90] feat: routing -> plugin routing --- .../circleci/src/components/Layout/Layout.tsx | 12 +++++ .../circleci/src/components/Layout/index.ts | 1 + .../src/pages/BuildsPage/BuildsPage.tsx | 39 ++++++++-------- .../src/pages/CircleCIPage/CircleCIPage.tsx | 44 ------------------- .../circleci/src/pages/CircleCIPage/index.ts | 1 - .../DetailedViewPage/DetailedViewPage.tsx | 42 +++++++++++------- .../src/pages/SettingsPage/SettingsPage.tsx | 9 ++-- plugins/circleci/src/plugin.ts | 6 ++- 8 files changed, 68 insertions(+), 86 deletions(-) create mode 100644 plugins/circleci/src/components/Layout/Layout.tsx create mode 100644 plugins/circleci/src/components/Layout/index.ts delete mode 100644 plugins/circleci/src/pages/CircleCIPage/CircleCIPage.tsx delete mode 100644 plugins/circleci/src/pages/CircleCIPage/index.ts diff --git a/plugins/circleci/src/components/Layout/Layout.tsx b/plugins/circleci/src/components/Layout/Layout.tsx new file mode 100644 index 0000000000..fe82bf90e8 --- /dev/null +++ b/plugins/circleci/src/components/Layout/Layout.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { Header, Page, pageTheme, HeaderLabel } from '@backstage/core'; + +export const Layout: React.FC = ({ children }) => ( + +
+ + +
+ {children} +
+); diff --git a/plugins/circleci/src/components/Layout/index.ts b/plugins/circleci/src/components/Layout/index.ts new file mode 100644 index 0000000000..9877e7f4ae --- /dev/null +++ b/plugins/circleci/src/components/Layout/index.ts @@ -0,0 +1 @@ +export * from './Layout'; diff --git a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx index cb8b3500ef..98e634d4c0 100644 --- a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx +++ b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx @@ -9,25 +9,28 @@ import { import { Button, Grid } from '@material-ui/core'; import { CircleCIFetch } from 'components/CircleCIFetch'; import { Settings as SettingsIcon } from '@material-ui/icons'; +import { Layout } from 'components/Layout'; export const BuildsPage: FC<{}> = () => ( - - - - A description of your plugin goes here. - - - - - - + + + + + A description of your plugin goes here. + + + + + + + - - + + ); diff --git a/plugins/circleci/src/pages/CircleCIPage/CircleCIPage.tsx b/plugins/circleci/src/pages/CircleCIPage/CircleCIPage.tsx deleted file mode 100644 index fe0ef0f1ce..0000000000 --- a/plugins/circleci/src/pages/CircleCIPage/CircleCIPage.tsx +++ /dev/null @@ -1,44 +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 React, { FC } from 'react'; -import { Route } from 'react-router'; -import { - Header, - Page, - pageTheme, - HeaderLabel, -} from '@backstage/core'; -import { SettingsPage } from '../SettingsPage'; -import { BuildsPage } from '../BuildsPage'; -import { DetailedViewPage } from '../DetailedViewPage'; -export const CircleCIPage: FC<{}> = () => { - return ( - <> - -
- - -
- - - -
- - ); -}; - -export default CircleCIPage; diff --git a/plugins/circleci/src/pages/CircleCIPage/index.ts b/plugins/circleci/src/pages/CircleCIPage/index.ts deleted file mode 100644 index 188ed6d61f..0000000000 --- a/plugins/circleci/src/pages/CircleCIPage/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { CircleCIPage } from './CircleCIPage'; diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx index 53fe2fea3e..3d5d7b575b 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -6,6 +6,7 @@ import { BuildWithSteps, BuildStepAction } from 'circleci-api'; import { circleCIApiRef } from 'api'; import { useParams } from 'react-router-dom'; import { ActionOutput } from '../../components/ActionOutput/ActionOutput'; +import { Layout } from 'components/Layout'; export const DetailedViewPage: FC<{}> = () => { let { buildId = '' } = useParams(); @@ -30,20 +31,22 @@ export const DetailedViewPage: FC<{}> = () => { getBuildAsync(); }, [authed, buildId]); return ( - - - {!api.authed ? ( -
Not authenticated
- ) : ( - - - - - + + + + {!api.authed ? ( +
Not authenticated
+ ) : ( + + + + + + -
- )} -
+ )} + + ); }; @@ -53,16 +56,23 @@ const BuildsList: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( build.steps && build.steps.map( ({ name, actions }: { name: string; actions: BuildStepAction[] }) => ( - + ), )} ); -const ActionsList: FC<{ actions: BuildStepAction[], name: string }> = ({ actions, name }) => ( +const ActionsList: FC<{ actions: BuildStepAction[]; name: string }> = ({ + actions, + name, +}) => ( {actions.map((action: BuildStepAction) => ( - + ))} ); diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 95e2c86662..af380509d1 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -4,14 +4,13 @@ import { circleCIApiRef } from 'api'; import { InfoCard, useApi, - Page, - pageTheme, Content, ContentHeader, SupportButton, } from '@backstage/core'; import { ProjectInput } from 'components/ProjectInput/ProjectInput'; import { Link as RouterLink } from 'react-router-dom'; +import { Layout } from 'components/Layout'; export const SettingsPage = () => { const api = useApi(circleCIApiRef); @@ -27,7 +26,7 @@ export const SettingsPage = () => { }, []); return ( - + A description of your plugin goes here. - + @@ -84,6 +83,6 @@ export const SettingsPage = () => { - + ); }; diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index 7e96bf5e0d..11d215f30f 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -14,13 +14,15 @@ * limitations under the License. */ import { createPlugin } from '@backstage/core'; -import { CircleCIPage } from './pages/CircleCIPage'; +import { BuildsPage } from './pages/BuildsPage'; import { SettingsPage } from './pages/SettingsPage'; +import { DetailedViewPage } from './pages/DetailedViewPage'; export const plugin = createPlugin({ id: 'circleci', register({ router }) { - router.registerRoute('/circleci', CircleCIPage); + router.registerRoute('/circleci', BuildsPage); + router.registerRoute('/circleci/build/:buildId', DetailedViewPage); router.registerRoute('/circleci/settings', SettingsPage); }, }); From 684408f0ffc01cb85be8f67c3b129f5a17b3cd3c Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Wed, 6 May 2020 12:37:26 +0200 Subject: [PATCH 21/90] feat: lazylog --- plugins/circleci/package.json | 2 + .../components/ActionOutput/ActionOutput.tsx | 25 +++-- .../DetailedViewPage/DetailedViewPage.tsx | 5 +- plugins/circleci/tsconfig.json | 1 + yarn.lock | 91 ++++++++++++++++++- 5 files changed, 109 insertions(+), 15 deletions(-) diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 73b10d4fa5..cf5c5f93c4 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -27,9 +27,11 @@ "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", + "@types/react-lazylog": "^4.5.0", "circleci-api": "^4.0.0", "react": "16.13.1", "react-dom": "16.13.1", + "react-lazylog": "^4.5.2", "react-router": "^5.1.2", "react-use": "^13.0.0" }, diff --git a/plugins/circleci/src/components/ActionOutput/ActionOutput.tsx b/plugins/circleci/src/components/ActionOutput/ActionOutput.tsx index b8d1564040..7cc92098a1 100644 --- a/plugins/circleci/src/components/ActionOutput/ActionOutput.tsx +++ b/plugins/circleci/src/components/ActionOutput/ActionOutput.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState, FC } from 'react'; +import React, { useEffect, useState, FC, Suspense } from 'react'; import { ExpansionPanel, ExpansionPanelSummary, @@ -9,6 +9,8 @@ import { import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; import { BuildStepAction } from 'circleci-api'; +const LazyLog = React.lazy(() => import('react-lazylog/build/LazyLog')); + export const ActionOutput: FC<{ url: string; name: string; @@ -25,22 +27,25 @@ export const ActionOutput: FC<{ ); }); }, [url]); - console.log(messages); return ( - + } - aria-controls="panel1a-content" - id="panel1a-header" + aria-controls={`panel-${name}-content`} + id={`panel-${name}-header`} > {name} - {messages.length === 0 - ? 'Nothing here...' - : messages.map(message => ( -

{message}

- ))} + {messages.length === 0 ? ( + 'Nothing here...' + ) : ( + +
+ +
+
+ )}
); diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx index 3d5d7b575b..37ff1e0655 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -64,9 +64,8 @@ const BuildsList: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( const ActionsList: FC<{ actions: BuildStepAction[]; name: string }> = ({ actions, - name, }) => ( - + <> {actions.map((action: BuildStepAction) => ( = ({ url={action.output_url || ''} /> ))} - + ); diff --git a/plugins/circleci/tsconfig.json b/plugins/circleci/tsconfig.json index 7b73db2f0f..91968a6e49 100644 --- a/plugins/circleci/tsconfig.json +++ b/plugins/circleci/tsconfig.json @@ -2,6 +2,7 @@ "extends": "../../tsconfig.json", "include": ["src"], "compilerOptions": { + "module": "esnext", "baseUrl": "src" } } diff --git a/yarn.lock b/yarn.lock index d337b98883..a55b15593a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2491,6 +2491,13 @@ prop-types "^15.7.2" react-is "^16.8.0" +"@mattiasbuelens/web-streams-polyfill@^0.2.0": + version "0.2.1" + resolved "https://registry.npmjs.org/@mattiasbuelens/web-streams-polyfill/-/web-streams-polyfill-0.2.1.tgz#d7c4aa94f98084ec0787be084d47167d62ea5f67" + integrity sha512-oKuFCQFa3W7Hj7zKn0+4ypI8JFm4ZKIoncwAC6wd5WwFW2sL7O1hpPoJdSWpynQ4DJ4lQ6MvFoVDmCLilonDFg== + dependencies: + "@types/whatwg-streams" "^0.0.7" + "@mdx-js/react@^1.0.0", "@mdx-js/react@^1.5.2": version "1.5.9" resolved "https://registry.npmjs.org/@mdx-js/react/-/react-1.5.9.tgz#31873ab097fbe58c61c7585fc0be64e83182b6df" @@ -4199,6 +4206,14 @@ dependencies: "@types/react" "*" +"@types/react-lazylog@^4.5.0": + version "4.5.0" + resolved "https://registry.npmjs.org/@types/react-lazylog/-/react-lazylog-4.5.0.tgz#1677ac520f29ada2e95b8cd5f8ec54b897227278" + integrity sha512-yg0IhKtDRGqUUtXJwi9Y/sSmgX/gmVP0vu0cr5uAECmJnRQbAgsGoVUntQGtwH0Z7Y2iiTh+QW5LkOFsmtIisg== + dependencies: + "@types/react" "*" + immutable ">=3.8.2" + "@types/react-router-dom@^5.1.3": version "5.1.3" resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.3.tgz#b5d28e7850bd274d944c0fbbe5d57e6b30d71196" @@ -4443,6 +4458,11 @@ "@types/webpack-sources" "*" source-map "^0.6.0" +"@types/whatwg-streams@^0.0.7": + version "0.0.7" + resolved "https://registry.npmjs.org/@types/whatwg-streams/-/whatwg-streams-0.0.7.tgz#28bfe73dc850562296367249c4b32a50db81e9d3" + integrity sha512-6sDiSEP6DWcY2ZolsJ2s39ZmsoGQ7KVwBDI3sESQsEm9P2dHTcqnDIHRZFRNtLCzWp7hCFGqYbw5GyfpQnJ01A== + "@types/yargs-parser@*": version "15.0.0" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" @@ -6638,7 +6658,7 @@ clone@^1.0.2: resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -clsx@^1.0.2, clsx@^1.0.4, clsx@^1.1.0: +clsx@^1.0.1, clsx@^1.0.2, clsx@^1.0.4, clsx@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz#62937c6adfea771247c34b54d320fb99624f5702" integrity sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA== @@ -8135,6 +8155,14 @@ dom-converter@^0.2: dependencies: utila "~0.4" +dom-helpers@^5.0.0: + version "5.1.4" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b" + integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^2.6.7" + dom-helpers@^5.0.1: version "5.1.3" resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.3.tgz#7233248eb3a2d1f74aafca31e52c5299cc8ce821" @@ -9286,6 +9314,11 @@ feature-policy@0.3.0: resolved "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz#7430e8e54a40da01156ca30aaec1a381ce536069" integrity sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ== +fetch-readablestream@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/fetch-readablestream/-/fetch-readablestream-0.2.0.tgz#eaa6d1a76b12de2d4731a343393c6ccdcfe2c795" + integrity sha512-qu4mXWf4wus4idBIN/kVH+XSer8IZ9CwHP+Pd7DL7TuKNC1hP7ykon4kkBjwJF3EMX2WsFp4hH7gU7CyL7ucXw== + figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -10913,6 +10946,11 @@ immer@1.10.0: resolved "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz#bad67605ba9c810275d91e1c2a47d4582e98286d" integrity sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg== +immutable@>=3.8.2, immutable@^3.8.2: + version "3.8.2" + resolved "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= + import-cwd@^2.0.0, import-cwd@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -13610,7 +13648,7 @@ longest@^2.0.1: resolved "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8" integrity sha1-eB4YMpaqlPbU2RbcM10NF676I/g= -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -14198,6 +14236,11 @@ mississippi@^3.0.0: stream-each "^1.1.0" through2 "^2.0.0" +mitt@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" + integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== + mixin-deep@^1.2.0: version "1.3.2" resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" @@ -17114,6 +17157,21 @@ react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-i resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-lazylog@^4.5.2: + version "4.5.2" + resolved "https://registry.npmjs.org/react-lazylog/-/react-lazylog-4.5.2.tgz#9b66a0997348690f56286f6afcda97ebd0c62b7c" + integrity sha512-XvAjlzs8tzbjmqyEdj8HwW8Kg5nfqZAzIGeeG1incZuhuXQkekIs6nYb3W/GQNxDpA1CowgNUR4UfP+7/C2Ang== + dependencies: + "@mattiasbuelens/web-streams-polyfill" "^0.2.0" + fetch-readablestream "^0.2.0" + immutable "^3.8.2" + mitt "^1.1.2" + prop-types "^15.6.1" + react-string-replace "^0.4.1" + react-virtualized "^9.21.0" + text-encoding-utf-8 "^1.0.1" + whatwg-fetch "^2.0.4" + react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" @@ -17267,6 +17325,13 @@ react-sparklines@^1.7.0: dependencies: prop-types "^15.5.10" +react-string-replace@^0.4.1: + version "0.4.4" + resolved "https://registry.npmjs.org/react-string-replace/-/react-string-replace-0.4.4.tgz#24006fbe0db573d5be583133df38b1a735cb4225" + integrity sha512-FAMkhxmDpCsGTwTZg7p/2v+/GTmxAp73so3fbSvlAcBBX36ujiGRNEaM/1u+jiYQrArhns+7eE92g2pi5E5FUA== + dependencies: + lodash "^4.17.4" + react-syntax-highlighter@^11.0.2: version "11.0.2" resolved "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-11.0.2.tgz#4e3f376e752b20d2f54e4c55652fd663149e4029" @@ -17334,6 +17399,18 @@ react-use@^13.24.0: ts-easing "^0.2.0" tslib "^1.10.0" +react-virtualized@^9.21.0: + version "9.21.2" + resolved "https://registry.npmjs.org/react-virtualized/-/react-virtualized-9.21.2.tgz#02e6df65c1e020c8dbf574ec4ce971652afca84e" + integrity sha512-oX7I7KYiUM7lVXQzmhtF4Xg/4UA5duSA+/ZcAvdWlTLFCoFYq1SbauJT5gZK9cZS/wdYR6TPGpX/dqzvTqQeBA== + dependencies: + babel-runtime "^6.26.0" + clsx "^1.0.1" + dom-helpers "^5.0.0" + loose-envify "^1.3.0" + prop-types "^15.6.0" + react-lifecycles-compat "^3.0.4" + react@16.13.1, react@^16.0.0, react@^16.12.0, react@^16.13.1, react@^16.8.3: version "16.13.1" resolved "https://registry.npmjs.org/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" @@ -19651,6 +19728,11 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-encoding-utf-8@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" + integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== + text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" @@ -20788,6 +20870,11 @@ whatwg-fetch@3.0.0, whatwg-fetch@>=0.10.0, whatwg-fetch@^3.0.0: resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== +whatwg-fetch@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== + whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" From ca7d863d065c25ce8fd7a8a0c86db6cc50d45c9a Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Wed, 6 May 2020 15:24:01 +0200 Subject: [PATCH 22/90] Extract CITable rows into components --- .../src/components/CITable/CITable.tsx | 86 ++++++++++--------- 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/plugins/circleci/src/components/CITable/CITable.tsx b/plugins/circleci/src/components/CITable/CITable.tsx index 465fae24e0..bd8be803a3 100644 --- a/plugins/circleci/src/components/CITable/CITable.tsx +++ b/plugins/circleci/src/components/CITable/CITable.tsx @@ -71,6 +71,48 @@ const getStatusComponent = (status: string) => { } }; +export const CITableBuildRow: FC<{ build: CITableBuildInfo }> = ({ build }) => ( + + {build.id} + + {build.buildName} + + + {build.source.branchName} +
+ {build.source.commit.hash} +
+ {getStatusComponent(build.status)} + {build.tests && ( + + { + <> + {build.tests.passed}/{build.tests.total} ( + {build.tests.failed ? build.tests.failed + ', ' : ''} + {build.tests.skipped ? build.tests.skipped : ''}) + + } + + )} + + + +
+); + +export const CITableBuildHeadRow:FC<{isTestDataAvailable: boolean}> = ({isTestDataAvailable}) => ( + + ID + Build + Source + Status + {isTestDataAvailable && Tests} + Actions + +); + export const CITable: FC<{ builds: CITableBuildInfo[]; }> = ({ builds }) => { @@ -79,50 +121,10 @@ export const CITable: FC<{ return (
- - - ID - Build - Source - Status - {isTestDataAvailable && Tests} - Actions - - + {builds.map(build => ( - - {build.id} - - - {build.buildName} - - - - {build.source.branchName} -
- {build.source.commit.hash} -
- - {getStatusComponent(build.status)} - - {build.tests && ( - - { - <> - {build.tests.passed}/{build.tests.total} ( - {build.tests.failed ? build.tests.failed + ', ' : ''} - {build.tests.skipped ? build.tests.skipped : ''}) - - } - - )} - - - -
+ ))}
From 34d5a985a0ce82606453244f19dafeb4bc4bba4b Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Wed, 6 May 2020 15:57:50 +0200 Subject: [PATCH 23/90] fix: types --- packages/app/package.json | 1 - yarn.lock | 17 +++-------------- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index 7b7cfebbe4..cfeb43b4d3 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -14,7 +14,6 @@ "cross-env": "^7.0.0", "cypress": "^4.2.0", "eslint-plugin-cypress": "^2.10.3", - "http-proxy-middleware": "^1.0.3", "start-server-and-test": "^1.10.11" }, "dependencies": { diff --git a/yarn.lock b/yarn.lock index f88dd930ff..e063d47f5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4079,7 +4079,7 @@ "@types/http-proxy" "*" "@types/node" "*" -"@types/http-proxy@*", "@types/http-proxy@^1.17.3": +"@types/http-proxy@*": version "1.17.4" resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz#e7c92e3dbe3e13aa799440ff42e6d3a17a9d045b" integrity sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q== @@ -11010,18 +11010,7 @@ http-proxy-middleware@0.19.1: lodash "^4.17.11" micromatch "^3.1.10" -http-proxy-middleware@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.0.3.tgz#f73daad8dac622d51fe1769960c914b9b1f75a72" - integrity sha512-GHvPeBD+A357zS5tHjzj6ISrVOjjCiy0I92bdyTJz0pNmIjFxO0NX/bX+xkGgnclKQE/5hHAB9JEQ7u9Pw4olg== - dependencies: - "@types/http-proxy" "^1.17.3" - http-proxy "^1.18.0" - is-glob "^4.0.1" - lodash "^4.17.15" - micromatch "^4.0.2" - -http-proxy@^1.17.0, http-proxy@^1.18.0: +http-proxy@^1.17.0: version "1.18.0" resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== @@ -17481,7 +17470,7 @@ react-lazylog@^4.5.2: text-encoding-utf-8 "^1.0.1" whatwg-fetch "^2.0.4" -react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: +react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== From bdb02f7de0140313f480a5b8728f77e35323a64f Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Wed, 6 May 2020 17:21:41 +0200 Subject: [PATCH 24/90] feat: make it work --- packages/app/package.json | 3 +- packages/app/src/setupProxy.js | 17 +- plugins/circleci/package.json | 3 +- .../src/components/CITable/CITable.tsx | 186 ++++++++++-------- .../components/CircleCIFetch/CirleCIFetch.tsx | 2 +- .../src/pages/BuildsPage/BuildsPage.tsx | 2 +- plugins/circleci/src/proxy.ts | 4 +- 7 files changed, 129 insertions(+), 88 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index cfeb43b4d3..9e235613b7 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -19,13 +19,14 @@ "dependencies": { "@backstage/cli": "^0.1.1-alpha.4", "@backstage/core": "^0.1.1-alpha.4", - "@backstage/plugin-explore": "^0.1.1-alpha.4", "@backstage/plugin-circleci": "^0.1.1-alpha.4", + "@backstage/plugin-explore": "^0.1.1-alpha.4", "@backstage/plugin-home-page": "^0.1.1-alpha.4", "@backstage/plugin-inventory": "^0.1.1-alpha.4", "@backstage/plugin-lighthouse": "^0.1.1-alpha.4", "@backstage/plugin-scaffolder": "^0.1.1-alpha.4", "@backstage/plugin-tech-radar": "^0.1.1-alpha.4", + "@backstage/plugin-test": "^0.1.1-alpha.4", "@backstage/plugin-welcome": "^0.1.1-alpha.4", "@backstage/theme": "^0.1.1-alpha.4", "@material-ui/core": "^4.9.1", diff --git a/packages/app/src/setupProxy.js b/packages/app/src/setupProxy.js index 65ed973923..38cb098a03 100644 --- a/packages/app/src/setupProxy.js +++ b/packages/app/src/setupProxy.js @@ -1,7 +1,18 @@ -const { proxySettings } = require('@backstage/plugin-circleci'); -const { createProxyMiddleware } = require('http-proxy-middleware'); +const createProxyMiddleware = require('http-proxy-middleware'); + +// FIXME: somehow get it from within the plugin itself? +const circleCIProxySettings = { + '/circleci/api': { + target: 'https://circleci.com/api/v1.1', + changeOrigin: true, + logLevel: 'debug', + pathRewrite: { + '^/circleci/api/': '/', + }, + }, +}; module.exports = (/** @type {import('express').Application} */ app) => - Object.entries(proxySettings).forEach(([url, settings]) => + Object.entries(circleCIProxySettings).forEach(([url, settings]) => app.use(url, createProxyMiddleware(settings)), ); diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index cf5c5f93c4..12afc5e8ff 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -1,7 +1,8 @@ { "name": "@backstage/plugin-circleci", "version": "0.1.1-alpha.4", - "main": "dist/index.cjs.js", + "main": "dist/index.esm.js", + "module": "dist/index.esm.js", "types": "dist/index.d.ts", "license": "Apache-2.0", "private": true, diff --git a/plugins/circleci/src/components/CITable/CITable.tsx b/plugins/circleci/src/components/CITable/CITable.tsx index bd8be803a3..0e62083c7f 100644 --- a/plugins/circleci/src/components/CITable/CITable.tsx +++ b/plugins/circleci/src/components/CITable/CITable.tsx @@ -1,35 +1,27 @@ // Idea for this component to be somehow reusable representation of CI table view import React, { FC } from 'react'; -import { makeStyles } from '@material-ui/core/styles'; -import { - Button, - Table, - TableBody, - TableCell, - TableHead, - TableContainer, - TableRow, - CircularProgress, -} from '@material-ui/core'; +// import { makeStyles } from '@material-ui/core/styles'; +import { Link, CircularProgress, Button } from '@material-ui/core'; import { Replay as RetryIcon } from '@material-ui/icons'; -import { Link } from 'react-router-dom'; +import { Link as RouterLink } from 'react-router-dom'; import { StatusFailed, StatusOK, StatusPending, StatusNA, + Table, } from '@backstage/core'; - -const useStyles = makeStyles({ - table: { - minWidth: 650, - }, - avatar: { - height: 32, - width: 32, - borderRadius: '50%', - }, -}); +import type { TableColumn } from '@backstage/core/src/components/Table'; +// const useStyles = makeStyles({ +// table: { +// minWidth: 650, +// }, +// avatar: { +// height: 32, +// width: 32, +// borderRadius: '50%', +// }, +// }); export type CITableBuildInfo = { id: string; @@ -54,7 +46,7 @@ export type CITableBuildInfo = { }; // :retried, :canceled, :infrastructure_fail, :timedout, :not_run, :running, :failed, :queued, :scheduled, :not_running, :no_tests, :fixed, :success -const getStatusComponent = (status: string) => { +const getStatusComponent = (status: string | undefined = '') => { switch (status.toLowerCase()) { case 'queued': case 'scheduled': @@ -71,63 +63,101 @@ const getStatusComponent = (status: string) => { } }; -export const CITableBuildRow: FC<{ build: CITableBuildInfo }> = ({ build }) => ( - - {build.id} - - {build.buildName} - - - {build.source.branchName} -
- {build.source.commit.hash} -
- {getStatusComponent(build.status)} - {build.tests && ( - - { - <> - {build.tests.passed}/{build.tests.total} ( - {build.tests.failed ? build.tests.failed + ', ' : ''} - {build.tests.skipped ? build.tests.skipped : ''}) - - } - - )} - - +// +//
+// ); + +// export const CITableBuildHeadRow:FC<{isTestDataAvailable: boolean}> = ({isTestDataAvailable}) => ( +// +// ID +// Build +// Source +// Status +// {isTestDataAvailable && Tests} +// Actions +// +// ); + +const generatedColumns: TableColumn[] = [ + { + title: 'ID', + field: 'id', + type: 'numeric', + }, + { + title: 'Build', + field: 'buildName', + highlight: true, + render: (row: Partial) => ( + + {row.buildName} + + ), + }, + { + title: 'Source', + render: (row: Partial) => ( + <> + {row.source?.branchName} +
+ {row.source?.commit.hash} + + ), + }, + { + title: 'Status', + render: (row: Partial) => ( + <> + {getStatusComponent(row.status)} {row.status} + + ), + }, + { + title: 'Actions', + render: (row: Partial) => ( + - - -); - -export const CITableBuildHeadRow:FC<{isTestDataAvailable: boolean}> = ({isTestDataAvailable}) => ( - - ID - Build - Source - Status - {isTestDataAvailable && Tests} - Actions - -); - + ), + }, +]; export const CITable: FC<{ builds: CITableBuildInfo[]; -}> = ({ builds }) => { - const classes = useStyles(); - const isTestDataAvailable = builds.some(build => build.tests); +}> = React.memo(({ builds = [] }) => { + // const classes = useStyles(); + // const isTestDataAvailable = builds.some(build => build.tests); return ( - - - - - {builds.map(build => ( - - ))} - -
-
+ ); -}; +}); diff --git a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx index 92d4ca5ce2..abd4b2c363 100644 --- a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx +++ b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx @@ -51,7 +51,7 @@ const transform = ( buildsData: BuildSummary[], api: typeof circleCIApiRef.T, ): CITableBuildInfo[] => { - return buildsData.map(buildData => { + return buildsData.map((buildData) => { const tableBuildInfo: CITableBuildInfo = { id: String(buildData.build_num), buildName: buildData.subject diff --git a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx index 98e634d4c0..32939d2ebe 100644 --- a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx +++ b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx @@ -26,7 +26,7 @@ export const BuildsPage: FC<{}> = () => ( - + diff --git a/plugins/circleci/src/proxy.ts b/plugins/circleci/src/proxy.ts index 397b9b3c56..ec3b32621d 100644 --- a/plugins/circleci/src/proxy.ts +++ b/plugins/circleci/src/proxy.ts @@ -1,6 +1,4 @@ -import type {Options} from 'http-proxy-middleware'; - -export const proxySettings: Record = { +export const proxySettings = { '/circleci/api': { target: 'https://circleci.com/api/v1.1', changeOrigin: true, From 7b3dcff47cd2036eaf708e91726eed1331346657 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 7 May 2020 10:27:06 +0200 Subject: [PATCH 25/90] fix: authed, column sizes Co-authored-by: Nikita Dudnik --- packages/app/package.json | 1 - plugins/circleci/src/components/CITable/CITable.tsx | 4 ++++ plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx | 6 +++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index 9e235613b7..91fe2cf34c 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -26,7 +26,6 @@ "@backstage/plugin-lighthouse": "^0.1.1-alpha.4", "@backstage/plugin-scaffolder": "^0.1.1-alpha.4", "@backstage/plugin-tech-radar": "^0.1.1-alpha.4", - "@backstage/plugin-test": "^0.1.1-alpha.4", "@backstage/plugin-welcome": "^0.1.1-alpha.4", "@backstage/theme": "^0.1.1-alpha.4", "@material-ui/core": "^4.9.1", diff --git a/plugins/circleci/src/components/CITable/CITable.tsx b/plugins/circleci/src/components/CITable/CITable.tsx index 0e62083c7f..52594b9227 100644 --- a/plugins/circleci/src/components/CITable/CITable.tsx +++ b/plugins/circleci/src/components/CITable/CITable.tsx @@ -110,6 +110,8 @@ const generatedColumns: TableColumn[] = [ title: 'ID', field: 'id', type: 'numeric', + // @ts-ignore + width: '10%', }, { title: 'Build', @@ -146,6 +148,8 @@ const generatedColumns: TableColumn[] = [ ), + // @ts-ignore + width: '10%', }, ]; export const CITable: FC<{ diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index af380509d1..950792bfab 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -39,7 +39,7 @@ export const SettingsPage = () => { {authed ? ( - <>Already authed + <>Authenticated ) : ( <> @@ -48,7 +48,7 @@ export const SettingsPage = () => { type="password" label="Token" value={token} - onChange={e => setToken(e.target.value)} + onChange={(e) => setToken(e.target.value)} /> @@ -77,7 +77,7 @@ export const SettingsPage = () => { api.setVCSOptions(info)} + setGitInfo={(info) => api.setVCSOptions(info)} /> From 4476a14fa1675d15ed688f99f0ca9f0b30f0bdec Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 7 May 2020 10:32:32 +0200 Subject: [PATCH 26/90] fix: store vcs settings --- plugins/circleci/src/api/index.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index d1eabbe2d6..b0126378f6 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -14,16 +14,12 @@ * limitations under the License. */ -import { CircleCI, GitType, CircleCIOptions } from 'circleci-api'; +import { CircleCI, CircleCIOptions } from 'circleci-api'; import { ApiRef } from '@backstage/core'; const defaultOptions: Partial = { circleHost: '/circleci/api', - vcs: { - type: GitType.GITHUB, - owner: 'CircleCITest3', - repo: 'circleci-test', - }, + vcs: {}, }; export const circleCIApiRef = new ApiRef({ id: 'plugin.circleci.service', @@ -31,7 +27,6 @@ export const circleCIApiRef = new ApiRef({ }); export class CircleCIApi { - private token: string = ''; options: Partial; From 781472bf3c80368ecf4385a678f6b6775fd4039a Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Thu, 7 May 2020 10:52:03 +0200 Subject: [PATCH 27/90] Merge --- .../components/ProjectInput/ProjectInput.tsx | 10 +-- .../src/pages/SettingsPage/SettingsPage.tsx | 48 +++++++++++--- plugins/circleci/src/utils/index.ts | 62 +++++++++++++++++++ 3 files changed, 105 insertions(+), 15 deletions(-) create mode 100644 plugins/circleci/src/utils/index.ts diff --git a/plugins/circleci/src/components/ProjectInput/ProjectInput.tsx b/plugins/circleci/src/components/ProjectInput/ProjectInput.tsx index 046cd171b9..fe4cb61446 100644 --- a/plugins/circleci/src/components/ProjectInput/ProjectInput.tsx +++ b/plugins/circleci/src/components/ProjectInput/ProjectInput.tsx @@ -1,5 +1,5 @@ import { useState, FC, useEffect } from 'react'; -import { List, ListItem, TextField, Button } from '@material-ui/core'; +import { ListItem, TextField, Button } from '@material-ui/core'; import React from 'react'; export const ProjectInput: FC<{ @@ -16,13 +16,13 @@ export const ProjectInput: FC<{ }, [apiGitInfo]); return ( - + <> setOwner(e.target.value)} + onChange={(e) => setOwner(e.target.value)} /> @@ -30,7 +30,7 @@ export const ProjectInput: FC<{ name="circleci-repo" label="Repo" value={repo} - onChange={e => setRepo(e.target.value)} + onChange={(e) => setRepo(e.target.value)} /> @@ -43,6 +43,6 @@ export const ProjectInput: FC<{ Save - + ); }; diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 950792bfab..8ea1a4d4fb 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState, useEffect } from 'react'; import { Button, TextField, List, Grid, ListItem } from '@material-ui/core'; import { circleCIApiRef } from 'api'; import { @@ -8,12 +8,12 @@ import { ContentHeader, SupportButton, } from '@backstage/core'; -import { ProjectInput } from 'components/ProjectInput/ProjectInput'; import { Link as RouterLink } from 'react-router-dom'; import { Layout } from 'components/Layout'; export const SettingsPage = () => { const api = useApi(circleCIApiRef); + const apiGitInfo = api.options.vcs; const [authed, setAuthed] = React.useState(api.authed); const [token, setToken] = React.useState(''); @@ -25,6 +25,16 @@ export const SettingsPage = () => { .catch(() => setAuthed(false)); }, []); + const [owner, setOwner] = useState(''); + const [repo, setRepo] = useState(''); + + useEffect(() => { + if (apiGitInfo && apiGitInfo.owner !== owner && apiGitInfo.owner) + setOwner(apiGitInfo.owner); + if (apiGitInfo && apiGitInfo.repo !== repo && apiGitInfo.repo) + setRepo(apiGitInfo.repo); + }, [apiGitInfo]); + return ( @@ -52,6 +62,32 @@ export const SettingsPage = () => { /> + + setOwner(e.target.value)} + /> + + + setRepo(e.target.value)} + /> + + + + - - - ); -}; diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 8ea1a4d4fb..028b09d07f 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -7,6 +7,8 @@ import { Content, ContentHeader, SupportButton, + // StatusOK, + StatusFailed, } from '@backstage/core'; import { Link as RouterLink } from 'react-router-dom'; import { Layout } from 'components/Layout'; @@ -46,7 +48,14 @@ export const SettingsPage = () => { - + + + + } + > {authed ? ( <>Authenticated @@ -78,22 +87,13 @@ export const SettingsPage = () => { onChange={(e) => setRepo(e.target.value)} /> - - - From 5dda050152181a5277f1b3a243d066a2b71a6012 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 7 May 2020 11:28:49 +0200 Subject: [PATCH 29/90] feat: destroyed everything Co-authored-by: Nikita Dudnik --- plugins/circleci/src/api/index.ts | 97 ++++------------ .../src/pages/SettingsPage/SettingsPage.tsx | 104 ++++++++---------- 2 files changed, 72 insertions(+), 129 deletions(-) diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index b0126378f6..b132b6a208 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -14,94 +14,45 @@ * limitations under the License. */ -import { CircleCI, CircleCIOptions } from 'circleci-api'; +import { + CircleCIOptions, + getMe, + getBuildSummaries, + getFullBuild, + postBuildActions, + BuildAction, +} from 'circleci-api'; import { ApiRef } from '@backstage/core'; -const defaultOptions: Partial = { - circleHost: '/circleci/api', - vcs: {}, -}; export const circleCIApiRef = new ApiRef({ id: 'plugin.circleci.service', description: 'Used by the CircleCI plugin to make requests', }); export class CircleCIApi { - private token: string = ''; - options: Partial; - - authed: boolean = false; - constructor(options?: Partial) { - this.options = Object.assign(Object.create(null), defaultOptions, options); + apiUrl: string; + constructor(apiUrl: string = '/circleci/api') { + this.apiUrl = apiUrl; } - setToken(token: string) { - this.token = token; - this.persistToken(); + async retry(buildNumber: number, options: CircleCIOptions) { + return postBuildActions( + options.token, + buildNumber, + BuildAction.RETRY, + options, + ); } - setVCSOptions(vcs: CircleCIOptions['vcs']) { - this.options.vcs = vcs; - this.persistVCSOptions(); + async getBuilds(options: CircleCIOptions) { + return getBuildSummaries(options.token, { vcs: {}, ...options }); } - async persistVCSOptions() { - const key = circleCIApiRef.id; - sessionStorage.setItem(key + '_options', JSON.stringify(this.options.vcs)); + async getUser(options: CircleCIOptions) { + return getMe(options.token, options); } - async restorePersistedSettings() { - if (this.authed) return Promise.resolve(); - const key = circleCIApiRef.id; - const persistedToken = sessionStorage.getItem(key); - let persistedVCSOptions: {} | undefined; - try { - persistedVCSOptions = JSON.parse( - sessionStorage.getItem(key + '_options') as string, - ); - } catch (e) {} - if (persistedToken && persistedVCSOptions) { - this.token = persistedToken; - this.options.vcs = persistedVCSOptions; - return Promise.resolve(); - } - return Promise.reject(); - } - - async persistToken() { - if (this.authed) return; - const key = circleCIApiRef.id; - sessionStorage.setItem(key, this.token); - } - - async validateToken() { - if (!this.token || this.token === '') { - return Promise.reject('Wrong token'); - } - - // TODO: switch towards using personal token - await this.api.builds(); - this.authed = true; - return Promise.resolve(); - } - - private get api() { - return new CircleCI({ ...this.options, token: this.token }); - } - - async retry(buildId: string) { - return this.api.retry(Number(buildId)); - } - - async getBuilds() { - return this.api.builds(); - } - - async getUser() { - return this.api.me(); - } - - async getBuild(buildId: string) { - return this.api.build(parseInt(buildId, 10)); + async getBuild(buildNumber: number, options: CircleCIOptions) { + return getFullBuild(options.token, buildNumber, options); } } diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 028b09d07f..0605409ad1 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -7,7 +7,7 @@ import { Content, ContentHeader, SupportButton, - // StatusOK, + StatusOK, StatusFailed, } from '@backstage/core'; import { Link as RouterLink } from 'react-router-dom'; @@ -17,7 +17,7 @@ export const SettingsPage = () => { const api = useApi(circleCIApiRef); const apiGitInfo = api.options.vcs; const [authed, setAuthed] = React.useState(api.authed); - const [token, setToken] = React.useState(''); + const [token, setToken] = React.useState(api.token); React.useEffect(() => { api @@ -49,63 +49,55 @@ export const SettingsPage = () => { - - + title={ + <> + Project Credentials{authed ? : } + } > - {authed ? ( - <>Authenticated - ) : ( - <> - - setToken(e.target.value)} - /> - - - - setOwner(e.target.value)} - /> - - - setRepo(e.target.value)} - /> - - - - - - )} + + setToken(e.target.value)} + /> + + + setOwner(e.target.value)} + /> + + + setRepo(e.target.value)} + /> + + + + From c8e3b72adcf2f789e1d561dfb8c656af6064264e Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Thu, 7 May 2020 11:50:35 +0200 Subject: [PATCH 30/90] It's broken but changes are nice --- plugins/circleci/src/components/App.tsx | 41 +++++++++++++++++++++++++ plugins/circleci/src/plugin.ts | 8 ++--- 2 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 plugins/circleci/src/components/App.tsx diff --git a/plugins/circleci/src/components/App.tsx b/plugins/circleci/src/components/App.tsx new file mode 100644 index 0000000000..db826b26d3 --- /dev/null +++ b/plugins/circleci/src/components/App.tsx @@ -0,0 +1,41 @@ +import { Route } from 'react-router'; +import React from 'react'; +import { BuildsPage } from 'pages/BuildsPage'; +import { DetailedViewPage } from 'pages/DetailedViewPage'; +import { SettingsPage } from 'pages/SettingsPage'; + +type AppState = { + token: string; + owner: string; + repo: string; +}; + +type AppAction = + | { type: 'setToken'; payload: string } + | { type: 'setOwner'; payload: string } + | { type: 'setRepo'; payload: string }; + +const initialState: AppState = { token: '', owner: '', repo: '' }; + +function reducer(state: AppState, action: AppAction) { + switch (action.type) { + case 'setToken': + return { count: state.count + 1 }; + case 'decrement': + return { count: state.count - 1 }; + default: + throw new Error(); + } +} + +const Context = React.createContext(42); + +export const App = () => { + return ( + + + + + + ); +}; diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index 11d215f30f..064cce93fb 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -14,15 +14,11 @@ * limitations under the License. */ import { createPlugin } from '@backstage/core'; -import { BuildsPage } from './pages/BuildsPage'; -import { SettingsPage } from './pages/SettingsPage'; -import { DetailedViewPage } from './pages/DetailedViewPage'; +import { App } from './components/App'; export const plugin = createPlugin({ id: 'circleci', register({ router }) { - router.registerRoute('/circleci', BuildsPage); - router.registerRoute('/circleci/build/:buildId', DetailedViewPage); - router.registerRoute('/circleci/settings', SettingsPage); + router.registerRoute('/circleci', App); }, }); From 7f00512d93771ba10a653b98359b185e8d2397ec Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Thu, 7 May 2020 14:31:21 +0200 Subject: [PATCH 31/90] Add Rematch --- plugins/circleci/package.json | 3 + plugins/circleci/src/components/App.tsx | 42 +++--------- .../src/pages/SettingsPage/SettingsPage.tsx | 67 ++++++++++--------- plugins/circleci/src/state/models/index.ts | 8 +++ plugins/circleci/src/state/models/settings.ts | 36 ++++++++++ plugins/circleci/src/state/store.ts | 12 ++++ yarn.lock | 29 +++++++- 7 files changed, 130 insertions(+), 67 deletions(-) create mode 100644 plugins/circleci/src/state/models/index.ts create mode 100644 plugins/circleci/src/state/models/settings.ts create mode 100644 plugins/circleci/src/state/store.ts diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 12afc5e8ff..f2c94f06e1 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -28,11 +28,14 @@ "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", + "@rematch/core": "^1.4.0", "@types/react-lazylog": "^4.5.0", + "@types/react-redux": "^7.1.8", "circleci-api": "^4.0.0", "react": "16.13.1", "react-dom": "16.13.1", "react-lazylog": "^4.5.2", + "react-redux": "^7.2.0", "react-router": "^5.1.2", "react-use": "^13.0.0" }, diff --git a/plugins/circleci/src/components/App.tsx b/plugins/circleci/src/components/App.tsx index db826b26d3..2dc92ea574 100644 --- a/plugins/circleci/src/components/App.tsx +++ b/plugins/circleci/src/components/App.tsx @@ -1,41 +1,17 @@ import { Route } from 'react-router'; import React from 'react'; -import { BuildsPage } from 'pages/BuildsPage'; -import { DetailedViewPage } from 'pages/DetailedViewPage'; +// import { BuildsPage } from 'pages/BuildsPage'; +// import { DetailedViewPage } from 'pages/DetailedViewPage'; import { SettingsPage } from 'pages/SettingsPage'; - -type AppState = { - token: string; - owner: string; - repo: string; -}; - -type AppAction = - | { type: 'setToken'; payload: string } - | { type: 'setOwner'; payload: string } - | { type: 'setRepo'; payload: string }; - -const initialState: AppState = { token: '', owner: '', repo: '' }; - -function reducer(state: AppState, action: AppAction) { - switch (action.type) { - case 'setToken': - return { count: state.count + 1 }; - case 'decrement': - return { count: state.count - 1 }; - default: - throw new Error(); - } -} - -const Context = React.createContext(42); +import { Provider } from 'react-redux'; +import store from 'state/store'; export const App = () => { return ( - - - - - + + {/* + */} + + ); }; diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 0605409ad1..b4433ec2a6 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -1,9 +1,8 @@ -import React, { useState, useEffect } from 'react'; +import React from 'react'; +import { useSelector, useDispatch } from 'react-redux'; import { Button, TextField, List, Grid, ListItem } from '@material-ui/core'; -import { circleCIApiRef } from 'api'; import { InfoCard, - useApi, Content, ContentHeader, SupportButton, @@ -12,30 +11,35 @@ import { } from '@backstage/core'; import { Link as RouterLink } from 'react-router-dom'; import { Layout } from 'components/Layout'; +import { SettingsState } from 'state/models/settings'; +import { iRootState } from 'state/store'; +import { Dispatch } from '../../state/store'; export const SettingsPage = () => { - const api = useApi(circleCIApiRef); - const apiGitInfo = api.options.vcs; - const [authed, setAuthed] = React.useState(api.authed); - const [token, setToken] = React.useState(api.token); + const { token, owner, repo } = useSelector( + (state: iRootState): SettingsState => state.settings, + ); - React.useEffect(() => { - api - .restorePersistedSettings() - .then(() => api.validateToken()) - .then(() => setAuthed(true)) - .catch(() => setAuthed(false)); - }, []); + const dispatch: Dispatch = useDispatch(); - const [owner, setOwner] = useState(''); - const [repo, setRepo] = useState(''); + // const api = useApi(circleCIApiRef); + // const apiGitInfo = api.options.vcs; + const [authed] = React.useState(false); - useEffect(() => { - if (apiGitInfo && apiGitInfo.owner !== owner && apiGitInfo.owner) - setOwner(apiGitInfo.owner); - if (apiGitInfo && apiGitInfo.repo !== repo && apiGitInfo.repo) - setRepo(apiGitInfo.repo); - }, [apiGitInfo]); + // React.useEffect(() => { + // api + // .restorePersistedSettings() + // .then(() => api.validateToken()) + // .then(() => setAuthed(true)) + // .catch(() => setAuthed(false)); + // }, []); + + // useEffect(() => { + // if (apiGitInfo && apiGitInfo.owner !== owner && apiGitInfo.owner) + // setOwner(apiGitInfo.owner); + // if (apiGitInfo && apiGitInfo.repo !== repo && apiGitInfo.repo) + // setRepo(apiGitInfo.repo); + // }, [apiGitInfo]); return ( @@ -59,10 +63,9 @@ export const SettingsPage = () => { setToken(e.target.value)} + onChange={e => dispatch.settings.setToken(e.target.value)} /> @@ -70,7 +73,7 @@ export const SettingsPage = () => { name="circleci-owner" label="Owner" value={owner} - onChange={(e) => setOwner(e.target.value)} + // onChange={(e) => setOwner(e.target.value)} /> @@ -78,7 +81,7 @@ export const SettingsPage = () => { name="circleci-repo" label="Repo" value={repo} - onChange={(e) => setRepo(e.target.value)} + // onChange={(e) => setRepo(e.target.value)} /> @@ -87,12 +90,12 @@ export const SettingsPage = () => { variant="outlined" color="primary" onClick={async () => { - api.setVCSOptions({ owner, repo }); - api.setToken(token); - api - .validateToken() - .then(() => setAuthed(true)) - .catch(() => setAuthed(false)); + // api.setVCSOptions({ owner, repo }); + // api.setToken(token); + // api + // .validateToken() + // .then(() => setAuthed(true)) + // .catch(() => setAuthed(false)); }} > Save credentials diff --git a/plugins/circleci/src/state/models/index.ts b/plugins/circleci/src/state/models/index.ts new file mode 100644 index 0000000000..c02f31a6e1 --- /dev/null +++ b/plugins/circleci/src/state/models/index.ts @@ -0,0 +1,8 @@ +import { settings } from './settings'; + +// no need to extend from Models +export interface RootModel { + settings: typeof settings; +} + +export const models: RootModel = { settings }; diff --git a/plugins/circleci/src/state/models/settings.ts b/plugins/circleci/src/state/models/settings.ts new file mode 100644 index 0000000000..02c78d0f73 --- /dev/null +++ b/plugins/circleci/src/state/models/settings.ts @@ -0,0 +1,36 @@ +// import { Dispatch } from '../store' + +export type SettingsState = { + token: string; + owner: string; + repo: string; +}; + +export const settings = { + state: { + token: '!!!', + owner: '', + repo: '', + }, // initial state + reducers: { + // handle state changes with pure functions + setToken(state: SettingsState, payload: string) { + return { ...state, token: payload }; + }, + setOwner(state: SettingsState, payload: string) { + return { ...state, owner: payload }; + }, + setRepo(state: SettingsState, payload: string) { + return { ...state, repo: payload }; + }, + }, + // effects: + // (dispatch: Dispatch) => ({ + // // handle state changes with impure functions. + // // use async/await for async actions + // // async incrementAsync(payload, rootState) { + // // await new Promise(resolve => setTimeout(resolve, 1000)) + // // dispatch.count.increment(payload) + // // }, + // }), +}; diff --git a/plugins/circleci/src/state/store.ts b/plugins/circleci/src/state/store.ts new file mode 100644 index 0000000000..c06c44d8e6 --- /dev/null +++ b/plugins/circleci/src/state/store.ts @@ -0,0 +1,12 @@ +import { init, RematchRootState, RematchDispatch } from '@rematch/core'; +import { models, RootModel } from './models'; + +const store = init({ + models, +}); + +export type Store = typeof store; +export type Dispatch = RematchDispatch; +export type iRootState = RematchRootState; + +export default store; diff --git a/yarn.lock b/yarn.lock index e063d47f5a..e3244ea127 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2740,6 +2740,13 @@ prop-types "^15.6.1" react-lifecycles-compat "^3.0.4" +"@rematch/core@^1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@rematch/core/-/core-1.4.0.tgz#686ce814e1cf125029c5e9fba23ef3ab7c3eb2a7" + integrity sha512-1zy9cTYxbvDHP0PwIL1QqkwagCEnqA0uWMmPf8v2BYvLi2OsxIfX1xiV+vCP3sdJAjjZ0b9+IbSmj0DL2MEgLQ== + dependencies: + redux "^4.0.5" + "@rollup/plugin-commonjs@^11.0.2": version "11.0.2" resolved "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz#837cc6950752327cb90177b608f0928a4e60b582" @@ -4047,6 +4054,14 @@ resolved "https://registry.npmjs.org/@types/history/-/history-4.7.5.tgz#527d20ef68571a4af02ed74350164e7a67544860" integrity sha512-wLD/Aq2VggCJXSjxEwrMafIP51Z+13H78nXIX0ABEuIGhmB5sNGbR113MOKo+yfw+RDo1ZU3DM6yfnnRF/+ouw== +"@types/hoist-non-react-statics@^3.3.0": + version "3.3.1" + resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + "@types/html-minifier@*": version "3.5.3" resolved "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-3.5.3.tgz#5276845138db2cebc54c789e0aaf87621a21e84f" @@ -4290,6 +4305,16 @@ "@types/react" "*" immutable ">=3.8.2" +"@types/react-redux@^7.1.8": + version "7.1.8" + resolved "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.8.tgz#3631feb559f7858d6ad9eea1d6ef41fa64fe7205" + integrity sha512-kpplH7Wg2SYU00sZVT98WBN0ou6QKrYcShRaW+5Vpe5l7bluKWJbWmAL+ieiso07OQzpcP5i1PeY3690640ZWg== + dependencies: + "@types/hoist-non-react-statics" "^3.3.0" + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + redux "^4.0.0" + "@types/react-router-dom@^5.1.3": version "5.1.3" resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.3.tgz#b5d28e7850bd274d944c0fbbe5d57e6b30d71196" @@ -17510,7 +17535,7 @@ react-popper@^1.3.6: typed-styles "^0.0.7" warning "^4.0.2" -react-redux@^7.0.3: +react-redux@^7.0.3, react-redux@^7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/react-redux/-/react-redux-7.2.0.tgz#f970f62192b3981642fec46fd0db18a074fe879d" integrity sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA== @@ -17976,7 +18001,7 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" -redux@^4.0.1: +redux@^4.0.0, redux@^4.0.1, redux@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== From f60b6df5558a41dde86eeeb0f2b6da43ffc9c962 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 7 May 2020 15:23:55 +0200 Subject: [PATCH 32/90] feat: destroyed everything v2 Co-authored-by: Nikita Dudnik --- .../src/pages/SettingsPage/SettingsPage.tsx | 69 +++++++++--------- plugins/circleci/src/state/models/settings.ts | 72 +++++++++++++------ 2 files changed, 89 insertions(+), 52 deletions(-) diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index b4433ec2a6..68649511f2 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -6,8 +6,8 @@ import { Content, ContentHeader, SupportButton, - StatusOK, - StatusFailed, + // StatusOK, + // StatusFailed, } from '@backstage/core'; import { Link as RouterLink } from 'react-router-dom'; import { Layout } from 'components/Layout'; @@ -16,30 +16,35 @@ import { iRootState } from 'state/store'; import { Dispatch } from '../../state/store'; export const SettingsPage = () => { - const { token, owner, repo } = useSelector( - (state: iRootState): SettingsState => state.settings, - ); + const { + token: tokenFromStore, + owner: ownerFromStore, + repo: repoFromStore, + } = useSelector((state: iRootState): SettingsState => state.settings); const dispatch: Dispatch = useDispatch(); - // const api = useApi(circleCIApiRef); // const apiGitInfo = api.options.vcs; - const [authed] = React.useState(false); + // const [authed] = React.useState(false); + const [token, setToken] = React.useState(''); + const [owner, setOwner] = React.useState(''); + const [repo, setRepo] = React.useState(''); - // React.useEffect(() => { - // api - // .restorePersistedSettings() - // .then(() => api.validateToken()) - // .then(() => setAuthed(true)) - // .catch(() => setAuthed(false)); - // }, []); + React.useEffect(() => { + dispatch.settings.rehydrate(); + }, []); - // useEffect(() => { - // if (apiGitInfo && apiGitInfo.owner !== owner && apiGitInfo.owner) - // setOwner(apiGitInfo.owner); - // if (apiGitInfo && apiGitInfo.repo !== repo && apiGitInfo.repo) - // setRepo(apiGitInfo.repo); - // }, [apiGitInfo]); + React.useEffect(() => { + if (tokenFromStore !== token) { + setToken(tokenFromStore); + } + if (ownerFromStore !== owner) { + setOwner(ownerFromStore); + } + if (repoFromStore !== repo) { + setRepo(repoFromStore); + } + }, [ownerFromStore, repoFromStore, tokenFromStore]); return ( @@ -55,7 +60,8 @@ export const SettingsPage = () => { - Project Credentials{authed ? : } + Project Credentials + {/*{authed ? : } */} } > @@ -65,7 +71,7 @@ export const SettingsPage = () => { name="circleci-token" label="Token" value={token} - onChange={e => dispatch.settings.setToken(e.target.value)} + onChange={(e) => setToken(e.target.value)} /> @@ -73,7 +79,7 @@ export const SettingsPage = () => { name="circleci-owner" label="Owner" value={owner} - // onChange={(e) => setOwner(e.target.value)} + onChange={(e) => setOwner(e.target.value)} /> @@ -81,7 +87,7 @@ export const SettingsPage = () => { name="circleci-repo" label="Repo" value={repo} - // onChange={(e) => setRepo(e.target.value)} + onChange={(e) => setRepo(e.target.value)} /> @@ -89,14 +95,13 @@ export const SettingsPage = () => { data-testid="github-auth-button" variant="outlined" color="primary" - onClick={async () => { - // api.setVCSOptions({ owner, repo }); - // api.setToken(token); - // api - // .validateToken() - // .then(() => setAuthed(true)) - // .catch(() => setAuthed(false)); - }} + onClick={() => + dispatch.settings.setCredentialsEffect({ + owner, + repo, + token, + }) + } > Save credentials diff --git a/plugins/circleci/src/state/models/settings.ts b/plugins/circleci/src/state/models/settings.ts index 02c78d0f73..d92a5f8fa1 100644 --- a/plugins/circleci/src/state/models/settings.ts +++ b/plugins/circleci/src/state/models/settings.ts @@ -1,4 +1,8 @@ -// import { Dispatch } from '../store' +import { Dispatch } from '../store'; +import { circleCIApiRef } from '../../api'; +import { RootModel } from '.'; + +const STORAGE_KEY = `${circleCIApiRef.id}.settings`; export type SettingsState = { token: string; @@ -8,29 +12,57 @@ export type SettingsState = { export const settings = { state: { - token: '!!!', + token: '', owner: '', repo: '', }, // initial state reducers: { - // handle state changes with pure functions - setToken(state: SettingsState, payload: string) { - return { ...state, token: payload }; - }, - setOwner(state: SettingsState, payload: string) { - return { ...state, owner: payload }; - }, - setRepo(state: SettingsState, payload: string) { - return { ...state, repo: payload }; + setCredentials(state: SettingsState, payload: SettingsState) { + return { ...state, ...payload }; }, }, - // effects: - // (dispatch: Dispatch) => ({ - // // handle state changes with impure functions. - // // use async/await for async actions - // // async incrementAsync(payload, rootState) { - // // await new Promise(resolve => setTimeout(resolve, 1000)) - // // dispatch.count.increment(payload) - // // }, - // }), + effects: (dispatch: Dispatch) => ({ + setCredentialsEffect( + { + credentials, + doPersist = true, + }: { credentials: SettingsState; doPersist?: boolean }, + state: RootModel, + ) { + const newState = { ...state.settings, ...credentials }; + + if (doPersist) dispatch.settings.persist(newState); + dispatch.settings.setCredentials(newState); + }, + persist(payload: RootModel) { + sessionStorage.setItem(STORAGE_KEY, JSON.stringify(payload)); + }, + rehydrate(_: any, state: RootModel) { + try { + const stateFromStorage = JSON.parse( + sessionStorage.getItem(STORAGE_KEY)!, + ); + console.log({ stateFromStorage, state }); + console.log(Object.keys(stateFromStorage)); + if ( + stateFromStorage && + Object.keys(stateFromStorage).some( + (k) => (state as any).settings[k] !== stateFromStorage[k], + ) + ) + dispatch.settings.setCredentialsEffect({ + credentials: stateFromStorage, + doPersist: false, + }); + } catch (e) { + console.log(e); + } + }, + // handle state changes with impure functions. + // use async/await for async actions + // async incrementAsync(payload, rootState) { + // await new Promise(resolve => setTimeout(resolve, 1000)) + // dispatch.count.increment(payload) + // }, + }), }; From 74e561812c800b784c3070f9a7c217bb764cd026 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Thu, 7 May 2020 15:31:05 +0200 Subject: [PATCH 33/90] Fix persistance --- .../src/pages/SettingsPage/SettingsPage.tsx | 8 ++++---- plugins/circleci/src/state/models/settings.ts | 15 ++++++++------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 68649511f2..3d9e14f6c6 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -71,7 +71,7 @@ export const SettingsPage = () => { name="circleci-token" label="Token" value={token} - onChange={(e) => setToken(e.target.value)} + onChange={e => setToken(e.target.value)} /> @@ -79,7 +79,7 @@ export const SettingsPage = () => { name="circleci-owner" label="Owner" value={owner} - onChange={(e) => setOwner(e.target.value)} + onChange={e => setOwner(e.target.value)} /> @@ -87,7 +87,7 @@ export const SettingsPage = () => { name="circleci-repo" label="Repo" value={repo} - onChange={(e) => setRepo(e.target.value)} + onChange={e => setRepo(e.target.value)} /> @@ -96,7 +96,7 @@ export const SettingsPage = () => { variant="outlined" color="primary" onClick={() => - dispatch.settings.setCredentialsEffect({ + dispatch.settings.setCredentials({ owner, repo, token, diff --git a/plugins/circleci/src/state/models/settings.ts b/plugins/circleci/src/state/models/settings.ts index d92a5f8fa1..992fd28243 100644 --- a/plugins/circleci/src/state/models/settings.ts +++ b/plugins/circleci/src/state/models/settings.ts @@ -22,7 +22,7 @@ export const settings = { }, }, effects: (dispatch: Dispatch) => ({ - setCredentialsEffect( + setCredentials( { credentials, doPersist = true, @@ -32,7 +32,7 @@ export const settings = { const newState = { ...state.settings, ...credentials }; if (doPersist) dispatch.settings.persist(newState); - dispatch.settings.setCredentials(newState); + // dispatch.settings.setCredentials(newState); }, persist(payload: RootModel) { sessionStorage.setItem(STORAGE_KEY, JSON.stringify(payload)); @@ -47,13 +47,14 @@ export const settings = { if ( stateFromStorage && Object.keys(stateFromStorage).some( - (k) => (state as any).settings[k] !== stateFromStorage[k], + k => (state as any).settings[k] !== stateFromStorage[k], ) ) - dispatch.settings.setCredentialsEffect({ - credentials: stateFromStorage, - doPersist: false, - }); + // dispatch.settings.setCredentialsEffect({ + // credentials: stateFromStorage, + // doPersist: false, + // }); + dispatch.settings.setCredentials(stateFromStorage); } catch (e) { console.log(e); } From fa05620b45c41bb55fab17604bc4742fa5907449 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 7 May 2020 15:46:01 +0200 Subject: [PATCH 34/90] fix: settings page works --- plugins/circleci/src/state/models/settings.ts | 51 +++++++------------ 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/plugins/circleci/src/state/models/settings.ts b/plugins/circleci/src/state/models/settings.ts index 992fd28243..dda4f86cfa 100644 --- a/plugins/circleci/src/state/models/settings.ts +++ b/plugins/circleci/src/state/models/settings.ts @@ -1,6 +1,5 @@ -import { Dispatch } from '../store'; +import { Dispatch, iRootState } from '../store'; import { circleCIApiRef } from '../../api'; -import { RootModel } from '.'; const STORAGE_KEY = `${circleCIApiRef.id}.settings`; @@ -17,53 +16,41 @@ export const settings = { repo: '', }, // initial state reducers: { - setCredentials(state: SettingsState, payload: SettingsState) { - return { ...state, ...payload }; + setCredentials( + state: SettingsState, + { doPersist, ...credentials }: SettingsState & { doPersist: boolean }, + ) { + return { ...state, ...credentials }; }, }, effects: (dispatch: Dispatch) => ({ - setCredentials( - { - credentials, - doPersist = true, - }: { credentials: SettingsState; doPersist?: boolean }, - state: RootModel, - ) { - const newState = { ...state.settings, ...credentials }; - - if (doPersist) dispatch.settings.persist(newState); - // dispatch.settings.setCredentials(newState); + setCredentials({ + doPersist = true, + ...credentials + }: SettingsState & { doPersist: boolean }) { + if (doPersist) dispatch.settings.persist(credentials); }, - persist(payload: RootModel) { - sessionStorage.setItem(STORAGE_KEY, JSON.stringify(payload)); + persist(credentials: SettingsState) { + sessionStorage.setItem(STORAGE_KEY, JSON.stringify(credentials)); }, - rehydrate(_: any, state: RootModel) { + rehydrate(_: any, state: iRootState) { try { const stateFromStorage = JSON.parse( sessionStorage.getItem(STORAGE_KEY)!, ); - console.log({ stateFromStorage, state }); - console.log(Object.keys(stateFromStorage)); if ( stateFromStorage && Object.keys(stateFromStorage).some( - k => (state as any).settings[k] !== stateFromStorage[k], + (k) => (state as any).settings[k] !== stateFromStorage[k], ) ) - // dispatch.settings.setCredentialsEffect({ - // credentials: stateFromStorage, - // doPersist: false, - // }); - dispatch.settings.setCredentials(stateFromStorage); + dispatch.settings.setCredentials({ + ...stateFromStorage, + doPersist: false, + }); } catch (e) { console.log(e); } }, - // handle state changes with impure functions. - // use async/await for async actions - // async incrementAsync(payload, rootState) { - // await new Promise(resolve => setTimeout(resolve, 1000)) - // dispatch.count.increment(payload) - // }, }), }; From 85e5e1f70e3f5198fccb35096731d1f7c7844e86 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 7 May 2020 17:02:27 +0200 Subject: [PATCH 35/90] feat: builds --- plugins/circleci/src/api/index.ts | 13 +++- plugins/circleci/src/components/App.tsx | 28 ++++++-- .../components/CircleCIFetch/CirleCIFetch.tsx | 48 ++++--------- .../src/pages/SettingsPage/SettingsPage.tsx | 24 +++---- plugins/circleci/src/plugin.ts | 2 +- plugins/circleci/src/state/models/builds.ts | 67 +++++++++++++++++++ plugins/circleci/src/state/models/index.ts | 7 +- plugins/circleci/src/state/store.ts | 8 +-- 8 files changed, 132 insertions(+), 65 deletions(-) create mode 100644 plugins/circleci/src/state/models/builds.ts diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index b132b6a208..f7645ab760 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -45,14 +45,21 @@ export class CircleCIApi { } async getBuilds(options: CircleCIOptions) { - return getBuildSummaries(options.token, { vcs: {}, ...options }); + return getBuildSummaries(options.token, { + vcs: {}, + circleHost: this.apiUrl, + ...options, + }); } async getUser(options: CircleCIOptions) { - return getMe(options.token, options); + return getMe(options.token, { circleHost: this.apiUrl, ...options }); } async getBuild(buildNumber: number, options: CircleCIOptions) { - return getFullBuild(options.token, buildNumber, options); + return getFullBuild(options.token, buildNumber, { + circleHost: this.apiUrl, + ...options, + }); } } diff --git a/plugins/circleci/src/components/App.tsx b/plugins/circleci/src/components/App.tsx index 2dc92ea574..799016130f 100644 --- a/plugins/circleci/src/components/App.tsx +++ b/plugins/circleci/src/components/App.tsx @@ -1,17 +1,31 @@ -import { Route } from 'react-router'; +import { Route, Switch } from 'react-router'; import React from 'react'; -// import { BuildsPage } from 'pages/BuildsPage'; +import { BuildsPage } from 'pages/BuildsPage'; // import { DetailedViewPage } from 'pages/DetailedViewPage'; import { SettingsPage } from 'pages/SettingsPage'; -import { Provider } from 'react-redux'; -import store from 'state/store'; +import { Provider, useDispatch } from 'react-redux'; +import store, { Dispatch } from 'state/store'; + +const RehydrateSettings = () => { + const dispatch: Dispatch = useDispatch(); + + React.useEffect(() => { + dispatch.settings.rehydrate(); + }, []); + return null; +}; export const App = () => { return ( - {/* - */} - + <> + + + + + + + {/* */} ); }; diff --git a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx index abd4b2c363..68358dccd6 100644 --- a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx +++ b/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx @@ -22,9 +22,10 @@ import React, { FC } from 'react'; import { BuildSummary } from 'circleci-api'; import { CITable, CITableBuildInfo } from '../CITable'; -import { circleCIApiRef } from 'api'; +import { useSelector, useDispatch } from 'react-redux'; +import { iRootState, Dispatch } from 'state/store'; import { useApi } from '@backstage/core'; - +import { circleCIApiRef } from 'api'; // "lifecycle" : "finished", // :queued, :scheduled, :not_run, :not_running, :running or :finished // "outcome" : "failed", // :canceled, :infrastructure_fail, :timedout, :failed, :no_tests or :success @@ -47,10 +48,7 @@ const makeReadableStatus = (status: string | undefined) => { } as Record)[status]; }; -const transform = ( - buildsData: BuildSummary[], - api: typeof circleCIApiRef.T, -): CITableBuildInfo[] => { +const transform = (buildsData: BuildSummary[]): CITableBuildInfo[] => { return buildsData.map((buildData) => { const tableBuildInfo: CITableBuildInfo = { id: String(buildData.build_num), @@ -58,7 +56,7 @@ const transform = ( ? buildData.subject + (buildData.retry_of ? ` (retry of #${buildData.retry_of})` : '') : '', - onRetryClick: () => api.retry(String(buildData.build_num)), + onRetryClick: () => {}, //api.retry(String(buildData.build_num)), source: { branchName: String(buildData.branch), commit: { @@ -81,35 +79,17 @@ const transform = ( }; export const CircleCIFetch: FC<{}> = () => { - const [authed, setAuthed] = React.useState(false); - const [builds, setBuilds] = React.useState([]); + const dispatch: Dispatch = useDispatch(); const api = useApi(circleCIApiRef); React.useEffect(() => { - const intervalId = setInterval(async () => { - if (!authed) { - await api.restorePersistedSettings(); - await api - .validateToken() - .then(() => { - setAuthed(true); - }) - .catch(() => setAuthed(false)); - } - api.getBuilds().then(setBuilds); - }, 1500); - return () => clearInterval(intervalId); - }, [authed]); + dispatch.builds.startPolling(api); + return () => { + dispatch.builds.stopPolling(); + }; + }, []); + const { builds } = useSelector((state: iRootState) => state.builds); + const transformedBuilds = transform(builds); - if (!authed) return
Not authenticated
; - const transformedBuilds = transform(builds || [], api); - return ( - <> - {!api.authed ? ( -
Not authenticated
- ) : ( - - )} - - ); + return ; }; diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 3d9e14f6c6..cd68577d3b 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -20,20 +20,20 @@ export const SettingsPage = () => { token: tokenFromStore, owner: ownerFromStore, repo: repoFromStore, - } = useSelector((state: iRootState): SettingsState => state.settings); + } = useSelector( + (state: iRootState): SettingsState => + (console.log({ state }) as any) || state.settings, + ); - const dispatch: Dispatch = useDispatch(); - // const api = useApi(circleCIApiRef); // const apiGitInfo = api.options.vcs; // const [authed] = React.useState(false); - const [token, setToken] = React.useState(''); - const [owner, setOwner] = React.useState(''); - const [repo, setRepo] = React.useState(''); + const [token, setToken] = React.useState(() => tokenFromStore); + const [owner, setOwner] = React.useState(() => ownerFromStore); + const [repo, setRepo] = React.useState(() => repoFromStore); - React.useEffect(() => { - dispatch.settings.rehydrate(); - }, []); + const dispatch: Dispatch = useDispatch(); + React.useEffect(() => () => console.log('Settings unmounterd'), []); React.useEffect(() => { if (tokenFromStore !== token) { setToken(tokenFromStore); @@ -71,7 +71,7 @@ export const SettingsPage = () => { name="circleci-token" label="Token" value={token} - onChange={e => setToken(e.target.value)} + onChange={(e) => setToken(e.target.value)} />
@@ -79,7 +79,7 @@ export const SettingsPage = () => { name="circleci-owner" label="Owner" value={owner} - onChange={e => setOwner(e.target.value)} + onChange={(e) => setOwner(e.target.value)} /> @@ -87,7 +87,7 @@ export const SettingsPage = () => { name="circleci-repo" label="Repo" value={repo} - onChange={e => setRepo(e.target.value)} + onChange={(e) => setRepo(e.target.value)} /> diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index 064cce93fb..77a223a162 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -19,6 +19,6 @@ import { App } from './components/App'; export const plugin = createPlugin({ id: 'circleci', register({ router }) { - router.registerRoute('/circleci', App); + router.registerRoute('/circleci', App, { exact: false }); }, }); diff --git a/plugins/circleci/src/state/models/builds.ts b/plugins/circleci/src/state/models/builds.ts new file mode 100644 index 0000000000..71b5c4f4f2 --- /dev/null +++ b/plugins/circleci/src/state/models/builds.ts @@ -0,0 +1,67 @@ +import { Dispatch, iRootState } from '../store'; +import { BuildSummary, GitType } from 'circleci-api'; +import { CircleCIApi } from 'api'; + +export type BuildsState = { + builds: BuildSummary[]; + pollingIntervalId: number | null; + pollingState: PollingState; +}; + +const INTERVAL_AMOUNT = 1500; + +export enum PollingState { + Polling, + Idle, +} +export const builds = { + state: { + builds: [] as BuildSummary[], + pollingIntervalId: null, + pollingState: PollingState.Idle, + }, + reducers: { + setBuilds(state: BuildsState, payload: BuildSummary[]) { + return { ...state, builds: payload }; + }, + setPollingIntervalId(state: BuildsState, payload: number | null) { + return { + ...state, + pollingIntervalId: payload, + pollingState: + payload === null ? PollingState.Idle : PollingState.Polling, + }; + }, + }, + effects: (dispatch: Dispatch) => ({ + async getBuilds(api: CircleCIApi, state: iRootState) { + try { + const builds = await api.getBuilds({ + token: state.settings.token, + vcs: { + owner: state.settings.owner, + repo: state.settings.repo, + type: GitType.GITHUB, + }, + }); + dispatch.builds.setBuilds(builds); + } catch (e) { + console.log(e); + } + }, + startPolling(api: CircleCIApi, state: iRootState) { + if (state.builds.pollingIntervalId) return; + + const intervalId = (setInterval( + () => dispatch.builds.getBuilds(api), + INTERVAL_AMOUNT, + ) as any) as number; + dispatch.builds.setPollingIntervalId(intervalId); + }, + stopPolling(_: any, state: iRootState) { + const currentIntervalId = state.builds.pollingIntervalId; + if (currentIntervalId) clearInterval(currentIntervalId); + dispatch.builds.setPollingIntervalId(null); + }, + }), +}; diff --git a/plugins/circleci/src/state/models/index.ts b/plugins/circleci/src/state/models/index.ts index c02f31a6e1..39623b96f9 100644 --- a/plugins/circleci/src/state/models/index.ts +++ b/plugins/circleci/src/state/models/index.ts @@ -1,8 +1,13 @@ import { settings } from './settings'; +import { builds } from './builds'; // no need to extend from Models export interface RootModel { settings: typeof settings; + builds: typeof builds; } -export const models: RootModel = { settings }; +export const models = { + settings, + builds, +}; diff --git a/plugins/circleci/src/state/store.ts b/plugins/circleci/src/state/store.ts index c06c44d8e6..43b447bf9c 100644 --- a/plugins/circleci/src/state/store.ts +++ b/plugins/circleci/src/state/store.ts @@ -1,12 +1,6 @@ import { init, RematchRootState, RematchDispatch } from '@rematch/core'; import { models, RootModel } from './models'; -const store = init({ - models, -}); - -export type Store = typeof store; export type Dispatch = RematchDispatch; export type iRootState = RematchRootState; - -export default store; +export default init({ models }); From d19c17830cb203f51e9ae3ca6f02f469e11f958a Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Thu, 7 May 2020 17:27:28 +0200 Subject: [PATCH 36/90] Fix things --- .../src/pages/SettingsPage/SettingsPage.tsx | 33 ++++++++++++++----- plugins/circleci/src/state/models/builds.ts | 3 ++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index cd68577d3b..611177a42b 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -1,6 +1,13 @@ -import React from 'react'; +import React, { useState } from 'react'; import { useSelector, useDispatch } from 'react-redux'; -import { Button, TextField, List, Grid, ListItem } from '@material-ui/core'; +import { + Button, + TextField, + List, + Grid, + ListItem, + Snackbar, +} from '@material-ui/core'; import { InfoCard, Content, @@ -14,6 +21,7 @@ import { Layout } from 'components/Layout'; import { SettingsState } from 'state/models/settings'; import { iRootState } from 'state/store'; import { Dispatch } from '../../state/store'; +import { Alert } from '@material-ui/lab'; export const SettingsPage = () => { const { @@ -46,6 +54,8 @@ export const SettingsPage = () => { } }, [ownerFromStore, repoFromStore, tokenFromStore]); + const [saved, setSaved] = useState(false); + return ( @@ -62,6 +72,9 @@ export const SettingsPage = () => { <> Project Credentials {/*{authed ? : } */} + + Credentials saved. + } > @@ -71,23 +84,26 @@ export const SettingsPage = () => { name="circleci-token" label="Token" value={token} - onChange={(e) => setToken(e.target.value)} + variant="outlined" + onChange={e => setToken(e.target.value)} /> setOwner(e.target.value)} + onChange={e => setOwner(e.target.value)} /> setRepo(e.target.value)} + onChange={e => setRepo(e.target.value)} /> @@ -95,13 +111,14 @@ export const SettingsPage = () => { data-testid="github-auth-button" variant="outlined" color="primary" - onClick={() => + onClick={() => { + setSaved(true); dispatch.settings.setCredentials({ owner, repo, token, - }) - } + }); + }} > Save credentials diff --git a/plugins/circleci/src/state/models/builds.ts b/plugins/circleci/src/state/models/builds.ts index 71b5c4f4f2..a260bfb249 100644 --- a/plugins/circleci/src/state/models/builds.ts +++ b/plugins/circleci/src/state/models/builds.ts @@ -22,6 +22,9 @@ export const builds = { }, reducers: { setBuilds(state: BuildsState, payload: BuildSummary[]) { + if (state.pollingState !== PollingState.Polling) { + return state; + } return { ...state, builds: payload }; }, setPollingIntervalId(state: BuildsState, payload: number | null) { From fc9cfa0c755d11ca7ec1dfdb1f9cb0b780af00b6 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 7 May 2020 17:40:32 +0200 Subject: [PATCH 37/90] feat: settings optimizations --- .../src/pages/SettingsPage/SettingsPage.tsx | 53 ++++++++++++------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 611177a42b..033c5cd2ee 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -7,6 +7,7 @@ import { Grid, ListItem, Snackbar, + Box, } from '@material-ui/core'; import { InfoCard, @@ -66,13 +67,17 @@ export const SettingsPage = () => { A description of your plugin goes here. - + Project Credentials {/*{authed ? : } */} - + setSaved(false)} + > Credentials saved. @@ -84,44 +89,54 @@ export const SettingsPage = () => { name="circleci-token" label="Token" value={token} + fullWidth variant="outlined" - onChange={e => setToken(e.target.value)} + onChange={(e) => setToken(e.target.value)} /> setOwner(e.target.value)} + onChange={(e) => setOwner(e.target.value)} /> setRepo(e.target.value)} + onChange={(e) => setRepo(e.target.value)} /> - + +
From b8429894566cc5fc38a85afcc8c0de0a61b577c4 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 7 May 2020 22:22:38 +0200 Subject: [PATCH 38/90] feat: total upgrade --- .../core/src/layout/InfoCard/InfoCard.tsx | 4 +- plugins/circleci/src/{components => }/App.tsx | 4 +- plugins/circleci/src/api/index.ts | 3 +- .../assets/circle-logo-horizontal-black.png | Bin 0 -> 13927 bytes .../assets/circle-logo-horizontal-white.png | Bin 0 -> 15625 bytes .../src/components/CircleCIFetch/index.ts | 1 - .../circleci/src/components/Layout/Layout.tsx | 4 +- .../components/PluginHeader/PluginHeader.tsx | 51 +++++--- .../src/pages/BuildsPage/BuildsPage.tsx | 29 +---- .../BuildsPage/lib/Builds/Builds.tsx} | 7 +- .../src/pages/BuildsPage/lib/Builds/index.ts | 1 + .../BuildsPage/lib}/CITable/CITable.tsx | 22 +++- .../BuildsPage/lib}/CITable/index.ts | 0 .../DetailedViewPage/DetailedViewPage.tsx | 115 ++++++++++++------ .../lib}/ActionOutput/ActionOutput.tsx | 36 ++++-- .../lib}/ActionOutput/index.ts | 0 .../src/pages/SettingsPage/SettingsPage.tsx | 13 +- plugins/circleci/src/plugin.ts | 2 +- .../src/state/models/buildWithSteps.ts | 77 ++++++++++++ plugins/circleci/src/state/models/index.ts | 3 + plugins/circleci/src/utils/index.ts | 6 +- 21 files changed, 269 insertions(+), 109 deletions(-) rename plugins/circleci/src/{components => }/App.tsx (84%) create mode 100644 plugins/circleci/src/assets/circle-logo-horizontal-black.png create mode 100644 plugins/circleci/src/assets/circle-logo-horizontal-white.png delete mode 100644 plugins/circleci/src/components/CircleCIFetch/index.ts rename plugins/circleci/src/{components/CircleCIFetch/CirleCIFetch.tsx => pages/BuildsPage/lib/Builds/Builds.tsx} (93%) create mode 100644 plugins/circleci/src/pages/BuildsPage/lib/Builds/index.ts rename plugins/circleci/src/{components => pages/BuildsPage/lib}/CITable/CITable.tsx (89%) rename plugins/circleci/src/{components => pages/BuildsPage/lib}/CITable/index.ts (100%) rename plugins/circleci/src/{components => pages/DetailedViewPage/lib}/ActionOutput/ActionOutput.tsx (60%) rename plugins/circleci/src/{components => pages/DetailedViewPage/lib}/ActionOutput/index.ts (100%) create mode 100644 plugins/circleci/src/state/models/buildWithSteps.ts diff --git a/packages/core/src/layout/InfoCard/InfoCard.tsx b/packages/core/src/layout/InfoCard/InfoCard.tsx index 7077167828..42c5401de5 100644 --- a/packages/core/src/layout/InfoCard/InfoCard.tsx +++ b/packages/core/src/layout/InfoCard/InfoCard.tsx @@ -126,6 +126,7 @@ type Props = { actions?: ReactNode; cardClassName?: string; actionsTopRight?: ReactNode; + className?: string; }; const InfoCard: FC = ({ @@ -142,6 +143,7 @@ const InfoCard: FC = ({ actions, cardClassName, actionsTopRight, + className, }) => { const classes = useStyles(); @@ -169,7 +171,7 @@ const InfoCard: FC = ({ } return ( - + {title && ( <> diff --git a/plugins/circleci/src/components/App.tsx b/plugins/circleci/src/App.tsx similarity index 84% rename from plugins/circleci/src/components/App.tsx rename to plugins/circleci/src/App.tsx index 799016130f..ec802a88b3 100644 --- a/plugins/circleci/src/components/App.tsx +++ b/plugins/circleci/src/App.tsx @@ -1,7 +1,7 @@ import { Route, Switch } from 'react-router'; import React from 'react'; import { BuildsPage } from 'pages/BuildsPage'; -// import { DetailedViewPage } from 'pages/DetailedViewPage'; +import { DetailedViewPage } from 'pages/DetailedViewPage'; import { SettingsPage } from 'pages/SettingsPage'; import { Provider, useDispatch } from 'react-redux'; @@ -23,9 +23,9 @@ export const App = () => { + - {/* */} ); }; diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index f7645ab760..c44988509f 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -57,9 +57,10 @@ export class CircleCIApi { } async getBuild(buildNumber: number, options: CircleCIOptions) { + console.log({ buildNumber, options }); return getFullBuild(options.token, buildNumber, { circleHost: this.apiUrl, - ...options, + ...options.vcs, }); } } diff --git a/plugins/circleci/src/assets/circle-logo-horizontal-black.png b/plugins/circleci/src/assets/circle-logo-horizontal-black.png new file mode 100644 index 0000000000000000000000000000000000000000..419d97e69bae509d0575c55f3714bba6a60f3829 GIT binary patch literal 13927 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

jPO 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�$Tc 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 ( -

+
}>
diff --git a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx index f725a979a9..25719c3f42 100644 --- a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx +++ b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx @@ -1,18 +1,39 @@ import React from 'react'; -import { Link as RouterLink } from 'react-router-dom'; +import { Link as RouterLink, useLocation } from 'react-router-dom'; import { ContentHeader, SupportButton } from '@backstage/core'; -import { Button } from '@material-ui/core'; -import { Settings as SettingsIcon } from '@material-ui/icons'; - -export const PluginHeader = () => ( - - - A description of your plugin goes here. - -); + {!isSettingsPage && ( + + )} + A description of your plugin goes here. + + ); +}; diff --git a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx index 32939d2ebe..ff078dcd95 100644 --- a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx +++ b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx @@ -1,34 +1,17 @@ import React, { FC } from 'react'; -import { Link as RouterLink } from 'react-router-dom'; -import { - Content, - ContentHeader, - SupportButton, - InfoCard, -} from '@backstage/core'; -import { Button, Grid } from '@material-ui/core'; -import { CircleCIFetch } from 'components/CircleCIFetch'; -import { Settings as SettingsIcon } from '@material-ui/icons'; +import { Content } from '@backstage/core'; +import { Grid } from '@material-ui/core'; +import { Builds } from './lib/Builds'; import { Layout } from 'components/Layout'; +import { PluginHeader } from 'components/PluginHeader'; export const BuildsPage: FC<{}> = () => ( - - - A description of your plugin goes here. - + - - - + diff --git a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx similarity index 93% rename from plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx rename to plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx index 68358dccd6..b23f768c7b 100644 --- a/plugins/circleci/src/components/CircleCIFetch/CirleCIFetch.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx @@ -78,7 +78,7 @@ const transform = (buildsData: BuildSummary[]): CITableBuildInfo[] => { }); }; -export const CircleCIFetch: FC<{}> = () => { +export const Builds: FC<{}> = () => { const dispatch: Dispatch = useDispatch(); const api = useApi(circleCIApiRef); @@ -89,7 +89,10 @@ export const CircleCIFetch: FC<{}> = () => { }; }, []); const { builds } = useSelector((state: iRootState) => state.builds); + const { repo, owner } = useSelector((state: iRootState) => state.settings); const transformedBuilds = transform(builds); - return ; + return ( + + ); }; diff --git a/plugins/circleci/src/pages/BuildsPage/lib/Builds/index.ts b/plugins/circleci/src/pages/BuildsPage/lib/Builds/index.ts new file mode 100644 index 0000000000..c2649d7919 --- /dev/null +++ b/plugins/circleci/src/pages/BuildsPage/lib/Builds/index.ts @@ -0,0 +1 @@ +export { Builds } from './Builds'; diff --git a/plugins/circleci/src/components/CITable/CITable.tsx b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx similarity index 89% rename from plugins/circleci/src/components/CITable/CITable.tsx rename to plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx index 52594b9227..ed720446bc 100644 --- a/plugins/circleci/src/components/CITable/CITable.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx @@ -1,8 +1,14 @@ // Idea for this component to be somehow reusable representation of CI table view import React, { FC } from 'react'; // import { makeStyles } from '@material-ui/core/styles'; -import { Link, CircularProgress, Button } from '@material-ui/core'; -import { Replay as RetryIcon } from '@material-ui/icons'; +import { + Link, + CircularProgress, + Button, + Typography, + Box, +} from '@material-ui/core'; +import { Replay as RetryIcon, GitHub as GithubIcon } from '@material-ui/icons'; import { Link as RouterLink } from 'react-router-dom'; import { StatusFailed, @@ -111,7 +117,7 @@ const generatedColumns: TableColumn[] = [ field: 'id', type: 'numeric', // @ts-ignore - width: '10%', + width: '80px', }, { title: 'Build', @@ -154,13 +160,21 @@ const generatedColumns: TableColumn[] = [ ]; export const CITable: FC<{ builds: CITableBuildInfo[]; -}> = React.memo(({ builds = [] }) => { + projectName: string; +}> = React.memo(({ builds = [], projectName }) => { // const classes = useStyles(); // const isTestDataAvailable = builds.some(build => build.tests); return (
+ + + {projectName} + + } columns={generatedColumns} /> ); diff --git a/plugins/circleci/src/components/CITable/index.ts b/plugins/circleci/src/pages/BuildsPage/lib/CITable/index.ts similarity index 100% rename from plugins/circleci/src/components/CITable/index.ts rename to plugins/circleci/src/pages/BuildsPage/lib/CITable/index.ts diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx index 37ff1e0655..d8ee53114a 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -5,46 +5,79 @@ import { PluginHeader } from 'components/PluginHeader'; import { BuildWithSteps, BuildStepAction } from 'circleci-api'; import { circleCIApiRef } from 'api'; import { useParams } from 'react-router-dom'; -import { ActionOutput } from '../../components/ActionOutput/ActionOutput'; +import { ActionOutput } from './lib/ActionOutput/ActionOutput'; import { Layout } from 'components/Layout'; +import { Dispatch, iRootState } from 'state/store'; +import { useDispatch, useSelector } from 'react-redux'; + +const BuildName: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( + <> + #{build?.build_num} - {build?.branch} + +); +import { makeStyles } from '@material-ui/core/styles'; +const useStyles = makeStyles((theme) => ({ + failed: { + position: 'relative', + '&:after': { + pointerEvents: 'none', + content: '""', + position: 'absolute', + top: 0, + right: 0, + left: 0, + bottom: 0, + boxShadow: `inset 4px 0px 0px ${theme.palette.error.main}`, + }, + }, + cardContent: { + backgroundColor: theme.palette.background.default, + }, + success: { + position: 'relative', + '&:after': { + pointerEvents: 'none', + content: '""', + position: 'absolute', + top: 0, + right: 0, + left: 0, + bottom: 0, + boxShadow: `inset 4px 0px 0px ${theme.palette.success.main}`, + }, + }, +})); export const DetailedViewPage: FC<{}> = () => { let { buildId = '' } = useParams(); - - const [authed, setAuthed] = React.useState(false); - const [build, setBuild] = React.useState(null); + const classes = useStyles(); + const dispatch: Dispatch = useDispatch(); const api = useApi(circleCIApiRef); React.useEffect(() => { - const getBuildAsync = async () => { - if (!authed) { - await api.restorePersistedSettings(); - await api - .validateToken() - .then(() => { - setAuthed(true); - }) - .catch(() => setAuthed(false)); - } - api.getBuild(buildId).then(setBuild); + dispatch.buildWithSteps.startPolling({ api, buildId: Number(buildId) }); + return () => { + dispatch.buildWithSteps.stopPolling(); }; - getBuildAsync(); - }, [authed, buildId]); + }, []); + const { build } = useSelector((state: iRootState) => state.buildWithSteps); + return ( - - {!api.authed ? ( -
Not authenticated
- ) : ( - - - - - - + + + + + } + cardClassName={classes.cardContent} + > + + - )} +
); @@ -64,14 +97,18 @@ const BuildsList: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( const ActionsList: FC<{ actions: BuildStepAction[]; name: string }> = ({ actions, -}) => ( - <> - {actions.map((action: BuildStepAction) => ( - - ))} - -); +}) => { + const classes = useStyles(); + return ( + <> + {actions.map((action: BuildStepAction) => ( + + ))} + + ); +}; diff --git a/plugins/circleci/src/components/ActionOutput/ActionOutput.tsx b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx similarity index 60% rename from plugins/circleci/src/components/ActionOutput/ActionOutput.tsx rename to plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx index 7cc92098a1..18293b790b 100644 --- a/plugins/circleci/src/components/ActionOutput/ActionOutput.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx @@ -7,20 +7,36 @@ import { } from '@material-ui/core'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import { makeStyles } from '@material-ui/core/styles'; import { BuildStepAction } from 'circleci-api'; const LazyLog = React.lazy(() => import('react-lazylog/build/LazyLog')); +const useStyles = makeStyles({ + expansionPanelDetails: { + padding: 0, + }, + button: { + order: -1, + marginRight: 0, + // FIXME: how not to hardcode this + marginLeft: '-20px', + }, +}); + export const ActionOutput: FC<{ url: string; name: string; + className?: string; action: BuildStepAction; -}> = ({ url, name }) => { +}> = ({ url, name, className }) => { + const classes = useStyles(); + const [messages, setMessages] = useState([]); useEffect(() => { fetch(url) - .then(res => res.json()) - .then(actionOutput => { + .then((res) => res.json()) + .then((actionOutput) => { actionOutput && setMessages( actionOutput.map(({ message }: { message: string }) => message), @@ -28,20 +44,26 @@ export const ActionOutput: FC<{ }); }, [url]); return ( - + } aria-controls={`panel-${name}-content`} id={`panel-${name}-header`} + IconButtonProps={{ + className: classes.button, + }} > - {name} + {name} - + {messages.length === 0 ? ( 'Nothing here...' ) : ( -
+
diff --git a/plugins/circleci/src/components/ActionOutput/index.ts b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/index.ts similarity index 100% rename from plugins/circleci/src/components/ActionOutput/index.ts rename to plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/index.ts diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 033c5cd2ee..f99181c26c 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -12,17 +12,15 @@ import { import { InfoCard, Content, - ContentHeader, - SupportButton, // StatusOK, // StatusFailed, } from '@backstage/core'; -import { Link as RouterLink } from 'react-router-dom'; import { Layout } from 'components/Layout'; import { SettingsState } from 'state/models/settings'; import { iRootState } from 'state/store'; import { Dispatch } from '../../state/store'; import { Alert } from '@material-ui/lab'; +import { PluginHeader } from 'components/PluginHeader'; export const SettingsPage = () => { const { @@ -60,12 +58,8 @@ export const SettingsPage = () => { return ( - - - A description of your plugin goes here. - + + { setSaved(false)} > Credentials saved. diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index 77a223a162..8e308bd12c 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { createPlugin } from '@backstage/core'; -import { App } from './components/App'; +import { App } from './App'; export const plugin = createPlugin({ id: 'circleci', diff --git a/plugins/circleci/src/state/models/buildWithSteps.ts b/plugins/circleci/src/state/models/buildWithSteps.ts new file mode 100644 index 0000000000..109ee08df0 --- /dev/null +++ b/plugins/circleci/src/state/models/buildWithSteps.ts @@ -0,0 +1,77 @@ +import { Dispatch, iRootState } from '../store'; +import { GitType, BuildWithSteps } from 'circleci-api'; +import { CircleCIApi } from 'api'; + +export type BuildState = { + build: BuildWithSteps | null; + pollingIntervalId: number | null; + pollingState: PollingState; +}; + +const INTERVAL_AMOUNT = 1500; + +export enum PollingState { + Polling, + Idle, +} +export const buildWithSteps = { + state: { + build: null, + pollingIntervalId: null, + pollingState: PollingState.Idle, + } as BuildState, + reducers: { + setBuild(state: BuildState, payload: BuildWithSteps) { + if (state.pollingState !== PollingState.Polling) { + return state; + } + return { ...state, build: payload }; + }, + setPollingIntervalId(state: BuildState, payload: number | null) { + return { + ...state, + pollingIntervalId: payload, + pollingState: + payload === null ? PollingState.Idle : PollingState.Polling, + }; + }, + }, + effects: (dispatch: Dispatch) => ({ + async getBuild( + { api, buildId }: { api: CircleCIApi; buildId: number }, + state: iRootState, + ) { + try { + const options = { + token: state.settings.token, + vcs: { + owner: state.settings.owner, + repo: state.settings.repo, + type: GitType.GITHUB, + }, + }; + const build = await api.getBuild(buildId, options); + dispatch.buildWithSteps.setBuild(build); + } catch (e) { + console.log(e); + } + }, + startPolling( + { api, buildId }: { api: CircleCIApi; buildId: number }, + state: iRootState, + ) { + if (state.buildWithSteps.pollingIntervalId) return; + + const intervalId = (setInterval( + () => dispatch.buildWithSteps.getBuild({ buildId, api }), + INTERVAL_AMOUNT, + ) as any) as number; + dispatch.buildWithSteps.setPollingIntervalId(intervalId); + }, + stopPolling(_: any, state: iRootState) { + const currentIntervalId = state.buildWithSteps.pollingIntervalId; + if (currentIntervalId) clearInterval(currentIntervalId); + dispatch.buildWithSteps.setPollingIntervalId(null); + }, + }), +}; diff --git a/plugins/circleci/src/state/models/index.ts b/plugins/circleci/src/state/models/index.ts index 39623b96f9..ff1396d97d 100644 --- a/plugins/circleci/src/state/models/index.ts +++ b/plugins/circleci/src/state/models/index.ts @@ -1,13 +1,16 @@ import { settings } from './settings'; import { builds } from './builds'; +import { buildWithSteps } from './buildWithSteps'; // no need to extend from Models export interface RootModel { settings: typeof settings; builds: typeof builds; + buildWithSteps: typeof buildWithSteps; } export const models = { settings, builds, + buildWithSteps, }; diff --git a/plugins/circleci/src/utils/index.ts b/plugins/circleci/src/utils/index.ts index 77697659e0..2bf45aa3e4 100644 --- a/plugins/circleci/src/utils/index.ts +++ b/plugins/circleci/src/utils/index.ts @@ -1,6 +1,6 @@ import { circleCIApiRef } from 'api'; import { BuildSummary } from 'circleci-api'; -import { CITableBuildInfo } from 'components/CITable'; +import { CITableBuildInfo } from 'pages/BuildsPage/lib/CITable'; const makeReadableStatus = (status: string | undefined) => { if (typeof status === 'undefined') return ''; @@ -22,7 +22,7 @@ const makeReadableStatus = (status: string | undefined) => { }; export const transformBuildSummary = ( - api: typeof circleCIApiRef.T, + _: typeof circleCIApiRef.T, buildData: BuildSummary, ) => { const tableBuildInfo: CITableBuildInfo = { @@ -31,7 +31,7 @@ export const transformBuildSummary = ( ? buildData.subject + (buildData.retry_of ? ` (retry of #${buildData.retry_of})` : '') : '', - onRetryClick: () => api.retry(String(buildData.build_num)), + onRetryClick: () => {}, //api.retry(String(buildData.build_num)), source: { branchName: String(buildData.branch), commit: { From 563148998e25c70098ba5337faef907da117fbee Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 7 May 2020 23:26:18 +0200 Subject: [PATCH 39/90] feat: good plugin state --- plugins/circleci/src/api/index.ts | 10 ++--- .../src/assets/circle-logo-badge-white-15.png | Bin 0 -> 46850 bytes .../circleci/src/components/Layout/Layout.tsx | 13 ++++++- .../components/PluginHeader/PluginHeader.tsx | 25 ++++++------ .../pages/BuildsPage/lib/Builds/Builds.tsx | 11 ++++-- .../pages/BuildsPage/lib/CITable/CITable.tsx | 14 ++++--- .../DetailedViewPage/DetailedViewPage.tsx | 36 ++++++++++++++++-- .../lib/ActionOutput/ActionOutput.tsx | 16 ++++++-- .../src/state/models/buildWithSteps.ts | 9 +++-- plugins/circleci/src/state/models/builds.ts | 18 +++++++++ 10 files changed, 112 insertions(+), 40 deletions(-) create mode 100644 plugins/circleci/src/assets/circle-logo-badge-white-15.png diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index c44988509f..44f081878f 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -36,12 +36,10 @@ export class CircleCIApi { } async retry(buildNumber: number, options: CircleCIOptions) { - return postBuildActions( - options.token, - buildNumber, - BuildAction.RETRY, - options, - ); + return postBuildActions(options.token, buildNumber, BuildAction.RETRY, { + circleHost: this.apiUrl, + ...options.vcs, + }); } async getBuilds(options: CircleCIOptions) { diff --git a/plugins/circleci/src/assets/circle-logo-badge-white-15.png b/plugins/circleci/src/assets/circle-logo-badge-white-15.png new file mode 100644 index 0000000000000000000000000000000000000000..4d094c9c5725e334e8ec712e1bc5f5161caa31f1 GIT binary patch literal 46850 zcmX^d2{@Ep_l|WeNg)bF-(aR>OHo;dQpUcus0d}LELoC-CX`ZI#zgihS=uEnmYB5o zOv#jrkR?R+tVQ&nJNo|bdH(0ueeZJibM86k&KWzKE%QW|h$4jM(abkFAS6tL|A`QV zV5FmV^FQ!^B8SYKgAvkzzcv0Lgyk5ABBX?9n@pU-8vDNt*{69=t!=B@FzwQdp30ct zKskJgqIN5^cA5O#>gGTQ5>%B@+U}OG6eMg%7>e5!FF;Vgxb*w4V1?C73Nqfj%`ELO zS)bKcVq{=oAONSqe?6!EoSyp&m25Ntc<_IU*OcZy(m~a{Pj7@crvT5sqT1QK)_G$ zAx3lANcZT=zIChrOv2vz7v{r%Ko-<^Gt1%0)3H9%V&l;v#j|&V9#e8UNc?6VA%+ysIb-5n7oqWz#O(EdZtnbp7a5UQ(1IoU7TlQGT%lh%< z1zG#Zs-gW`wt2Qk3`~!k2CAwe#H!&mrmYAkgBm?x_Cj zo4V;|1Q9B+#z)5Ky*;p|XXKb3;lzqn0ZTQ8mTFW~NXI`Pz7y zuh&Hfq#^dqo{_l&&31h+Y99d*KE&cPX8p!G534Vv--&$PQF?0iC18d-mZF~Zo=WWY z=5Ifk?N%g&>>yOrN5y#H8xFS36Zc*YD4GJXsEP^ouKvP&1uOd=i+kTsl1B9N81q9uGX@&`cf@0lWN;Y;*@{<0WJ#Wn7r5k#6P=yI4{Hx%^a9NqVk>93SFZU?4-S zm5J0{6mbIb5yX%+IS~1{Tl-G7Z)I!%if{$+q?Wy96YCcVBN7eHskFnJt-_l%ydd8) z9nRKAZvV87Jkb(B^qqD9*Km3iBk{Jyvwtoj_O`*%FvahfC<^gFbb3zUwj9=mXk>S1 z8O00;d5I4dc*7a=!6lu6lm;mgr10kPZPDlQfk1f`fQb6|++GVw)H}Fk+bwf%Z5P1q zJU+Y8Ptq|OaYJ5zH+?JyporkP)8`ySpCw*dC_sPYT;UR?A_1^tv%!^kZF(rZ(_8^@ zMJAnPPHw*+4@8`Y_etG<@nbLd!dHYC&8jK6%u{;sXPXKJ>6=^*GdgjHq9`i!FOCl> zJ}(VIa~1fM|JdF_Ic(vrjRg8+aqUg@kjKD5eEz(Q+fTz`eQ5u^C%fR-{dk+_ecp#{ z?I=XlpI9h~STR^^;@;KXl>AMWKrA8uL@P&5WwAa8j3t0tU~FN6SQO?-gjVI^vyvPn zk_~(Yne?Y7?BoKYZ5x6d$2um(p1CyH8M5=rF`Y8Zoi0!k> z+P635Lbgkywt`uU6!r9YKE&Dypt24MIp2{y3?Eog%_{-ZD`8>#v}&|^u* z7C=E}QWUV>3~&{F*57uT4;7u1xeljeC(!66xpEW8!W&TsM8_gYe{|)#m1vZ-AfkFV z=UPeIBsQPnM{cX}an(Y!w+2VWqFaTMw zQ=405oaA^?mNxi;fI`jye)>fw78Lz6c&k3`;mzuWoMmDRfwNrGJr41e@*pbK*!F~aDjWpL^epPz zLZENP=A|k1#S-{hQZr>g=VaK&#vCo4(HK}RsEkgd>aC1XQZW4EFcyp!kBcMjach7+ z!zBS{vogHluikIQ%Mn_uW%J9eV~8wFKyFf1w7ZU~B5GgZ;|l?0G@MG~IM#kT4R$9}l zAeVQ0;o)7Nh!P#U7~j7NBD;0KhLC!FPmkdppt*Kp#*2)zZGk3EG~m~l)wEySc60o} za*}duizWk0O2ZnwW}|V}qqd{?46gL+Yll+zfsngx2XWx~&yc*&^0bJ%V~@kqpJ`|L zP(u=&-bm91uQqUoBZi(gSz#@x+T5I`tukX-G_ILbJqkLZViZuyS`F+S{Ry!CMq zV5(t4wj4|h-C|Efzp;@V*E#P2T|yb*o$LCHTN1=~;aa z)3N+a2X)3F+08Yl@!39iJIJC0*5TW7g7gDpj-P(~Rt5^P%*u0`$>~7qRBRzjAF2!0 zGR9sI!25nkW={78+au~Ikk9SNTOPzEU9Z1Jax=(?wGMbz@RVk;E{ufti5X1Xt?n9c zihQuOE^F1V){O@?(D!YX&V=222QYv1d~ClZelJp-1)PsthEG;fx;>Huv9+pwv^#Qpdr1<}HTs@D3PIrh z-TwixYwRU;xt`nrl7|M`jX(zI(USB>i&wRfcd7stxvs_zk6!ME!&~0YgW1=z9K@q8 zVA8V&&NCvcfmREJQ5l#z`dWR<&{vcZls>}hG2_H!BeoET3ak3nS-le*0ZtUs z63OAe4*rkbhr!u2^HRRN4;vmt4yS1(HeWZe18)v7617gf{!AvgB1HEVcU(%&c-3f+ z!hk9CT)8|0!Krm!H|$`)u$uiG{#;OAdQ~&fYH*5jM93PWIPCfu;ukAvL4lcfRnB9_;n<5Hiel7h$&EH(HO%FDJb_$0gF z$23)%|0Y=?4HhG7a+GwfiPR1d$NWnDuFcPv@s2k$%1y7up3d3}uqpjuo3i9LR!FpS za2JDS;Z8&ephR?+#d%iqR$yj`&=6>w7xB`HF z!z&tRg-n+cd~jK7HDZ`6LhvDi#+Ak00MSHYEf-*N3K`|E#DgD6xfp>ql`XWpiMy{G zxQU^Md*N8?c@DWk*z+PJuMNc3L2WBY>gbBrBwiNJK0=(clwAyxXGIX#!admxtfZ1PBfCh9*IEynBhf&@4 zkC{!eU_T4QV5d;|9IJUaXh0|-G|OS3>lr?}U$F_1>k7oE;Sqxy@f7TeXl1!RY5)Sz zCl+6~nz!^UCahJnxqpP!zVB=Q2@Gx;y9QyVU>}MNpagAVcj}X5mh}q9@mtQA;s%-=lzj zznOD5y0uE4Ir+OVwb&)oBsGesGBS8ApiCW2zkXYKEA}?XcAT+Wtr+BA6Fi^p7Guu? z!+l@lBH;@?Il|&78@q>0hQ{+^n6LCMvgfS5)^p!Y>1g=Ud{#@gq#I>hC_Js z7n$kzmY+RBG(_qCfQ&-R(c2L1f?=rQ*wfG7_mFNoBt%(h7KarN9bn@@EfeA)xek&Z z&uyS__bxJZ3%JXPA%kt$0HSeE72KNhmYe>qz6+-mzLJw)TU|Gua7*?2uH+~$>yAAf}LtM0ETX(ZOme#Ne zERVZVP(A^|GuQ4GB^YFfhSTnL03?3E1J|`@j$!#grC(vh8pCEViLDg6*{-3?J^{kA zG&leY3M+h)qSBr~MiaI1_Vmm491DA%dQl&S)5@z{OzAOzv9ubctIZB0jE)7T1oaBi z4FO7}b(SN};&@PabX6C@|A+`-f-RuT^_(Hq@feFF2J}5k>mV5ZxY~pmvekG_Exo?m*vz^+s!o=}xD!%iQuo3Lq1InC#0W3AmRGB3!!WYD z1Uw^)oH!5Clb^PKj-E~juLL!EkwjT%0k^~NY$?LVJo7;}EVfM{l`RnDLe_*OF-5WU zoyT(`?94A}>uA3sL|IZG5fXlqJb^`Vb(TRH`<9EcR?e>EYol+bbh+_#6e%=xeeH9S z=0z_ObLdgO>;^7{K-8!oOJfYpSui`}Jo|-wtALafevFSLJPPM$d(s+Y1-YA-EnT|w zI_iJz%&6swA4}Ok@f>6U_VhhAbL0mf8pU*8g00j_#@Zuk1?#y0caR zdRx;r^TWyt_qH(B_)g;)vU_x+`P2yn*1 zx&0b%CwCrWoFPNDO_HxvH-3&a{!h*^Bz^M##G{5wo`3ZQDFzn*TrVTYB>`hy?0Cw- z-Kr{b;uRS9CWpCyA5PXbBkICkso@lFClp@?3_1l$KeUE6VmNo^4u^$&2`nXnmc5LR z1TT!In;DJxAv0Ps>=tc~i^EG)lXNVjb;;yXF5!%Rc%s0)b2k zKqg<0zf;Sqw5ru*d32Q|aNuRUecPHkW()@(%$~R{FL>aYfbuZo zuly8P0!lbRSer6OT(s40A)hd?F*EhQ0f1i^B=M6qFAPQWNIU~>DM`6=tY;fhL{4B! zcV_Nf2|%wuBU^NAXcK2eW40Ij`p^VQFDl0o(OLLL@^BQ)kHRWPVqogzoif|w$e#?uB= z);W1aRlxPCQtY?yYAL*H2c!tCXvDIA>{~9>woa9JbzRbb4vBp# z%KF#t1#Qb|?uC7M~&P$Ww~-`j3NUE}EV{foV7;F|KDlV$ZXb>?GYDLR@i3j8FYvj?4vd| z;9s`T2SiQbll5Pc8#b#g&WrFDDY_ybdr1GUH>OYZInC0F4O_O2*D z(UsGk9BEHIMj^WYc{?W>sQ2I%9a=sq7ShC(QPzxzML4d9iybBe>*Sm$OzdTLmhvQ! zF7%6`^AmC|BBl)&>^bH}crrCH9s7$Sh%@tDjjIj1o@nxhrDm3{+;Vk|m89vzDN16@ zoQYvoYb2g~i3V6ou?Jjo6h?WV`IOvZ23t^{19{fhk*enCxbs?aq4ph3QJ=Mf%1#{y zU14*(rjbRi3eLe5dXQ0gK^~vQx>Nqr+SEr~P`UpTx%voCY?0!yil-Z&kKD@5?ngFL zvd8g6vr(@LCcph|Sto1*zM6maGOg!xKqqSZ@O1EM)F?x-p}7yqL5y~#{vQ5FF> zG~n`==^;((UE)$)Bx>65_9!RQ4=<-{^yS=MJaCq;7ow}M3L3+54us#3OS~_~YLSi| zHp(WozQl9Uu;v~IA$58xIL8+Mi-op44Cu!OFt_L-zk3voMR zQPZ$AXU5*Y+kS}T7{WD{`V>rS+FxIT3U0V^1l;#X+i3!5Z%Cd2Yk9||ZLs+KM(6`* zZj|sxpm14VHNWaKDFG|no1<9K*BgADZ#U4*1{UXf`TPVCtwbv)>5!>(E zGlu5ao8O$wJTcF$Rywxey{(Sz;y_^x1S`BEuUSQ40@8yk^=PN&rZ(K#<6x8}IPqeh zDfzDEXZDbdBy}EmtLezj<~pBtyMDD?IrX>=pWZE04zzVbh`bl<5DE~vDj5Wh#$7>;w?)^*U#Aqj+TGBIyT z@GxG3_oLR$>v-VWuvm|{|3MVTwf7%;Jc^1chbU?}^i^aS{=cvky}~z?L&RYlfOK2; zoFha<)|#Ht1)8E^#!|6G@ARu5^7I>OjrT}u9`s3VI82>wU~Tp{K>hm^Wjg0hSYA{jLUX+UI4cbrxptE1zEPF9fBg}h(m}`^uJkA5 z+PbA@9~g#RY0Zf zOO@f)GXCu^*rmD&$70>0FE%bwE1t8!Xv4&IhLkqfQjE!alz^ET=NJ*PbD$g>@xCpe0~N#% zX2zZmd**I>sQ+C6xG8EfnRw&u{{Muozt^>vi%7hmj2iFvE9c!qA#AemkjcW zVSeXn4AN(IJTWtm+o8?5TC?c*4<1bHt22zw&EiFnoRaviK41{w4SXdZ?Ugu_V7An4YaA&c9EJ;6dc~;~;1MDj#*JSf?(7zo#~OV>+b1 z5m4SLr}9gKXQR;0-dd8k2kVA(tkbgtbK2ba_NM)k*YWnD1OHzcu;kX}{Sa>SGd^D9 z?H_VxYql;U`l3tWPTsYhe)rd^>dSII3s-LbeEDxMiFz{k-(HgAZY5bLwvCq?LR`<| zD(e>TTf4)`EAhOY=n~U%g39x*Dec?UeSdBc?)U?GTsdLAiycB5P+I&M1u>0^ICx*Al zE@$~m$NG9)3_8ZsW)zm@9`VYi21HWTOWTmA^r-2lN_B!B#AU{tUQHk&7? zd=H}0ITwN+g{EUjPsn7KeOpnzWzGV#Z6MB4NjV$6QOD$8%U6Gm9b04EBY4>wmQv@s zzhtGZIiHw*`ou;D$&vI2q%Cvai*8}%c7b*(ddyW@$`*$l7+gb1HE{>YRJp}>6^(9oXNRGS~eF|pktGN z7;j#(%daSrXf}VNJNiag8VPp67*Zv2t9gqL$yMa|PRDS7KmTc_e$jr8-F&CF0`89! z=8T2YVAJXfz1lv#&0aDUvSHt2;%2|rW=$UnpUs0d4U3r+od*8P4w9iw>ecrFBe#DZ z(*_r{);?G>O>$IU7aIvSP$)MsRKNRj8zUXz0?wButsCq3sG{q{$ z?~RgYduKB}f1UXEXZ7~F(@?f~_J^_i^og5fV(Is}90Zr|wFvvy*YP6a^{1~6?nyrR zRY_G6npA3!Wt^B?<78&iP^0$_2kb2O@~&2uHY@cqH>Sgq^AC1x&m&2Rr(W-W-ZhE)i+X$O!}J-VaCDb?wKvF%9sgtJ zJ3<*|3;uOC+^$e^n24w@EgKSEuowf~6jBGx08kC@#q zyK{m$g{=KzJ3UPt7Znw_k;QiI&~h^o6BAPBMm_mD|Ks?pv&<5`(WA>(czNl0s3>+_ zdt>mcG`YLfHOsN`7KJ$N$1GI6KcfX1PR_}1%jZi)TV7&+x>v7ylss>hr6^)M{!RiV zEK7P%$sQ6WKh zW2?m9kawi3k_AsRQpBJ?COC1Qx=^NtNkh3kr?GP4JOs2&d63Q(Jn^VG`J`ig20|aF zSHW#ROjOW)+KUzi@dov>QJ1>|H#3^rXR~z1aSMa&mC7YzOLlkq+i_%faY@! zbFQ~Fn=R(DW+2Z5ayj(6{4lbf>nuEloOhU?*uErf|20 zqlL+|C|^X=jO)oE$o>{cRlIn9J0dQ+z`Blf9F&E%I!RJ6EalzQlF%iV7x_@g_x076 z(_CfFT5`N6_WQQlYIww{)~<;Fr4GJ+d=bCN}9@ znAbu;Yrp$Pp7#tep?@jKT9N)T31W=2@|9V>%pyQckaxL#}8m zq*LAgc?d7pJq=a&4#bYPdY+@Tq#g6ZKwGd3IZD4tMgL6Ee zo7QHE)X517G=rs1{?J-wFZl^lML664Q*~O5?@+*!X=y(6`(JBL{08y#=mOVlX4>vd zx&Zn)C0JvSqky&Ig4Nzq=o}l;HUk;(n4@~zYQ4TulB^Ca-8YkV68+IFhMzSS3? z0YgqhDh7pkD&Q~1IR@r0*;kZqzrG|Uh1^(H;(XkPo>qY3n@w6)u%ggBNL>iIQQ?E# z*+Bf^`M&r=bSueEdvVfKOF>nLkYA&t3Y|CZsb}57@CUeyBJOcLiryZmjIx3{t^l^D zI%Mm6pL;|XNZ?umJ*t#8V$|hzOH2aoEU-G7-_^~mJ_3d(?Tp(F>Da^iQUt_xym0mz zv<~`kw{l{hR&0V!ow52KQ|WOh>?8+UK-0jT83reJZe(PWg$O-yW*qAW$MXyjKjP}G zULYQ4NIVjd(h2uL>V*h%XXW;7(rBzfw@WqkU^rsg_M7QTidKHvV}-2=OYNEu{u z^r0iUIFKtEQ1$fq3NtQVH}EsI#XSwIAAK|T<)-}h2y9r5QOYkRRou~B1RNfAOWDUL zJW~4*dYCpV=8CU-2Ws&}KOx7AKwleaMG>k61JGJz9>gp(sLy~&LN%MX0ZDQLE#$5< zrfJFiXjQS*(eOhQQ4}^2Nv{J_&IjeFr^I7#1l%WWaEiGxFtM|h@;YbLO9HA5O&bxI zg^F}DT*N(8qh}#J>YKd*{-E)T$}h=jaXxmg`e=c1djdYH;cP(_cyS$!RGTBGoCcLz z_N!G6OW810iVuyaondA5n=~jMo6mYb&UY9*4wD8wtJla!<=hU95X53s<&aX5T{gFnD! zzQQqgQ4%!lta!ut&FplLM%0ttl(Ey%ho-IY!M`r*tOLvC754Yw#*oWb&aj|8y~#6N66HU0VYEVr#Jv{;RP)5T z_};K3XQT}(miyuhzy$H;G(3FG^caTH6!*3nGyw?178?Kq0f>_bv&V>LZ2p6if93oeXodA*6^}#AsvpOB48=&Vi9!`)+NKb z^ow|%Utzrx8aC{J#5XE&k1w!SCF=2t2?Z`$9`{U8+jP=V{H-DP2C;Ep^r2C;HfVeT z&j7Vd%|Pae(;wVpxogDI_xO7Sso1pDI9cCt{xvi07~Ch@itm2vUa$-V*|*wCU_jgC z$-1*UnwFu4vQ|bqn6d^sjiY;2IGsSZUTxMO2kSRH+Xg9)w2+L>ZcMQn=j&EdxO=Uk zAcffI5q&6FtpT6!2q_;(U=*0CK?8{}2;ADvJd&k$(KCVeK1G~k@O|aNVJH9yZcQ2v zgZp=b^J%yUTU=F&Fw`4Hbn7QpI_Jly2=qa9$4Az`lthsme@jkt6N``}7nu>rsDNur z+53R|K%IhJTPThvajwy|-Jse@eB4p8{H;OG0$~((CXG3B{4Sv9fzR*uwq+^ZSP9JWoL7)LD^Uuo>Q=97r%6@rk)G|4f7qLwd6HNjOr>P zyX*%fV@R2 zQwU(WIm%4)O@eNToq=hE(eIA|TWWP>Ouk6RO86qT>8M><#ydcPeBK#&R=>kcvkj4R zvG_Q#?bc=KOz+fATWuIRlvr5L0;9m1znS9Mz6;Mf1ku&0^%P=OK+5|FeiTvbX|c`+ z8iRV$AS5|WKw;5)80s(VmRX)Ns>PX$wko6Bwen!#sLL{Pn)^$kcs|U(dclWkf%efk zr~mU*DYNTeO(2^%o80AEje%+X5$s#x05x>mBhn!1!+!OBqk`DINI&iy&4L~t)Ec-V zdWuX`WJC8`MxHvQ1W?tY){%yQQxVTgNqeDaFa&E)^oH6%--pXu(m2p5Q0JRMiAg@+d=BW?%Q)VVP3G?W*F})3LxuPF+c`N%a!y&9UIizwQsFw zPA(9M-DYi8a7?r^;DNI$oRY_^Hkk%R^?j@B`8^c5J!#1?xL6}WAy)Vo8BxJsueUu~ z=>pnPaCDTJ^KuY460=6;nLkW;JEnxh>yN430Ofvc?tG^m8eX)_!>=ed?Ygtg;pcll z2ER69vzl|HW5C6uo;Tzi^@x8&kzD#DWu;gFKftJqi^H%0wbx9{p-8kv+xnC zrJfCvi52^9%b-(T>pl1OLo)>Gf8ocOt?j;s=qBr|j@q48w1a}cLd%_qeR22Q<9`A` z;tPW7m^rTyy6V0icXF4gz=#u4thbTSCB?#;?f2Cdf~6REUkNW~G*7&b1fid>ozTnoah zU1Jp&hns{kI@#_BJ;nKzo{Bl$c)D7~MDLWVRD-i-!#gdYd%E69AnoxG;zKJYltIhT+Kn_K@>_4Cv*@|kyc{J3 zm7{%qLiF5pwG{AR^m$Otrl#4L6*zCC5cA3pARkU~YXD?0Ho>X^py31P`Z|zAU@79g z9$DkP)|m$_KUK5X)I^^a)N@M+uCf4D4`*w$j{rRh5MMVfA%|GJ{+yCW<|D2kGO>?o zuRI#gmCMFvlZGN{;N2D`Z>i1&KyRnE%rmdCr%FXu0wA-E)rvSi;eF7W`(Q9G!%zKq z*KtBj2%2Kjwg3zdH=H|0lYiG8Jxs2a-=mG3`pV(vB8Y<{HC!&sZ*&s42ULK^DO8Yj z>Kz-$iGPJq@0dolx%fTkSwJPB$%VEBm|;7uvAm>aoNhZjaV)}3;b%C3wf+dyR6+KU zUGaW~tp`MK8S!n0r*=x(L_S1z8Ph?-7GQjJJyHt|jF4Tj9$*(%Y_tfl3*b%Q6^ngd z`*Ak<15ffVP%5|g>^0FJf5=BY+@h8OS4XMdl59l(>Ueo2x$p`i}wK@g2f#jgVth* zS4$_2u#}wYTHB>u3~rHaV{JBUFkK!7(TUOZ{^xuMZ46Eu8J>d6hnu%VqQaT>?^AY? z=N&&K3!=~tgK8@fdGUs=w+{)T($E#rd3_sAdOF2WX!m;6UvP7zEuy?0FRNzCZ}=S!3-S2p6VLrKEqffA8oMys9dPN+x%4X5n7VuK$wT{1`X? zhu9n$6Idl1o4CVO8pJ0Pl4wwF-uU{7i3lofo17HcsR0^fgnB+aY~2HXFUgEC36f*; zG{JN8@%*l6JAQHWrI?n|0=3vo@61AIp66!VAeP_z7(Gm?K5=h8S|9j$cHk*yOWD7= zo@Vd>t+ds(Ji80-ygje>GgfK?IJc}EwtWLl9I}SmcR7Bp8BtrsRJjB+s4uoI&N~eK zBR#Pi-#6@3C+6KRBcqUZ9eh(j4d+&NHy~~boOtJDv|Wc7YC6)PCktBv?ZDO)98Ow1 zbN-Vk80g34Ya#8D$W*xqyVj(s;;NZ%hHzVjd#kJn`u%*GnR5ZY45Yk>f~N$2NfWa| zAUVSg5HD;25JSJbda8jM9zBO7{Z9u=!K++=9XEiSJ@1!S2LM&>q{g>du9At( z%;%#I6rYU*3*sgV$x`Ti_DzWTz7iCI>X3PTCwK=G8fp~vj}U4QeSI#kAwnJAtb-MJFq7JNrK7BVVs8#MN|f*j^QyBr*h8kQK=8RG{iPX>QOZkW3D8)Sl^ zo7_9)-Ep6*N<}~--zpl%VKYKhLz~3ipqp#`S40c1l8#lCM{c7=Bm2+dSWbu(#BM)cZiS6#wN)M(rXHa zKoyI=uc#J=faO)#Pu0V+vE|S&bPj@0DSuqau})PfhNP(7h4uuJ3?7Yma|NdpK%{HTjeIX@}%e zm31Mz`PgT_kg#__;eB&(-x4oTYKHjW;nO_GCau>Xw7rb7DRu|l8*AFi&;xmpZIbU5 zz84tHT_}QvgO*`8PrrIawOEQDl{L6+xX}ncQ(aROX&zRzg!>dkRmI>8w%bciEk~@Q z5V%0_n9idE&NDA`tXhuBPD3sNqQ>0&AIPZeg$W~DIchi+-JLA^WU2iFMZx4(cFSG7SY zBTOxzx5o{5qjKZfy!!*&rGKC3n2$2MoCE+Y;~fX2QKqfQlYgYDmO{iFN7@c_L**Vz zEED+H!3t`N=Y8j|*9Ap3s5z{TTazQ2-ml?D22HGzn@dE&lFd^h(DPE_VbMm#S{s!1XMex`rQ$VE`ey~31Rt`e1Z#VYMNuPz|= z1#5*?oqhlH0+_*;26gJ5%YxzBle_U3t5kz%J)e(V7hzS1l?$$M%Mo2IMZ7C!P;3dh zc|;b|9%(){KiUJghH`Lw8-KFk?E@>Sj`SE~#_*km%I@lY7I@{ z2{?P@msjQA(6DrjoPU$77ILZ)G=Mi86j{oAWtg>gab=tni0V^NIjr{$to`b1L{V$- zMFKOnbOjMMGvq^ijwBXtAp&7lS3$X+fXZ)8ZuFmy7NoDR#`ySFt9M=9gxdO4BmdCx zaBqYK519fpOeVdjG@ZdwVSJ3s;9P4FURL+$5en84nik<*V!S>TsP znNNXpQ^$Ti9}ts9Hvv+Ea@9oR!h1*?;3-!O+(1j=I>GPa)jc@?Z!!G_hKJLqx>uQlR# zmLBESz6tyo9J^y|l&B}I7VxpVRU@aVE)b5;BovJyKiL0W8#EKy-7w?XxIe4EHwib& zDxi=-^=jM%MSY1^#n4)fF2Y_Vhm)br7H%ZIDcDOZ(VSIA^KF;mSBhVtEovp0L>2+4 zra+))9(Hk&#>Xh=p^IrGFh}s-V%Y9B6yk{4sfe3n&eh*s{c5=T#1a7OAHTimqN1GlJh7INz|QsG&4 zpDU}R5Y^=8zAfiv&>>~`nFHN`ONEE|kof28n#=He&ZfheJiE;j_F9hI+QJ{qZ+|3K zd4I1UlH~#@dk52N=V@4WNq*PmHVARn6w zG0A&eO+Y;_4N5eC$^#O9k3gUiBSsoocNuR(d-1HsIaB)Sua1f8>KZ8()EE-gXtP1*ke1d2EIC-e`NE&z^ti7>WY43isk`s~84U~!8}B(joxtDL zVgO<5sT;o{iH||F7{6<^`Pl4;(=+<$lo!)sO!3a2>3uWDqnbNvBQk2mo||!kf-U3t z*{pMkzk$L+z1_NHOJ1)Pt0XzEGeUBbkVc)EctSMT`KQKs(QDbej`5YZ$P$E8Zc80w zk$7Fe{;(8#kZs@d-%aSVPc-?}j*;7J6w_#HJNxKkreRq z-MQ(?;n`(qJQb=#==o^WjC@17pKNR%ZT3(E;syf*y{j!K{I(v|-0~-T7-JqYS(cZO zlcxekt@bEm|Ji_uCc$>79iE?$!rzQ3Q4L>FPPWn1<<|?;Lzc>n!+@6f7K2k zHm$RsEc~k^hACh7$NF>LuzHS@5KA7cf|gd|qSg>uso0JkJ3%6+C|$4qK~35gDGSqI z-6WN@9OgK^KG_;Tzf)>HvP~R`zwlh5E&}E*afEqqhKhO;N15`UkZ%iVzUAqqr(;$@ zWwlU}KJYu~j|zy$zI(-b&Gsf?sh#sNt{#BvgUytjw*Bgg7Doo*@%!qEJ|zG6G;|or zo!|4RBC@7osORvv^Yc)6r(^Rbfd*#w_;}?Xhovi=B;M!5FlW^N*rcc$ED&M8db0_! z*?0ZY-fuMtODmL?M`O=Yh{)A1wNU2S@x(GIVVSVBPGib^LPoCDL%!jlvm}T>+>})B zJZ-<5Bxh}LY-&#xyn39Lu7fveYb+?PHhTk1dXFUQY}G$|86v6!ylkTu0{6G-X}gA4 z<%`A+R8-p%gKG6`D9$$5U+*wgpu79@mbXV$-O~#OktrAj70>L5 zI{vJ}F=@e8iT5{;&}JDM1_nXd%Ly6QUNDXozCEsb@(OV&zpf9MhD^^Id-S) z-HhVXL1%_#l?Y0}J>bJ@I+V0me<9+|U=RZ{<=4;_#TfM;o{eWT+W?b)|#HN66Z72Lj;@zFDHqoaUD+0C0PXRdb1xE5kJtAqCX%bdsX? zf^e$$hfz$`S9-#+#JCxeRU1UbFVPO5DgXDCX}51EmBEdf{-xNGA`F>8q5i1oMx&U5 z$RUTM&l_X}wY1>H{Y$9kr6@(Ti&S1p6hP}kE4tfuOS7p7iMvU^Y}M67UBb)ydoJnI z34sHG)GP{dk9%ro%w8g0Vs{=hWS|J#{MIxhwKTkiFZ;zuup0+6i8if?xtqq>HM zmU|XwTUISZ@*x$iZ8XlvC$w?3Wy-eoiv*pzwW{|(f9F`MnYa+*?n!KHZHwYpZn+!t zyN1S(BKcr<1`MV?&xTAeTHwW~jzd1w2X-kz1(uCA}$T+Fm zL4l1x?dFv)5Y&CHtIR!;v{;aJ@1`bka@(z~XP=#SOfn1amg8>|_Wx9|7*fLgYh3@# zD@rF99k&Tycub9d=E0#%KC11^N|}IwqE?^$*Q7d$G;8P;Xg5x9@Q(tE+INLt?sgh8VX*s0h@qBmHdCea z_7lQPNXiJe-$9yc+pM|{Vqn8jWf|kP`sC>0`_qMo3TKb>$O-g7K}}`9#x-dHbBh+v-gOXNbnWfMfQ2J@8!1CC?zGOj?jzaElc1 z0#R#!uk>uVx_-J`9zvZ)$gV#Ol04OC%}E%SvPbhaK%Lg`snf9JlfSV0sS$orFttf(Ma3(V-F%lkFX+Q3(*n_xg9Xng`Prjf= z9Se99yj7a5SLX631D<+dbk3?ocr-#^dLw9=DJIf~{mh`%e=^AQ zdFx#NxGX-)m*2cw0F9Yn7Hn@h@NncKgrY8kub=5%Lyy`tJeM&cZ7q`}He)M}#(I92 zmRvS~_hc{ybfj^m@Cit59woZN>ofuug@1PEHSMJPJGJVws^O5b08)UkL z%V{W~FRq_B1#vWF-taG3D2cK*9^VYFy1p;>q^(6guh$%hq6BJKy=~awu zs!P&+KYP|w*w z>j3;qIOq$0&h^0-K>WG_-|Kq_QUITp9X=uy9}Z*WjA*9%#Pxt%uiEEWhr)3Qts8XobrPOCE23Ezg6gX$`>SlSMOit5;twN?qpk z;7vXjrAOWX5_j1U`>{;44Pz!eBd#%hP)+Fc;Oo#qcx-ofKct?kcM zF@j?svmmQp+WuRV{)s0tRcg~`Ny67qcz-REwx6z1V+IReJuJHfexR!lLDotxNB#I= zvZx!vstH_I+_}D@qO&R{#5BRCCY^W~j-KJmF-|^>*{8_#puBiahy&FI3jk)dn z$^iFg@CRQkRBJGorf%uqNTl|?g2ni2S&KpSF8DgGsv1ro+}SVH#!zFbkQPL6U8jqs%xmdepTRKVS24 zl9^n{J3Ip3Jo^!bb7IC@t3h2>WnCapZ>g3>@$-()e1PBo{Ji`8$dzuA+m=UcYO7!~hM98PI7ey>2poGTn(pNFE z<08J3JShff?T|HRqZ~>rgr?Pbg)hi(UG9v6e9)ur$^M_Gh}@N`i3Fc_KFONpSOW!t zr*4;Ui}bD|i4F@Pog9{9&-inOKo=Sq=sjtTNe~0-LnsN7g9s=sFs*YZ)Nn&E#mTP% zvzM?AR;Z?&CNvOlhqU2*st{>RVnqWV8ER;t~B7{Qd``E2dPvzlI+EHhlDfJiG+c z33?Gg#`)`DI%`p!_PcpyZ!uH6yyyQr08IJ8kF-7{4tv5i^~1O1C)M-I($g|fkyn7M z<^do){c0*aAGG@)XKx-4W%vGppRp&Qq7vgVkoojht=Wz+R z?x`_{c-)K=F%=sVJ1Xig*)k^Moy650tKEMF zd*boxIzwMNn(KU=@IV~S?k*$u}T4$Jvwc}rhN})Y1Pll`O0TP%ObN5gC zvu>EqlBsr%q;aID0SG{@w(mat4D3yN2Rgo99nc$RUVBSBFBh*IBO33+)k%iHbU>cFKVLh;A!veB%S^Cmj3UX9!q@Q)F$$FnZo}c`kc!Y0 zBBbzMI5MK}!CBZIhl>lxQJ!I)@gawqdBIm)ODpFRIEN~d-xQFO(=iWvYPr{2Et+mh z`j*p{`88jb(|WGXvDT@o0 zZ~x;mhJ0)2_;iq-AJy4Zzz^{(+t{*#vhblgs|u+`ikp}>Tu$IcJDdfgv}8toX)6r@ z6h2-XA0eolf)ho2-k-PKsgA`jeFC($&;*VRtbIO|&WP`GXn1#*Y%PzUA@HI^B2Ifd zC54e3n?1|b`cnLc!-TkXsUd?PNi~oyJHJC{e()4%#{Sr5GY`(nd!`Wmh} zOo%Kq<{O*Ui1SosmQVo`w#lsP(?RO%atE!J`FC2$2x@*R*~^M4=-B;+%_O0r-Bz{EIT&`Pe@qh)R1W+=!>aYvAXDBTUQDqcPQ_I%*NsKeddZmN-_3H-@HX*7ep_ z3A`ic{#Q+SNa=~S9LHv+xRsolDDV3PZw+?|vN)i&BpOB);(O1W9)&_NX&lfB*T9L} zES67LL*F0TST8B)mdP4oKb&ysoSUKtg2{+X5Bs;|$C0>#;o@L2$%|TUpwQ)p-DpE9 z5C{%WB{s~tL^0pUt!*}=NwF?ez8FX~o%+m|lW4nHENQ#gheRt6u1LzNJO7!0xgwj^ zzY^y-rOskZ}AJZ}eGg=qtU(AfeBX9pufvLk>@=yz60D|OE%gEs*OLB`X zfx=KAV7mAWwrO-xJH2*47F@-cj%0dJ>nN^&%3nmP8`CJ)zk3O$N}%Z+!4l3CmwT1) z-+Oq4J7rf~_Q~l+E72Df6J{R9=+1ztXNBo-mRt(>s}!~War|{A5J5Nemf|~dK98oP z?2>vI&OKq`!7Z*>t4$phZ|ISeS&0b<7R<)-%29+fZc5C$L2Hsf4Yj?(i*gA}A%?|? zjGarubCp=cCQb9_VCU=4TUD3lPp@`-F>vODjLdwFh1mV!3r6m5mvNY{X(3iKTqdf; zb+}55=VKYE7y(BjWS^R^Z`qF)>FPcCRUS+9npbSMC#F9xJu4iTA&qvSq2Yc(r00>D z4c~`SGRiz`Cr|Q&b;NvMVdLje4L8TJF;kN7r|yKaat5=kZ=|M>r&gS#L@dRU|IZSL z<4=0~lbAstRLy|`==bgF+%O!B6PRfX3?IcU3Rxie>K2ALh3-NZakKTT_8Mxj$)PG= z&M@qD{(SYt`*%=IKtaGrt>DOV^21~#%ft^`#e><>2+2ngs1GXi&tD9e(yGEQ;)3+- zh75oC{@!e0UVfM?8A>5Q@>y&83 z0_|p;>J3u+Fnn@#I%w6G;#_iPi+XeQzu(EVL=cKw!tagO6_(INK$R0=W^g$ix94{o z)28=fnBM@E%Y0e`YR!B?=RO8-5h!oD_kVsMx&p+RLvJsfHBPYca3m=Oi281fc~$Nq zfJ8n|w;@FA7SS=5!ss{?ucH zn*aTQ4-Sc@2J`wKaEYMOzS#RUs-fDV6WpDn5!k_BCDC8+3rxqs=_A)9zt$nRUZgzLX_0 zGfQP$+R`HmJpoS^l>d8^K6XPXL`YEGBjm7PIhLKC=g$DJe|=`~F{L4;;{dED$I&6zCY2JXXzkw3(^Vl@QK+hif(sbbL$bTyCOr|F}E$ zp+>k$rBLT9zUfd%Lc4K3Q5LqTTOpegR%Ru5zj-r8omFUf@H+EeMSY|q_t%QQNXia6 z07lrHhmW)7_i9M!pambMh2SY-q}O-6m@i-mNXq|tOMNa2Vv)*zzc zz5hA}lc4YE)N`b^)3e#olYW$vJVC-UsSC~vJV<)gKqbO~kFA$wj~?66-fm}ln~V9F zX)>Cnh$~O+=OU3b=5lihPXTra>8`lOC>Ah4$fw*+kuX;K)c8E!4vo`C=BvQ3qLvp;Z1 zg`6S6JPazcF0vdz* z0vG+eyQk7w^a^5&anqmJlHH}CO}U5J6{G24W0b2=gA3oQKuSn^z;auL%A2MhfzzZ) z+(zDD6wCALUL-&0EAr`tylkWv{9_&M?L6Pp^e#WIV|LqqMedelCW20GZieJp?Rn_+ zdHdlc<`s73{1dQ`@4wUWLsA(e7xT=xcY=h<mB!X#x>; z&#cY?S*iTxBf52aKC!yCZ=|>&vynP?g=k?P%9UjQ`C|Q2yBF(-$`Q16G&tqm0+==< zXzQM(R$12{5+m7e+?YcwVNRAS^Z!#{r$Jm}G|N+I@U*xk-J?Qgqk9BmZmb8U%<8NV zW90Qi-p{@bRo`r?dILdTdBFZLV@Z+a^B*!4-X#RrYSU; z26L>Y*`5NbN9DTf^9n}8*xrbsc~;0d46LPr5@OD~2|gDs$e}OYrUJK@`xLq3^FFuQ z(h17(R)+pXu4Ewo;}&j4cDD(!`MVM{f>ku%k`oQ=)W{j{ca7;0ob+qGgA1;yrcB-$C2km}1;2;m?F)pUs&%~$pL z%haaZUb4qBlU2}2yI+0oI-^75Y*oipeErsaowl?K=SB!cgeOXf`KcwrP^1a2(P5Eq zy({{#U;ok|M17@hsJ0Zh@UDH{*)3T6i*~$XoB@I>w?Aa9W;Aflr%GMVlU2XME~`oG zSWEX`dv4WedK(aAxZj8zCMf!qa(c^OG(Y<3SLe`@Rg@@}gxh{yS3N&Y4sW z7pDw>=mj6owi-q5-i)==@VuRF7h8f3O&R#3#C+XRe^k-4Zt&Wxor?9}iYF7JxfQe5 zQ1PEM|Gu%;K#F^+Z=%nT4ct}Ki)8<&?T4R*SFUfJOyHb;cVSO7w7j1Ufbqhe6}W9A z)HCg0N*E>PcQ`V(^uL(;M!Yi;E}JTsQj41DnLyM_;rCcI_`RkmTritX4(HqN0Y+1K z^kz&(E$j5BI=BkfYZO-!l}io(ezfKIJF}_8vOF?=)=E|{?3mD?%GG9f|Is(+IplpD z2Jc#JK!Rk=hZ}`Twomhx7EE~`!f{(RLgg2s3v+bjc3#cmz#4ItTedvx7b6$x!eSO( zG0O@QpDOOeMP&Ee4BGs4(W-E+-u{ridO2<^@Ul$?+ymG7Cv1XQ``}LL`8eQTP5jHF zKhBhpV_Km!nw(G7_pGqnP`b2!+s4aN;i}hT!=JtUemo=lcXrP&PF*Ibhf${p?#kS$ zv=_!mL0E-AhziH{?Udn8UH0Nn`6*f+h;oktTs$WRuBb_+ z0y*dQd-VAmKt^w6!SmLOQRY9Ygpuh}nwrF>x6KpDqjk$`QfJg}HZ2+f1#&6lBc+GI zZ@NiY(4#l}bTc4B<7zt%UE-@3Q+t-rs5VW~8t5i6sBwzl+wEPLJxa3r{FykwEM-2) z17|qw$CfuzGHXLeeB_90wyedUAQi-P?kd)kPOW@YCx(Oz$rmhFg-nq3Q~)h( zgNyFspDWr8LAfJ3KIdK4W4P<=%kgEWzn?=c5(6LC zeSeA7A6H;2Xk3}gTHFQEIEJ}zhGa);S%L4LwQ|)7!g_p8zwyL^v@$o)(>|x)mB#NG zN=|?JaN-f`P%G`518kx9*5CXGworkQL)^+zw{L>hD{hHOx0*GLv?{1Y$aAjzrrp4X z0X3Q@!hgf+FR{MZyIL8b^9RO2k>vjK%RppMKID^-eYAedIbcTYDR=Bmo5bBe1IFBm zZlA@&C`(gGuh1Hd-7{pr^RJYk@IBhHo}M~(O@Fbt$C-Qh%$=vQBU(;P;)ix=L;F6uD+wMqKC&4kF*U`m|NMG< z)=|;PEg<0M7*PJvZSn6u_n!N*QjHVt&USu3s8$nUw759!3Lo;|qxTdU^U=rI2?~?t z;GRV%?bkh+Z?uf>v-85-{kC-gV*60a%Y=&4eRcR0=#m51xr zHAK5|U#u)K8DCpot63dYH&u=ZLZ)om7mj_B{^I+NgmnVoShv&d$pDM3-CmykyW5skm}l2x zgDo&~JqXok_4kVfY7U-?OOc8BzSIQn_8xYCwovOa~1 zr78$$9SM6v=0Tn!Uw>Q3*oxTuvm3Sgr2`~{ zhma*Lc3dqnS|7gr_?4;y0Q5-klH^96GGEHty)MBu80aJ8<@+vux7)iQbkd92;iP19 z*bzzMm9DuvB2=FZi+tNL-}! z_tS&L>l9nI>e#Kuu_z_?=@q}@06c9Hyd=2$^OabF^ZMr}d7o@T0uQbw z>-xJ*;ep5BJ((&d;QlhtiJQfd)M1-Rzt;55Y|5~ll%pgmh@0Y;>ksYNz}f|Ma;uya zDJGO>AG#v+zWllP3_Oc;^F|L5$BtdWLpqy>2DV~CZ@LiGhX&5BnijlV@$^i%x9(rc zRw#tQ_c9;}&k38y)Jt`lv>K#6K7B!{Ve)a9#i;`KVT-$3$0f~^I-#w7L||(`R@AW- zR{lJO93~s5wAYmWl5}>9+Dulz-wvZ}b!Q{Ym`H-4p3WMU9}>W9MX-r;3xAkX;L zcHI#c!DrspS?W*BR~#aEx)R!^LvjHJgbr2VjEWa5(fcENqzZ zBzS(S(gF9ba2O%>bz_R_sG?Zukt=rGF4QcJbyehdf9cs*LO5Q(6Ij<4XLlb69Hlx! z+$f;qvu##eIr(8$X0zPfK1hqVXy91(y2|YiU&L$IspFoO(`Mik`uSe}zOdf|&g0Pi z#znknXd*K2>9sw2w|k(ts>fxNM^tcM*B2KVgST(gxUU@O0A_`+x<}O(hC7eH(+gNE zR=fUqWaZloOi`&->D!AF03Y}H76Q(nC8;#z!XZmBA6 z5kRQ%zrKHVVx-1k%ni$*%fznrxJVeBmyz&&W-x9;c|q5BYg0;jRyKcDOl$p7`_ z2Iom{aop#@-R{rA3I`fyY`*cUJ7{2o@_>Yx@M0(>==5*R*FH*p9PF28d1l1&Rz6f3 zPZSaxtn7k*of>S|_&cxc*XGFXwl9T)@q39S^)4c>ZmIl`uHRto8zjbcUv=S%Ro6-x zf!mZXE;_OA?~mjz!p}%r;$+4TCZKtDm#~j}7pHCLd%Ng|i+tKE6TXa^z=Kru!4i&i3u2VpYikq#)5W`azR=wKp|G`KwGv-tKUicRS`mkDR9HsoEt z>rLvaBKm8bES%i`*%bB+=13P+1rsqr#~qQ;4V^EUe&S(x3=!s)s8}sdl6+&F<|B!Vx4+?i7PVp}Q$39EF#fDPtH|Onoo{FG z5FdTrobqn;R0LVAJo*m;m|6UNTW*hT#UFc;qhWt~v;K<4m5u|#S2rYx!6S&6mkOL{ z6kK2AvtEzLSq1Npv<|^r`b^*{hnla+njDo5>5lW7CblwUjVVN1QhkGwk-7Vp>E?~= zh{S&@&C^LsbnNZXAJEb&M5!qPSmIfxbQ1s`w!}5gyoP@baz}r}zXOnSXwPk$#)hxkd)4bL8<9Z{(Sb46Id~?fd zC@BiNF&lPrBp*s*hw;VHu^;M}uOA3Z_`3*!NjpwvYv4W%(BQZNW%Q(GU8jaHtF+D( zLul^Z5%v!(tyz<|(dehE=QSHAgM#mbz;82u8xzASbc`M~+xrY9ouNa??$5d-*M) zHFnSF*y$uB9^dT3HyJ5d4fV9-d$~nJ?=Ru0mZ}oVALp8&G65XjN~#PcmQe>>>JeJq z`nd!?JpwNrl!yxoiQmp^aG$+-nB<%LQvpoXThTiK3YnHLN{jRTHu0|>Iv_MHD{Pe~ zE8k&)W^OzFZZ4+VS9Z=>#Ed)9pghEarC%FETFORE*;8+GR$QQ2cq9$_Jg#A??hN=& zSiXwXx|}#W&~aphU#SMM>_10a=r&*=UQT;IdnG+vX*Mk8%s0iU`SXyKYGc6U0-HC` z!7WE{AL;W|hsYvu!{Bp!&*BDW6q|~b{zmixsc&8qMWdEoIDn`KRXV zpqkX%ePIKO>38`dQYUd#OUPY+GW`m4PL|F$!~G(ai!u(j4u^^-iTXPc&PX~{8&=G>ZjT&BVjf$T zVSb3wrX=>|zW}jv)3^UY-7;+F&9Xy?Wz|-u6JDm#2%T(6ySC!DFtSLAsHB-u(F^L? z4I?H8vIGW`WG3eXu0)(?CB^lI?RDVPKA>!c99OV&pCaw@MdHn?e}(|~OvxE5D>zZ$ z)Uyzavaa&FcW8SBi@Rv1eb9I*aIS)lmIPtr*}k(V1W`b;K^(~^WgH8g*8>2G6iHIFgftO@O?Ha`& zJSbP1w4h%CCw!!pu0}kQ^bPZ21mote)MhYArPiL#9t!}GyW1vTEY@79-QVIT#yvG7 zN;(i*RK|c;0Q%^RA6T~{5;5<-PwhHsXo z_2IVRmMU{Zoo+sQj)E!k^P4~Rj+5ZN{z9HMtNr+!@R#>alz?|L4YBQg&~xq#uE(4P zruywPYpyr^@UlwnM-Sn~v+ujn6*hc-gMJa+W?M|{ zJ6b+g_e0C$D)7%vCJ?$lBTwe{#s!jRede(|iH(|hL*Dga5DzC&tOBy5!_sHtKH^!7*&1e}FLOQa%AV~cYp3o%p5RNJ ze{ZBdNL;5Uw!-a^;(MCs&0+CXx451T#8R(bKjLyQGA;(&HB(=pq7SRe}Fhclc4`uLr7=R;|*K3l@o|mNhOk8{$co%>B^*E-xM~d2qJaSQl`Jqpb#W&jmH6!8sXWS@P zh7WyS-w^pdA7QKnx(V&7i7zkv>u)4V;=@)IP$CTRV#^#k0_>P3Z3YbF5bm~odH379 z&fQRoxUAK^=M<^F+Y#TE00K^EE~W>!-qSM6duI)SfpzwLyly5Gw8ZlrBIxtHxqmuJ&^L3_9CB2BB{d5 zliBeh>v+{h{GlSRjqN_L#kt^S`nSI+0kPCZ-EI}5XEz87%I z6^CBI_w6_)nSZBaP;xaZCGKu-Z($L=bdaj&QcQ!9g9cB(Bx?oWAfn@^ZvrY3omL^z z0TY#LXuUh@MpanbWNEH7ojT!4rhGfkZ))diKglt!wkP;hpnQ3?uZK znK-qv?YX5$(<2Zr9~0y(uln=JHd>xS%W29YfpE_PknP@_Wr_y8#(_^P&uU7zyAi@b z9<4Pv@N35AuiI4ZB)MW@s7{;m1 zlp~%dUA!l*?jTLipHFcc<=*ILw^;}FwrBlQweKT(zi7r`yE(81uEeExLD^mJnM^o!*<^D_%p zV^fNJ0hIRBlj1@wasek`E?SK!D&C{cJ>{OG$C*R-<2uPqq3R)y{TwG_`{YSj#uGa1 z?^~R(@aMmIH5Px28FGIeEEOtO0WNCy0X#xQi;l7xnN?1?DvtW1^&K1knZ?2$1KQ2A zGaU1lXJUj~Q=|DSWamh0z?8YF(@GBTX&J!bDLse5u9#0DtlorA9uASF>BqAn#HFx~ z-PQtb=K1yOv{|@8Ez=G)lp?5JANU6P!21_$6kWtEmD#obY`FjQ}q zoeX0CD&l?K0IagWIa|r*yHdoNe8(WbjQBpX1E?&L19O`y-4es4$t#P&8ga?9;lqhX z2G+8@&U+xN^9YzIduKy4`HIMKXVHMt)wKJa%lDdLTR~6l#Xv5qH57eYVBO~f>6;VR zq)l%M99<{3+^`wLC5g#~ajP7zD@CkHzlDzd>XO#O`FkqEL0$_-d`STrhYAAWIh7HUh2X-GXr`3 zhG02Jz&W)m2M!1uu2I`ISpaRZoj%0)?$(8JSQ4_%=rZ6bx~Z>1);FCtsX8!E(!Bln zyFpiXZ$j=kk9l%VjK1LXGE9bOvIj;sr|Tz3;b|;fl@bv&uZ-fWpXTGe^&)F0_n@nllc?`6ZHk5d5zW}u1G@V?{=#*ET=2L z2imTDE?3)@#l0S?(U7wkN3BUT1Iksj?o`j$pMd4%h^MnBvnlvsU!sPq`=$#MfU%eY z?*P&)+`5Lw7LkeHx3)=u(1cTv$I%_32{rxy3?-J2uwt79kh-gU%4a{p`(ND3KgBG5 zg#VLeFq5rXZA0>sCs9qpg~k?|c<<=e(QTf$fKg=T90Xc!86L~~Ii@0BoIEh2HUJ?0 z2_}xYbLqr^YU^R7v$-K&_q`70L#iDVkpWXEJQmIv2im47MO005hS?l$I2&%fn?#KC z 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 literal 0 HcmV?d00001 diff --git a/plugins/circleci/src/components/Layout/Layout.tsx b/plugins/circleci/src/components/Layout/Layout.tsx index cea9bc4081..81f5f68d44 100644 --- a/plugins/circleci/src/components/Layout/Layout.tsx +++ b/plugins/circleci/src/components/Layout/Layout.tsx @@ -1,11 +1,20 @@ import React from 'react'; import { Header, Page, pageTheme, HeaderLabel } from '@backstage/core'; // @ts-ignore -import logo from '../../assets/circle-logo-horizontal-white.png'; +import logo from '../../assets/circle-logo-badge-white-15.png'; +import { Box } from '@material-ui/core'; export const Layout: React.FC = ({ children }) => ( -
}> +
+ + Circle CI Plugin + + } + >
diff --git a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx index 25719c3f42..f875c54f02 100644 --- a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx +++ b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx @@ -1,7 +1,7 @@ import React from 'react'; import { Link as RouterLink, useLocation } from 'react-router-dom'; import { ContentHeader, SupportButton } from '@backstage/core'; -import { Button, IconButton, Box } from '@material-ui/core'; +import { Button, IconButton, Box, Typography } from '@material-ui/core'; import { Settings as SettingsIcon, ArrowBack } from '@material-ui/icons'; export const PluginHeader: React.FC<{ title?: string }> = ({ title = 'Circle CI', @@ -11,18 +11,17 @@ export const PluginHeader: React.FC<{ title?: string }> = ({ const isSettingsPage = location.pathname.match(/\/circleci\/settings\/?/); return ( - {notRoot && ( - - - - )} - {title} - - ) as any - } + title={title} + titleComponent={() => ( + + {notRoot && ( + + + + )} + {title} + + )} > {!isSettingsPage && ( + ), // @ts-ignore width: '10%', diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx index d8ee53114a..7562409536 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -12,11 +12,12 @@ import { useDispatch, useSelector } from 'react-redux'; const BuildName: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( <> - #{build?.build_num} - {build?.branch} + #{build?.build_num} - {build?.subject} ); import { makeStyles } from '@material-ui/core/styles'; const useStyles = makeStyles((theme) => ({ + neutral: {}, failed: { position: 'relative', '&:after': { @@ -30,6 +31,19 @@ const useStyles = makeStyles((theme) => ({ boxShadow: `inset 4px 0px 0px ${theme.palette.error.main}`, }, }, + running: { + position: 'relative', + '&:after': { + pointerEvents: 'none', + content: '""', + position: 'absolute', + top: 0, + right: 0, + left: 0, + bottom: 0, + boxShadow: `inset 4px 0px 0px ${theme.palette.info.main}`, + }, + }, cardContent: { backgroundColor: theme.palette.background.default, }, @@ -48,6 +62,21 @@ const useStyles = makeStyles((theme) => ({ }, })); +const pickClassName = ( + classes: ReturnType, + build: BuildWithSteps = {} as BuildWithSteps, +) => { + switch (true) { + case build.failed: + return classes.failed; + case ['running', 'queued'].includes(build.status!): + return classes.running; + case build.status === 'success': + return classes.success; + default: + return classes.neutral; + } +}; export const DetailedViewPage: FC<{}> = () => { let { buildId = '' } = useParams(); const classes = useStyles(); @@ -60,7 +89,8 @@ export const DetailedViewPage: FC<{}> = () => { dispatch.buildWithSteps.stopPolling(); }; }, []); - const { build } = useSelector((state: iRootState) => state.buildWithSteps); + const { builds } = useSelector((state: iRootState) => state.buildWithSteps); + const build = builds[parseInt(buildId, 10)]; return ( @@ -70,7 +100,7 @@ export const DetailedViewPage: FC<{}> = () => { } cardClassName={classes.cardContent} > diff --git a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx index 18293b790b..63d78412a0 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx @@ -5,13 +5,13 @@ import { Typography, ExpansionPanelDetails, } from '@material-ui/core'; - +import moment from 'moment'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; import { makeStyles } from '@material-ui/core/styles'; import { BuildStepAction } from 'circleci-api'; const LazyLog = React.lazy(() => import('react-lazylog/build/LazyLog')); - +moment.relativeTimeThreshold('ss', 0); const useStyles = makeStyles({ expansionPanelDetails: { padding: 0, @@ -29,7 +29,7 @@ export const ActionOutput: FC<{ name: string; className?: string; action: BuildStepAction; -}> = ({ url, name, className }) => { +}> = ({ url, name, className, action }) => { const classes = useStyles(); const [messages, setMessages] = useState([]); @@ -43,6 +43,12 @@ export const ActionOutput: FC<{ ); }); }, [url]); + + const timeElapsed = moment + .duration( + moment(action.end_time || moment()).diff(moment(action.start_time)), + ) + .humanize(); return ( - {name} + + {name} ({timeElapsed}) + {messages.length === 0 ? ( diff --git a/plugins/circleci/src/state/models/buildWithSteps.ts b/plugins/circleci/src/state/models/buildWithSteps.ts index 109ee08df0..4bde261f09 100644 --- a/plugins/circleci/src/state/models/buildWithSteps.ts +++ b/plugins/circleci/src/state/models/buildWithSteps.ts @@ -3,7 +3,7 @@ import { GitType, BuildWithSteps } from 'circleci-api'; import { CircleCIApi } from 'api'; export type BuildState = { - build: BuildWithSteps | null; + builds: Record; pollingIntervalId: number | null; pollingState: PollingState; }; @@ -16,7 +16,7 @@ export enum PollingState { } export const buildWithSteps = { state: { - build: null, + builds: {}, pollingIntervalId: null, pollingState: PollingState.Idle, } as BuildState, @@ -25,7 +25,10 @@ export const buildWithSteps = { if (state.pollingState !== PollingState.Polling) { return state; } - return { ...state, build: payload }; + return { + ...state, + builds: { ...state.builds, [payload.build_num!]: payload }, + }; }, setPollingIntervalId(state: BuildState, payload: number | null) { return { diff --git a/plugins/circleci/src/state/models/builds.ts b/plugins/circleci/src/state/models/builds.ts index a260bfb249..f427175bd8 100644 --- a/plugins/circleci/src/state/models/builds.ts +++ b/plugins/circleci/src/state/models/builds.ts @@ -52,6 +52,24 @@ export const builds = { console.log(e); } }, + async restartBuild( + { api, buildId }: { api: CircleCIApi; buildId: number }, + state: iRootState, + ) { + try { + await api.retry(buildId, { + token: state.settings.token, + vcs: { + owner: state.settings.owner, + repo: state.settings.repo, + type: GitType.GITHUB, + }, + }); + } catch (e) { + console.log(e); + } + }, + startPolling(api: CircleCIApi, state: iRootState) { if (state.builds.pollingIntervalId) return; From ad353f859f797c239d1d0446d748ddb80b1d19f0 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 7 May 2020 23:56:05 +0200 Subject: [PATCH 40/90] feat: readme --- plugins/circleci/README.md | 51 ++++++++++++++++-- .../src/assets/circle-logo-badge-black.png | Bin 0 -> 50079 bytes plugins/circleci/src/assets/screenshot-1.png | Bin 0 -> 232916 bytes plugins/circleci/src/assets/screenshot-2.png | Bin 0 -> 155747 bytes 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 plugins/circleci/src/assets/circle-logo-badge-black.png create mode 100644 plugins/circleci/src/assets/screenshot-1.png create mode 100644 plugins/circleci/src/assets/screenshot-2.png diff --git a/plugins/circleci/README.md b/plugins/circleci/README.md index 46d48e9411..d1a2a7c9e0 100644 --- a/plugins/circleci/README.md +++ b/plugins/circleci/README.md @@ -1,6 +1,49 @@ -# Title -Welcome to the circleci plugin! +# CircleCI Plugin -## Sub-section 1 +Website: [https://circleci.com/](https://circleci.com/) -## Sub-section 2 + + +## Setup + +0. If you have standalone app (you didn't clone this repo), then do + +```bash +yarn add @backstage/plugin-circleci +``` + +1. Add plugin API to your Backstage instance: + +```js +// packages/app/src/api.ts +import { ApiHolder } from '@backstage/core'; +import { CircleCIApi, circleCIApiRef } from '@backstage/plugin-circleci'; + +const builder = ApiRegistry.builder(); +builder.add(circleCIApiRef, new CircleCIApi(/* optional custom url for your own CircleCI instance */)); + +export default builder.build() as ApiHolder; +``` + +2. Add plugin itself: + +```js +// packages/app/src/plugins.ts +export { plugin as Circleci } from '@backstage/plugin-circleci'; +``` + +3. Run app with `yarn start` and navigate to `/circleci/settings` +4. Enter project credentials and **project** token, acquired according to [https://circleci.com/docs/2.0/managing-api-tokens/](https://circleci.com/docs/2.0/managing-api-tokens/) + +## Features + +- List top 50 builds for a project +- Dive into one build to see logs +- Polling +- Retry builds + +## Limitations + +- Currently working only with project token (personal credentials WIP) +- Currently only top 50 builds in table view +- CircleCI has pretty strict rate limits per token, be careful with opened tabs diff --git a/plugins/circleci/src/assets/circle-logo-badge-black.png b/plugins/circleci/src/assets/circle-logo-badge-black.png new file mode 100644 index 0000000000000000000000000000000000000000..dc5de12c8a5de445b272838c4f18513ac7a33d16 GIT binary patch literal 50079 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 literal 0 HcmV?d00001 diff --git a/plugins/circleci/src/assets/screenshot-1.png b/plugins/circleci/src/assets/screenshot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..2c84d8a828be2b39cc7a58e1f5db6edc46e853bd GIT binary patch literal 232916 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 literal 0 HcmV?d00001 diff --git a/plugins/circleci/src/assets/screenshot-2.png b/plugins/circleci/src/assets/screenshot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8c4fef13b925f475845f3850d81cbede0f4f506a GIT binary patch literal 155747 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⁢ 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 P_#^Z9$)jQkL%;t6ckRAZ literal 0 HcmV?d00001 From cb64acdf82ead8882d94c652bfcee2bdb135a777 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Fri, 8 May 2020 00:02:31 +0200 Subject: [PATCH 41/90] fix: readme --- plugins/circleci/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/circleci/README.md b/plugins/circleci/README.md index d1a2a7c9e0..28d6b9c1c8 100644 --- a/plugins/circleci/README.md +++ b/plugins/circleci/README.md @@ -4,6 +4,7 @@ Website: [https://circleci.com/](https://circleci.com/) + ## Setup 0. If you have standalone app (you didn't clone this repo), then do @@ -33,7 +34,7 @@ export { plugin as Circleci } from '@backstage/plugin-circleci'; ``` 3. Run app with `yarn start` and navigate to `/circleci/settings` -4. Enter project credentials and **project** token, acquired according to [https://circleci.com/docs/2.0/managing-api-tokens/](https://circleci.com/docs/2.0/managing-api-tokens/) +4. Enter project settings and **project** token, acquired according to [https://circleci.com/docs/2.0/managing-api-tokens/](https://circleci.com/docs/2.0/managing-api-tokens/) ## Features From 2830369c52a3d8c53141b18fbb4c9d51b52d3775 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Fri, 8 May 2020 09:19:14 +0200 Subject: [PATCH 42/90] refactor: clean comments --- .../pages/BuildsPage/lib/Builds/Builds.tsx | 12 ---- .../pages/BuildsPage/lib/CITable/CITable.tsx | 58 +---------------- plugins/circleci/src/utils/index.ts | 62 ------------------- 3 files changed, 1 insertion(+), 131 deletions(-) delete mode 100644 plugins/circleci/src/utils/index.ts diff --git a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx index 3195d8b587..2044fe531b 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx @@ -16,9 +16,6 @@ import React, { FC } from 'react'; -// import Alert from '@material-ui/lab/Alert'; -// import { Progress } from '@backstage/core'; - import { BuildSummary } from 'circleci-api'; import { CITable, CITableBuildInfo } from '../CITable'; @@ -26,8 +23,6 @@ import { useSelector, useDispatch } from 'react-redux'; import { iRootState, Dispatch } from 'state/store'; import { useApi } from '@backstage/core'; import { circleCIApiRef } from 'api'; -// "lifecycle" : "finished", // :queued, :scheduled, :not_run, :not_running, :running or :finished -// "outcome" : "failed", // :canceled, :infrastructure_fail, :timedout, :failed, :no_tests or :success const makeReadableStatus = (status: string | undefined) => { if (typeof status === 'undefined') return ''; @@ -71,13 +66,6 @@ const transform = ( }, status: makeReadableStatus(buildData.status), buildUrl: buildData.build_url, - // tests: { - // failed: 0, - // passed: 10, - // skipped: 3, - // testUrl: 'nourlnow', - // total: 13, - // }, }; return tableBuildInfo; }); diff --git a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx index 7185b591cc..8fa710e54f 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx @@ -1,6 +1,4 @@ -// Idea for this component to be somehow reusable representation of CI table view import React, { FC } from 'react'; -// import { makeStyles } from '@material-ui/core/styles'; import { Link, CircularProgress, @@ -18,16 +16,6 @@ import { Table, } from '@backstage/core'; import type { TableColumn } from '@backstage/core/src/components/Table'; -// const useStyles = makeStyles({ -// table: { -// minWidth: 650, -// }, -// avatar: { -// height: 32, -// width: 32, -// borderRadius: '50%', -// }, -// }); export type CITableBuildInfo = { id: string; @@ -51,7 +39,7 @@ export type CITableBuildInfo = { onRetryClick: () => void; }; -// :retried, :canceled, :infrastructure_fail, :timedout, :not_run, :running, :failed, :queued, :scheduled, :not_running, :no_tests, :fixed, :success +// retried, canceled, infrastructure_fail, timedout, not_run, running, failed, queued, scheduled, not_running, no_tests, fixed, success const getStatusComponent = (status: string | undefined = '') => { switch (status.toLowerCase()) { case 'queued': @@ -69,48 +57,6 @@ const getStatusComponent = (status: string | undefined = '') => { } }; -// export const CITableBuildRow: FC<{ build: CITableBuildInfo }> = ({ build }) => ( -// -// {build.id} -// -// {build.buildName} -// -// -// {build.source.branchName} -//
-// {build.source.commit.hash} -//
-// {getStatusComponent(build.status)} -// {build.tests && ( -// -// { -// <> -// {build.tests.passed}/{build.tests.total} ( -// {build.tests.failed ? build.tests.failed + ', ' : ''} -// {build.tests.skipped ? build.tests.skipped : ''}) -// -// } -// -// )} -// -// -// -//
-// ); - -// export const CITableBuildHeadRow:FC<{isTestDataAvailable: boolean}> = ({isTestDataAvailable}) => ( -// -// ID -// Build -// Source -// Status -// {isTestDataAvailable && Tests} -// Actions -// -// ); - const generatedColumns: TableColumn[] = [ { title: 'ID', @@ -164,8 +110,6 @@ export const CITable: FC<{ builds: CITableBuildInfo[]; projectName: string; }> = React.memo(({ builds = [], projectName }) => { - // const classes = useStyles(); - // const isTestDataAvailable = builds.some(build => build.tests); return (
{ - if (typeof status === 'undefined') return ''; - return ({ - retried: 'Retried', - canceled: 'Canceled', - infrastructure_fail: 'Infra fail', - timedout: 'Timedout', - not_run: 'Not run', - running: 'Running', - failed: 'Failed', - queued: 'Queued', - scheduled: 'Scheduled', - not_running: 'Not running', - no_tests: 'No tests', - fixed: 'Fixed', - success: 'Success', - } as Record)[status]; -}; - -export const transformBuildSummary = ( - _: typeof circleCIApiRef.T, - buildData: BuildSummary, -) => { - const tableBuildInfo: CITableBuildInfo = { - id: String(buildData.build_num), - buildName: buildData.subject - ? buildData.subject + - (buildData.retry_of ? ` (retry of #${buildData.retry_of})` : '') - : '', - onRetryClick: () => {}, //api.retry(String(buildData.build_num)), - source: { - branchName: String(buildData.branch), - commit: { - hash: String(buildData.vcs_revision), - url: 'todo', - }, - }, - status: makeReadableStatus(buildData.status), - buildUrl: buildData.build_url, - // tests: { - // failed: 0, - // passed: 10, - // skipped: 3, - // testUrl: 'nourlnow', - // total: 13, - // }, - }; - return tableBuildInfo; -}; - -export const transformBuildSummaries = ( - buildsData: BuildSummary[], - api: typeof circleCIApiRef.T, -): CITableBuildInfo[] => { - return buildsData.map((buildSummary) => - transformBuildSummary(api, buildSummary), - ); -}; From e4e5c02ed52a38430b4a0a95f5c7401c03831041 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Fri, 8 May 2020 14:18:17 +0200 Subject: [PATCH 43/90] fix: some leftovers --- README.html | 138 ------------------ .../pages/BuildsPage/lib/CITable/CITable.tsx | 11 +- .../src/pages/SettingsPage/SettingsPage.tsx | 7 +- yarn.lock | 14 ++ 4 files changed, 18 insertions(+), 152 deletions(-) delete mode 100644 README.html diff --git a/README.html b/README.html deleted file mode 100644 index e9a0e9c19e..0000000000 --- a/README.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - -README.html - - - - - -
-headline -
headline
-
- -

Backstage

- -

License - -Discord -Code style -

- -

What is Backstage?

- -

Backstage is an open platform for building developer portals.

- -

The philosophy behind Backstage is simple: Don’t expose your engineers to the full complexity of your infrastructure tooling. Engineers should be shipping code β€” not figuring out a whole new toolset every time they want to implement the basics. Backstage allows you add “stuff” (tooling, services, features, etc.) by adding a plugin, instead of building a new tool. This saves you work and avoids the need of your team to learn how to use and support yet another tool.

- -

For more information go to backstage.io or join our Discord chatroom.

- -

What problem does Backstage solve?

- -

As companies grow, their infrastructure systems get messier. Backstage unifies all your infrastructure tooling, services, and documentation with a single, consistent UI.

- -

This blog post provides more examples of how Backstage is used inside Spotify:

- -

https://labs.spotify.com/2020/03/17/what-the-heck-is-backstage-anyway/

- -

Project roadmap

- -

We created Backstage about 4 years ago. While our internal version of Backstage has had the benefit of time to mature and evolve, the first iteration of our open source version is still nascent. We are envisioning three phases of the project and we have already begun work on various aspects of these phases:

- -
    -
  • 🐣 Phase 1: Extensible frontend platform (now) - You will be able to easily create a single consistent UI layer for your internal infrastructure and tools. A set of reusable UX patterns and components help ensure a consistent experience between tools.

  • -
  • 🐒 Phase 2: Manage your stuff (next 2–3 months) - Manage anything from microservices to software components to infrastructure and your service catalog. Regardless of whether you want to create a new library, view service deployment status in Kubernetes, or check the test coverage for a website – Backstage will provide all of those tools - and many more - in a single developer portal.

  • -
  • πŸ‡ Phase 3: Ecosystem (later) - Everyone’s infrastructure stack is different. By fostering a vibrant community of contributors we hope to provide an ecosystem of Open Source plugins/integrations that allows you to pick the tools that match your stack.

  • -
- -

Check out our Milestones and open RFCs how they relate to the three Phases outlined above.

- -

Our vision for Backstage is for it to become the trusted standard toolbox (read: UX layer) for the open source infrastructure landscape. Think of it like Kubernetes for developer experience. We realize this is an ambitious goal. We can’t do it alone. If this sounds interesting or you’d like to help us shape our product vision, we’d love to talk. You can email me directly: alund@spotify.com.

- -

Overview

- -

The Backstage platform consists of a number of different components:

- -
    -
  • app - Main web application that users interact with. It’s built up by a number of different Plugins. This repo contains an example implementation of an app (located in packages/example-app) and you can easily get started with your own app by creating one.
  • -
  • plugins - 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 API’s and reusable UI components. Plugins can fetch data either from the backend or through any RESTful API exposed through the proxy.
  • -
  • backend - GraphQL aggregation service that holds the model of your software ecosystem, including organisational information and what team owns what software. The backend also has a Plugin model for extending its graph.
  • -
  • proxy * - Terminates HTTPS and exposes any RESTful API to Plugins.
  • -
  • identity * - A backend service that holds your organisation’s metadata.
  • -
- -

* not yet released

- -
-overview -
overview
-
- -

Getting started

- -

To run a Backstage app, you will need to have the following installed:

- - - -

After cloning this repo, open a terminal window and start the web app using the following commands from the project root:

- -
yarn install
-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.

- -

And thats it! You are good to go πŸ‘

- -

Next step

- -

Take a look at the Getting Started guide to learn more about how to extend the functionality with Plugins.

- -

Documentation

- - - -

Contributing

- -

We would love your help in building Backstage! See CONTRIBUTING for more information.

- -

Community

- -
    -
  • Discord chatroom - Get support or discuss the project
  • -
  • Good First Issues - Start here if you want to contribute
  • -
  • RFCs - Help shape the technical direction
  • -
  • FAQ - Frequently Asked Questions
  • -
  • Code of Conduct - This is how we roll
  • -
  • Blog - Announcements and updates
  • -
  • Give us a star ⭐️ - If you are using Backstage or think it is an interesting project, we would love a star ❀️
  • -
- -

Or, if you are an open source developer and are interested in joining our team, please reach out to foss-opportunities@spotify.com

- -

License

- -

Copyright 2020 Spotify AB.

- -

Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0

- - - diff --git a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx index 8fa710e54f..d3f45a6414 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx @@ -1,11 +1,5 @@ import React, { FC } from 'react'; -import { - Link, - CircularProgress, - Typography, - Box, - IconButton, -} from '@material-ui/core'; +import { Link, Typography, Box, IconButton } from '@material-ui/core'; import { Replay as RetryIcon, GitHub as GithubIcon } from '@material-ui/icons'; import { Link as RouterLink } from 'react-router-dom'; import { @@ -13,6 +7,7 @@ import { StatusOK, StatusPending, StatusNA, + StatusRunning, Table, } from '@backstage/core'; import type { TableColumn } from '@backstage/core/src/components/Table'; @@ -46,7 +41,7 @@ const getStatusComponent = (status: string | undefined = '') => { case 'scheduled': return ; case 'running': - return ; + return ; case 'failed': return ; case 'success': diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index f99181c26c..f9f479d436 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -9,12 +9,7 @@ import { Snackbar, Box, } from '@material-ui/core'; -import { - InfoCard, - Content, - // StatusOK, - // StatusFailed, -} from '@backstage/core'; +import { InfoCard, Content } from '@backstage/core'; import { Layout } from 'components/Layout'; import { SettingsState } from 'state/models/settings'; import { iRootState } from 'state/store'; diff --git a/yarn.lock b/yarn.lock index ddd2b87518..6be455842e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4197,6 +4197,13 @@ dependencies: "@types/sizzle" "*" +"@types/jquery@^3.3.34": + version "3.3.38" + resolved "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.38.tgz#6385f1e1b30bd2bff55ae8ee75ea42a999cc3608" + integrity sha512-nkDvmx7x/6kDM5guu/YpXkGZ/Xj/IwGiLDdKM99YA5Vag7pjGyTJ8BNUh/6hxEn/sEu5DKtyRgnONJ7EmOoKrA== + dependencies: + "@types/sizzle" "*" + "@types/js-cookie@2.2.5": version "2.2.5" resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.5.tgz#38dfaacae8623b37cc0b0d27398e574e3fc28b1e" @@ -4543,6 +4550,13 @@ dependencies: pretty-format "^25.1.0" +"@types/testing-library__jest-dom@5.0.2": + version "5.0.2" + resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.0.2.tgz#89b782e0f187fe1e80d6375133da74182ba02065" + integrity sha512-dZP+/WHndgCSmdaImITy0KhjGAa9c0hlGGkzefbtrPFpnGEPZECDA0zyvfSp8RKhHECJJSKHFExjOwzo0rHyIA== + dependencies: + "@types/jest" "*" + "@types/testing-library__jest-dom@5.0.4": version "5.0.4" resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.0.4.tgz#c7bfbafb920cd1ce40506474e70ee73637f33701" From 6de6c71eafbe7ce826cf70bd9ac1be126ffd79c5 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Fri, 8 May 2020 15:03:42 +0200 Subject: [PATCH 44/90] fix: pr fixes --- packages/core/src/components/Table/Table.tsx | 15 ++++---- plugins/circleci/src/App.tsx | 10 +++--- plugins/circleci/src/api/index.ts | 5 +++ .../circleci/src/components/Layout/Layout.tsx | 4 +-- .../components/PluginHeader/PluginHeader.tsx | 8 ++--- .../src/pages/BuildsPage/BuildsPage.tsx | 4 +-- .../pages/BuildsPage/lib/Builds/Builds.tsx | 15 ++++---- .../pages/BuildsPage/lib/CITable/CITable.tsx | 4 +-- .../DetailedViewPage/DetailedViewPage.tsx | 34 ++++++++----------- .../lib/ActionOutput/ActionOutput.tsx | 3 +- .../src/pages/SettingsPage/SettingsPage.tsx | 11 +++--- .../src/state/models/buildWithSteps.ts | 2 +- plugins/circleci/src/state/models/builds.ts | 2 +- plugins/circleci/tsconfig.json | 3 +- 14 files changed, 59 insertions(+), 61 deletions(-) diff --git a/packages/core/src/components/Table/Table.tsx b/packages/core/src/components/Table/Table.tsx index a9a55ae763..85f1acc7f8 100644 --- a/packages/core/src/components/Table/Table.tsx +++ b/packages/core/src/components/Table/Table.tsx @@ -99,7 +99,7 @@ const tableIcons = { )), }; -const useCellStyles = makeStyles(theme => ({ +const useCellStyles = makeStyles((theme) => ({ root: { color: theme.palette.grey[500], padding: theme.spacing(0, 2, 0, 2.5), @@ -107,7 +107,7 @@ const useCellStyles = makeStyles(theme => ({ }, })); -const useHeaderStyles = makeStyles(theme => ({ +const useHeaderStyles = makeStyles((theme) => ({ header: { padding: theme.spacing(1, 2, 1, 2.5), borderTop: `1px solid ${theme.palette.grey.A100}`, @@ -118,7 +118,7 @@ const useHeaderStyles = makeStyles(theme => ({ }, })); -const useToolbarStyles = makeStyles(theme => ({ +const useToolbarStyles = makeStyles((theme) => ({ root: { padding: theme.spacing(3, 0, 2.5, 2.5), }, @@ -130,7 +130,7 @@ const useToolbarStyles = makeStyles(theme => ({ })); const convertColumns = (columns: TableColumn[]): TableColumn[] => { - return columns.map(column => { + return columns.map((column) => { const headerStyle: React.CSSProperties = {}; const cellStyle: React.CSSProperties = {}; @@ -149,6 +149,7 @@ const convertColumns = (columns: TableColumn[]): TableColumn[] => { export interface TableColumn extends Column<{}> { highlight?: boolean; + width?: string; } export interface TableProps extends MaterialTableProps<{}> { @@ -171,13 +172,13 @@ const Table: FC = ({ columns, options, ...props }) => { return ( ( + Cell: (cellProps) => ( ), - Header: headerProps => ( + Header: (headerProps) => ( ), - Toolbar: toolbarProps => ( + Toolbar: (toolbarProps) => ( ), }} diff --git a/plugins/circleci/src/App.tsx b/plugins/circleci/src/App.tsx index ec802a88b3..111989405f 100644 --- a/plugins/circleci/src/App.tsx +++ b/plugins/circleci/src/App.tsx @@ -1,11 +1,11 @@ -import { Route, Switch } from 'react-router'; import React from 'react'; -import { BuildsPage } from 'pages/BuildsPage'; -import { DetailedViewPage } from 'pages/DetailedViewPage'; -import { SettingsPage } from 'pages/SettingsPage'; +import { Route, Switch } from 'react-router'; import { Provider, useDispatch } from 'react-redux'; +import { BuildsPage } from './pages/BuildsPage'; +import { DetailedViewPage } from './pages/DetailedViewPage'; +import { SettingsPage } from './pages/SettingsPage'; -import store, { Dispatch } from 'state/store'; +import store, { Dispatch } from './state/store'; const RehydrateSettings = () => { const dispatch: Dispatch = useDispatch(); diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index 44f081878f..de76791cc5 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -21,9 +21,14 @@ import { getFullBuild, postBuildActions, BuildAction, + BuildWithSteps, + BuildStepAction, + BuildSummary, } from 'circleci-api'; import { ApiRef } from '@backstage/core'; +export { BuildWithSteps, BuildStepAction, BuildSummary }; + export const circleCIApiRef = new ApiRef({ id: 'plugin.circleci.service', description: 'Used by the CircleCI plugin to make requests', diff --git a/plugins/circleci/src/components/Layout/Layout.tsx b/plugins/circleci/src/components/Layout/Layout.tsx index 81f5f68d44..4ddf4b7c90 100644 --- a/plugins/circleci/src/components/Layout/Layout.tsx +++ b/plugins/circleci/src/components/Layout/Layout.tsx @@ -7,11 +7,11 @@ import { Box } from '@material-ui/core'; export const Layout: React.FC = ({ children }) => (
- Circle CI Plugin + Circle CI } > diff --git a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx index f875c54f02..9676f86e42 100644 --- a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx +++ b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx @@ -1,11 +1,11 @@ -import React from 'react'; +import React, { FC } from 'react'; import { Link as RouterLink, useLocation } from 'react-router-dom'; import { ContentHeader, SupportButton } from '@backstage/core'; import { Button, IconButton, Box, Typography } from '@material-ui/core'; import { Settings as SettingsIcon, ArrowBack } from '@material-ui/icons'; -export const PluginHeader: React.FC<{ title?: string }> = ({ - title = 'Circle CI', -}) => { + +export type Props = { title?: string }; +export const PluginHeader: FC = ({ title = 'Circle CI' }) => { const location = useLocation(); const notRoot = !location.pathname.match(/\/circleci\/?$/); const isSettingsPage = location.pathname.match(/\/circleci\/settings\/?/); diff --git a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx index ff078dcd95..6c1c3f0638 100644 --- a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx +++ b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx @@ -2,8 +2,8 @@ import React, { FC } from 'react'; import { Content } from '@backstage/core'; import { Grid } from '@material-ui/core'; import { Builds } from './lib/Builds'; -import { Layout } from 'components/Layout'; -import { PluginHeader } from 'components/PluginHeader'; +import { Layout } from '../../components/Layout'; +import { PluginHeader } from '../../components/PluginHeader'; export const BuildsPage: FC<{}> = () => ( diff --git a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx index 2044fe531b..ebf4e37300 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx @@ -14,18 +14,18 @@ * limitations under the License. */ -import React, { FC } from 'react'; +import React, { FC, useEffect } from 'react'; -import { BuildSummary } from 'circleci-api'; +import {} from 'circleci-api'; +import { useApi } from '@backstage/core'; import { CITable, CITableBuildInfo } from '../CITable'; import { useSelector, useDispatch } from 'react-redux'; -import { iRootState, Dispatch } from 'state/store'; -import { useApi } from '@backstage/core'; -import { circleCIApiRef } from 'api'; +import { iRootState, Dispatch } from '../../../../state/store'; +import { circleCIApiRef, BuildSummary } from '../../../../api'; const makeReadableStatus = (status: string | undefined) => { - if (typeof status === 'undefined') return ''; + if (!status) return ''; return ({ retried: 'Retried', canceled: 'Canceled', @@ -75,12 +75,13 @@ export const Builds: FC<{}> = () => { const dispatch: Dispatch = useDispatch(); const api = useApi(circleCIApiRef); - React.useEffect(() => { + useEffect(() => { dispatch.builds.startPolling(api); return () => { dispatch.builds.stopPolling(); }; }, []); + const { builds } = useSelector((state: iRootState) => state.builds); const { repo, owner } = useSelector((state: iRootState) => state.settings); const transformedBuilds = transform(builds, dispatch, api); diff --git a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx index d3f45a6414..cf4fd74b81 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx @@ -9,8 +9,8 @@ import { StatusNA, StatusRunning, Table, + TableColumn, } from '@backstage/core'; -import type { TableColumn } from '@backstage/core/src/components/Table'; export type CITableBuildInfo = { id: string; @@ -57,7 +57,6 @@ const generatedColumns: TableColumn[] = [ title: 'ID', field: 'id', type: 'numeric', - // @ts-ignore width: '80px', }, { @@ -97,7 +96,6 @@ const generatedColumns: TableColumn[] = [ ), - // @ts-ignore width: '10%', }, ]; diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx index 7562409536..297936b765 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -1,21 +1,20 @@ import React, { FC } from 'react'; -import { Content, InfoCard, useApi } from '@backstage/core'; -import { Grid, Box } from '@material-ui/core'; -import { PluginHeader } from 'components/PluginHeader'; -import { BuildWithSteps, BuildStepAction } from 'circleci-api'; -import { circleCIApiRef } from 'api'; -import { useParams } from 'react-router-dom'; -import { ActionOutput } from './lib/ActionOutput/ActionOutput'; -import { Layout } from 'components/Layout'; -import { Dispatch, iRootState } from 'state/store'; import { useDispatch, useSelector } from 'react-redux'; +import { useParams } from 'react-router-dom'; +import { Content, InfoCard, useApi } from '@backstage/core'; +import { circleCIApiRef, BuildWithSteps, BuildStepAction } from '../../api'; +import { Grid, Box } from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; +import { PluginHeader } from '../../components/PluginHeader'; +import { ActionOutput } from './lib/ActionOutput/ActionOutput'; +import { Layout } from '../../components/Layout'; +import { Dispatch, iRootState } from '../../state/store'; const BuildName: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( <> #{build?.build_num} - {build?.subject} ); -import { makeStyles } from '@material-ui/core/styles'; const useStyles = makeStyles((theme) => ({ neutral: {}, failed: { @@ -66,16 +65,11 @@ const pickClassName = ( classes: ReturnType, build: BuildWithSteps = {} as BuildWithSteps, ) => { - switch (true) { - case build.failed: - return classes.failed; - case ['running', 'queued'].includes(build.status!): - return classes.running; - case build.status === 'success': - return classes.success; - default: - return classes.neutral; - } + if (build.failed) return classes.failed; + if (['running', 'queued'].includes(build.status!)) return classes.running; + if (build.status === 'success') return classes.success; + + return classes.neutral; }; export const DetailedViewPage: FC<{}> = () => { let { buildId = '' } = useParams(); diff --git a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx index 63d78412a0..03bf984835 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx @@ -4,6 +4,7 @@ import { ExpansionPanelSummary, Typography, ExpansionPanelDetails, + LinearProgress, } from '@material-ui/core'; import moment from 'moment'; import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; @@ -70,7 +71,7 @@ export const ActionOutput: FC<{ {messages.length === 0 ? ( 'Nothing here...' ) : ( - + }>
diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index f9f479d436..155669737a 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -9,13 +9,12 @@ import { Snackbar, Box, } from '@material-ui/core'; -import { InfoCard, Content } from '@backstage/core'; -import { Layout } from 'components/Layout'; -import { SettingsState } from 'state/models/settings'; -import { iRootState } from 'state/store'; -import { Dispatch } from '../../state/store'; import { Alert } from '@material-ui/lab'; -import { PluginHeader } from 'components/PluginHeader'; +import { InfoCard, Content } from '@backstage/core'; +import { Layout } from '../../components/Layout'; +import { PluginHeader } from '../../components/PluginHeader'; +import { SettingsState } from '../../state/models/settings'; +import { iRootState, Dispatch } from '../../state/store'; export const SettingsPage = () => { const { diff --git a/plugins/circleci/src/state/models/buildWithSteps.ts b/plugins/circleci/src/state/models/buildWithSteps.ts index 4bde261f09..20a5023215 100644 --- a/plugins/circleci/src/state/models/buildWithSteps.ts +++ b/plugins/circleci/src/state/models/buildWithSteps.ts @@ -1,6 +1,6 @@ import { Dispatch, iRootState } from '../store'; import { GitType, BuildWithSteps } from 'circleci-api'; -import { CircleCIApi } from 'api'; +import { CircleCIApi } from '../../api'; export type BuildState = { builds: Record; diff --git a/plugins/circleci/src/state/models/builds.ts b/plugins/circleci/src/state/models/builds.ts index f427175bd8..8d5f9727d6 100644 --- a/plugins/circleci/src/state/models/builds.ts +++ b/plugins/circleci/src/state/models/builds.ts @@ -1,6 +1,6 @@ import { Dispatch, iRootState } from '../store'; import { BuildSummary, GitType } from 'circleci-api'; -import { CircleCIApi } from 'api'; +import { CircleCIApi } from '../../api'; export type BuildsState = { builds: BuildSummary[]; diff --git a/plugins/circleci/tsconfig.json b/plugins/circleci/tsconfig.json index 91968a6e49..5cf0a023cb 100644 --- a/plugins/circleci/tsconfig.json +++ b/plugins/circleci/tsconfig.json @@ -2,7 +2,6 @@ "extends": "../../tsconfig.json", "include": ["src"], "compilerOptions": { - "module": "esnext", - "baseUrl": "src" + "module": "esnext" } } From 7242c1b15552c9c21b70fda9e8a9c190375d1310 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Fri, 8 May 2020 15:10:15 +0200 Subject: [PATCH 45/90] Fix linting --- plugins/circleci/src/App.tsx | 15 +++++++++ .../circleci/src/components/Layout/Layout.tsx | 15 +++++++++ .../circleci/src/components/Layout/index.ts | 15 +++++++++ .../components/PluginHeader/PluginHeader.tsx | 15 +++++++++ .../src/components/PluginHeader/index.ts | 15 +++++++++ .../src/pages/BuildsPage/BuildsPage.tsx | 15 +++++++++ .../circleci/src/pages/BuildsPage/index.ts | 15 +++++++++ .../pages/BuildsPage/lib/Builds/Builds.tsx | 15 +++++++++ .../src/pages/BuildsPage/lib/Builds/index.ts | 15 +++++++++ .../pages/BuildsPage/lib/CITable/CITable.tsx | 17 +++++++++- .../src/pages/BuildsPage/lib/CITable/index.ts | 15 +++++++++ .../DetailedViewPage/DetailedViewPage.tsx | 17 +++++++++- .../src/pages/DetailedViewPage/index.ts | 15 +++++++++ .../lib/ActionOutput/ActionOutput.tsx | 15 +++++++++ .../lib/ActionOutput/index.ts | 15 +++++++++ .../src/pages/SettingsPage/SettingsPage.tsx | 17 +++++++++- .../circleci/src/pages/SettingsPage/index.ts | 15 +++++++++ plugins/circleci/src/proxy.ts | 15 +++++++++ .../src/state/models/buildWithSteps.ts | 21 +++++++++++++ plugins/circleci/src/state/models/builds.ts | 31 +++++++++++++++++-- plugins/circleci/src/state/models/index.ts | 15 +++++++++ plugins/circleci/src/state/models/settings.ts | 21 ++++++++++++- plugins/circleci/src/state/store.ts | 15 +++++++++ 23 files changed, 373 insertions(+), 6 deletions(-) diff --git a/plugins/circleci/src/App.tsx b/plugins/circleci/src/App.tsx index 111989405f..eddb9556ad 100644 --- a/plugins/circleci/src/App.tsx +++ b/plugins/circleci/src/App.tsx @@ -1,3 +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. + */ import React from 'react'; import { Route, Switch } from 'react-router'; import { Provider, useDispatch } from 'react-redux'; diff --git a/plugins/circleci/src/components/Layout/Layout.tsx b/plugins/circleci/src/components/Layout/Layout.tsx index 4ddf4b7c90..880e3f82a8 100644 --- a/plugins/circleci/src/components/Layout/Layout.tsx +++ b/plugins/circleci/src/components/Layout/Layout.tsx @@ -1,3 +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. + */ import React from 'react'; import { Header, Page, pageTheme, HeaderLabel } from '@backstage/core'; // @ts-ignore diff --git a/plugins/circleci/src/components/Layout/index.ts b/plugins/circleci/src/components/Layout/index.ts index 9877e7f4ae..236fc98851 100644 --- a/plugins/circleci/src/components/Layout/index.ts +++ b/plugins/circleci/src/components/Layout/index.ts @@ -1 +1,16 @@ +/* + * 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 './Layout'; diff --git a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx index 9676f86e42..b65683f4f8 100644 --- a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx +++ b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx @@ -1,3 +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. + */ import React, { FC } from 'react'; import { Link as RouterLink, useLocation } from 'react-router-dom'; import { ContentHeader, SupportButton } from '@backstage/core'; diff --git a/plugins/circleci/src/components/PluginHeader/index.ts b/plugins/circleci/src/components/PluginHeader/index.ts index e9231f1318..4de972f6f2 100644 --- a/plugins/circleci/src/components/PluginHeader/index.ts +++ b/plugins/circleci/src/components/PluginHeader/index.ts @@ -1 +1,16 @@ +/* + * 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 './PluginHeader'; diff --git a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx index 6c1c3f0638..70722ae487 100644 --- a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx +++ b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx @@ -1,3 +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. + */ import React, { FC } from 'react'; import { Content } from '@backstage/core'; import { Grid } from '@material-ui/core'; diff --git a/plugins/circleci/src/pages/BuildsPage/index.ts b/plugins/circleci/src/pages/BuildsPage/index.ts index 94086cd569..bb9de5d696 100644 --- a/plugins/circleci/src/pages/BuildsPage/index.ts +++ b/plugins/circleci/src/pages/BuildsPage/index.ts @@ -1 +1,16 @@ +/* + * 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 './BuildsPage'; diff --git a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx index ebf4e37300..97227d5342 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx @@ -1,3 +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. + */ /* * Copyright 2020 Spotify AB * diff --git a/plugins/circleci/src/pages/BuildsPage/lib/Builds/index.ts b/plugins/circleci/src/pages/BuildsPage/lib/Builds/index.ts index c2649d7919..e91a9496b7 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/Builds/index.ts +++ b/plugins/circleci/src/pages/BuildsPage/lib/Builds/index.ts @@ -1 +1,16 @@ +/* + * 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 { Builds } from './Builds'; diff --git a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx index cf4fd74b81..8be304e873 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx @@ -1,3 +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. + */ import React, { FC } from 'react'; import { Link, Typography, Box, IconButton } from '@material-ui/core'; import { Replay as RetryIcon, GitHub as GithubIcon } from '@material-ui/icons'; @@ -29,7 +44,7 @@ export type CITableBuildInfo = { passed: number; skipped: number; failed: number; - testUrl: string; //fixme better name + testUrl: string; // fixme better name }; onRetryClick: () => void; }; diff --git a/plugins/circleci/src/pages/BuildsPage/lib/CITable/index.ts b/plugins/circleci/src/pages/BuildsPage/lib/CITable/index.ts index 279634bce6..600d6d689f 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/CITable/index.ts +++ b/plugins/circleci/src/pages/BuildsPage/lib/CITable/index.ts @@ -1 +1,16 @@ +/* + * 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 { CITable, CITableBuildInfo } from './CITable'; diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx index 297936b765..0a0c90c649 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -1,3 +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. + */ import React, { FC } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { useParams } from 'react-router-dom'; @@ -72,7 +87,7 @@ const pickClassName = ( return classes.neutral; }; export const DetailedViewPage: FC<{}> = () => { - let { buildId = '' } = useParams(); + const { buildId = '' } = useParams(); const classes = useStyles(); const dispatch: Dispatch = useDispatch(); const api = useApi(circleCIApiRef); diff --git a/plugins/circleci/src/pages/DetailedViewPage/index.ts b/plugins/circleci/src/pages/DetailedViewPage/index.ts index 578eec4e64..62bbabbfe5 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/index.ts +++ b/plugins/circleci/src/pages/DetailedViewPage/index.ts @@ -1 +1,16 @@ +/* + * 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 './DetailedViewPage'; diff --git a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx index 03bf984835..f502c7bede 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx @@ -1,3 +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. + */ import React, { useEffect, useState, FC, Suspense } from 'react'; import { ExpansionPanel, diff --git a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/index.ts b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/index.ts index 1e4fd5dfac..7cf74c73f8 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/index.ts +++ b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/index.ts @@ -1 +1,16 @@ +/* + * 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 { ActionOutput } from './ActionOutput'; diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 155669737a..4f2e3d0239 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -1,3 +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. + */ import React, { useState } from 'react'; import { useSelector, useDispatch } from 'react-redux'; import { @@ -60,7 +75,7 @@ export const SettingsPage = () => { title={ <> Project Credentials - {/*{authed ? : } */} + {/* {authed ? : } */} ; pollingIntervalId: number | null; pollingState: PollingState; + getBuildError: Error | null; }; const INTERVAL_AMOUNT = 1500; @@ -19,6 +35,7 @@ export const buildWithSteps = { builds: {}, pollingIntervalId: null, pollingState: PollingState.Idle, + getBuildError: null, } as BuildState, reducers: { setBuild(state: BuildState, payload: BuildWithSteps) { @@ -30,6 +47,9 @@ export const buildWithSteps = { builds: { ...state.builds, [payload.build_num!]: payload }, }; }, + setBuildError(state: BuildState, payload: Error | null) { + return { ...state, getBuildError: payload }; + }, setPollingIntervalId(state: BuildState, payload: number | null) { return { ...state, @@ -45,6 +65,7 @@ export const buildWithSteps = { state: iRootState, ) { try { + d; //ispatch.buildWithSteps.() const options = { token: state.settings.token, vcs: { diff --git a/plugins/circleci/src/state/models/builds.ts b/plugins/circleci/src/state/models/builds.ts index 8d5f9727d6..57481b1d6f 100644 --- a/plugins/circleci/src/state/models/builds.ts +++ b/plugins/circleci/src/state/models/builds.ts @@ -1,3 +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. + */ import { Dispatch, iRootState } from '../store'; import { BuildSummary, GitType } from 'circleci-api'; import { CircleCIApi } from '../../api'; @@ -6,6 +21,8 @@ export type BuildsState = { builds: BuildSummary[]; pollingIntervalId: number | null; pollingState: PollingState; + restartBuildError: Error | null; + getBuildsError: Error | null; }; const INTERVAL_AMOUNT = 1500; @@ -19,6 +36,8 @@ export const builds = { builds: [] as BuildSummary[], pollingIntervalId: null, pollingState: PollingState.Idle, + restartBuildError: null, + getBuildsError: null, }, reducers: { setBuilds(state: BuildsState, payload: BuildSummary[]) { @@ -35,10 +54,17 @@ export const builds = { payload === null ? PollingState.Idle : PollingState.Polling, }; }, + setRestartBuildError(state: BuildsState, payload: Error | null) { + return { ...state, restartBuildError: payload }; + }, + setGetBuildsError(state: BuildsState, payload: Error | null) { + return { ...state, getBuildsError: payload }; + }, }, effects: (dispatch: Dispatch) => ({ async getBuilds(api: CircleCIApi, state: iRootState) { try { + dispatch.builds.setGetBuildsError(null); const builds = await api.getBuilds({ token: state.settings.token, vcs: { @@ -49,7 +75,7 @@ export const builds = { }); dispatch.builds.setBuilds(builds); } catch (e) { - console.log(e); + dispatch.builds.setGetBuildsError(null); } }, async restartBuild( @@ -57,6 +83,7 @@ export const builds = { state: iRootState, ) { try { + dispatch.builds.setRestartBuildError(null); await api.retry(buildId, { token: state.settings.token, vcs: { @@ -66,7 +93,7 @@ export const builds = { }, }); } catch (e) { - console.log(e); + dispatch.builds.setRestartBuildError(e); } }, diff --git a/plugins/circleci/src/state/models/index.ts b/plugins/circleci/src/state/models/index.ts index ff1396d97d..44c87dcc3b 100644 --- a/plugins/circleci/src/state/models/index.ts +++ b/plugins/circleci/src/state/models/index.ts @@ -1,3 +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. + */ import { settings } from './settings'; import { builds } from './builds'; import { buildWithSteps } from './buildWithSteps'; diff --git a/plugins/circleci/src/state/models/settings.ts b/plugins/circleci/src/state/models/settings.ts index dda4f86cfa..49b261852a 100644 --- a/plugins/circleci/src/state/models/settings.ts +++ b/plugins/circleci/src/state/models/settings.ts @@ -1,3 +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. + */ import { Dispatch, iRootState } from '../store'; import { circleCIApiRef } from '../../api'; @@ -30,11 +45,15 @@ export const settings = { }: SettingsState & { doPersist: boolean }) { if (doPersist) dispatch.settings.persist(credentials); }, + setRehydrateError(state: SettingsState, payload: Error | null) { + return { ...state, rehydrateError: payload }; + }, persist(credentials: SettingsState) { sessionStorage.setItem(STORAGE_KEY, JSON.stringify(credentials)); }, rehydrate(_: any, state: iRootState) { try { + dispatch.settings.setRehydrateError(null); const stateFromStorage = JSON.parse( sessionStorage.getItem(STORAGE_KEY)!, ); @@ -49,7 +68,7 @@ export const settings = { doPersist: false, }); } catch (e) { - console.log(e); + dispatch.settings.setRehydrateError(e); } }, }), diff --git a/plugins/circleci/src/state/store.ts b/plugins/circleci/src/state/store.ts index 43b447bf9c..503a2e9b73 100644 --- a/plugins/circleci/src/state/store.ts +++ b/plugins/circleci/src/state/store.ts @@ -1,3 +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. + */ import { init, RematchRootState, RematchDispatch } from '@rematch/core'; import { models, RootModel } from './models'; From 158c38b850cb73896595c070f42b33d183e9f044 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Fri, 8 May 2020 15:19:36 +0200 Subject: [PATCH 46/90] Fix linting --- plugins/circleci/package.json | 2 ++ plugins/circleci/src/api/index.ts | 1 - plugins/circleci/src/components/Layout/Layout.tsx | 2 +- .../lib/ActionOutput/ActionOutput.tsx | 8 ++++---- .../src/pages/SettingsPage/SettingsPage.tsx | 14 ++++---------- .../circleci/src/state/models/buildWithSteps.ts | 4 ++-- plugins/circleci/src/state/models/builds.ts | 4 ++-- yarn.lock | 5 +++++ 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index f2c94f06e1..3b04ee28f2 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -32,11 +32,13 @@ "@types/react-lazylog": "^4.5.0", "@types/react-redux": "^7.1.8", "circleci-api": "^4.0.0", + "moment": "^2.25.3", "react": "16.13.1", "react-dom": "16.13.1", "react-lazylog": "^4.5.2", "react-redux": "^7.2.0", "react-router": "^5.1.2", + "react-router-dom": "^5.1.2", "react-use": "^13.0.0" }, "files": [ diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index de76791cc5..89f9623e90 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -60,7 +60,6 @@ export class CircleCIApi { } async getBuild(buildNumber: number, options: CircleCIOptions) { - console.log({ buildNumber, options }); return getFullBuild(options.token, buildNumber, { circleHost: this.apiUrl, ...options.vcs, diff --git a/plugins/circleci/src/components/Layout/Layout.tsx b/plugins/circleci/src/components/Layout/Layout.tsx index 880e3f82a8..eab8ab0e88 100644 --- a/plugins/circleci/src/components/Layout/Layout.tsx +++ b/plugins/circleci/src/components/Layout/Layout.tsx @@ -25,7 +25,7 @@ export const Layout: React.FC = ({ children }) => ( pageTitleOverride="Circle CI" title={ - + Backstage Logo Circle CI } diff --git a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx index f502c7bede..dd526c1b5f 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx @@ -35,7 +35,6 @@ const useStyles = makeStyles({ button: { order: -1, marginRight: 0, - // FIXME: how not to hardcode this marginLeft: '-20px', }, }); @@ -51,12 +50,13 @@ export const ActionOutput: FC<{ const [messages, setMessages] = useState([]); useEffect(() => { fetch(url) - .then((res) => res.json()) - .then((actionOutput) => { - actionOutput && + .then(res => res.json()) + .then(actionOutput => { + if (typeof actionOutput !== 'undefined') { setMessages( actionOutput.map(({ message }: { message: string }) => message), ); + } }); }, [url]); diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 4f2e3d0239..20fe096605 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -36,20 +36,14 @@ export const SettingsPage = () => { token: tokenFromStore, owner: ownerFromStore, repo: repoFromStore, - } = useSelector( - (state: iRootState): SettingsState => - (console.log({ state }) as any) || state.settings, - ); + } = useSelector((state: iRootState): SettingsState => state.settings); - // const apiGitInfo = api.options.vcs; - // const [authed] = React.useState(false); const [token, setToken] = React.useState(() => tokenFromStore); const [owner, setOwner] = React.useState(() => ownerFromStore); const [repo, setRepo] = React.useState(() => repoFromStore); const dispatch: Dispatch = useDispatch(); - React.useEffect(() => () => console.log('Settings unmounterd'), []); React.useEffect(() => { if (tokenFromStore !== token) { setToken(tokenFromStore); @@ -95,7 +89,7 @@ export const SettingsPage = () => { value={token} fullWidth variant="outlined" - onChange={(e) => setToken(e.target.value)} + onChange={e => setToken(e.target.value)} /> @@ -105,7 +99,7 @@ export const SettingsPage = () => { label="Owner" variant="outlined" value={owner} - onChange={(e) => setOwner(e.target.value)} + onChange={e => setOwner(e.target.value)} /> @@ -115,7 +109,7 @@ export const SettingsPage = () => { fullWidth variant="outlined" value={repo} - onChange={(e) => setRepo(e.target.value)} + onChange={e => setRepo(e.target.value)} /> diff --git a/plugins/circleci/src/state/models/buildWithSteps.ts b/plugins/circleci/src/state/models/buildWithSteps.ts index a5ad4d89b3..796348f205 100644 --- a/plugins/circleci/src/state/models/buildWithSteps.ts +++ b/plugins/circleci/src/state/models/buildWithSteps.ts @@ -65,7 +65,7 @@ export const buildWithSteps = { state: iRootState, ) { try { - d; //ispatch.buildWithSteps.() + dispatch.buildWithSteps.setBuildError(null); const options = { token: state.settings.token, vcs: { @@ -77,7 +77,7 @@ export const buildWithSteps = { const build = await api.getBuild(buildId, options); dispatch.buildWithSteps.setBuild(build); } catch (e) { - console.log(e); + dispatch.buildWithSteps.setBuildError(e); } }, startPolling( diff --git a/plugins/circleci/src/state/models/builds.ts b/plugins/circleci/src/state/models/builds.ts index 57481b1d6f..6f8a30e868 100644 --- a/plugins/circleci/src/state/models/builds.ts +++ b/plugins/circleci/src/state/models/builds.ts @@ -65,7 +65,7 @@ export const builds = { async getBuilds(api: CircleCIApi, state: iRootState) { try { dispatch.builds.setGetBuildsError(null); - const builds = await api.getBuilds({ + const newBuilds = await api.getBuilds({ token: state.settings.token, vcs: { owner: state.settings.owner, @@ -73,7 +73,7 @@ export const builds = { type: GitType.GITHUB, }, }); - dispatch.builds.setBuilds(builds); + dispatch.builds.setBuilds(newBuilds); } catch (e) { dispatch.builds.setGetBuildsError(null); } diff --git a/yarn.lock b/yarn.lock index 6be455842e..236e495db6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14624,6 +14624,11 @@ moment@2.24.0: resolved "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== +moment@^2.25.3: + version "2.25.3" + resolved "https://registry.npmjs.org/moment/-/moment-2.25.3.tgz#252ff41319cf41e47761a1a88cab30edfe9808c0" + integrity sha512-PuYv0PHxZvzc15Sp8ybUCoQ+xpyPWvjOuK72a5ovzp2LI32rJXOiIfyoFoYvG3s6EwwrdkMyWuRiEHSZRLJNdg== + morgan@^1.10.0: version "1.10.0" resolved "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" From d182818081c1270441289b4f395ce751582cd451 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Fri, 8 May 2020 15:41:27 +0200 Subject: [PATCH 47/90] Fix linting --- packages/app/package.json | 3 ++- packages/app/src/setupProxy.js | 15 +++++++++++++++ yarn.lock | 15 +++++++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index 0ab288fcca..d04031181e 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -17,6 +17,7 @@ "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", + "http-proxy-middleware": "^1.0.3", "prop-types": "^15.7.2", "react": "^16.12.0", "react-dom": "^16.12.0", @@ -26,11 +27,11 @@ }, "devDependencies": { "@testing-library/cypress": "^6.0.0", - "@types/jquery": "^3.3.34", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^7.1.2", "@types/jest": "^24.0.0", + "@types/jquery": "^3.3.34", "@types/node": "^12.0.0", "@types/react-router-dom": "^5.1.3", "@types/zen-observable": "^0.8.0", diff --git a/packages/app/src/setupProxy.js b/packages/app/src/setupProxy.js index 38cb098a03..cf15313f27 100644 --- a/packages/app/src/setupProxy.js +++ b/packages/app/src/setupProxy.js @@ -1,3 +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. + */ const createProxyMiddleware = require('http-proxy-middleware'); // FIXME: somehow get it from within the plugin itself? diff --git a/yarn.lock b/yarn.lock index 236e495db6..002974ad40 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4128,7 +4128,7 @@ "@types/http-proxy" "*" "@types/node" "*" -"@types/http-proxy@*": +"@types/http-proxy@*", "@types/http-proxy@^1.17.3": version "1.17.4" resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz#e7c92e3dbe3e13aa799440ff42e6d3a17a9d045b" integrity sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q== @@ -11078,7 +11078,18 @@ http-proxy-middleware@0.19.1: lodash "^4.17.11" micromatch "^3.1.10" -http-proxy@^1.17.0: +http-proxy-middleware@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.0.3.tgz#f73daad8dac622d51fe1769960c914b9b1f75a72" + integrity sha512-GHvPeBD+A357zS5tHjzj6ISrVOjjCiy0I92bdyTJz0pNmIjFxO0NX/bX+xkGgnclKQE/5hHAB9JEQ7u9Pw4olg== + dependencies: + "@types/http-proxy" "^1.17.3" + http-proxy "^1.18.0" + is-glob "^4.0.1" + lodash "^4.17.15" + micromatch "^4.0.2" + +http-proxy@^1.17.0, http-proxy@^1.18.0: version "1.18.0" resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== From f3c42578c4c484338fb72655d298cfb953158825 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Fri, 8 May 2020 15:59:50 +0200 Subject: [PATCH 48/90] Fix linting --- packages/app/package.json | 2 +- packages/app/src/setupProxy.js | 1 + yarn.lock | 15 ++------------- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index d04031181e..47f553a98b 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -17,7 +17,7 @@ "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", - "http-proxy-middleware": "^1.0.3", + "@types/http-proxy": "^1.17.4", "prop-types": "^15.7.2", "react": "^16.12.0", "react-dom": "^16.12.0", diff --git a/packages/app/src/setupProxy.js b/packages/app/src/setupProxy.js index cf15313f27..68ab231e89 100644 --- a/packages/app/src/setupProxy.js +++ b/packages/app/src/setupProxy.js @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +// eslint-disable-next-line const createProxyMiddleware = require('http-proxy-middleware'); // FIXME: somehow get it from within the plugin itself? diff --git a/yarn.lock b/yarn.lock index 002974ad40..6818944223 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4128,7 +4128,7 @@ "@types/http-proxy" "*" "@types/node" "*" -"@types/http-proxy@*", "@types/http-proxy@^1.17.3": +"@types/http-proxy@*", "@types/http-proxy@^1.17.4": version "1.17.4" resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz#e7c92e3dbe3e13aa799440ff42e6d3a17a9d045b" integrity sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q== @@ -11078,18 +11078,7 @@ http-proxy-middleware@0.19.1: lodash "^4.17.11" micromatch "^3.1.10" -http-proxy-middleware@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.0.3.tgz#f73daad8dac622d51fe1769960c914b9b1f75a72" - integrity sha512-GHvPeBD+A357zS5tHjzj6ISrVOjjCiy0I92bdyTJz0pNmIjFxO0NX/bX+xkGgnclKQE/5hHAB9JEQ7u9Pw4olg== - dependencies: - "@types/http-proxy" "^1.17.3" - http-proxy "^1.18.0" - is-glob "^4.0.1" - lodash "^4.17.15" - micromatch "^4.0.2" - -http-proxy@^1.17.0, http-proxy@^1.18.0: +http-proxy@^1.17.0: version "1.18.0" resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== From 520503b85c3c315fbd2259a7782a32f29aaf40b5 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Fri, 8 May 2020 16:34:07 +0200 Subject: [PATCH 49/90] Fix tests failing on image import --- package.json | 1 + packages/cli/config/jest.js | 1 + yarn.lock | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f7eb2c5f5..6459abcc5e 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "devDependencies": { "@spotify/eslint-config-oss": "^1.0.1", "husky": "^4.2.3", + "identity-obj-proxy": "^3.0.0", "lerna": "^3.20.2", "lint-staged": "^10.1.0", "prettier": "^2.0.5" diff --git a/packages/cli/config/jest.js b/packages/cli/config/jest.js index 77f345a0dd..7f5f05b212 100644 --- a/packages/cli/config/jest.js +++ b/packages/cli/config/jest.js @@ -28,6 +28,7 @@ if (fs.existsSync('jest.config.js')) { modulePaths: [''], moduleNameMapper: { '\\.(css|less|scss|sss|styl)$': require.resolve('jest-css-modules'), + '.+\\.(png|jpg|ttf|woff|woff2)$': 'identity-obj-proxy', }, // We build .esm.js files with plugin:build, so to be able to load these in tests they need to be transformed // TODO: jest is working on module support, it's possible that we can remove this in the future diff --git a/yarn.lock b/yarn.lock index 6818944223..b8f62a16a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11169,7 +11169,7 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: dependencies: postcss "^7.0.14" -identity-obj-proxy@3.0.0: +identity-obj-proxy@3.0.0, identity-obj-proxy@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= From d0066a2dd9f12f08fd0dd4330243564fa01c9dff Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Fri, 8 May 2020 16:48:11 +0200 Subject: [PATCH 50/90] feat: plugin description --- plugins/circleci/package.json | 20 +++++++++---------- .../components/PluginHeader/PluginHeader.tsx | 5 ++++- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index f2c94f06e1..e6f67781a1 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -12,16 +12,6 @@ "test": "backstage-cli test", "clean": "backstage-cli clean" }, - "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.4", - "@testing-library/jest-dom": "^4.2.4", - "@testing-library/react": "^9.3.2", - "@testing-library/user-event": "^7.1.2", - "@types/jest": "^24.0.0", - "@types/node": "^12.0.0", - "@types/testing-library__jest-dom": "5.0.2", - "jest-fetch-mock": "^3.0.3" - }, "dependencies": { "@backstage/core": "^0.1.1-alpha.4", "@backstage/theme": "^0.1.1-alpha.4", @@ -39,6 +29,16 @@ "react-router": "^5.1.2", "react-use": "^13.0.0" }, + "devDependencies": { + "@backstage/cli": "^0.1.1-alpha.4", + "@testing-library/jest-dom": "^4.2.4", + "@testing-library/react": "^9.3.2", + "@testing-library/user-event": "^7.1.2", + "@types/jest": "^24.0.0", + "@types/node": "^12.0.0", + "@types/testing-library__jest-dom": "5.0.2", + "jest-fetch-mock": "^3.0.3" + }, "files": [ "dist" ] diff --git a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx index 9676f86e42..c5f62044dd 100644 --- a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx +++ b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx @@ -32,7 +32,10 @@ export const PluginHeader: FC = ({ title = 'Circle CI' }) => { Settings )} - A description of your plugin goes here. + + This plugin allows you to view and interact with your builds within the + Circle CI environment. + ); }; From efb498a3645a5ddcdb6e7a67c9978eac3a0b3c3c Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 11 May 2020 11:15:57 +0200 Subject: [PATCH 51/90] feat/routing-through-plugin-api --- .../{App.tsx => components/Store/Store.tsx} | 27 +++++++++---------- .../circleci/src/components/Store/index.ts | 1 + .../src/pages/BuildsPage/BuildsPage.tsx | 5 +++- .../circleci/src/pages/BuildsPage/index.ts | 2 +- .../DetailedViewPage/DetailedViewPage.tsx | 6 ++++- .../src/pages/DetailedViewPage/index.ts | 2 +- .../src/pages/SettingsPage/SettingsPage.tsx | 11 +++++--- .../circleci/src/pages/SettingsPage/index.ts | 2 +- plugins/circleci/src/plugin.ts | 8 ++++-- 9 files changed, 39 insertions(+), 25 deletions(-) rename plugins/circleci/src/{App.tsx => components/Store/Store.tsx} (60%) create mode 100644 plugins/circleci/src/components/Store/index.ts diff --git a/plugins/circleci/src/App.tsx b/plugins/circleci/src/components/Store/Store.tsx similarity index 60% rename from plugins/circleci/src/App.tsx rename to plugins/circleci/src/components/Store/Store.tsx index eddb9556ad..897f19d0ce 100644 --- a/plugins/circleci/src/App.tsx +++ b/plugins/circleci/src/components/Store/Store.tsx @@ -13,14 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React from 'react'; -import { Route, Switch } from 'react-router'; +import React, { FC } from 'react'; import { Provider, useDispatch } from 'react-redux'; -import { BuildsPage } from './pages/BuildsPage'; -import { DetailedViewPage } from './pages/DetailedViewPage'; -import { SettingsPage } from './pages/SettingsPage'; -import store, { Dispatch } from './state/store'; +import store, { Dispatch } from '../../state/store'; const RehydrateSettings = () => { const dispatch: Dispatch = useDispatch(); @@ -30,17 +26,20 @@ const RehydrateSettings = () => { }, []); return null; }; -export const App = () => { + +export const Store: FC = ({ children }) => { return ( - <> +
- - - - - - + {children} +
); }; + +export const withStore = (Component: React.ComponentType) => () => ( + + + +); diff --git a/plugins/circleci/src/components/Store/index.ts b/plugins/circleci/src/components/Store/index.ts new file mode 100644 index 0000000000..47e0805c13 --- /dev/null +++ b/plugins/circleci/src/components/Store/index.ts @@ -0,0 +1 @@ +export * from './Store'; diff --git a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx index 70722ae487..700aa1288e 100644 --- a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx +++ b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx @@ -19,8 +19,9 @@ import { Grid } from '@material-ui/core'; import { Builds } from './lib/Builds'; import { Layout } from '../../components/Layout'; import { PluginHeader } from '../../components/PluginHeader'; +import { withStore } from '../../components/Store'; -export const BuildsPage: FC<{}> = () => ( +const BuildsPage: FC<{}> = () => ( @@ -32,3 +33,5 @@ export const BuildsPage: FC<{}> = () => ( ); + +export default withStore(BuildsPage); diff --git a/plugins/circleci/src/pages/BuildsPage/index.ts b/plugins/circleci/src/pages/BuildsPage/index.ts index bb9de5d696..9b555f0f12 100644 --- a/plugins/circleci/src/pages/BuildsPage/index.ts +++ b/plugins/circleci/src/pages/BuildsPage/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export * from './BuildsPage'; +export { default as BuildsPage } from './BuildsPage'; diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx index 0a0c90c649..15598cd8f4 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -24,6 +24,7 @@ import { PluginHeader } from '../../components/PluginHeader'; import { ActionOutput } from './lib/ActionOutput/ActionOutput'; import { Layout } from '../../components/Layout'; import { Dispatch, iRootState } from '../../state/store'; +import { withStore } from '../../components/Store'; const BuildName: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( <> @@ -86,7 +87,8 @@ const pickClassName = ( return classes.neutral; }; -export const DetailedViewPage: FC<{}> = () => { + +const DetailedViewPage: FC<{}> = () => { const { buildId = '' } = useParams(); const classes = useStyles(); const dispatch: Dispatch = useDispatch(); @@ -151,3 +153,5 @@ const ActionsList: FC<{ actions: BuildStepAction[]; name: string }> = ({ ); }; + +export default withStore(DetailedViewPage); diff --git a/plugins/circleci/src/pages/DetailedViewPage/index.ts b/plugins/circleci/src/pages/DetailedViewPage/index.ts index 62bbabbfe5..40d25c4a84 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/index.ts +++ b/plugins/circleci/src/pages/DetailedViewPage/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export * from './DetailedViewPage'; +export { default as DetailedViewPage } from './DetailedViewPage'; diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 20fe096605..536535bc85 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -30,8 +30,9 @@ import { Layout } from '../../components/Layout'; import { PluginHeader } from '../../components/PluginHeader'; import { SettingsState } from '../../state/models/settings'; import { iRootState, Dispatch } from '../../state/store'; +import { withStore } from '../../components/Store'; -export const SettingsPage = () => { +const SettingsPage = () => { const { token: tokenFromStore, owner: ownerFromStore, @@ -89,7 +90,7 @@ export const SettingsPage = () => { value={token} fullWidth variant="outlined" - onChange={e => setToken(e.target.value)} + onChange={(e) => setToken(e.target.value)} />
@@ -99,7 +100,7 @@ export const SettingsPage = () => { label="Owner" variant="outlined" value={owner} - onChange={e => setOwner(e.target.value)} + onChange={(e) => setOwner(e.target.value)} /> @@ -109,7 +110,7 @@ export const SettingsPage = () => { fullWidth variant="outlined" value={repo} - onChange={e => setRepo(e.target.value)} + onChange={(e) => setRepo(e.target.value)} /> @@ -144,3 +145,5 @@ export const SettingsPage = () => {
); }; + +export default withStore(SettingsPage); diff --git a/plugins/circleci/src/pages/SettingsPage/index.ts b/plugins/circleci/src/pages/SettingsPage/index.ts index b7883e4887..e0ba8157b2 100644 --- a/plugins/circleci/src/pages/SettingsPage/index.ts +++ b/plugins/circleci/src/pages/SettingsPage/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export * from './SettingsPage'; +export { default as SettingsPage } from './SettingsPage'; diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index 8e308bd12c..fb42c53835 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -14,11 +14,15 @@ * limitations under the License. */ import { createPlugin } from '@backstage/core'; -import { App } from './App'; +import { BuildsPage } from './pages/BuildsPage'; +import { SettingsPage } from './pages/SettingsPage'; +import { DetailedViewPage } from './pages/DetailedViewPage'; export const plugin = createPlugin({ id: 'circleci', register({ router }) { - router.registerRoute('/circleci', App, { exact: false }); + router.registerRoute('/circleci', BuildsPage); + router.registerRoute('/circleci/settings', SettingsPage); + router.registerRoute('/circleci/build/:buildId', DetailedViewPage); }, }); From f841accbef2bb8b6d40462a4b2ea11061ed6c0df Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 11 May 2020 12:04:23 +0200 Subject: [PATCH 52/90] fix linting: add missing notice header --- plugins/circleci/src/components/Store/index.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/plugins/circleci/src/components/Store/index.ts b/plugins/circleci/src/components/Store/index.ts index 47e0805c13..8ddb059053 100644 --- a/plugins/circleci/src/components/Store/index.ts +++ b/plugins/circleci/src/components/Store/index.ts @@ -1 +1,16 @@ +/* + * 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 './Store'; From ddfa3e70f4ecaf755f7918c2caf119758cb619c1 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 11 May 2020 13:18:09 +0200 Subject: [PATCH 53/90] Remove double heading --- .../src/pages/BuildsPage/lib/Builds/Builds.tsx | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx index 97227d5342..ebf4e37300 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx @@ -1,18 +1,3 @@ -/* - * 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. - */ /* * Copyright 2020 Spotify AB * From b9c4eb955f5dee66c586578b871781de6c50256e Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 11 May 2020 13:19:10 +0200 Subject: [PATCH 54/90] Remove "huh?" --- plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx index ebf4e37300..edbedc63ff 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx @@ -15,10 +15,7 @@ */ import React, { FC, useEffect } from 'react'; - -import {} from 'circleci-api'; import { useApi } from '@backstage/core'; - import { CITable, CITableBuildInfo } from '../CITable'; import { useSelector, useDispatch } from 'react-redux'; import { iRootState, Dispatch } from '../../../../state/store'; From 313da9d660f48d280ab09f08f2539836e1ace88d Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 11 May 2020 13:37:38 +0200 Subject: [PATCH 55/90] Fix a typo in notice heading --- plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx index edbedc63ff..90202ef9a2 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx @@ -7,13 +7,12 @@ * * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in wr iting, software + * 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, useEffect } from 'react'; import { useApi } from '@backstage/core'; import { CITable, CITableBuildInfo } from '../CITable'; From 1627b490b4ee17f819b7b5ec4edb5f28c9235afa Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 11 May 2020 13:45:59 +0200 Subject: [PATCH 56/90] Get rid of
--- .../circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx index 8be304e873..5524d9985c 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx @@ -88,9 +88,8 @@ const generatedColumns: TableColumn[] = [ title: 'Source', render: (row: Partial) => ( <> - {row.source?.branchName} -
- {row.source?.commit.hash} +

{row.source?.branchName}

+

{row.source?.commit.hash}

), }, From 86350c23a2ceca9ddd071da8c5cdb010405d1c5f Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Tue, 12 May 2020 17:15:05 +0200 Subject: [PATCH 57/90] Break stuff but add useReducer for settings --- .../circleci/src/components/Store/Store.tsx | 73 ++++++++++++++--- .../src/pages/SettingsPage/SettingsPage.tsx | 79 +++++++++++++++---- 2 files changed, 125 insertions(+), 27 deletions(-) diff --git a/plugins/circleci/src/components/Store/Store.tsx b/plugins/circleci/src/components/Store/Store.tsx index 897f19d0ce..b086fe38b1 100644 --- a/plugins/circleci/src/components/Store/Store.tsx +++ b/plugins/circleci/src/components/Store/Store.tsx @@ -13,28 +13,77 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { FC } from 'react'; -import { Provider, useDispatch } from 'react-redux'; +import React, { FC, useReducer, Dispatch } from 'react'; +// import { Provider, useDispatch } from 'react-redux'; -import store, { Dispatch } from '../../state/store'; +// import store from '../../state/store'; +import { circleCIApiRef } from '../../api'; -const RehydrateSettings = () => { - const dispatch: Dispatch = useDispatch(); +// const RehydrateSettings = () => { +// const dispatch: Dispatch = useDispatch(); - React.useEffect(() => { - dispatch.settings.rehydrate(); - }, []); - return null; +// React.useEffect(() => { +// dispatch.settings.rehydrate(); +// }, []); +// return null; +// }; + +export const SettingsContext = React.createContext< + [RootState, Dispatch] +>([] as any); + +type SettingsState = { + owner: string; + repo: string; + token: string; +}; + +export const STORAGE_KEY = `${circleCIApiRef.id}.settings`; + +type RootState = { + settings: SettingsState; +}; + +const initialState = { + settings: { + owner: '', + repo: '', + token: '', + }, +}; + +type Action = { + type: 'setCredentials'; + payload: { + repo: string; + owner: string; + token: string; + }; +}; + +const reducer = (state: RootState, action: Action): RootState => { + switch (action.type) { + case 'setCredentials': + return { + ...state, + settings: { ...state.settings, ...action.payload }, + }; + default: + return state; + } }; export const Store: FC = ({ children }) => { + const [state, dispatch] = useReducer(reducer, initialState); return ( - + + {/* */}
- + {/* */} {children}
-
+ {/*
*/} + ); }; diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 536535bc85..df402010db 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -13,8 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useState } from 'react'; -import { useSelector, useDispatch } from 'react-redux'; +import React, { useState, useContext, useEffect } from 'react'; import { Button, TextField, @@ -28,22 +27,68 @@ import { Alert } from '@material-ui/lab'; import { InfoCard, Content } from '@backstage/core'; import { Layout } from '../../components/Layout'; import { PluginHeader } from '../../components/PluginHeader'; -import { SettingsState } from '../../state/models/settings'; -import { iRootState, Dispatch } from '../../state/store'; -import { withStore } from '../../components/Store'; +// import { SettingsState } from '../../state/models/settings'; +// import { iRootState, Dispatch } from '../../state/store'; +import { + withStore, + SettingsContext, + STORAGE_KEY, +} from '../../components/Store'; const SettingsPage = () => { - const { - token: tokenFromStore, - owner: ownerFromStore, - repo: repoFromStore, - } = useSelector((state: iRootState): SettingsState => state.settings); + // const { + // token: tokenFromStore, + // owner: ownerFromStore, + // repo: repoFromStore, + // } = useSelector((state: iRootState): SettingsState => state.settings); + + const [ + { + settings: { + repo: repoFromStore, + owner: ownerFromStore, + token: tokenFromStore, + }, + settings, + }, + dispatch, + ] = useContext(SettingsContext); + + const rehydrate = () => { + try { + const stateFromStorage = JSON.parse(sessionStorage.getItem(STORAGE_KEY)!); + if ( + stateFromStorage && + Object.keys(stateFromStorage).some( + (k) => (settings as any)[k] !== stateFromStorage[k], + ) + ) + dispatch({ + type: 'setCredentials', + payload: stateFromStorage, + }); + } catch (e) {} + }; + useEffect(() => { + rehydrate(); + }, []); const [token, setToken] = React.useState(() => tokenFromStore); const [owner, setOwner] = React.useState(() => ownerFromStore); const [repo, setRepo] = React.useState(() => repoFromStore); - const dispatch: Dispatch = useDispatch(); + const persist = () => { + sessionStorage.setItem( + STORAGE_KEY, + JSON.stringify({ + repo, + owner, + token, + }), + ); + }; + + // const dispatch: Dispatch = useDispatch(); React.useEffect(() => { if (tokenFromStore !== token) { @@ -126,10 +171,14 @@ const SettingsPage = () => { color="primary" onClick={() => { setSaved(true); - dispatch.settings.setCredentials({ - owner, - repo, - token, + persist(); + dispatch({ + type: 'setCredentials', + payload: { + repo: repo, + owner: owner, + token: token, + }, }); }} > From 408435eb842dbcbeaa9f042528464a92b390536f Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Tue, 12 May 2020 18:03:39 +0200 Subject: [PATCH 58/90] Move settings effects into a hook --- .../src/pages/SettingsPage/SettingsPage.tsx | 72 ++----------------- .../src/pages/SettingsPage/settings.tsx | 72 +++++++++++++++++++ plugins/circleci/src/state/models/settings.ts | 6 -- 3 files changed, 79 insertions(+), 71 deletions(-) create mode 100644 plugins/circleci/src/pages/SettingsPage/settings.tsx diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index df402010db..6b23207b50 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useState, useContext, useEffect } from 'react'; +import React, { useState } from 'react'; import { Button, TextField, @@ -27,69 +27,19 @@ import { Alert } from '@material-ui/lab'; import { InfoCard, Content } from '@backstage/core'; import { Layout } from '../../components/Layout'; import { PluginHeader } from '../../components/PluginHeader'; -// import { SettingsState } from '../../state/models/settings'; -// import { iRootState, Dispatch } from '../../state/store'; -import { - withStore, - SettingsContext, - STORAGE_KEY, -} from '../../components/Store'; +import { withStore } from '../../components/Store'; +import { useSettings } from './settings'; const SettingsPage = () => { - // const { - // token: tokenFromStore, - // owner: ownerFromStore, - // repo: repoFromStore, - // } = useSelector((state: iRootState): SettingsState => state.settings); - const [ - { - settings: { - repo: repoFromStore, - owner: ownerFromStore, - token: tokenFromStore, - }, - settings, - }, - dispatch, - ] = useContext(SettingsContext); - - const rehydrate = () => { - try { - const stateFromStorage = JSON.parse(sessionStorage.getItem(STORAGE_KEY)!); - if ( - stateFromStorage && - Object.keys(stateFromStorage).some( - (k) => (settings as any)[k] !== stateFromStorage[k], - ) - ) - dispatch({ - type: 'setCredentials', - payload: stateFromStorage, - }); - } catch (e) {} - }; - useEffect(() => { - rehydrate(); - }, []); + { repo: repoFromStore, owner: ownerFromStore, token: tokenFromStore }, + { saveSettings }, + ] = useSettings(); const [token, setToken] = React.useState(() => tokenFromStore); const [owner, setOwner] = React.useState(() => ownerFromStore); const [repo, setRepo] = React.useState(() => repoFromStore); - const persist = () => { - sessionStorage.setItem( - STORAGE_KEY, - JSON.stringify({ - repo, - owner, - token, - }), - ); - }; - - // const dispatch: Dispatch = useDispatch(); - React.useEffect(() => { if (tokenFromStore !== token) { setToken(tokenFromStore); @@ -171,15 +121,7 @@ const SettingsPage = () => { color="primary" onClick={() => { setSaved(true); - persist(); - dispatch({ - type: 'setCredentials', - payload: { - repo: repo, - owner: owner, - token: token, - }, - }); + saveSettings({ repo, owner, token }); }} > Save credentials diff --git a/plugins/circleci/src/pages/SettingsPage/settings.tsx b/plugins/circleci/src/pages/SettingsPage/settings.tsx new file mode 100644 index 0000000000..3ebd8e9ef0 --- /dev/null +++ b/plugins/circleci/src/pages/SettingsPage/settings.tsx @@ -0,0 +1,72 @@ +/* + * 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 { useContext, useEffect } from 'react'; +import { SettingsContext, STORAGE_KEY } from '../../components/Store'; +import { useApi, errorApiRef } from '@backstage/core'; + +export type SettingsDispatch = { + saveSettings: (settings: SettingsState) => void; +}; + +export type SettingsState = { + token: string; + owner: string; + repo: string; +}; + +export function useSettings(): [SettingsState, SettingsDispatch] { + const [{ settings }, dispatch] = useContext(SettingsContext); + + const errorApi = useApi(errorApiRef); + + const rehydrate = () => { + try { + const stateFromStorage = JSON.parse(sessionStorage.getItem(STORAGE_KEY)!); + if ( + stateFromStorage && + Object.keys(stateFromStorage).some( + (k) => (settings as any)[k] !== stateFromStorage[k], + ) + ) + dispatch({ + type: 'setCredentials', + payload: stateFromStorage, + }); + } catch (error) { + errorApi.post(error); + } + }; + useEffect(() => { + rehydrate(); + }, []); + + const persist = (state: SettingsState) => { + sessionStorage.setItem(STORAGE_KEY, JSON.stringify(state)); + }; + + return [ + settings, + { + saveSettings: (state: SettingsState) => { + persist(state); + dispatch({ + type: 'setCredentials', + payload: state, + }); + }, + }, + ]; +} diff --git a/plugins/circleci/src/state/models/settings.ts b/plugins/circleci/src/state/models/settings.ts index 49b261852a..9237b85c0c 100644 --- a/plugins/circleci/src/state/models/settings.ts +++ b/plugins/circleci/src/state/models/settings.ts @@ -18,12 +18,6 @@ import { circleCIApiRef } from '../../api'; const STORAGE_KEY = `${circleCIApiRef.id}.settings`; -export type SettingsState = { - token: string; - owner: string; - repo: string; -}; - export const settings = { state: { token: '', From 061ffc60ac8535bc22e3216b1a9b8e921846f1b0 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Wed, 13 May 2020 09:14:34 +0200 Subject: [PATCH 59/90] Clean up comments --- .../circleci/src/components/Store/Store.tsx | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/plugins/circleci/src/components/Store/Store.tsx b/plugins/circleci/src/components/Store/Store.tsx index b086fe38b1..6ce6ee5a4a 100644 --- a/plugins/circleci/src/components/Store/Store.tsx +++ b/plugins/circleci/src/components/Store/Store.tsx @@ -14,20 +14,8 @@ * limitations under the License. */ import React, { FC, useReducer, Dispatch } from 'react'; -// import { Provider, useDispatch } from 'react-redux'; - -// import store from '../../state/store'; import { circleCIApiRef } from '../../api'; -// const RehydrateSettings = () => { -// const dispatch: Dispatch = useDispatch(); - -// React.useEffect(() => { -// dispatch.settings.rehydrate(); -// }, []); -// return null; -// }; - export const SettingsContext = React.createContext< [RootState, Dispatch] >([] as any); @@ -77,12 +65,7 @@ export const Store: FC = ({ children }) => { const [state, dispatch] = useReducer(reducer, initialState); return ( - {/* */} -
- {/* */} - {children} -
- {/*
*/} +
{children}
); }; From ba2b19d4c0b3086b378307ebc244d984986f953e Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Wed, 13 May 2020 17:36:02 +0200 Subject: [PATCH 60/90] Add missing file --- .../src/pages/SettingsPage/settings.ts | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 plugins/circleci/src/pages/SettingsPage/settings.ts diff --git a/plugins/circleci/src/pages/SettingsPage/settings.ts b/plugins/circleci/src/pages/SettingsPage/settings.ts new file mode 100644 index 0000000000..7f29b84f67 --- /dev/null +++ b/plugins/circleci/src/pages/SettingsPage/settings.ts @@ -0,0 +1,92 @@ +/* + * 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 { useContext, useEffect } from 'react'; +import { AppContext, STORAGE_KEY } from '../../components/Store'; +import { useApi, errorApiRef } from '@backstage/core'; + +export type SettingsDispatch = { + saveSettings: (settings: SettingsState) => void; +}; + +export type SettingsState = { + token: string; + owner: string; + repo: string; +}; + +// type Effect = { +// type: 'rehydrate', +// payload: any +// }; + +// const effects = []; +// pushEffect, popEffect + +export function useSettings(): [SettingsState, SettingsDispatch] { + const [{ settings }, dispatch] = useContext(AppContext); + + // const interpret = eff => { + // return { + // async rehydrate() {}, + + // }[eff.type](eff.payload) + // } + // useEffect(() => { + // const effectToInterpret = effects[0]; + // removeEffect(0); + // interpret(effectToInterpret) + // },[effects]) + + const errorApi = useApi(errorApiRef); + + const rehydrate = () => { + try { + const stateFromStorage = JSON.parse(sessionStorage.getItem(STORAGE_KEY)!); + if ( + stateFromStorage && + Object.keys(stateFromStorage).some( + (k) => (settings as any)[k] !== stateFromStorage[k], + ) + ) + dispatch({ + type: 'setCredentials', + payload: stateFromStorage, + }); + } catch (error) { + errorApi.post(error); + } + }; + useEffect(() => { + rehydrate(); + }, []); + + const persist = (state: SettingsState) => { + sessionStorage.setItem(STORAGE_KEY, JSON.stringify(state)); + }; + + return [ + settings, + { + saveSettings: (state: SettingsState) => { + persist(state); + dispatch({ + type: 'setCredentials', + payload: state, + }); + }, + }, + ]; +} From 7f56215da6c58c7e7ee9ec0df3dc28ea4a7b8b24 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Wed, 13 May 2020 19:08:41 +0200 Subject: [PATCH 61/90] Add non working settings implemented with hooks --- .../circleci/src/components/Store/Store.tsx | 63 ++++++++-- .../circleci/src/pages/BuildsPage/builds.tsx | 108 ++++++++++++++++++ .../pages/BuildsPage/lib/Builds/Builds.tsx | 33 ++---- .../src/pages/SettingsPage/settings.tsx | 72 ------------ plugins/circleci/src/state/models/index.ts | 3 - plugins/circleci/src/state/models/settings.ts | 69 ----------- 6 files changed, 173 insertions(+), 175 deletions(-) create mode 100644 plugins/circleci/src/pages/BuildsPage/builds.tsx delete mode 100644 plugins/circleci/src/pages/SettingsPage/settings.tsx delete mode 100644 plugins/circleci/src/state/models/settings.ts diff --git a/plugins/circleci/src/components/Store/Store.tsx b/plugins/circleci/src/components/Store/Store.tsx index 6ce6ee5a4a..b83ba8f086 100644 --- a/plugins/circleci/src/components/Store/Store.tsx +++ b/plugins/circleci/src/components/Store/Store.tsx @@ -15,10 +15,11 @@ */ import React, { FC, useReducer, Dispatch } from 'react'; import { circleCIApiRef } from '../../api'; +import { BuildSummary } from 'circleci-api'; -export const SettingsContext = React.createContext< - [RootState, Dispatch] ->([] as any); +export const AppContext = React.createContext<[AppState, Dispatch]>( + [] as any, +); type SettingsState = { owner: string; @@ -26,10 +27,22 @@ type SettingsState = { token: string; }; +export enum PollingState { + Polling, + Idle, +} + +export type BuildsState = { + builds: BuildSummary[]; + pollingIntervalId: number | null; + pollingState: PollingState; +}; + export const STORAGE_KEY = `${circleCIApiRef.id}.settings`; -type RootState = { +export type AppState = { settings: SettingsState; + builds: BuildsState; }; const initialState = { @@ -38,9 +51,14 @@ const initialState = { repo: '', token: '', }, + builds: { + builds: [], + pollingIntervalId: null, + pollingState: PollingState.Idle, + }, }; -type Action = { +type SettingsAction = { type: 'setCredentials'; payload: { repo: string; @@ -49,12 +67,39 @@ type Action = { }; }; -const reducer = (state: RootState, action: Action): RootState => { +type BuildsAction = + | { + type: 'setBuilds'; + payload: BuildSummary[]; + } + | { + type: 'setPollingIntervalId'; + payload: number | null; + }; + +type Action = SettingsAction | BuildsAction; + +const reducer = (state: AppState, action: Action): AppState => { switch (action.type) { case 'setCredentials': return { ...state, - settings: { ...state.settings, ...action.payload }, + settings: { ...state.settings, ...(action.payload as {}) }, + }; + case 'setBuilds': + return { + ...state, + builds: { ...state.builds, builds: action.payload }, + }; + case 'setPollingIntervalId': + return { + ...state, + builds: { + ...state.builds, + pollingIntervalId: action.payload, + pollingState: + action.payload === null ? PollingState.Idle : PollingState.Polling, + }, }; default: return state; @@ -64,9 +109,9 @@ const reducer = (state: RootState, action: Action): RootState => { export const Store: FC = ({ children }) => { const [state, dispatch] = useReducer(reducer, initialState); return ( - +
{children}
-
+ ); }; diff --git a/plugins/circleci/src/pages/BuildsPage/builds.tsx b/plugins/circleci/src/pages/BuildsPage/builds.tsx new file mode 100644 index 0000000000..a40c36bd24 --- /dev/null +++ b/plugins/circleci/src/pages/BuildsPage/builds.tsx @@ -0,0 +1,108 @@ +/* + * 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 { errorApiRef, useApi } from '@backstage/core'; +import { GitType } from 'circleci-api'; +import { useContext, useEffect } from 'react'; +import { CircleCIApi } from '../../api'; +import { circleCIApiRef } from '../../api/index'; +import { AppContext, BuildsState } from '../../components/Store'; + +export type BuildsDispatch = { + startPolling: (api: CircleCIApi) => void; + stopPolling: () => void; + restartBuild: (buildId: number) => Promise; +}; + +const INTERVAL_AMOUNT = 3000; + +export function useBuilds(): [BuildsState, BuildsDispatch] { + const [{ builds, settings }, dispatch] = useContext(AppContext); + const api = useApi(circleCIApiRef); + const errorApi = useApi(errorApiRef); + + const getBuilds = async () => { + console.log(settings); + if (settings.owner === '' || settings.repo === '') return; + try { + const newBuilds = await api.getBuilds({ + token: settings.token, + vcs: { + owner: settings.owner, + repo: settings.repo, + type: GitType.GITHUB, + }, + }); + dispatch({ + type: 'setBuilds', + payload: newBuilds, + }); + } catch (e) { + errorApi.post(e); + } + }; + + const restartBuild = async (buildId: number) => { + try { + await api.retry(buildId, { + token: settings.token, + vcs: { + owner: settings.owner, + repo: settings.repo, + type: GitType.GITHUB, + }, + }); + } catch (e) { + errorApi.post(e); + } + }; + + const startPolling = () => { + if (builds.pollingIntervalId) return; + const intervalId = (setInterval( + () => getBuilds(), + INTERVAL_AMOUNT, + ) as any) as number; + dispatch({ + type: 'setPollingIntervalId', + payload: intervalId, + }); + }; + + const stopPolling = () => { + const currentIntervalId = builds.pollingIntervalId; + if (currentIntervalId) clearInterval(currentIntervalId); + dispatch({ + type: 'setPollingIntervalId', + payload: null, + }); + }; + + useEffect(() => { + startPolling(); + return () => { + stopPolling(); + }; + }, []); + + return [ + builds, + { + restartBuild, + startPolling, + stopPolling, + }, + ]; +} diff --git a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx index 90202ef9a2..f52dff30ad 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx @@ -13,12 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { FC, useEffect } from 'react'; -import { useApi } from '@backstage/core'; -import { CITable, CITableBuildInfo } from '../CITable'; -import { useSelector, useDispatch } from 'react-redux'; -import { iRootState, Dispatch } from '../../../../state/store'; -import { circleCIApiRef, BuildSummary } from '../../../../api'; +import React, { FC } from 'react'; +import { CITableBuildInfo, CITable } from '../CITable'; +import { BuildSummary } from '../../../../api'; +import { useBuilds } from '../../builds'; +import { useSettings } from '../../../SettingsPage/settings'; const makeReadableStatus = (status: string | undefined) => { if (!status) return ''; @@ -41,8 +40,7 @@ const makeReadableStatus = (status: string | undefined) => { const transform = ( buildsData: BuildSummary[], - dispatch: Dispatch, - api: typeof circleCIApiRef.T, + restartBuild: { (buildId: number): Promise }, ): CITableBuildInfo[] => { return buildsData.map((buildData) => { const tableBuildInfo: CITableBuildInfo = { @@ -52,7 +50,8 @@ const transform = ( (buildData.retry_of ? ` (retry of #${buildData.retry_of})` : '') : '', onRetryClick: () => - dispatch.builds.restartBuild({ buildId: buildData.build_num, api }), + typeof buildData.build_num !== 'undefined' && + restartBuild(buildData.build_num), source: { branchName: String(buildData.branch), commit: { @@ -68,19 +67,9 @@ const transform = ( }; export const Builds: FC<{}> = () => { - const dispatch: Dispatch = useDispatch(); - const api = useApi(circleCIApiRef); - - useEffect(() => { - dispatch.builds.startPolling(api); - return () => { - dispatch.builds.stopPolling(); - }; - }, []); - - const { builds } = useSelector((state: iRootState) => state.builds); - const { repo, owner } = useSelector((state: iRootState) => state.settings); - const transformedBuilds = transform(builds, dispatch, api); + const [{ builds }, { restartBuild }] = useBuilds(); + const [{ repo, owner }] = useSettings(); + const transformedBuilds = transform(builds, restartBuild); return ( diff --git a/plugins/circleci/src/pages/SettingsPage/settings.tsx b/plugins/circleci/src/pages/SettingsPage/settings.tsx deleted file mode 100644 index 3ebd8e9ef0..0000000000 --- a/plugins/circleci/src/pages/SettingsPage/settings.tsx +++ /dev/null @@ -1,72 +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 { useContext, useEffect } from 'react'; -import { SettingsContext, STORAGE_KEY } from '../../components/Store'; -import { useApi, errorApiRef } from '@backstage/core'; - -export type SettingsDispatch = { - saveSettings: (settings: SettingsState) => void; -}; - -export type SettingsState = { - token: string; - owner: string; - repo: string; -}; - -export function useSettings(): [SettingsState, SettingsDispatch] { - const [{ settings }, dispatch] = useContext(SettingsContext); - - const errorApi = useApi(errorApiRef); - - const rehydrate = () => { - try { - const stateFromStorage = JSON.parse(sessionStorage.getItem(STORAGE_KEY)!); - if ( - stateFromStorage && - Object.keys(stateFromStorage).some( - (k) => (settings as any)[k] !== stateFromStorage[k], - ) - ) - dispatch({ - type: 'setCredentials', - payload: stateFromStorage, - }); - } catch (error) { - errorApi.post(error); - } - }; - useEffect(() => { - rehydrate(); - }, []); - - const persist = (state: SettingsState) => { - sessionStorage.setItem(STORAGE_KEY, JSON.stringify(state)); - }; - - return [ - settings, - { - saveSettings: (state: SettingsState) => { - persist(state); - dispatch({ - type: 'setCredentials', - payload: state, - }); - }, - }, - ]; -} diff --git a/plugins/circleci/src/state/models/index.ts b/plugins/circleci/src/state/models/index.ts index 44c87dcc3b..214fd62e6a 100644 --- a/plugins/circleci/src/state/models/index.ts +++ b/plugins/circleci/src/state/models/index.ts @@ -13,19 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { settings } from './settings'; import { builds } from './builds'; import { buildWithSteps } from './buildWithSteps'; // no need to extend from Models export interface RootModel { - settings: typeof settings; builds: typeof builds; buildWithSteps: typeof buildWithSteps; } export const models = { - settings, builds, buildWithSteps, }; diff --git a/plugins/circleci/src/state/models/settings.ts b/plugins/circleci/src/state/models/settings.ts deleted file mode 100644 index 9237b85c0c..0000000000 --- a/plugins/circleci/src/state/models/settings.ts +++ /dev/null @@ -1,69 +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 { Dispatch, iRootState } from '../store'; -import { circleCIApiRef } from '../../api'; - -const STORAGE_KEY = `${circleCIApiRef.id}.settings`; - -export const settings = { - state: { - token: '', - owner: '', - repo: '', - }, // initial state - reducers: { - setCredentials( - state: SettingsState, - { doPersist, ...credentials }: SettingsState & { doPersist: boolean }, - ) { - return { ...state, ...credentials }; - }, - }, - effects: (dispatch: Dispatch) => ({ - setCredentials({ - doPersist = true, - ...credentials - }: SettingsState & { doPersist: boolean }) { - if (doPersist) dispatch.settings.persist(credentials); - }, - setRehydrateError(state: SettingsState, payload: Error | null) { - return { ...state, rehydrateError: payload }; - }, - persist(credentials: SettingsState) { - sessionStorage.setItem(STORAGE_KEY, JSON.stringify(credentials)); - }, - rehydrate(_: any, state: iRootState) { - try { - dispatch.settings.setRehydrateError(null); - const stateFromStorage = JSON.parse( - sessionStorage.getItem(STORAGE_KEY)!, - ); - if ( - stateFromStorage && - Object.keys(stateFromStorage).some( - (k) => (state as any).settings[k] !== stateFromStorage[k], - ) - ) - dispatch.settings.setCredentials({ - ...stateFromStorage, - doPersist: false, - }); - } catch (e) { - dispatch.settings.setRehydrateError(e); - } - }, - }), -}; From aac4ac0df62b4d884a356b59e04582287cd7c0dd Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Thu, 14 May 2020 10:47:23 +0200 Subject: [PATCH 62/90] Fix builds polling --- plugins/circleci/src/pages/BuildsPage/builds.tsx | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/plugins/circleci/src/pages/BuildsPage/builds.tsx b/plugins/circleci/src/pages/BuildsPage/builds.tsx index a40c36bd24..fba1638fb7 100644 --- a/plugins/circleci/src/pages/BuildsPage/builds.tsx +++ b/plugins/circleci/src/pages/BuildsPage/builds.tsx @@ -16,13 +16,10 @@ import { errorApiRef, useApi } from '@backstage/core'; import { GitType } from 'circleci-api'; import { useContext, useEffect } from 'react'; -import { CircleCIApi } from '../../api'; import { circleCIApiRef } from '../../api/index'; import { AppContext, BuildsState } from '../../components/Store'; export type BuildsDispatch = { - startPolling: (api: CircleCIApi) => void; - stopPolling: () => void; restartBuild: (buildId: number) => Promise; }; @@ -34,7 +31,6 @@ export function useBuilds(): [BuildsState, BuildsDispatch] { const errorApi = useApi(errorApiRef); const getBuilds = async () => { - console.log(settings); if (settings.owner === '' || settings.repo === '') return; try { const newBuilds = await api.getBuilds({ @@ -70,7 +66,7 @@ export function useBuilds(): [BuildsState, BuildsDispatch] { }; const startPolling = () => { - if (builds.pollingIntervalId) return; + stopPolling(); const intervalId = (setInterval( () => getBuilds(), INTERVAL_AMOUNT, @@ -95,14 +91,12 @@ export function useBuilds(): [BuildsState, BuildsDispatch] { return () => { stopPolling(); }; - }, []); + }, [settings]); return [ builds, { restartBuild, - startPolling, - stopPolling, }, ]; } From 7b424c0337cdd0ecfc7e8f3ea34804e65c10aa31 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 14 May 2020 11:38:39 +0200 Subject: [PATCH 63/90] refactor: detailedViewPage moved to hooks Co-authored-by: Nikita Dudnik --- plugins/circleci/src/api/index.ts | 3 +- .../circleci/src/components/Store/Store.tsx | 56 ++++++++- .../DetailedViewPage/DetailedViewPage.tsx | 18 +-- .../src/pages/DetailedViewPage/hooks.ts | 101 +++++++++++++++ .../src/state/models/buildWithSteps.ts | 101 --------------- plugins/circleci/src/state/models/builds.ts | 115 ------------------ plugins/circleci/src/state/models/index.ts | 28 ----- plugins/circleci/src/state/store.ts | 21 ---- 8 files changed, 160 insertions(+), 283 deletions(-) create mode 100644 plugins/circleci/src/pages/DetailedViewPage/hooks.ts delete mode 100644 plugins/circleci/src/state/models/buildWithSteps.ts delete mode 100644 plugins/circleci/src/state/models/builds.ts delete mode 100644 plugins/circleci/src/state/models/index.ts delete mode 100644 plugins/circleci/src/state/store.ts diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index 89f9623e90..d98f511f35 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -24,10 +24,11 @@ import { BuildWithSteps, BuildStepAction, BuildSummary, + GitType, } from 'circleci-api'; import { ApiRef } from '@backstage/core'; -export { BuildWithSteps, BuildStepAction, BuildSummary }; +export { BuildWithSteps, BuildStepAction, BuildSummary, GitType }; export const circleCIApiRef = new ApiRef({ id: 'plugin.circleci.service', diff --git a/plugins/circleci/src/components/Store/Store.tsx b/plugins/circleci/src/components/Store/Store.tsx index b83ba8f086..3085480b42 100644 --- a/plugins/circleci/src/components/Store/Store.tsx +++ b/plugins/circleci/src/components/Store/Store.tsx @@ -15,7 +15,7 @@ */ import React, { FC, useReducer, Dispatch } from 'react'; import { circleCIApiRef } from '../../api'; -import { BuildSummary } from 'circleci-api'; +import { BuildSummary, BuildWithSteps } from 'circleci-api'; export const AppContext = React.createContext<[AppState, Dispatch]>( [] as any, @@ -43,9 +43,10 @@ export const STORAGE_KEY = `${circleCIApiRef.id}.settings`; export type AppState = { settings: SettingsState; builds: BuildsState; + buildsWithSteps: BuildsWithStepsState; }; -const initialState = { +const initialState: AppState = { settings: { owner: '', repo: '', @@ -56,6 +57,12 @@ const initialState = { pollingIntervalId: null, pollingState: PollingState.Idle, }, + buildsWithSteps: { + builds: {}, + pollingIntervalId: null, + pollingState: PollingState.Idle, + getBuildError: null, + }, }; type SettingsAction = { @@ -77,7 +84,24 @@ type BuildsAction = payload: number | null; }; -type Action = SettingsAction | BuildsAction; +type BuildsWithStepsAction = + | { + type: 'setBuildWithSteps'; + payload: BuildWithSteps; + } + | { + type: 'setPollingIntervalIdForBuildsWithSteps'; + payload: number | null; + }; + +export type BuildsWithStepsState = { + builds: Record; + pollingIntervalId: number | null; + pollingState: PollingState; + getBuildError: Error | null; +}; + +type Action = SettingsAction | BuildsAction | BuildsWithStepsAction; const reducer = (state: AppState, action: Action): AppState => { switch (action.type) { @@ -91,11 +115,37 @@ const reducer = (state: AppState, action: Action): AppState => { ...state, builds: { ...state.builds, builds: action.payload }, }; + case 'setBuildWithSteps': { + if (state.buildsWithSteps.pollingState !== PollingState.Polling) { + return state; + } + return { + ...state, + buildsWithSteps: { + ...state.buildsWithSteps, + builds: { + ...state.buildsWithSteps.builds, + [action.payload.build_num!]: action.payload, + }, + }, + }; + } case 'setPollingIntervalId': return { ...state, builds: { ...state.builds, + pollingIntervalId: action.payload, + pollingState: + action.payload === null ? PollingState.Idle : PollingState.Polling, + }, + }; + case 'setPollingIntervalIdForBuildsWithSteps': + return { + ...state, + buildsWithSteps: { + ...state.buildsWithSteps, + pollingIntervalId: action.payload, pollingState: action.payload === null ? PollingState.Idle : PollingState.Polling, diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx index 15598cd8f4..f77b4ff5e7 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -14,17 +14,16 @@ * limitations under the License. */ import React, { FC } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; import { useParams } from 'react-router-dom'; -import { Content, InfoCard, useApi } from '@backstage/core'; -import { circleCIApiRef, BuildWithSteps, BuildStepAction } from '../../api'; +import { Content, InfoCard } from '@backstage/core'; +import { BuildWithSteps, BuildStepAction } from '../../api'; import { Grid, Box } from '@material-ui/core'; import { makeStyles } from '@material-ui/core/styles'; import { PluginHeader } from '../../components/PluginHeader'; import { ActionOutput } from './lib/ActionOutput/ActionOutput'; import { Layout } from '../../components/Layout'; -import { Dispatch, iRootState } from '../../state/store'; import { withStore } from '../../components/Store'; +import { useBuildWithSteps } from './hooks'; const BuildName: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( <> @@ -91,17 +90,8 @@ const pickClassName = ( const DetailedViewPage: FC<{}> = () => { const { buildId = '' } = useParams(); const classes = useStyles(); - const dispatch: Dispatch = useDispatch(); - const api = useApi(circleCIApiRef); - React.useEffect(() => { - dispatch.buildWithSteps.startPolling({ api, buildId: Number(buildId) }); - return () => { - dispatch.buildWithSteps.stopPolling(); - }; - }, []); - const { builds } = useSelector((state: iRootState) => state.buildWithSteps); - const build = builds[parseInt(buildId, 10)]; + const [build] = useBuildWithSteps(parseInt(buildId, 10)); return ( diff --git a/plugins/circleci/src/pages/DetailedViewPage/hooks.ts b/plugins/circleci/src/pages/DetailedViewPage/hooks.ts new file mode 100644 index 0000000000..78ac6d8c7a --- /dev/null +++ b/plugins/circleci/src/pages/DetailedViewPage/hooks.ts @@ -0,0 +1,101 @@ +/* + * 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 { errorApiRef, useApi } from '@backstage/core'; +import { useContext, useEffect } from 'react'; +import { circleCIApiRef, GitType } from '../../api/index'; +import { AppContext } from '../../components/Store'; +import { useSettings } from '../SettingsPage/settings'; + +const INTERVAL_AMOUNT = 3000; + +export function useBuildWithSteps(buildId: number) { + const [settings] = useSettings(); + const [{ buildsWithSteps }, dispatch] = useContext(AppContext); + const api = useApi(circleCIApiRef); + const errorApi = useApi(errorApiRef); + + const getBuildWithSteps = async () => { + try { + const options = { + token: settings.token, + vcs: { + owner: settings.owner, + repo: settings.repo, + type: GitType.GITHUB, + }, + }; + const build = await api.getBuild(buildId, options); + dispatch({ type: 'setBuildWithSteps', payload: build }); + } catch (e) { + errorApi.post(e); + } + }; + + const restartBuild = async () => { + try { + await api.retry(buildId, { + token: settings.token, + vcs: { + owner: settings.owner, + repo: settings.repo, + type: GitType.GITHUB, + }, + }); + } catch (e) { + errorApi.post(e); + } + }; + + const startPolling = () => { + stopPolling(); + const intervalId = (setInterval( + () => getBuildWithSteps(), + INTERVAL_AMOUNT, + ) as any) as number; + dispatch({ + type: 'setPollingIntervalIdForBuildsWithSteps', + payload: intervalId, + }); + }; + + const stopPolling = () => { + const currentIntervalId = buildsWithSteps.pollingIntervalId; + if (currentIntervalId) clearInterval(currentIntervalId); + dispatch({ + type: 'setPollingIntervalIdForBuildsWithSteps', + payload: null, + }); + }; + + useEffect(() => { + startPolling(); + return () => { + stopPolling(); + }; + }, [buildId, settings]); + + const build = buildsWithSteps.builds[buildId]; + + return [ + build, + { + restartBuild, + startPolling, + stopPolling, + getBuildWithSteps, + }, + ] as const; +} diff --git a/plugins/circleci/src/state/models/buildWithSteps.ts b/plugins/circleci/src/state/models/buildWithSteps.ts deleted file mode 100644 index 796348f205..0000000000 --- a/plugins/circleci/src/state/models/buildWithSteps.ts +++ /dev/null @@ -1,101 +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 { Dispatch, iRootState } from '../store'; -import { GitType, BuildWithSteps } from 'circleci-api'; -import { CircleCIApi } from '../../api'; - -export type BuildState = { - builds: Record; - pollingIntervalId: number | null; - pollingState: PollingState; - getBuildError: Error | null; -}; - -const INTERVAL_AMOUNT = 1500; - -export enum PollingState { - Polling, - Idle, -} -export const buildWithSteps = { - state: { - builds: {}, - pollingIntervalId: null, - pollingState: PollingState.Idle, - getBuildError: null, - } as BuildState, - reducers: { - setBuild(state: BuildState, payload: BuildWithSteps) { - if (state.pollingState !== PollingState.Polling) { - return state; - } - return { - ...state, - builds: { ...state.builds, [payload.build_num!]: payload }, - }; - }, - setBuildError(state: BuildState, payload: Error | null) { - return { ...state, getBuildError: payload }; - }, - setPollingIntervalId(state: BuildState, payload: number | null) { - return { - ...state, - pollingIntervalId: payload, - pollingState: - payload === null ? PollingState.Idle : PollingState.Polling, - }; - }, - }, - effects: (dispatch: Dispatch) => ({ - async getBuild( - { api, buildId }: { api: CircleCIApi; buildId: number }, - state: iRootState, - ) { - try { - dispatch.buildWithSteps.setBuildError(null); - const options = { - token: state.settings.token, - vcs: { - owner: state.settings.owner, - repo: state.settings.repo, - type: GitType.GITHUB, - }, - }; - const build = await api.getBuild(buildId, options); - dispatch.buildWithSteps.setBuild(build); - } catch (e) { - dispatch.buildWithSteps.setBuildError(e); - } - }, - startPolling( - { api, buildId }: { api: CircleCIApi; buildId: number }, - state: iRootState, - ) { - if (state.buildWithSteps.pollingIntervalId) return; - - const intervalId = (setInterval( - () => dispatch.buildWithSteps.getBuild({ buildId, api }), - INTERVAL_AMOUNT, - ) as any) as number; - dispatch.buildWithSteps.setPollingIntervalId(intervalId); - }, - stopPolling(_: any, state: iRootState) { - const currentIntervalId = state.buildWithSteps.pollingIntervalId; - if (currentIntervalId) clearInterval(currentIntervalId); - dispatch.buildWithSteps.setPollingIntervalId(null); - }, - }), -}; diff --git a/plugins/circleci/src/state/models/builds.ts b/plugins/circleci/src/state/models/builds.ts deleted file mode 100644 index 6f8a30e868..0000000000 --- a/plugins/circleci/src/state/models/builds.ts +++ /dev/null @@ -1,115 +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 { Dispatch, iRootState } from '../store'; -import { BuildSummary, GitType } from 'circleci-api'; -import { CircleCIApi } from '../../api'; - -export type BuildsState = { - builds: BuildSummary[]; - pollingIntervalId: number | null; - pollingState: PollingState; - restartBuildError: Error | null; - getBuildsError: Error | null; -}; - -const INTERVAL_AMOUNT = 1500; - -export enum PollingState { - Polling, - Idle, -} -export const builds = { - state: { - builds: [] as BuildSummary[], - pollingIntervalId: null, - pollingState: PollingState.Idle, - restartBuildError: null, - getBuildsError: null, - }, - reducers: { - setBuilds(state: BuildsState, payload: BuildSummary[]) { - if (state.pollingState !== PollingState.Polling) { - return state; - } - return { ...state, builds: payload }; - }, - setPollingIntervalId(state: BuildsState, payload: number | null) { - return { - ...state, - pollingIntervalId: payload, - pollingState: - payload === null ? PollingState.Idle : PollingState.Polling, - }; - }, - setRestartBuildError(state: BuildsState, payload: Error | null) { - return { ...state, restartBuildError: payload }; - }, - setGetBuildsError(state: BuildsState, payload: Error | null) { - return { ...state, getBuildsError: payload }; - }, - }, - effects: (dispatch: Dispatch) => ({ - async getBuilds(api: CircleCIApi, state: iRootState) { - try { - dispatch.builds.setGetBuildsError(null); - const newBuilds = await api.getBuilds({ - token: state.settings.token, - vcs: { - owner: state.settings.owner, - repo: state.settings.repo, - type: GitType.GITHUB, - }, - }); - dispatch.builds.setBuilds(newBuilds); - } catch (e) { - dispatch.builds.setGetBuildsError(null); - } - }, - async restartBuild( - { api, buildId }: { api: CircleCIApi; buildId: number }, - state: iRootState, - ) { - try { - dispatch.builds.setRestartBuildError(null); - await api.retry(buildId, { - token: state.settings.token, - vcs: { - owner: state.settings.owner, - repo: state.settings.repo, - type: GitType.GITHUB, - }, - }); - } catch (e) { - dispatch.builds.setRestartBuildError(e); - } - }, - - startPolling(api: CircleCIApi, state: iRootState) { - if (state.builds.pollingIntervalId) return; - - const intervalId = (setInterval( - () => dispatch.builds.getBuilds(api), - INTERVAL_AMOUNT, - ) as any) as number; - dispatch.builds.setPollingIntervalId(intervalId); - }, - stopPolling(_: any, state: iRootState) { - const currentIntervalId = state.builds.pollingIntervalId; - if (currentIntervalId) clearInterval(currentIntervalId); - dispatch.builds.setPollingIntervalId(null); - }, - }), -}; diff --git a/plugins/circleci/src/state/models/index.ts b/plugins/circleci/src/state/models/index.ts deleted file mode 100644 index 214fd62e6a..0000000000 --- a/plugins/circleci/src/state/models/index.ts +++ /dev/null @@ -1,28 +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 { builds } from './builds'; -import { buildWithSteps } from './buildWithSteps'; - -// no need to extend from Models -export interface RootModel { - builds: typeof builds; - buildWithSteps: typeof buildWithSteps; -} - -export const models = { - builds, - buildWithSteps, -}; diff --git a/plugins/circleci/src/state/store.ts b/plugins/circleci/src/state/store.ts deleted file mode 100644 index 503a2e9b73..0000000000 --- a/plugins/circleci/src/state/store.ts +++ /dev/null @@ -1,21 +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 { init, RematchRootState, RematchDispatch } from '@rematch/core'; -import { models, RootModel } from './models'; - -export type Dispatch = RematchDispatch; -export type iRootState = RematchRootState; -export default init({ models }); From 6a3cc270487f7ce7e8bc816180cc9a09cb42e866 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 14 May 2020 11:53:25 +0200 Subject: [PATCH 64/90] refactor: remove redux, some rearrangement --- plugins/circleci/package.json | 3 - .../circleci/src/components/Store/Store.tsx | 73 ++----------------- .../circleci/src/components/Store/types.ts | 62 ++++++++++++++++ .../circleci/src/pages/BuildsPage/builds.tsx | 6 +- .../src/pages/SettingsPage/settings.ts | 17 +---- yarn.lock | 29 +------- 6 files changed, 77 insertions(+), 113 deletions(-) create mode 100644 plugins/circleci/src/components/Store/types.ts diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index f13b7a2e74..b931442e7d 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -18,15 +18,12 @@ "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", - "@rematch/core": "^1.4.0", "@types/react-lazylog": "^4.5.0", - "@types/react-redux": "^7.1.8", "circleci-api": "^4.0.0", "moment": "^2.25.3", "react": "16.13.1", "react-dom": "16.13.1", "react-lazylog": "^4.5.2", - "react-redux": "^7.2.0", "react-router": "^5.1.2", "react-router-dom": "^5.1.2", "react-use": "^13.0.0" diff --git a/plugins/circleci/src/components/Store/Store.tsx b/plugins/circleci/src/components/Store/Store.tsx index 3085480b42..6692ef9468 100644 --- a/plugins/circleci/src/components/Store/Store.tsx +++ b/plugins/circleci/src/components/Store/Store.tsx @@ -13,40 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { FC, useReducer, Dispatch } from 'react'; +import React, { FC, useReducer, Dispatch, Reducer } from 'react'; import { circleCIApiRef } from '../../api'; -import { BuildSummary, BuildWithSteps } from 'circleci-api'; +import { State, PollingState, Action, SettingsState } from './types'; +export { SettingsState }; -export const AppContext = React.createContext<[AppState, Dispatch]>( +export const AppContext = React.createContext<[State, Dispatch]>( [] as any, ); - -type SettingsState = { - owner: string; - repo: string; - token: string; -}; - -export enum PollingState { - Polling, - Idle, -} - -export type BuildsState = { - builds: BuildSummary[]; - pollingIntervalId: number | null; - pollingState: PollingState; -}; - export const STORAGE_KEY = `${circleCIApiRef.id}.settings`; -export type AppState = { - settings: SettingsState; - builds: BuildsState; - buildsWithSteps: BuildsWithStepsState; -}; - -const initialState: AppState = { +const initialState: State = { settings: { owner: '', repo: '', @@ -65,45 +42,7 @@ const initialState: AppState = { }, }; -type SettingsAction = { - type: 'setCredentials'; - payload: { - repo: string; - owner: string; - token: string; - }; -}; - -type BuildsAction = - | { - type: 'setBuilds'; - payload: BuildSummary[]; - } - | { - type: 'setPollingIntervalId'; - payload: number | null; - }; - -type BuildsWithStepsAction = - | { - type: 'setBuildWithSteps'; - payload: BuildWithSteps; - } - | { - type: 'setPollingIntervalIdForBuildsWithSteps'; - payload: number | null; - }; - -export type BuildsWithStepsState = { - builds: Record; - pollingIntervalId: number | null; - pollingState: PollingState; - getBuildError: Error | null; -}; - -type Action = SettingsAction | BuildsAction | BuildsWithStepsAction; - -const reducer = (state: AppState, action: Action): AppState => { +const reducer: Reducer = (state, action) => { switch (action.type) { case 'setCredentials': return { diff --git a/plugins/circleci/src/components/Store/types.ts b/plugins/circleci/src/components/Store/types.ts new file mode 100644 index 0000000000..d01bcaf391 --- /dev/null +++ b/plugins/circleci/src/components/Store/types.ts @@ -0,0 +1,62 @@ +import { BuildSummary, BuildWithSteps } from '../../api'; + +export type SettingsState = { + owner: string; + repo: string; + token: string; +}; + +export enum PollingState { + Polling, + Idle, +} + +export type BuildsState = { + builds: BuildSummary[]; + pollingIntervalId: number | null; + pollingState: PollingState; +}; + +export type State = { + settings: SettingsState; + builds: BuildsState; + buildsWithSteps: BuildsWithStepsState; +}; + +type SettingsAction = { + type: 'setCredentials'; + payload: { + repo: string; + owner: string; + token: string; + }; +}; + +type BuildsAction = + | { + type: 'setBuilds'; + payload: BuildSummary[]; + } + | { + type: 'setPollingIntervalId'; + payload: number | null; + }; + +type BuildsWithStepsAction = + | { + type: 'setBuildWithSteps'; + payload: BuildWithSteps; + } + | { + type: 'setPollingIntervalIdForBuildsWithSteps'; + payload: number | null; + }; + +export type BuildsWithStepsState = { + builds: Record; + pollingIntervalId: number | null; + pollingState: PollingState; + getBuildError: Error | null; +}; + +export type Action = SettingsAction | BuildsAction | BuildsWithStepsAction; diff --git a/plugins/circleci/src/pages/BuildsPage/builds.tsx b/plugins/circleci/src/pages/BuildsPage/builds.tsx index fba1638fb7..9f23e78b31 100644 --- a/plugins/circleci/src/pages/BuildsPage/builds.tsx +++ b/plugins/circleci/src/pages/BuildsPage/builds.tsx @@ -17,7 +17,7 @@ import { errorApiRef, useApi } from '@backstage/core'; import { GitType } from 'circleci-api'; import { useContext, useEffect } from 'react'; import { circleCIApiRef } from '../../api/index'; -import { AppContext, BuildsState } from '../../components/Store'; +import { AppContext } from '../../components/Store'; export type BuildsDispatch = { restartBuild: (buildId: number) => Promise; @@ -25,7 +25,7 @@ export type BuildsDispatch = { const INTERVAL_AMOUNT = 3000; -export function useBuilds(): [BuildsState, BuildsDispatch] { +export function useBuilds() { const [{ builds, settings }, dispatch] = useContext(AppContext); const api = useApi(circleCIApiRef); const errorApi = useApi(errorApiRef); @@ -98,5 +98,5 @@ export function useBuilds(): [BuildsState, BuildsDispatch] { { restartBuild, }, - ]; + ] as const; } diff --git a/plugins/circleci/src/pages/SettingsPage/settings.ts b/plugins/circleci/src/pages/SettingsPage/settings.ts index 7f29b84f67..8c6de913e9 100644 --- a/plugins/circleci/src/pages/SettingsPage/settings.ts +++ b/plugins/circleci/src/pages/SettingsPage/settings.ts @@ -14,19 +14,9 @@ * limitations under the License. */ import { useContext, useEffect } from 'react'; -import { AppContext, STORAGE_KEY } from '../../components/Store'; +import { AppContext, STORAGE_KEY, SettingsState } from '../../components/Store'; import { useApi, errorApiRef } from '@backstage/core'; -export type SettingsDispatch = { - saveSettings: (settings: SettingsState) => void; -}; - -export type SettingsState = { - token: string; - owner: string; - repo: string; -}; - // type Effect = { // type: 'rehydrate', // payload: any @@ -35,7 +25,7 @@ export type SettingsState = { // const effects = []; // pushEffect, popEffect -export function useSettings(): [SettingsState, SettingsDispatch] { +export function useSettings() { const [{ settings }, dispatch] = useContext(AppContext); // const interpret = eff => { @@ -69,6 +59,7 @@ export function useSettings(): [SettingsState, SettingsDispatch] { errorApi.post(error); } }; + useEffect(() => { rehydrate(); }, []); @@ -88,5 +79,5 @@ export function useSettings(): [SettingsState, SettingsDispatch] { }); }, }, - ]; + ] as const; } diff --git a/yarn.lock b/yarn.lock index 665f5dd90b..80ea25a51e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2740,13 +2740,6 @@ prop-types "^15.6.1" react-lifecycles-compat "^3.0.4" -"@rematch/core@^1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@rematch/core/-/core-1.4.0.tgz#686ce814e1cf125029c5e9fba23ef3ab7c3eb2a7" - integrity sha512-1zy9cTYxbvDHP0PwIL1QqkwagCEnqA0uWMmPf8v2BYvLi2OsxIfX1xiV+vCP3sdJAjjZ0b9+IbSmj0DL2MEgLQ== - dependencies: - redux "^4.0.5" - "@rollup/plugin-commonjs@^11.0.2": version "11.0.2" resolved "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz#837cc6950752327cb90177b608f0928a4e60b582" @@ -4090,14 +4083,6 @@ resolved "https://registry.npmjs.org/@types/history/-/history-4.7.5.tgz#527d20ef68571a4af02ed74350164e7a67544860" integrity sha512-wLD/Aq2VggCJXSjxEwrMafIP51Z+13H78nXIX0ABEuIGhmB5sNGbR113MOKo+yfw+RDo1ZU3DM6yfnnRF/+ouw== -"@types/hoist-non-react-statics@^3.3.0": - version "3.3.1" - resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - "@types/html-minifier@*": version "3.5.3" resolved "https://registry.npmjs.org/@types/html-minifier/-/html-minifier-3.5.3.tgz#5276845138db2cebc54c789e0aaf87621a21e84f" @@ -4343,16 +4328,6 @@ "@types/react" "*" immutable ">=3.8.2" -"@types/react-redux@^7.1.8": - version "7.1.8" - resolved "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.8.tgz#3631feb559f7858d6ad9eea1d6ef41fa64fe7205" - integrity sha512-kpplH7Wg2SYU00sZVT98WBN0ou6QKrYcShRaW+5Vpe5l7bluKWJbWmAL+ieiso07OQzpcP5i1PeY3690640ZWg== - dependencies: - "@types/hoist-non-react-statics" "^3.3.0" - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - redux "^4.0.0" - "@types/react-router-dom@^5.1.3": version "5.1.3" resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.1.3.tgz#b5d28e7850bd274d944c0fbbe5d57e6b30d71196" @@ -17713,7 +17688,7 @@ react-popper@^1.3.6: typed-styles "^0.0.7" warning "^4.0.2" -react-redux@^7.0.3, react-redux@^7.2.0: +react-redux@^7.0.3: version "7.2.0" resolved "https://registry.npmjs.org/react-redux/-/react-redux-7.2.0.tgz#f970f62192b3981642fec46fd0db18a074fe879d" integrity sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA== @@ -18179,7 +18154,7 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" -redux@^4.0.0, redux@^4.0.1, redux@^4.0.5: +redux@^4.0.1: version "4.0.5" resolved "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== From 34e021ff596ee67226a6f51dd2d202556c45b5e8 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 14 May 2020 14:32:58 +0200 Subject: [PATCH 65/90] feat: routing --- plugins/circleci/src/components/App.tsx | 20 +++++++++++++++++++ .../circleci/src/components/Store/Store.tsx | 9 ++------- .../src/pages/BuildsPage/BuildsPage.tsx | 3 +-- .../DetailedViewPage/DetailedViewPage.tsx | 3 +-- .../src/pages/SettingsPage/SettingsPage.tsx | 3 +-- plugins/circleci/src/plugin.ts | 8 ++------ 6 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 plugins/circleci/src/components/App.tsx diff --git a/plugins/circleci/src/components/App.tsx b/plugins/circleci/src/components/App.tsx new file mode 100644 index 0000000000..68a02b70be --- /dev/null +++ b/plugins/circleci/src/components/App.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { Switch, Route } from 'react-router'; +import { BuildsPage } from '../pages/BuildsPage'; +import { SettingsPage } from '../pages/SettingsPage'; +import { DetailedViewPage } from '../pages/DetailedViewPage'; +import { Store } from './Store'; + +export const App = () => ( + + + + + + + +); diff --git a/plugins/circleci/src/components/Store/Store.tsx b/plugins/circleci/src/components/Store/Store.tsx index 6692ef9468..f6df1897a0 100644 --- a/plugins/circleci/src/components/Store/Store.tsx +++ b/plugins/circleci/src/components/Store/Store.tsx @@ -97,15 +97,10 @@ const reducer: Reducer = (state, action) => { export const Store: FC = ({ children }) => { const [state, dispatch] = useReducer(reducer, initialState); + return ( -
{children}
+ <>{children}
); }; - -export const withStore = (Component: React.ComponentType) => () => ( - - - -); diff --git a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx index 700aa1288e..01593ebf4d 100644 --- a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx +++ b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx @@ -19,7 +19,6 @@ import { Grid } from '@material-ui/core'; import { Builds } from './lib/Builds'; import { Layout } from '../../components/Layout'; import { PluginHeader } from '../../components/PluginHeader'; -import { withStore } from '../../components/Store'; const BuildsPage: FC<{}> = () => ( @@ -34,4 +33,4 @@ const BuildsPage: FC<{}> = () => ( ); -export default withStore(BuildsPage); +export default BuildsPage; diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx index f77b4ff5e7..19509b32d1 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -22,7 +22,6 @@ import { makeStyles } from '@material-ui/core/styles'; import { PluginHeader } from '../../components/PluginHeader'; import { ActionOutput } from './lib/ActionOutput/ActionOutput'; import { Layout } from '../../components/Layout'; -import { withStore } from '../../components/Store'; import { useBuildWithSteps } from './hooks'; const BuildName: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( @@ -144,4 +143,4 @@ const ActionsList: FC<{ actions: BuildStepAction[]; name: string }> = ({ ); }; -export default withStore(DetailedViewPage); +export default DetailedViewPage; diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 6b23207b50..76f37b955b 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -27,7 +27,6 @@ import { Alert } from '@material-ui/lab'; import { InfoCard, Content } from '@backstage/core'; import { Layout } from '../../components/Layout'; import { PluginHeader } from '../../components/PluginHeader'; -import { withStore } from '../../components/Store'; import { useSettings } from './settings'; const SettingsPage = () => { @@ -137,4 +136,4 @@ const SettingsPage = () => { ); }; -export default withStore(SettingsPage); +export default SettingsPage; diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index fb42c53835..77a223a162 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -14,15 +14,11 @@ * limitations under the License. */ import { createPlugin } from '@backstage/core'; -import { BuildsPage } from './pages/BuildsPage'; -import { SettingsPage } from './pages/SettingsPage'; -import { DetailedViewPage } from './pages/DetailedViewPage'; +import { App } from './components/App'; export const plugin = createPlugin({ id: 'circleci', register({ router }) { - router.registerRoute('/circleci', BuildsPage); - router.registerRoute('/circleci/settings', SettingsPage); - router.registerRoute('/circleci/build/:buildId', DetailedViewPage); + router.registerRoute('/circleci', App, { exact: false }); }, }); From bd2ac2c68357cfdf10998d12474b73334babf0b5 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 14 May 2020 16:05:22 +0200 Subject: [PATCH 66/90] refactor: move state Co-authored-by: Patrik Oldsberg Co-authored-by: Nikita Dudnik --- plugins/circleci/src/components/App.tsx | 6 +- .../circleci/src/components/Store/types.ts | 62 ------------------- .../pages/BuildsPage/lib/Builds/Builds.tsx | 20 ++++-- .../pages/BuildsPage/lib/CITable/CITable.tsx | 4 +- .../DetailedViewPage/DetailedViewPage.tsx | 13 +++- .../src/pages/SettingsPage/SettingsPage.tsx | 2 +- .../Store/Store.tsx => state/AppState.tsx} | 52 +++------------- .../src/{components/Store => state}/index.ts | 5 +- plugins/circleci/src/state/types.ts | 38 ++++++++++++ .../hooks.ts => state/useBuildWithSteps.ts} | 33 +++------- .../builds.tsx => state/useBuilds.tsx} | 34 +++------- .../settings.ts => state/useSettings.ts} | 2 +- 12 files changed, 100 insertions(+), 171 deletions(-) delete mode 100644 plugins/circleci/src/components/Store/types.ts rename plugins/circleci/src/{components/Store/Store.tsx => state/AppState.tsx} (53%) rename plugins/circleci/src/{components/Store => state}/index.ts (82%) create mode 100644 plugins/circleci/src/state/types.ts rename plugins/circleci/src/{pages/DetailedViewPage/hooks.ts => state/useBuildWithSteps.ts} (72%) rename plugins/circleci/src/{pages/BuildsPage/builds.tsx => state/useBuilds.tsx} (75%) rename plugins/circleci/src/{pages/SettingsPage/settings.ts => state/useSettings.ts} (96%) diff --git a/plugins/circleci/src/components/App.tsx b/plugins/circleci/src/components/App.tsx index 68a02b70be..21c710e2b1 100644 --- a/plugins/circleci/src/components/App.tsx +++ b/plugins/circleci/src/components/App.tsx @@ -3,10 +3,10 @@ import { Switch, Route } from 'react-router'; import { BuildsPage } from '../pages/BuildsPage'; import { SettingsPage } from '../pages/SettingsPage'; import { DetailedViewPage } from '../pages/DetailedViewPage'; -import { Store } from './Store'; +import { AppStateProvider } from '../state'; export const App = () => ( - + @@ -16,5 +16,5 @@ export const App = () => ( component={DetailedViewPage} /> - + ); diff --git a/plugins/circleci/src/components/Store/types.ts b/plugins/circleci/src/components/Store/types.ts deleted file mode 100644 index d01bcaf391..0000000000 --- a/plugins/circleci/src/components/Store/types.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { BuildSummary, BuildWithSteps } from '../../api'; - -export type SettingsState = { - owner: string; - repo: string; - token: string; -}; - -export enum PollingState { - Polling, - Idle, -} - -export type BuildsState = { - builds: BuildSummary[]; - pollingIntervalId: number | null; - pollingState: PollingState; -}; - -export type State = { - settings: SettingsState; - builds: BuildsState; - buildsWithSteps: BuildsWithStepsState; -}; - -type SettingsAction = { - type: 'setCredentials'; - payload: { - repo: string; - owner: string; - token: string; - }; -}; - -type BuildsAction = - | { - type: 'setBuilds'; - payload: BuildSummary[]; - } - | { - type: 'setPollingIntervalId'; - payload: number | null; - }; - -type BuildsWithStepsAction = - | { - type: 'setBuildWithSteps'; - payload: BuildWithSteps; - } - | { - type: 'setPollingIntervalIdForBuildsWithSteps'; - payload: number | null; - }; - -export type BuildsWithStepsState = { - builds: Record; - pollingIntervalId: number | null; - pollingState: PollingState; - getBuildError: Error | null; -}; - -export type Action = SettingsAction | BuildsAction | BuildsWithStepsAction; diff --git a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx index f52dff30ad..41001c91dd 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx @@ -13,11 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { FC } from 'react'; +import React, { FC, useEffect } from 'react'; import { CITableBuildInfo, CITable } from '../CITable'; import { BuildSummary } from '../../../../api'; -import { useBuilds } from '../../builds'; -import { useSettings } from '../../../SettingsPage/settings'; +import { useSettings, useBuilds } from '../../../../state'; const makeReadableStatus = (status: string | undefined) => { if (!status) return ''; @@ -49,7 +48,7 @@ const transform = ( ? buildData.subject + (buildData.retry_of ? ` (retry of #${buildData.retry_of})` : '') : '', - onRetryClick: () => + onRestartClick: () => typeof buildData.build_num !== 'undefined' && restartBuild(buildData.build_num), source: { @@ -67,9 +66,18 @@ const transform = ( }; export const Builds: FC<{}> = () => { - const [{ builds }, { restartBuild }] = useBuilds(); + const [ + builds, + { restartBuild: handleRestartBuild, startPolling, stopPolling }, + ] = useBuilds(); const [{ repo, owner }] = useSettings(); - const transformedBuilds = transform(builds, restartBuild); + + useEffect(() => { + startPolling(); + return () => stopPolling(); + }, [repo, owner]); + + const transformedBuilds = transform(builds, handleRestartBuild); return ( diff --git a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx index 5524d9985c..962b3b46b2 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx @@ -46,7 +46,7 @@ export type CITableBuildInfo = { failed: number; testUrl: string; // fixme better name }; - onRetryClick: () => void; + onRestartClick: () => void; }; // retried, canceled, infrastructure_fail, timedout, not_run, running, failed, queued, scheduled, not_running, no_tests, fixed, success @@ -106,7 +106,7 @@ const generatedColumns: TableColumn[] = [ { title: 'Actions', render: (row: Partial) => ( - + ), diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx index 19509b32d1..6e6996af58 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { FC } from 'react'; +import React, { FC, useEffect } from 'react'; import { useParams } from 'react-router-dom'; import { Content, InfoCard } from '@backstage/core'; import { BuildWithSteps, BuildStepAction } from '../../api'; @@ -22,7 +22,7 @@ import { makeStyles } from '@material-ui/core/styles'; import { PluginHeader } from '../../components/PluginHeader'; import { ActionOutput } from './lib/ActionOutput/ActionOutput'; import { Layout } from '../../components/Layout'; -import { useBuildWithSteps } from './hooks'; +import { useBuildWithSteps, useSettings } from '../../state'; const BuildName: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( <> @@ -89,8 +89,15 @@ const pickClassName = ( const DetailedViewPage: FC<{}> = () => { const { buildId = '' } = useParams(); const classes = useStyles(); + const [settings] = useSettings(); + const [build, { startPolling, stopPolling }] = useBuildWithSteps( + parseInt(buildId, 10), + ); - const [build] = useBuildWithSteps(parseInt(buildId, 10)); + useEffect(() => { + startPolling(); + return () => stopPolling(); + }, [buildId, settings]); return ( diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 76f37b955b..62b874d70e 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -27,7 +27,7 @@ import { Alert } from '@material-ui/lab'; import { InfoCard, Content } from '@backstage/core'; import { Layout } from '../../components/Layout'; import { PluginHeader } from '../../components/PluginHeader'; -import { useSettings } from './settings'; +import { useSettings } from '../../state'; const SettingsPage = () => { const [ diff --git a/plugins/circleci/src/components/Store/Store.tsx b/plugins/circleci/src/state/AppState.tsx similarity index 53% rename from plugins/circleci/src/components/Store/Store.tsx rename to plugins/circleci/src/state/AppState.tsx index f6df1897a0..8c2e46d68b 100644 --- a/plugins/circleci/src/components/Store/Store.tsx +++ b/plugins/circleci/src/state/AppState.tsx @@ -14,8 +14,8 @@ * limitations under the License. */ import React, { FC, useReducer, Dispatch, Reducer } from 'react'; -import { circleCIApiRef } from '../../api'; -import { State, PollingState, Action, SettingsState } from './types'; +import { circleCIApiRef } from '../api'; +import { State, Action, SettingsState } from './types'; export { SettingsState }; export const AppContext = React.createContext<[State, Dispatch]>( @@ -29,17 +29,8 @@ const initialState: State = { repo: '', token: '', }, - builds: { - builds: [], - pollingIntervalId: null, - pollingState: PollingState.Idle, - }, - buildsWithSteps: { - builds: {}, - pollingIntervalId: null, - pollingState: PollingState.Idle, - getBuildError: null, - }, + builds: [], + buildsWithSteps: {}, }; const reducer: Reducer = (state, action) => { @@ -47,55 +38,28 @@ const reducer: Reducer = (state, action) => { case 'setCredentials': return { ...state, - settings: { ...state.settings, ...(action.payload as {}) }, + settings: { ...state.settings, ...action.payload }, }; case 'setBuilds': return { ...state, - builds: { ...state.builds, builds: action.payload }, + builds: action.payload, }; case 'setBuildWithSteps': { - if (state.buildsWithSteps.pollingState !== PollingState.Polling) { - return state; - } return { ...state, buildsWithSteps: { ...state.buildsWithSteps, - builds: { - ...state.buildsWithSteps.builds, - [action.payload.build_num!]: action.payload, - }, + [action.payload.build_num!]: action.payload, }, }; } - case 'setPollingIntervalId': - return { - ...state, - builds: { - ...state.builds, - pollingIntervalId: action.payload, - pollingState: - action.payload === null ? PollingState.Idle : PollingState.Polling, - }, - }; - case 'setPollingIntervalIdForBuildsWithSteps': - return { - ...state, - buildsWithSteps: { - ...state.buildsWithSteps, - - pollingIntervalId: action.payload, - pollingState: - action.payload === null ? PollingState.Idle : PollingState.Polling, - }, - }; default: return state; } }; -export const Store: FC = ({ children }) => { +export const AppStateProvider: FC = ({ children }) => { const [state, dispatch] = useReducer(reducer, initialState); return ( diff --git a/plugins/circleci/src/components/Store/index.ts b/plugins/circleci/src/state/index.ts similarity index 82% rename from plugins/circleci/src/components/Store/index.ts rename to plugins/circleci/src/state/index.ts index 8ddb059053..24db02aff4 100644 --- a/plugins/circleci/src/components/Store/index.ts +++ b/plugins/circleci/src/state/index.ts @@ -13,4 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export * from './Store'; +export * from './AppState'; +export * from './useBuildWithSteps'; +export * from './useBuilds'; +export * from './useSettings'; diff --git a/plugins/circleci/src/state/types.ts b/plugins/circleci/src/state/types.ts new file mode 100644 index 0000000000..8f4849748f --- /dev/null +++ b/plugins/circleci/src/state/types.ts @@ -0,0 +1,38 @@ +import { BuildSummary, BuildWithSteps } from '../api'; + +export type SettingsState = { + owner: string; + repo: string; + token: string; +}; + +export type BuildsState = BuildSummary[]; + +export type State = { + settings: SettingsState; + builds: BuildsState; + buildsWithSteps: BuildsWithStepsState; +}; + +type SettingsAction = { + type: 'setCredentials'; + payload: { + repo: string; + owner: string; + token: string; + }; +}; + +type BuildsAction = { + type: 'setBuilds'; + payload: BuildSummary[]; +}; + +type BuildsWithStepsAction = { + type: 'setBuildWithSteps'; + payload: BuildWithSteps; +}; + +export type BuildsWithStepsState = Record; + +export type Action = SettingsAction | BuildsAction | BuildsWithStepsAction; diff --git a/plugins/circleci/src/pages/DetailedViewPage/hooks.ts b/plugins/circleci/src/state/useBuildWithSteps.ts similarity index 72% rename from plugins/circleci/src/pages/DetailedViewPage/hooks.ts rename to plugins/circleci/src/state/useBuildWithSteps.ts index 78ac6d8c7a..22f5309963 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/hooks.ts +++ b/plugins/circleci/src/state/useBuildWithSteps.ts @@ -14,16 +14,18 @@ * limitations under the License. */ import { errorApiRef, useApi } from '@backstage/core'; -import { useContext, useEffect } from 'react'; -import { circleCIApiRef, GitType } from '../../api/index'; -import { AppContext } from '../../components/Store'; -import { useSettings } from '../SettingsPage/settings'; +import { useContext, useRef } from 'react'; +import { circleCIApiRef, GitType } from '../api/index'; +import { AppContext } from '.'; +import { useSettings } from './useSettings'; const INTERVAL_AMOUNT = 3000; export function useBuildWithSteps(buildId: number) { const [settings] = useSettings(); const [{ buildsWithSteps }, dispatch] = useContext(AppContext); + const intervalId = useRef(null); + const isPolling = intervalId !== null; const api = useApi(circleCIApiRef); const errorApi = useApi(errorApiRef); @@ -38,7 +40,7 @@ export function useBuildWithSteps(buildId: number) { }, }; const build = await api.getBuild(buildId, options); - dispatch({ type: 'setBuildWithSteps', payload: build }); + if (isPolling) dispatch({ type: 'setBuildWithSteps', payload: build }); } catch (e) { errorApi.post(e); } @@ -61,33 +63,18 @@ export function useBuildWithSteps(buildId: number) { const startPolling = () => { stopPolling(); - const intervalId = (setInterval( + intervalId.current = (setInterval( () => getBuildWithSteps(), INTERVAL_AMOUNT, ) as any) as number; - dispatch({ - type: 'setPollingIntervalIdForBuildsWithSteps', - payload: intervalId, - }); }; const stopPolling = () => { - const currentIntervalId = buildsWithSteps.pollingIntervalId; + const currentIntervalId = intervalId.current; if (currentIntervalId) clearInterval(currentIntervalId); - dispatch({ - type: 'setPollingIntervalIdForBuildsWithSteps', - payload: null, - }); }; - useEffect(() => { - startPolling(); - return () => { - stopPolling(); - }; - }, [buildId, settings]); - - const build = buildsWithSteps.builds[buildId]; + const build = buildsWithSteps[buildId]; return [ build, diff --git a/plugins/circleci/src/pages/BuildsPage/builds.tsx b/plugins/circleci/src/state/useBuilds.tsx similarity index 75% rename from plugins/circleci/src/pages/BuildsPage/builds.tsx rename to plugins/circleci/src/state/useBuilds.tsx index 9f23e78b31..72e8830042 100644 --- a/plugins/circleci/src/pages/BuildsPage/builds.tsx +++ b/plugins/circleci/src/state/useBuilds.tsx @@ -15,18 +15,15 @@ */ import { errorApiRef, useApi } from '@backstage/core'; import { GitType } from 'circleci-api'; -import { useContext, useEffect } from 'react'; -import { circleCIApiRef } from '../../api/index'; -import { AppContext } from '../../components/Store'; - -export type BuildsDispatch = { - restartBuild: (buildId: number) => Promise; -}; +import { useContext, useRef } from 'react'; +import { circleCIApiRef } from '../api/index'; +import { AppContext } from '.'; const INTERVAL_AMOUNT = 3000; export function useBuilds() { const [{ builds, settings }, dispatch] = useContext(AppContext); + const intervalId = useRef(null); const api = useApi(circleCIApiRef); const errorApi = useApi(errorApiRef); @@ -67,36 +64,23 @@ export function useBuilds() { const startPolling = () => { stopPolling(); - const intervalId = (setInterval( + intervalId.current = (setInterval( () => getBuilds(), INTERVAL_AMOUNT, - ) as any) as number; - dispatch({ - type: 'setPollingIntervalId', - payload: intervalId, - }); + ) as unknown) as number; }; const stopPolling = () => { - const currentIntervalId = builds.pollingIntervalId; + const currentIntervalId = intervalId.current; if (currentIntervalId) clearInterval(currentIntervalId); - dispatch({ - type: 'setPollingIntervalId', - payload: null, - }); }; - useEffect(() => { - startPolling(); - return () => { - stopPolling(); - }; - }, [settings]); - return [ builds, { restartBuild, + startPolling, + stopPolling, }, ] as const; } diff --git a/plugins/circleci/src/pages/SettingsPage/settings.ts b/plugins/circleci/src/state/useSettings.ts similarity index 96% rename from plugins/circleci/src/pages/SettingsPage/settings.ts rename to plugins/circleci/src/state/useSettings.ts index 8c6de913e9..68f19ee3b9 100644 --- a/plugins/circleci/src/pages/SettingsPage/settings.ts +++ b/plugins/circleci/src/state/useSettings.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { useContext, useEffect } from 'react'; -import { AppContext, STORAGE_KEY, SettingsState } from '../../components/Store'; +import { AppContext, STORAGE_KEY, SettingsState } from '.'; import { useApi, errorApiRef } from '@backstage/core'; // type Effect = { From 9ff391681bfe7af53f10017f111a12355a716848 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Thu, 14 May 2020 16:07:46 +0200 Subject: [PATCH 67/90] refactor: renaming --- plugins/circleci/src/components/App.tsx | 2 +- .../BuildWithStepsPage.tsx} | 4 ++-- .../pages/{DetailedViewPage => BuildWithStepsPage}/index.ts | 2 +- .../lib/ActionOutput/ActionOutput.tsx | 4 ++-- .../lib/ActionOutput/index.ts | 0 5 files changed, 6 insertions(+), 6 deletions(-) rename plugins/circleci/src/pages/{DetailedViewPage/DetailedViewPage.tsx => BuildWithStepsPage/BuildWithStepsPage.tsx} (98%) rename plugins/circleci/src/pages/{DetailedViewPage => BuildWithStepsPage}/index.ts (89%) rename plugins/circleci/src/pages/{DetailedViewPage => BuildWithStepsPage}/lib/ActionOutput/ActionOutput.tsx (97%) rename plugins/circleci/src/pages/{DetailedViewPage => BuildWithStepsPage}/lib/ActionOutput/index.ts (100%) diff --git a/plugins/circleci/src/components/App.tsx b/plugins/circleci/src/components/App.tsx index 21c710e2b1..701d35ea16 100644 --- a/plugins/circleci/src/components/App.tsx +++ b/plugins/circleci/src/components/App.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { Switch, Route } from 'react-router'; import { BuildsPage } from '../pages/BuildsPage'; import { SettingsPage } from '../pages/SettingsPage'; -import { DetailedViewPage } from '../pages/DetailedViewPage'; +import { DetailedViewPage } from '../pages/BuildWithStepsPage'; import { AppStateProvider } from '../state'; export const App = () => ( diff --git a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx b/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx similarity index 98% rename from plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx rename to plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx index 6e6996af58..04a1fba753 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/DetailedViewPage.tsx +++ b/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx @@ -86,7 +86,7 @@ const pickClassName = ( return classes.neutral; }; -const DetailedViewPage: FC<{}> = () => { +const BuildWithStepsPage: FC<{}> = () => { const { buildId = '' } = useParams(); const classes = useStyles(); const [settings] = useSettings(); @@ -150,4 +150,4 @@ const ActionsList: FC<{ actions: BuildStepAction[]; name: string }> = ({ ); }; -export default DetailedViewPage; +export default BuildWithStepsPage; diff --git a/plugins/circleci/src/pages/DetailedViewPage/index.ts b/plugins/circleci/src/pages/BuildWithStepsPage/index.ts similarity index 89% rename from plugins/circleci/src/pages/DetailedViewPage/index.ts rename to plugins/circleci/src/pages/BuildWithStepsPage/index.ts index 40d25c4a84..2fb1f48e12 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/index.ts +++ b/plugins/circleci/src/pages/BuildWithStepsPage/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { default as DetailedViewPage } from './DetailedViewPage'; +export { default as DetailedViewPage } from './BuildWithStepsPage'; diff --git a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx b/plugins/circleci/src/pages/BuildWithStepsPage/lib/ActionOutput/ActionOutput.tsx similarity index 97% rename from plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx rename to plugins/circleci/src/pages/BuildWithStepsPage/lib/ActionOutput/ActionOutput.tsx index dd526c1b5f..e8e1bfe958 100644 --- a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/ActionOutput.tsx +++ b/plugins/circleci/src/pages/BuildWithStepsPage/lib/ActionOutput/ActionOutput.tsx @@ -50,8 +50,8 @@ export const ActionOutput: FC<{ const [messages, setMessages] = useState([]); useEffect(() => { fetch(url) - .then(res => res.json()) - .then(actionOutput => { + .then((res) => res.json()) + .then((actionOutput) => { if (typeof actionOutput !== 'undefined') { setMessages( actionOutput.map(({ message }: { message: string }) => message), diff --git a/plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/index.ts b/plugins/circleci/src/pages/BuildWithStepsPage/lib/ActionOutput/index.ts similarity index 100% rename from plugins/circleci/src/pages/DetailedViewPage/lib/ActionOutput/index.ts rename to plugins/circleci/src/pages/BuildWithStepsPage/lib/ActionOutput/index.ts From 9949ee68808dbccba113f539d9eb368b45ab242c Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Thu, 14 May 2020 17:15:16 +0200 Subject: [PATCH 68/90] Implement useAsyncPolling --- plugins/circleci/package.json | 1 + plugins/circleci/src/components/App.tsx | 15 ++++++++ plugins/circleci/src/state/AppState.tsx | 2 + plugins/circleci/src/state/types.ts | 15 ++++++++ plugins/circleci/src/state/useAsyncPolling.ts | 37 +++++++++++++++++++ .../circleci/src/state/useBuildWithSteps.ts | 23 ++++-------- plugins/circleci/src/state/useBuilds.tsx | 19 +++------- plugins/circleci/src/state/useSettings.ts | 19 ---------- 8 files changed, 82 insertions(+), 49 deletions(-) create mode 100644 plugins/circleci/src/state/useAsyncPolling.ts diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index b931442e7d..cd00135004 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -20,6 +20,7 @@ "@material-ui/lab": "4.0.0-alpha.45", "@types/react-lazylog": "^4.5.0", "circleci-api": "^4.0.0", + "fast-deep-equal": "^3.1.1", "moment": "^2.25.3", "react": "16.13.1", "react-dom": "16.13.1", diff --git a/plugins/circleci/src/components/App.tsx b/plugins/circleci/src/components/App.tsx index 701d35ea16..3324753b88 100644 --- a/plugins/circleci/src/components/App.tsx +++ b/plugins/circleci/src/components/App.tsx @@ -1,3 +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. + */ import React from 'react'; import { Switch, Route } from 'react-router'; import { BuildsPage } from '../pages/BuildsPage'; diff --git a/plugins/circleci/src/state/AppState.tsx b/plugins/circleci/src/state/AppState.tsx index 8c2e46d68b..ecea9e5221 100644 --- a/plugins/circleci/src/state/AppState.tsx +++ b/plugins/circleci/src/state/AppState.tsx @@ -17,6 +17,7 @@ import React, { FC, useReducer, Dispatch, Reducer } from 'react'; import { circleCIApiRef } from '../api'; import { State, Action, SettingsState } from './types'; export { SettingsState }; +import equal from 'fast-deep-equal'; export const AppContext = React.createContext<[State, Dispatch]>( [] as any, @@ -41,6 +42,7 @@ const reducer: Reducer = (state, action) => { settings: { ...state.settings, ...action.payload }, }; case 'setBuilds': + if (equal(action.payload, state.builds)) return state; return { ...state, builds: action.payload, diff --git a/plugins/circleci/src/state/types.ts b/plugins/circleci/src/state/types.ts index 8f4849748f..de801ad213 100644 --- a/plugins/circleci/src/state/types.ts +++ b/plugins/circleci/src/state/types.ts @@ -1,3 +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. + */ import { BuildSummary, BuildWithSteps } from '../api'; export type SettingsState = { diff --git a/plugins/circleci/src/state/useAsyncPolling.ts b/plugins/circleci/src/state/useAsyncPolling.ts new file mode 100644 index 0000000000..b82d023934 --- /dev/null +++ b/plugins/circleci/src/state/useAsyncPolling.ts @@ -0,0 +1,37 @@ +/* + * 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 { useRef } from 'react'; + +export const useAsyncPolling = ( + pollingFn: () => Promise, + interval: number, +) => { + const isPolling = useRef(false); + const startPolling = async () => { + if (isPolling.current === true) return; + isPolling.current = true; + + while (isPolling.current === true) { + await pollingFn(); + await new Promise((resolve) => setTimeout(resolve, interval)); + } + }; + + const stopPolling = () => { + isPolling.current = false; + }; + return { isPolling, startPolling, stopPolling }; +}; diff --git a/plugins/circleci/src/state/useBuildWithSteps.ts b/plugins/circleci/src/state/useBuildWithSteps.ts index 22f5309963..cb0a01c8c1 100644 --- a/plugins/circleci/src/state/useBuildWithSteps.ts +++ b/plugins/circleci/src/state/useBuildWithSteps.ts @@ -14,21 +14,25 @@ * limitations under the License. */ import { errorApiRef, useApi } from '@backstage/core'; -import { useContext, useRef } from 'react'; +import { useContext } from 'react'; import { circleCIApiRef, GitType } from '../api/index'; import { AppContext } from '.'; import { useSettings } from './useSettings'; +import { useAsyncPolling } from './useAsyncPolling'; + + const INTERVAL_AMOUNT = 3000; export function useBuildWithSteps(buildId: number) { const [settings] = useSettings(); const [{ buildsWithSteps }, dispatch] = useContext(AppContext); - const intervalId = useRef(null); - const isPolling = intervalId !== null; const api = useApi(circleCIApiRef); const errorApi = useApi(errorApiRef); + const {isPolling, startPolling, stopPolling} = useAsyncPolling(() => getBuildWithSteps(), INTERVAL_AMOUNT); + + const getBuildWithSteps = async () => { try { const options = { @@ -61,19 +65,6 @@ export function useBuildWithSteps(buildId: number) { } }; - const startPolling = () => { - stopPolling(); - intervalId.current = (setInterval( - () => getBuildWithSteps(), - INTERVAL_AMOUNT, - ) as any) as number; - }; - - const stopPolling = () => { - const currentIntervalId = intervalId.current; - if (currentIntervalId) clearInterval(currentIntervalId); - }; - const build = buildsWithSteps[buildId]; return [ diff --git a/plugins/circleci/src/state/useBuilds.tsx b/plugins/circleci/src/state/useBuilds.tsx index 72e8830042..89f85744c8 100644 --- a/plugins/circleci/src/state/useBuilds.tsx +++ b/plugins/circleci/src/state/useBuilds.tsx @@ -15,17 +15,19 @@ */ import { errorApiRef, useApi } from '@backstage/core'; import { GitType } from 'circleci-api'; -import { useContext, useRef } from 'react'; +import { useContext } from 'react'; import { circleCIApiRef } from '../api/index'; import { AppContext } from '.'; +import { useAsyncPolling } from './useAsyncPolling'; const INTERVAL_AMOUNT = 3000; export function useBuilds() { const [{ builds, settings }, dispatch] = useContext(AppContext); - const intervalId = useRef(null); + const api = useApi(circleCIApiRef); const errorApi = useApi(errorApiRef); + const {isPolling, startPolling, stopPolling} = useAsyncPolling(() => getBuilds(), INTERVAL_AMOUNT); const getBuilds = async () => { if (settings.owner === '' || settings.repo === '') return; @@ -38,7 +40,7 @@ export function useBuilds() { type: GitType.GITHUB, }, }); - dispatch({ + if (isPolling) dispatch({ type: 'setBuilds', payload: newBuilds, }); @@ -62,18 +64,7 @@ export function useBuilds() { } }; - const startPolling = () => { - stopPolling(); - intervalId.current = (setInterval( - () => getBuilds(), - INTERVAL_AMOUNT, - ) as unknown) as number; - }; - const stopPolling = () => { - const currentIntervalId = intervalId.current; - if (currentIntervalId) clearInterval(currentIntervalId); - }; return [ builds, diff --git a/plugins/circleci/src/state/useSettings.ts b/plugins/circleci/src/state/useSettings.ts index 68f19ee3b9..34b2f5e402 100644 --- a/plugins/circleci/src/state/useSettings.ts +++ b/plugins/circleci/src/state/useSettings.ts @@ -17,28 +17,9 @@ import { useContext, useEffect } from 'react'; import { AppContext, STORAGE_KEY, SettingsState } from '.'; import { useApi, errorApiRef } from '@backstage/core'; -// type Effect = { -// type: 'rehydrate', -// payload: any -// }; - -// const effects = []; -// pushEffect, popEffect - export function useSettings() { const [{ settings }, dispatch] = useContext(AppContext); - // const interpret = eff => { - // return { - // async rehydrate() {}, - - // }[eff.type](eff.payload) - // } - // useEffect(() => { - // const effectToInterpret = effects[0]; - // removeEffect(0); - // interpret(effectToInterpret) - // },[effects]) const errorApi = useApi(errorApiRef); From b4ef484e8591c7b8be0d06d8e741d9f452d62487 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Fri, 15 May 2020 11:49:38 +0200 Subject: [PATCH 69/90] fix: replace missing icons --- .../circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx index 962b3b46b2..b04e52b3a9 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx @@ -18,10 +18,10 @@ import { Link, Typography, Box, IconButton } from '@material-ui/core'; import { Replay as RetryIcon, GitHub as GithubIcon } from '@material-ui/icons'; import { Link as RouterLink } from 'react-router-dom'; import { - StatusFailed, + StatusError, + StatusWarning, StatusOK, StatusPending, - StatusNA, StatusRunning, Table, TableColumn, @@ -58,12 +58,12 @@ const getStatusComponent = (status: string | undefined = '') => { case 'running': return ; case 'failed': - return ; + return ; case 'success': return ; case 'canceled': default: - return ; + return ; } }; From 95f1500866bcae707973da9f93c723664bccdf87 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Fri, 15 May 2020 15:23:03 +0200 Subject: [PATCH 70/90] feat: external link --- .../pages/BuildWithStepsPage/BuildWithStepsPage.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx b/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx index 04a1fba753..7dbe5ef393 100644 --- a/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx +++ b/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx @@ -17,17 +17,22 @@ import React, { FC, useEffect } from 'react'; import { useParams } from 'react-router-dom'; import { Content, InfoCard } from '@backstage/core'; import { BuildWithSteps, BuildStepAction } from '../../api'; -import { Grid, Box } from '@material-ui/core'; +import { Grid, Box, Link, IconButton } from '@material-ui/core'; import { makeStyles } from '@material-ui/core/styles'; import { PluginHeader } from '../../components/PluginHeader'; import { ActionOutput } from './lib/ActionOutput/ActionOutput'; import { Layout } from '../../components/Layout'; import { useBuildWithSteps, useSettings } from '../../state'; +import LaunchIcon from '@material-ui/icons/Launch'; +const IconLink = IconButton as typeof Link; const BuildName: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( - <> + #{build?.build_num} - {build?.subject} - + + + + ); const useStyles = makeStyles((theme) => ({ neutral: {}, From 2d5787214aa9f548722cdfbb46660608cf0b1cee Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 18 May 2020 10:52:56 +0200 Subject: [PATCH 71/90] Fix linting --- .../circleci/src/components/PluginHeader/PluginHeader.tsx | 3 ++- .../circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx | 5 +++-- plugins/circleci/src/state/useBuildWithSteps.ts | 1 - plugins/circleci/src/state/useBuilds.tsx | 1 - 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx index 952e2578cd..7bd35d0805 100644 --- a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx +++ b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx @@ -17,7 +17,8 @@ import React, { FC } from 'react'; import { Link as RouterLink, useLocation } from 'react-router-dom'; import { ContentHeader, SupportButton } from '@backstage/core'; import { Button, IconButton, Box, Typography } from '@material-ui/core'; -import { Settings as SettingsIcon, ArrowBack } from '@material-ui/icons'; +import ArrowBack from '@material-ui/icons/ArrowBack'; +import SettingsIcon from '@material-ui/icons/Settings'; export type Props = { title?: string }; export const PluginHeader: FC = ({ title = 'Circle CI' }) => { diff --git a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx index b04e52b3a9..f8e0026ff5 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx @@ -15,7 +15,8 @@ */ import React, { FC } from 'react'; import { Link, Typography, Box, IconButton } from '@material-ui/core'; -import { Replay as RetryIcon, GitHub as GithubIcon } from '@material-ui/icons'; +import RetryIcon from '@material-ui/icons/Replay'; +import GitHubIcon from '@material-ui/icons/GitHub'; import { Link as RouterLink } from 'react-router-dom'; import { StatusError, @@ -123,7 +124,7 @@ export const CITable: FC<{ data={builds} title={ - + {projectName} diff --git a/plugins/circleci/src/state/useBuildWithSteps.ts b/plugins/circleci/src/state/useBuildWithSteps.ts index 2787143658..96d3a3f159 100644 --- a/plugins/circleci/src/state/useBuildWithSteps.ts +++ b/plugins/circleci/src/state/useBuildWithSteps.ts @@ -29,7 +29,6 @@ export function useBuildWithSteps(buildId: number) { const api = useApi(circleCIApiRef); const errorApi = useApi(errorApiRef); - /* eslint-disable-line no-use-before-define */ const { isPolling, startPolling, stopPolling } = useAsyncPolling( () => getBuildWithSteps(), INTERVAL_AMOUNT, diff --git a/plugins/circleci/src/state/useBuilds.tsx b/plugins/circleci/src/state/useBuilds.tsx index 9104b134cc..d46ac642a5 100644 --- a/plugins/circleci/src/state/useBuilds.tsx +++ b/plugins/circleci/src/state/useBuilds.tsx @@ -27,7 +27,6 @@ export function useBuilds() { const api = useApi(circleCIApiRef); const errorApi = useApi(errorApiRef); - // eslint-disable-line no-use-before-define const { isPolling, startPolling, stopPolling } = useAsyncPolling( () => getBuilds(), INTERVAL_AMOUNT, From 44389c61b866929807a60580c173ddc46ba0ef49 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 18 May 2020 14:14:03 +0200 Subject: [PATCH 72/90] Fix functions crossreference --- plugins/circleci/.eslintrc.js | 3 --- plugins/circleci/src/state/useAsyncPolling.ts | 2 +- .../circleci/src/state/useBuildWithSteps.ts | 12 ++++++------ plugins/circleci/src/state/useBuilds.tsx | 18 +++++++++--------- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/plugins/circleci/.eslintrc.js b/plugins/circleci/.eslintrc.js index f1f18a58c8..13573efa9c 100644 --- a/plugins/circleci/.eslintrc.js +++ b/plugins/circleci/.eslintrc.js @@ -1,6 +1,3 @@ module.exports = { extends: [require.resolve('@backstage/cli/config/eslint')], - rules: { - 'no-use-before-define': ['error', { variables: false }], - }, }; diff --git a/plugins/circleci/src/state/useAsyncPolling.ts b/plugins/circleci/src/state/useAsyncPolling.ts index b82d023934..2f8de0c2fe 100644 --- a/plugins/circleci/src/state/useAsyncPolling.ts +++ b/plugins/circleci/src/state/useAsyncPolling.ts @@ -33,5 +33,5 @@ export const useAsyncPolling = ( const stopPolling = () => { isPolling.current = false; }; - return { isPolling, startPolling, stopPolling }; + return { startPolling, stopPolling }; }; diff --git a/plugins/circleci/src/state/useBuildWithSteps.ts b/plugins/circleci/src/state/useBuildWithSteps.ts index 96d3a3f159..3cfe830b25 100644 --- a/plugins/circleci/src/state/useBuildWithSteps.ts +++ b/plugins/circleci/src/state/useBuildWithSteps.ts @@ -29,11 +29,6 @@ export function useBuildWithSteps(buildId: number) { const api = useApi(circleCIApiRef); const errorApi = useApi(errorApiRef); - const { isPolling, startPolling, stopPolling } = useAsyncPolling( - () => getBuildWithSteps(), - INTERVAL_AMOUNT, - ); - const getBuildWithSteps = async () => { try { const options = { @@ -45,12 +40,17 @@ export function useBuildWithSteps(buildId: number) { }, }; const build = await api.getBuild(buildId, options); - if (isPolling) dispatch({ type: 'setBuildWithSteps', payload: build }); + dispatch({ type: 'setBuildWithSteps', payload: build }); } catch (e) { errorApi.post(e); } }; + const { startPolling, stopPolling } = useAsyncPolling( + getBuildWithSteps, + INTERVAL_AMOUNT, + ); + const restartBuild = async () => { try { await api.retry(buildId, { diff --git a/plugins/circleci/src/state/useBuilds.tsx b/plugins/circleci/src/state/useBuilds.tsx index d46ac642a5..4a8908a09f 100644 --- a/plugins/circleci/src/state/useBuilds.tsx +++ b/plugins/circleci/src/state/useBuilds.tsx @@ -27,10 +27,6 @@ export function useBuilds() { const api = useApi(circleCIApiRef); const errorApi = useApi(errorApiRef); - const { isPolling, startPolling, stopPolling } = useAsyncPolling( - () => getBuilds(), - INTERVAL_AMOUNT, - ); const getBuilds = async () => { if (settings.owner === '' || settings.repo === '') return; @@ -43,16 +39,20 @@ export function useBuilds() { type: GitType.GITHUB, }, }); - if (isPolling) - dispatch({ - type: 'setBuilds', - payload: newBuilds, - }); + dispatch({ + type: 'setBuilds', + payload: newBuilds, + }); } catch (e) { errorApi.post(e); } }; + const { startPolling, stopPolling } = useAsyncPolling( + getBuilds, + INTERVAL_AMOUNT, + ); + const restartBuild = async (buildId: number) => { try { await api.retry(buildId, { From cfd6508e98341d52237bd55f276b6ebb9e81b645 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 18 May 2020 15:54:55 +0200 Subject: [PATCH 73/90] Fix merge conflicts --- package.json | 1 + packages/app/package.json | 9 ++++++++- packages/cli/src/commands/app/serve.ts | 8 +++++++- packages/cli/src/lib/bundler/server.ts | 1 + packages/cli/src/lib/bundler/types.ts | 2 ++ .../src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx | 3 ++- .../circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx | 3 ++- plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx | 2 +- plugins/circleci/src/state/AppState.tsx | 4 ++-- plugins/circleci/src/state/index.ts | 3 --- plugins/circleci/src/state/useSettings.ts | 1 - yarn.lock | 8 ++++++++ 12 files changed, 34 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index c5412f5855..4d3d678690 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "version": "1.0.0", "devDependencies": { "@spotify/eslint-config-oss": "^1.0.1", + "file-loader": "^6.0.0", "husky": "^4.2.3", "identity-obj-proxy": "^3.0.0", "lerna": "^3.20.2", diff --git a/packages/app/package.json b/packages/app/package.json index f55594ce8e..adf8e9675e 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -64,5 +64,12 @@ "last 1 safari version" ] }, - "license": "Apache-2.0" + "license": "Apache-2.0", + "proxy": { + "/circleci/api": { + "target": "https://circleci.com/api/v1.1", + "changeOrigin": true, + "pathRewrite": {"^/circleci/api/": "/"} + } + } } diff --git a/packages/cli/src/commands/app/serve.ts b/packages/cli/src/commands/app/serve.ts index 182e338287..58e9e5fc16 100644 --- a/packages/cli/src/commands/app/serve.ts +++ b/packages/cli/src/commands/app/serve.ts @@ -14,13 +14,19 @@ * limitations under the License. */ -import { serveBundle } from '../../lib/bundler'; +import fs from 'fs-extra'; import { Command } from 'commander'; +import { serveBundle } from '../../lib/bundler'; +import { paths } from '../../lib/paths'; export default async (cmd: Command) => { + const pkgPath = paths.resolveTarget('package.json'); + const pkg = await fs.readJson(pkgPath); + const waitForExit = await serveBundle({ entry: 'src/index', checksEnabled: cmd.check, + proxy: pkg.proxy, }); await waitForExit(); diff --git a/packages/cli/src/lib/bundler/server.ts b/packages/cli/src/lib/bundler/server.ts index 3aaf5968f5..c130c14d4a 100644 --- a/packages/cli/src/lib/bundler/server.ts +++ b/packages/cli/src/lib/bundler/server.ts @@ -48,6 +48,7 @@ export async function serveBundle(options: ServeOptions) { https: protocol === 'https', host, port, + proxy: options.proxy, }); await new Promise((resolve, reject) => { diff --git a/packages/cli/src/lib/bundler/types.ts b/packages/cli/src/lib/bundler/types.ts index 4182226d69..5e14760574 100644 --- a/packages/cli/src/lib/bundler/types.ts +++ b/packages/cli/src/lib/bundler/types.ts @@ -15,6 +15,7 @@ */ import { BundlingPathsOptions } from './paths'; +import { ProxyConfigMap } from 'webpack-dev-server'; export type BundlingOptions = { checksEnabled: boolean; @@ -23,6 +24,7 @@ export type BundlingOptions = { export type ServeOptions = BundlingPathsOptions & { checksEnabled: boolean; + proxy?: ProxyConfigMap; }; export type BuildOptions = BundlingPathsOptions & { diff --git a/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx b/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx index 7dbe5ef393..021a2ced2b 100644 --- a/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx +++ b/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx @@ -22,8 +22,9 @@ import { makeStyles } from '@material-ui/core/styles'; import { PluginHeader } from '../../components/PluginHeader'; import { ActionOutput } from './lib/ActionOutput/ActionOutput'; import { Layout } from '../../components/Layout'; -import { useBuildWithSteps, useSettings } from '../../state'; import LaunchIcon from '@material-ui/icons/Launch'; +import { useSettings } from '../../state/useSettings'; +import { useBuildWithSteps } from '../../state/useBuildWithSteps'; const IconLink = IconButton as typeof Link; const BuildName: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( diff --git a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx index 41001c91dd..a121822af3 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx @@ -16,7 +16,8 @@ import React, { FC, useEffect } from 'react'; import { CITableBuildInfo, CITable } from '../CITable'; import { BuildSummary } from '../../../../api'; -import { useSettings, useBuilds } from '../../../../state'; +import { useBuilds } from '../../../../state/useBuilds'; +import { useSettings } from '../../../../state/useSettings'; const makeReadableStatus = (status: string | undefined) => { if (!status) return ''; diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx index 62b874d70e..f009b7487f 100644 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx @@ -27,7 +27,7 @@ import { Alert } from '@material-ui/lab'; import { InfoCard, Content } from '@backstage/core'; import { Layout } from '../../components/Layout'; import { PluginHeader } from '../../components/PluginHeader'; -import { useSettings } from '../../state'; +import { useSettings } from '../../state/useSettings'; const SettingsPage = () => { const [ diff --git a/plugins/circleci/src/state/AppState.tsx b/plugins/circleci/src/state/AppState.tsx index ecea9e5221..b4fedb6abd 100644 --- a/plugins/circleci/src/state/AppState.tsx +++ b/plugins/circleci/src/state/AppState.tsx @@ -15,8 +15,8 @@ */ import React, { FC, useReducer, Dispatch, Reducer } from 'react'; import { circleCIApiRef } from '../api'; -import { State, Action, SettingsState } from './types'; -export { SettingsState }; +import type { SettingsState, State, Action } from './types'; +export type { SettingsState }; import equal from 'fast-deep-equal'; export const AppContext = React.createContext<[State, Dispatch]>( diff --git a/plugins/circleci/src/state/index.ts b/plugins/circleci/src/state/index.ts index 24db02aff4..4ef67f62ea 100644 --- a/plugins/circleci/src/state/index.ts +++ b/plugins/circleci/src/state/index.ts @@ -14,6 +14,3 @@ * limitations under the License. */ export * from './AppState'; -export * from './useBuildWithSteps'; -export * from './useBuilds'; -export * from './useSettings'; diff --git a/plugins/circleci/src/state/useSettings.ts b/plugins/circleci/src/state/useSettings.ts index 34b2f5e402..c2d5714f0f 100644 --- a/plugins/circleci/src/state/useSettings.ts +++ b/plugins/circleci/src/state/useSettings.ts @@ -20,7 +20,6 @@ import { useApi, errorApiRef } from '@backstage/core'; export function useSettings() { const [{ settings }, dispatch] = useContext(AppContext); - const errorApi = useApi(errorApiRef); const rehydrate = () => { diff --git a/yarn.lock b/yarn.lock index 37e0a55af3..da6f670bef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9277,6 +9277,14 @@ file-loader@^4.2.0: loader-utils "^1.2.3" schema-utils "^2.5.0" +file-loader@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f" + integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.5" + file-system-cache@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/file-system-cache/-/file-system-cache-1.0.5.tgz#84259b36a2bbb8d3d6eb1021d3132ffe64cfff4f" From 9c9250faf0c97aeb9fe99089639f655f705adc9c Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 18 May 2020 17:18:25 +0200 Subject: [PATCH 74/90] feat: remove polling, add pagination, refactor --- plugins/circleci/src/api/index.ts | 9 +- plugins/circleci/src/components/App.tsx | 32 ++-- .../circleci/src/components/Layout/Layout.tsx | 36 +++-- .../components/PluginHeader/PluginHeader.tsx | 8 +- .../src/components/Settings/Settings.tsx | 127 +++++++++++++++ .../Settings}/index.ts | 2 +- .../BuildWithStepsPage/BuildWithStepsPage.tsx | 14 +- .../pages/BuildsPage/lib/Builds/Builds.tsx | 79 ++-------- .../pages/BuildsPage/lib/CITable/CITable.tsx | 40 ++++- .../src/pages/SettingsPage/SettingsPage.tsx | 139 ----------------- plugins/circleci/src/state/AppState.tsx | 33 ++-- plugins/circleci/src/state/types.ts | 49 ++---- .../circleci/src/state/useBuildWithSteps.ts | 50 +++--- plugins/circleci/src/state/useBuilds.tsx | 145 +++++++++++++----- plugins/circleci/src/state/useSettings.ts | 13 +- 15 files changed, 401 insertions(+), 375 deletions(-) create mode 100644 plugins/circleci/src/components/Settings/Settings.tsx rename plugins/circleci/src/{pages/SettingsPage => components/Settings}/index.ts (91%) delete mode 100644 plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx diff --git a/plugins/circleci/src/api/index.ts b/plugins/circleci/src/api/index.ts index d98f511f35..f683f79ff9 100644 --- a/plugins/circleci/src/api/index.ts +++ b/plugins/circleci/src/api/index.ts @@ -48,8 +48,15 @@ export class CircleCIApi { }); } - async getBuilds(options: CircleCIOptions) { + async getBuilds( + { limit = 10, offset = 0 }: { limit: number; offset: number }, + options: CircleCIOptions, + ) { return getBuildSummaries(options.token, { + options: { + limit, + offset, + }, vcs: {}, circleHost: this.apiUrl, ...options, diff --git a/plugins/circleci/src/components/App.tsx b/plugins/circleci/src/components/App.tsx index 3324753b88..46b70cb500 100644 --- a/plugins/circleci/src/components/App.tsx +++ b/plugins/circleci/src/components/App.tsx @@ -16,20 +16,24 @@ import React from 'react'; import { Switch, Route } from 'react-router'; import { BuildsPage } from '../pages/BuildsPage'; -import { SettingsPage } from '../pages/SettingsPage'; import { DetailedViewPage } from '../pages/BuildWithStepsPage'; import { AppStateProvider } from '../state'; +import { Settings } from './Settings'; -export const App = () => ( - - - - - - - -); +export const App = () => { + return ( + + <> + + + + + + + + ); +}; diff --git a/plugins/circleci/src/components/Layout/Layout.tsx b/plugins/circleci/src/components/Layout/Layout.tsx index eab8ab0e88..2028e1533d 100644 --- a/plugins/circleci/src/components/Layout/Layout.tsx +++ b/plugins/circleci/src/components/Layout/Layout.tsx @@ -19,20 +19,22 @@ import { Header, Page, pageTheme, HeaderLabel } from '@backstage/core'; import logo from '../../assets/circle-logo-badge-white-15.png'; import { Box } from '@material-ui/core'; -export const Layout: React.FC = ({ children }) => ( - -
- Backstage Logo - Circle CI - - } - > - - -
- {children} -
-); +export const Layout: React.FC = ({ children }) => { + return ( + +
+ Backstage Logo + Circle CI + + } + > + + +
+ {children} +
+ ); +}; diff --git a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx index 7bd35d0805..4bab4b5921 100644 --- a/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx +++ b/plugins/circleci/src/components/PluginHeader/PluginHeader.tsx @@ -19,9 +19,11 @@ import { ContentHeader, SupportButton } from '@backstage/core'; import { Button, IconButton, Box, Typography } from '@material-ui/core'; import ArrowBack from '@material-ui/icons/ArrowBack'; import SettingsIcon from '@material-ui/icons/Settings'; +import { useSettings } from '../../state'; export type Props = { title?: string }; export const PluginHeader: FC = ({ title = 'Circle CI' }) => { + const [, { showSettings }] = useSettings(); const location = useLocation(); const notRoot = !location.pathname.match(/\/circleci\/?$/); const isSettingsPage = location.pathname.match(/\/circleci\/settings\/?/); @@ -40,11 +42,7 @@ export const PluginHeader: FC = ({ title = 'Circle CI' }) => { )} > {!isSettingsPage && ( - )} diff --git a/plugins/circleci/src/components/Settings/Settings.tsx b/plugins/circleci/src/components/Settings/Settings.tsx new file mode 100644 index 0000000000..b33bf59dd8 --- /dev/null +++ b/plugins/circleci/src/components/Settings/Settings.tsx @@ -0,0 +1,127 @@ +/* + * 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, { useState } from 'react'; +import { + Button, + TextField, + List, + ListItem, + Snackbar, + Box, + Dialog, + DialogTitle, +} from '@material-ui/core'; +import { Alert } from '@material-ui/lab'; +import { useSettings } from '../../state'; + +const Settings = () => { + const [ + { + repo: repoFromStore, + owner: ownerFromStore, + token: tokenFromStore, + showSettings, + }, + { saveSettings, hideSettings }, + ] = useSettings(); + + const [token, setToken] = React.useState(() => tokenFromStore); + const [owner, setOwner] = React.useState(() => ownerFromStore); + const [repo, setRepo] = React.useState(() => repoFromStore); + + React.useEffect(() => { + if (tokenFromStore !== token) { + setToken(tokenFromStore); + } + if (ownerFromStore !== owner) { + setOwner(ownerFromStore); + } + if (repoFromStore !== repo) { + setRepo(repoFromStore); + } + }, [ownerFromStore, repoFromStore, tokenFromStore]); + + const [saved, setSaved] = useState(false); + + return ( + <> + setSaved(false)} + > + Credentials saved. + + + + Project Credentials + {/* {authed ? : } */} + + + + setToken(e.target.value)} + /> + + + setOwner(e.target.value)} + /> + + + setRepo(e.target.value)} + /> + + + + + + + + + + ); +}; + +export default Settings; diff --git a/plugins/circleci/src/pages/SettingsPage/index.ts b/plugins/circleci/src/components/Settings/index.ts similarity index 91% rename from plugins/circleci/src/pages/SettingsPage/index.ts rename to plugins/circleci/src/components/Settings/index.ts index e0ba8157b2..c04ded6dea 100644 --- a/plugins/circleci/src/pages/SettingsPage/index.ts +++ b/plugins/circleci/src/components/Settings/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { default as SettingsPage } from './SettingsPage'; +export { default as Settings } from './Settings'; diff --git a/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx b/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx index 7dbe5ef393..0a4dfd4050 100644 --- a/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx +++ b/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx @@ -15,7 +15,7 @@ */ import React, { FC, useEffect } from 'react'; import { useParams } from 'react-router-dom'; -import { Content, InfoCard } from '@backstage/core'; +import { Content, InfoCard, Progress } from '@backstage/core'; import { BuildWithSteps, BuildStepAction } from '../../api'; import { Grid, Box, Link, IconButton } from '@material-ui/core'; import { makeStyles } from '@material-ui/core/styles'; @@ -26,7 +26,7 @@ import { useBuildWithSteps, useSettings } from '../../state'; import LaunchIcon from '@material-ui/icons/Launch'; const IconLink = IconButton as typeof Link; -const BuildName: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( +const BuildName: FC<{ build?: BuildWithSteps }> = ({ build }) => ( #{build?.build_num} - {build?.subject} @@ -95,7 +95,7 @@ const BuildWithStepsPage: FC<{}> = () => { const { buildId = '' } = useParams(); const classes = useStyles(); const [settings] = useSettings(); - const [build, { startPolling, stopPolling }] = useBuildWithSteps( + const [{ loading, value }, { startPolling, stopPolling }] = useBuildWithSteps( parseInt(buildId, 10), ); @@ -112,11 +112,11 @@ const BuildWithStepsPage: FC<{}> = () => { } + className={pickClassName(classes, value)} + title={} cardClassName={classes.cardContent} > - + {loading ? : } @@ -125,7 +125,7 @@ const BuildWithStepsPage: FC<{}> = () => { ); }; -const BuildsList: FC<{ build: BuildWithSteps | null }> = ({ build }) => ( +const BuildsList: FC<{ build?: BuildWithSteps }> = ({ build }) => ( {build && build.steps && diff --git a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx index 41001c91dd..bed96bb24c 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/Builds/Builds.tsx @@ -13,73 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { FC, useEffect } from 'react'; -import { CITableBuildInfo, CITable } from '../CITable'; -import { BuildSummary } from '../../../../api'; -import { useSettings, useBuilds } from '../../../../state'; - -const makeReadableStatus = (status: string | undefined) => { - if (!status) return ''; - return ({ - retried: 'Retried', - canceled: 'Canceled', - infrastructure_fail: 'Infra fail', - timedout: 'Timedout', - not_run: 'Not run', - running: 'Running', - failed: 'Failed', - queued: 'Queued', - scheduled: 'Scheduled', - not_running: 'Not running', - no_tests: 'No tests', - fixed: 'Fixed', - success: 'Success', - } as Record)[status]; -}; - -const transform = ( - buildsData: BuildSummary[], - restartBuild: { (buildId: number): Promise }, -): CITableBuildInfo[] => { - return buildsData.map((buildData) => { - const tableBuildInfo: CITableBuildInfo = { - id: String(buildData.build_num), - buildName: buildData.subject - ? buildData.subject + - (buildData.retry_of ? ` (retry of #${buildData.retry_of})` : '') - : '', - onRestartClick: () => - typeof buildData.build_num !== 'undefined' && - restartBuild(buildData.build_num), - source: { - branchName: String(buildData.branch), - commit: { - hash: String(buildData.vcs_revision), - url: 'todo', - }, - }, - status: makeReadableStatus(buildData.status), - buildUrl: buildData.build_url, - }; - return tableBuildInfo; - }); -}; +import React, { FC } from 'react'; +import { CITable } from '../CITable'; +import { useBuilds } from '../../../../state'; export const Builds: FC<{}> = () => { const [ - builds, - { restartBuild: handleRestartBuild, startPolling, stopPolling }, + { total, loading, value, projectName, page, pageSize }, + { setPage, retry, setPageSize }, ] = useBuilds(); - const [{ repo, owner }] = useSettings(); - - useEffect(() => { - startPolling(); - return () => stopPolling(); - }, [repo, owner]); - - const transformedBuilds = transform(builds, handleRestartBuild); - return ( - + ); }; diff --git a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx index f8e0026ff5..b349dcfcbe 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/circleci/src/pages/BuildsPage/lib/CITable/CITable.tsx @@ -114,14 +114,46 @@ const generatedColumns: TableColumn[] = [ width: '10%', }, ]; -export const CITable: FC<{ + +type Props = { + loading: boolean; + retry: () => void; builds: CITableBuildInfo[]; projectName: string; -}> = React.memo(({ builds = [], projectName }) => { + page: number; + onChangePage: (page: number) => void; + total: number; + pageSize: number; + onChangePageSize: (pageSize: number) => void; +}; +export const CITable: FC = ({ + projectName, + loading, + pageSize, + page, + retry, + builds, + onChangePage, + onChangePageSize, + total, +}) => { return (
, + tooltip: 'Refresh Data', + isFreeAction: true, + onClick: () => retry(), + }, + ]} data={builds} + onChangePage={onChangePage} + onChangeRowsPerPage={onChangePageSize} title={ @@ -132,4 +164,4 @@ export const CITable: FC<{ columns={generatedColumns} /> ); -}); +}; diff --git a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx b/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx deleted file mode 100644 index 62b874d70e..0000000000 --- a/plugins/circleci/src/pages/SettingsPage/SettingsPage.tsx +++ /dev/null @@ -1,139 +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 React, { useState } from 'react'; -import { - Button, - TextField, - List, - Grid, - ListItem, - Snackbar, - Box, -} from '@material-ui/core'; -import { Alert } from '@material-ui/lab'; -import { InfoCard, Content } from '@backstage/core'; -import { Layout } from '../../components/Layout'; -import { PluginHeader } from '../../components/PluginHeader'; -import { useSettings } from '../../state'; - -const SettingsPage = () => { - const [ - { repo: repoFromStore, owner: ownerFromStore, token: tokenFromStore }, - { saveSettings }, - ] = useSettings(); - - const [token, setToken] = React.useState(() => tokenFromStore); - const [owner, setOwner] = React.useState(() => ownerFromStore); - const [repo, setRepo] = React.useState(() => repoFromStore); - - React.useEffect(() => { - if (tokenFromStore !== token) { - setToken(tokenFromStore); - } - if (ownerFromStore !== owner) { - setOwner(ownerFromStore); - } - if (repoFromStore !== repo) { - setRepo(repoFromStore); - } - }, [ownerFromStore, repoFromStore, tokenFromStore]); - - const [saved, setSaved] = useState(false); - - return ( - - - - - - - - Project Credentials - {/* {authed ? : } */} - setSaved(false)} - > - Credentials saved. - - - } - > - - - setToken(e.target.value)} - /> - - - setOwner(e.target.value)} - /> - - - setRepo(e.target.value)} - /> - - - - - - - - - - - - - ); -}; - -export default SettingsPage; diff --git a/plugins/circleci/src/state/AppState.tsx b/plugins/circleci/src/state/AppState.tsx index ecea9e5221..2e98f86661 100644 --- a/plugins/circleci/src/state/AppState.tsx +++ b/plugins/circleci/src/state/AppState.tsx @@ -17,7 +17,6 @@ import React, { FC, useReducer, Dispatch, Reducer } from 'react'; import { circleCIApiRef } from '../api'; import { State, Action, SettingsState } from './types'; export { SettingsState }; -import equal from 'fast-deep-equal'; export const AppContext = React.createContext<[State, Dispatch]>( [] as any, @@ -25,13 +24,10 @@ export const AppContext = React.createContext<[State, Dispatch]>( export const STORAGE_KEY = `${circleCIApiRef.id}.settings`; const initialState: State = { - settings: { - owner: '', - repo: '', - token: '', - }, - builds: [], - buildsWithSteps: {}, + owner: '', + repo: '', + token: '', + showSettings: false, }; const reducer: Reducer = (state, action) => { @@ -39,23 +35,12 @@ const reducer: Reducer = (state, action) => { case 'setCredentials': return { ...state, - settings: { ...state.settings, ...action.payload }, + ...action.payload, }; - case 'setBuilds': - if (equal(action.payload, state.builds)) return state; - return { - ...state, - builds: action.payload, - }; - case 'setBuildWithSteps': { - return { - ...state, - buildsWithSteps: { - ...state.buildsWithSteps, - [action.payload.build_num!]: action.payload, - }, - }; - } + case 'showSettings': + return { ...state, showSettings: true }; + case 'hideSettings': + return { ...state, showSettings: false }; default: return state; } diff --git a/plugins/circleci/src/state/types.ts b/plugins/circleci/src/state/types.ts index de801ad213..41b3577082 100644 --- a/plugins/circleci/src/state/types.ts +++ b/plugins/circleci/src/state/types.ts @@ -13,41 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { BuildSummary, BuildWithSteps } from '../api'; -export type SettingsState = { - owner: string; - repo: string; - token: string; +export type Settings = { owner: string; repo: string; token: string }; +export type SettingsState = Settings & { + showSettings: boolean; }; -export type BuildsState = BuildSummary[]; +export type State = SettingsState; -export type State = { - settings: SettingsState; - builds: BuildsState; - buildsWithSteps: BuildsWithStepsState; -}; +type SettingsAction = + | { + type: 'setCredentials'; + payload: { + repo: string; + owner: string; + token: string; + }; + } + | { type: 'showSettings' } + | { type: 'hideSettings' }; -type SettingsAction = { - type: 'setCredentials'; - payload: { - repo: string; - owner: string; - token: string; - }; -}; - -type BuildsAction = { - type: 'setBuilds'; - payload: BuildSummary[]; -}; - -type BuildsWithStepsAction = { - type: 'setBuildWithSteps'; - payload: BuildWithSteps; -}; - -export type BuildsWithStepsState = Record; - -export type Action = SettingsAction | BuildsAction | BuildsWithStepsAction; +export type Action = SettingsAction; diff --git a/plugins/circleci/src/state/useBuildWithSteps.ts b/plugins/circleci/src/state/useBuildWithSteps.ts index 96d3a3f159..d77203cce0 100644 --- a/plugins/circleci/src/state/useBuildWithSteps.ts +++ b/plugins/circleci/src/state/useBuildWithSteps.ts @@ -14,50 +14,43 @@ * limitations under the License. */ import { errorApiRef, useApi } from '@backstage/core'; -import { useContext } from 'react'; +import { useCallback } from 'react'; import { circleCIApiRef, GitType } from '../api/index'; -import { AppContext } from '.'; import { useSettings } from './useSettings'; - import { useAsyncPolling } from './useAsyncPolling'; +import { useAsyncRetry } from 'react-use'; -const INTERVAL_AMOUNT = 3000; - +const INTERVAL_AMOUNT = 1500; export function useBuildWithSteps(buildId: number) { - const [settings] = useSettings(); - const [{ buildsWithSteps }, dispatch] = useContext(AppContext); + const [{ token, repo, owner }] = useSettings(); const api = useApi(circleCIApiRef); const errorApi = useApi(errorApiRef); - const { isPolling, startPolling, stopPolling } = useAsyncPolling( - () => getBuildWithSteps(), - INTERVAL_AMOUNT, - ); - - const getBuildWithSteps = async () => { + const getBuildWithSteps = useCallback(async () => { try { const options = { - token: settings.token, + token: token, vcs: { - owner: settings.owner, - repo: settings.repo, + owner: owner, + repo: repo, type: GitType.GITHUB, }, }; - const build = await api.getBuild(buildId, options); - if (isPolling) dispatch({ type: 'setBuildWithSteps', payload: build }); + const b = await api.getBuild(buildId, options); + return Promise.resolve(b); } catch (e) { errorApi.post(e); + return Promise.reject(e); } - }; + }, [token, owner, repo, buildId]); const restartBuild = async () => { try { await api.retry(buildId, { - token: settings.token, + token: token, vcs: { - owner: settings.owner, - repo: settings.repo, + owner: owner, + repo: repo, type: GitType.GITHUB, }, }); @@ -66,15 +59,22 @@ export function useBuildWithSteps(buildId: number) { } }; - const build = buildsWithSteps[buildId]; + const { loading, value, retry } = useAsyncRetry(() => getBuildWithSteps(), [ + getBuildWithSteps, + ]); + + const { startPolling, stopPolling } = useAsyncPolling( + getBuildWithSteps, + INTERVAL_AMOUNT, + ); return [ - build, + { loading, value, retry }, { restartBuild, + getBuildWithSteps, startPolling, stopPolling, - getBuildWithSteps, }, ] as const; } diff --git a/plugins/circleci/src/state/useBuilds.tsx b/plugins/circleci/src/state/useBuilds.tsx index d46ac642a5..4435c2b8bd 100644 --- a/plugins/circleci/src/state/useBuilds.tsx +++ b/plugins/circleci/src/state/useBuilds.tsx @@ -14,52 +14,102 @@ * limitations under the License. */ import { errorApiRef, useApi } from '@backstage/core'; -import { GitType } from 'circleci-api'; -import { useContext } from 'react'; +import { GitType, BuildSummary } from 'circleci-api'; +import { useState, useEffect, useCallback } from 'react'; import { circleCIApiRef } from '../api/index'; -import { AppContext } from '.'; -import { useAsyncPolling } from './useAsyncPolling'; +import { useAsyncRetry } from 'react-use'; +import { CITableBuildInfo } from '../pages/BuildsPage/lib/CITable'; +import { useSettings } from './useSettings'; -const INTERVAL_AMOUNT = 3000; +const makeReadableStatus = (status: string | undefined) => { + if (!status) return ''; + return ({ + retried: 'Retried', + canceled: 'Canceled', + infrastructure_fail: 'Infra fail', + timedout: 'Timedout', + not_run: 'Not run', + running: 'Running', + failed: 'Failed', + queued: 'Queued', + scheduled: 'Scheduled', + not_running: 'Not running', + no_tests: 'No tests', + fixed: 'Fixed', + success: 'Success', + } as Record)[status]; +}; + +export const transform = ( + buildsData: BuildSummary[], + restartBuild: { (buildId: number): Promise }, +): CITableBuildInfo[] => { + return buildsData.map((buildData) => { + const tableBuildInfo: CITableBuildInfo = { + id: String(buildData.build_num), + buildName: buildData.subject + ? buildData.subject + + (buildData.retry_of ? ` (retry of #${buildData.retry_of})` : '') + : '', + onRestartClick: () => + typeof buildData.build_num !== 'undefined' && + restartBuild(buildData.build_num), + source: { + branchName: String(buildData.branch), + commit: { + hash: String(buildData.vcs_revision), + url: 'todo', + }, + }, + status: makeReadableStatus(buildData.status), + buildUrl: buildData.build_url, + }; + return tableBuildInfo; + }); +}; export function useBuilds() { - const [{ builds, settings }, dispatch] = useContext(AppContext); + const [{ repo, owner, token }] = useSettings(); const api = useApi(circleCIApiRef); const errorApi = useApi(errorApiRef); - const { isPolling, startPolling, stopPolling } = useAsyncPolling( - () => getBuilds(), - INTERVAL_AMOUNT, - ); - const getBuilds = async () => { - if (settings.owner === '' || settings.repo === '') return; - try { - const newBuilds = await api.getBuilds({ - token: settings.token, - vcs: { - owner: settings.owner, - repo: settings.repo, - type: GitType.GITHUB, - }, - }); - if (isPolling) - dispatch({ - type: 'setBuilds', - payload: newBuilds, - }); - } catch (e) { - errorApi.post(e); - } - }; + const [total, setTotal] = useState(0); + const [page, setPage] = useState(0); + const [pageSize, setPageSize] = useState(5); + + const getBuilds = useCallback( + async ({ limit, offset }: { limit: number; offset: number }) => { + if (owner === '' || repo === '') { + return; + } + try { + return await api.getBuilds( + { limit, offset }, + { + token: token, + vcs: { + owner: owner, + repo: repo, + type: GitType.GITHUB, + }, + }, + ); + } catch (e) { + errorApi.post(e); + return Promise.reject(e); + } + }, + [repo, token, owner], + ); const restartBuild = async (buildId: number) => { try { await api.retry(buildId, { - token: settings.token, + token: token, vcs: { - owner: settings.owner, - repo: settings.repo, + owner: owner, + repo: repo, type: GitType.GITHUB, }, }); @@ -68,12 +118,35 @@ export function useBuilds() { } }; + useEffect(() => { + getBuilds({ limit: 1, offset: 0 }).then((b) => setTotal(b?.[0].build_num!)); + }, [repo]); + + const { loading, value, retry } = useAsyncRetry( + () => + getBuilds({ + offset: page * pageSize, + limit: pageSize, + }).then((builds) => transform(builds ?? [], restartBuild)), + [page, pageSize, getBuilds], + ); + + const projectName = `${owner}/${repo}`; return [ - builds, { + page, + pageSize, + loading, + value, + projectName, + total, + }, + { + getBuilds, + setPage, + setPageSize, restartBuild, - startPolling, - stopPolling, + retry, }, ] as const; } diff --git a/plugins/circleci/src/state/useSettings.ts b/plugins/circleci/src/state/useSettings.ts index 34b2f5e402..04ce83a0a9 100644 --- a/plugins/circleci/src/state/useSettings.ts +++ b/plugins/circleci/src/state/useSettings.ts @@ -14,12 +14,11 @@ * limitations under the License. */ import { useContext, useEffect } from 'react'; -import { AppContext, STORAGE_KEY, SettingsState } from '.'; +import { AppContext, STORAGE_KEY } from '.'; import { useApi, errorApiRef } from '@backstage/core'; - +import { Settings } from './types'; export function useSettings() { - const [{ settings }, dispatch] = useContext(AppContext); - + const [settings, dispatch] = useContext(AppContext); const errorApi = useApi(errorApiRef); @@ -45,20 +44,22 @@ export function useSettings() { rehydrate(); }, []); - const persist = (state: SettingsState) => { + const persist = (state: Settings) => { sessionStorage.setItem(STORAGE_KEY, JSON.stringify(state)); }; return [ settings, { - saveSettings: (state: SettingsState) => { + saveSettings: (state: Settings) => { persist(state); dispatch({ type: 'setCredentials', payload: state, }); }, + showSettings: () => dispatch({ type: 'showSettings' }), + hideSettings: () => dispatch({ type: 'hideSettings' }), }, ] as const; } From 0a592af4dedbb8a9660960a7080aa7c77daf0fe2 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 18 May 2020 17:59:12 +0200 Subject: [PATCH 75/90] feat: settings -> dialog --- packages/cli/src/commands/plugin/serve.ts | 6 ++ plugins/circleci/dev/index.tsx | 28 ++++++ plugins/circleci/package.json | 42 +++++--- .../src/components/Settings/Settings.tsx | 97 ++++++++++--------- plugins/circleci/src/state/AppState.tsx | 1 - plugins/circleci/src/state/index.ts | 3 + .../circleci/src/state/useBuildWithSteps.ts | 8 +- plugins/circleci/src/state/useBuilds.tsx | 5 - 8 files changed, 118 insertions(+), 72 deletions(-) create mode 100644 plugins/circleci/dev/index.tsx diff --git a/packages/cli/src/commands/plugin/serve.ts b/packages/cli/src/commands/plugin/serve.ts index 5700992644..f9768ec497 100644 --- a/packages/cli/src/commands/plugin/serve.ts +++ b/packages/cli/src/commands/plugin/serve.ts @@ -14,13 +14,19 @@ * limitations under the License. */ +import fs from 'fs-extra'; import { serveBundle } from '../../lib/bundler'; import { Command } from 'commander'; +import { paths } from '../../lib/paths'; export default async (cmd: Command) => { + const pkgPath = paths.resolveTarget('package.json'); + const pkg = await fs.readJson(pkgPath); + const waitForExit = await serveBundle({ entry: 'dev/index', checksEnabled: cmd.check, + proxy: pkg.proxy, }); await waitForExit(); diff --git a/plugins/circleci/dev/index.tsx b/plugins/circleci/dev/index.tsx new file mode 100644 index 0000000000..ed7dd5de9c --- /dev/null +++ b/plugins/circleci/dev/index.tsx @@ -0,0 +1,28 @@ +/* + * 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 { createDevApp } from '@backstage/dev-utils'; +import { plugin } from '../src/plugin'; +import { circleCIApiRef, CircleCIApi } from '../src/api'; + +createDevApp() + .registerPlugin(plugin) + .registerApiFactory({ + deps: {}, + factory: () => new CircleCIApi(), + implements: circleCIApiRef, + }) + .render(); diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index cd00135004..e3e0372d88 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -3,18 +3,31 @@ "version": "0.1.1-alpha.4", "main": "dist/index.esm.js", "module": "dist/index.esm.js", - "types": "dist/index.d.ts", + "types": "src/index.ts", "license": "Apache-2.0", "private": true, + "proxy": { + "/circleci/api": { + "target": "https://circleci.com/api/v1.1", + "changeOrigin": true, + "pathRewrite": { + "^/circleci/api/": "/" + } + } + }, "scripts": { "build": "backstage-cli plugin:build", "lint": "backstage-cli lint", "test": "backstage-cli test", - "clean": "backstage-cli clean" + "clean": "backstage-cli clean", + "diff": "backstage-cli plugin:diff", + "start": "backstage-cli plugin:serve", + "prepack": "backstage-cli prepack", + "postpack": "backstage-cli postpack" }, "dependencies": { - "@backstage/core": "^0.1.1-alpha.4", - "@backstage/theme": "^0.1.1-alpha.4", + "@backstage/core": "^0.1.1-alpha.5", + "@backstage/theme": "^0.1.1-alpha.5", "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", @@ -22,24 +35,25 @@ "circleci-api": "^4.0.0", "fast-deep-equal": "^3.1.1", "moment": "^2.25.3", - "react": "16.13.1", - "react-dom": "16.13.1", + "react": "^16.13.1", + "react-dom": "^16.13.1", "react-lazylog": "^4.5.2", "react-router": "^5.1.2", "react-router-dom": "^5.1.2", - "react-use": "^13.0.0" + "react-use": "^14.2.0" }, "devDependencies": { - "@backstage/cli": "^0.1.1-alpha.4", - "@testing-library/jest-dom": "^4.2.4", + "@backstage/cli": "^0.1.1-alpha.5", + "@testing-library/jest-dom": "^5.7.0", "@testing-library/react": "^9.3.2", - "@testing-library/user-event": "^7.1.2", - "@types/jest": "^24.0.0", + "@testing-library/user-event": "^10.2.4", + "@types/jest": "^25.2.1", "@types/node": "^12.0.0", - "@types/testing-library__jest-dom": "5.0.2", - "jest-fetch-mock": "^3.0.3" + "@types/testing-library__jest-dom": "^5.0.4", + "jest-fetch-mock": "^3.0.3", + "@backstage/dev-utils": "^0.1.1-alpha.5" }, "files": [ - "dist" + "dist/**/*.{js,d.ts}" ] } diff --git a/plugins/circleci/src/components/Settings/Settings.tsx b/plugins/circleci/src/components/Settings/Settings.tsx index b33bf59dd8..510af583d2 100644 --- a/plugins/circleci/src/components/Settings/Settings.tsx +++ b/plugins/circleci/src/components/Settings/Settings.tsx @@ -23,6 +23,7 @@ import { Box, Dialog, DialogTitle, + DialogContent, } from '@material-ui/core'; import { Alert } from '@material-ui/lab'; import { useSettings } from '../../state'; @@ -71,54 +72,56 @@ const Settings = () => { Project Credentials {/* {authed ? : } */} - - - setToken(e.target.value)} - /> - - - setOwner(e.target.value)} - /> - - - setRepo(e.target.value)} - /> - - - - - - - + onChange={(e) => setToken(e.target.value)} + /> + + + setOwner(e.target.value)} + /> + + + setRepo(e.target.value)} + /> + + + + + + + + ); diff --git a/plugins/circleci/src/state/AppState.tsx b/plugins/circleci/src/state/AppState.tsx index 2e98f86661..720b660ccd 100644 --- a/plugins/circleci/src/state/AppState.tsx +++ b/plugins/circleci/src/state/AppState.tsx @@ -48,7 +48,6 @@ const reducer: Reducer = (state, action) => { export const AppStateProvider: FC = ({ children }) => { const [state, dispatch] = useReducer(reducer, initialState); - return ( <>{children} diff --git a/plugins/circleci/src/state/index.ts b/plugins/circleci/src/state/index.ts index 4ef67f62ea..2321103eb4 100644 --- a/plugins/circleci/src/state/index.ts +++ b/plugins/circleci/src/state/index.ts @@ -14,3 +14,6 @@ * limitations under the License. */ export * from './AppState'; +export * from './useSettings'; +export * from './useBuilds'; +export * from './useBuildWithSteps'; diff --git a/plugins/circleci/src/state/useBuildWithSteps.ts b/plugins/circleci/src/state/useBuildWithSteps.ts index 4c9f6a0c42..8abc08f580 100644 --- a/plugins/circleci/src/state/useBuildWithSteps.ts +++ b/plugins/circleci/src/state/useBuildWithSteps.ts @@ -27,6 +27,9 @@ export function useBuildWithSteps(buildId: number) { const errorApi = useApi(errorApiRef); const getBuildWithSteps = useCallback(async () => { + if (owner === '' || repo === '' || token === '') { + return; + } try { const options = { token: token, @@ -44,11 +47,6 @@ export function useBuildWithSteps(buildId: number) { } }, [token, owner, repo, buildId]); - const { startPolling, stopPolling } = useAsyncPolling( - getBuildWithSteps, - INTERVAL_AMOUNT, - ); - const restartBuild = async () => { try { await api.retry(buildId, { diff --git a/plugins/circleci/src/state/useBuilds.tsx b/plugins/circleci/src/state/useBuilds.tsx index c29b05890c..4435c2b8bd 100644 --- a/plugins/circleci/src/state/useBuilds.tsx +++ b/plugins/circleci/src/state/useBuilds.tsx @@ -103,11 +103,6 @@ export function useBuilds() { [repo, token, owner], ); - const { startPolling, stopPolling } = useAsyncPolling( - getBuilds, - INTERVAL_AMOUNT, - ); - const restartBuild = async (buildId: number) => { try { await api.retry(buildId, { From 3d019401910f7da3f8ea9613716bf60bca9c2078 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 18 May 2020 18:06:19 +0200 Subject: [PATCH 76/90] fix: tsc --- plugins/circleci/src/components/Settings/Settings.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/circleci/src/components/Settings/Settings.tsx b/plugins/circleci/src/components/Settings/Settings.tsx index 510af583d2..5159c156cc 100644 --- a/plugins/circleci/src/components/Settings/Settings.tsx +++ b/plugins/circleci/src/components/Settings/Settings.tsx @@ -23,7 +23,6 @@ import { Box, Dialog, DialogTitle, - DialogContent, } from '@material-ui/core'; import { Alert } from '@material-ui/lab'; import { useSettings } from '../../state'; From e78eaa9bb630bb05d42ffda7ab910fc082208ecd Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 18 May 2020 18:44:19 +0200 Subject: [PATCH 77/90] fix: lint --- plugins/circleci/src/state/useBuildWithSteps.ts | 13 +++++++------ .../src/state/{useBuilds.tsx => useBuilds.ts} | 11 ++++++----- plugins/circleci/src/state/useSettings.ts | 5 +++-- 3 files changed, 16 insertions(+), 13 deletions(-) rename plugins/circleci/src/state/{useBuilds.tsx => useBuilds.ts} (94%) diff --git a/plugins/circleci/src/state/useBuildWithSteps.ts b/plugins/circleci/src/state/useBuildWithSteps.ts index 8abc08f580..7aba770851 100644 --- a/plugins/circleci/src/state/useBuildWithSteps.ts +++ b/plugins/circleci/src/state/useBuildWithSteps.ts @@ -15,10 +15,10 @@ */ import { errorApiRef, useApi } from '@backstage/core'; import { useCallback } from 'react'; -import { circleCIApiRef, GitType } from '../api/index'; -import { useSettings } from './useSettings'; -import { useAsyncPolling } from './useAsyncPolling'; import { useAsyncRetry } from 'react-use'; +import { circleCIApiRef, GitType } from '../api/index'; +import { useAsyncPolling } from './useAsyncPolling'; +import { useSettings } from './useSettings'; const INTERVAL_AMOUNT = 1500; export function useBuildWithSteps(buildId: number) { @@ -28,8 +28,9 @@ export function useBuildWithSteps(buildId: number) { const getBuildWithSteps = useCallback(async () => { if (owner === '' || repo === '' || token === '') { - return; + return Promise.reject('No credentials provided'); } + try { const options = { token: token, @@ -39,8 +40,8 @@ export function useBuildWithSteps(buildId: number) { type: GitType.GITHUB, }, }; - const b = await api.getBuild(buildId, options); - return Promise.resolve(b); + const build = await api.getBuild(buildId, options); + return Promise.resolve(build); } catch (e) { errorApi.post(e); return Promise.reject(e); diff --git a/plugins/circleci/src/state/useBuilds.tsx b/plugins/circleci/src/state/useBuilds.ts similarity index 94% rename from plugins/circleci/src/state/useBuilds.tsx rename to plugins/circleci/src/state/useBuilds.ts index 4435c2b8bd..248cc677f6 100644 --- a/plugins/circleci/src/state/useBuilds.tsx +++ b/plugins/circleci/src/state/useBuilds.ts @@ -14,10 +14,10 @@ * limitations under the License. */ import { errorApiRef, useApi } from '@backstage/core'; -import { GitType, BuildSummary } from 'circleci-api'; -import { useState, useEffect, useCallback } from 'react'; -import { circleCIApiRef } from '../api/index'; +import { BuildSummary, GitType } from 'circleci-api'; +import { useCallback, useEffect, useState } from 'react'; import { useAsyncRetry } from 'react-use'; +import { circleCIApiRef } from '../api/index'; import { CITableBuildInfo } from '../pages/BuildsPage/lib/CITable'; import { useSettings } from './useSettings'; @@ -80,9 +80,10 @@ export function useBuilds() { const getBuilds = useCallback( async ({ limit, offset }: { limit: number; offset: number }) => { - if (owner === '' || repo === '') { - return; + if (owner === '' || repo === '' || token === '') { + return Promise.reject('No credentials provided'); } + try { return await api.getBuilds( { limit, offset }, diff --git a/plugins/circleci/src/state/useSettings.ts b/plugins/circleci/src/state/useSettings.ts index 04ce83a0a9..5482abeb8b 100644 --- a/plugins/circleci/src/state/useSettings.ts +++ b/plugins/circleci/src/state/useSettings.ts @@ -13,10 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { errorApiRef, useApi } from '@backstage/core'; import { useContext, useEffect } from 'react'; -import { AppContext, STORAGE_KEY } from '.'; -import { useApi, errorApiRef } from '@backstage/core'; +import { AppContext, STORAGE_KEY } from './AppState'; import { Settings } from './types'; + export function useSettings() { const [settings, dispatch] = useContext(AppContext); From 1d428128f04ec865e06409b4ee71dc0662a8e135 Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 18 May 2020 18:52:10 +0200 Subject: [PATCH 78/90] fix: remove logo from plugin header --- plugins/circleci/src/components/Layout/Layout.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/circleci/src/components/Layout/Layout.tsx b/plugins/circleci/src/components/Layout/Layout.tsx index eab8ab0e88..906db182b4 100644 --- a/plugins/circleci/src/components/Layout/Layout.tsx +++ b/plugins/circleci/src/components/Layout/Layout.tsx @@ -15,8 +15,6 @@ */ import React from 'react'; import { Header, Page, pageTheme, HeaderLabel } from '@backstage/core'; -// @ts-ignore -import logo from '../../assets/circle-logo-badge-white-15.png'; import { Box } from '@material-ui/core'; export const Layout: React.FC = ({ children }) => ( From f3da9cd7eff33d3f1b6810606773e52c838d8ffe Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 18 May 2020 18:52:41 +0200 Subject: [PATCH 79/90] fix: type imports --- plugins/circleci/src/state/AppState.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/circleci/src/state/AppState.tsx b/plugins/circleci/src/state/AppState.tsx index 720b660ccd..f229175111 100644 --- a/plugins/circleci/src/state/AppState.tsx +++ b/plugins/circleci/src/state/AppState.tsx @@ -15,7 +15,7 @@ */ import React, { FC, useReducer, Dispatch, Reducer } from 'react'; import { circleCIApiRef } from '../api'; -import { State, Action, SettingsState } from './types'; +import type { State, Action, SettingsState } from './types'; export { SettingsState }; export const AppContext = React.createContext<[State, Dispatch]>( From 8428d957918fe29bd967a9873ed2ea95890e009e Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 18 May 2020 19:11:42 +0200 Subject: [PATCH 80/90] fix: tests --- packages/app/package.json | 12 +++++++----- plugins/circleci/src/components/Layout/Layout.tsx | 1 - 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index e4304752a8..36e6f12f5f 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -66,10 +66,12 @@ }, "license": "Apache-2.0", "proxy": { - "/circleci/api": { - "target": "https://circleci.com/api/v1.1", - "changeOrigin": true, - "pathRewrite": {"^/circleci/api/": "/"} + "/circleci/api": { + "target": "https://circleci.com/api/v1.1", + "changeOrigin": true, + "pathRewrite": { + "^/circleci/api/": "/" } } -} + } +} \ No newline at end of file diff --git a/plugins/circleci/src/components/Layout/Layout.tsx b/plugins/circleci/src/components/Layout/Layout.tsx index 6ae97532ce..a614d388f0 100644 --- a/plugins/circleci/src/components/Layout/Layout.tsx +++ b/plugins/circleci/src/components/Layout/Layout.tsx @@ -24,7 +24,6 @@ export const Layout: React.FC = ({ children }) => { pageTitleOverride="Circle CI" title={ - Backstage Logo Circle CI } From c90110f6ab0b2a472c60eee45a5d94870260ddb8 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 18 May 2020 19:26:52 +0200 Subject: [PATCH 81/90] feat: export as a widget --- plugins/circleci/src/components/App.tsx | 27 ++++++++++-- plugins/circleci/src/index.ts | 1 + .../BuildWithStepsPage/BuildWithStepsPage.tsx | 41 +++++++++++-------- .../src/pages/BuildWithStepsPage/index.ts | 5 ++- .../src/pages/BuildsPage/BuildsPage.tsx | 21 ++++++---- .../circleci/src/pages/BuildsPage/index.ts | 2 +- 6 files changed, 68 insertions(+), 29 deletions(-) diff --git a/plugins/circleci/src/components/App.tsx b/plugins/circleci/src/components/App.tsx index 46b70cb500..1649c01b70 100644 --- a/plugins/circleci/src/components/App.tsx +++ b/plugins/circleci/src/components/App.tsx @@ -14,9 +14,9 @@ * limitations under the License. */ import React from 'react'; -import { Switch, Route } from 'react-router'; -import { BuildsPage } from '../pages/BuildsPage'; -import { DetailedViewPage } from '../pages/BuildWithStepsPage'; +import { Switch, Route, MemoryRouter } from 'react-router'; +import { BuildsPage, Builds } from '../pages/BuildsPage'; +import { DetailedViewPage, BuildWithSteps } from '../pages/BuildWithStepsPage'; import { AppStateProvider } from '../state'; import { Settings } from './Settings'; @@ -37,3 +37,24 @@ export const App = () => { ); }; + +// TODO: allow pass in settings as props +// When some shared settings workflow +// will be established +export const CircleCIWidget = () => ( + + + <> + + + + + + + + +); diff --git a/plugins/circleci/src/index.ts b/plugins/circleci/src/index.ts index 33b8fe0067..69fdf02416 100644 --- a/plugins/circleci/src/index.ts +++ b/plugins/circleci/src/index.ts @@ -17,3 +17,4 @@ export { plugin } from './plugin'; export * from './api'; export * from './proxy'; +export { CircleCIWidget } from './components/App'; diff --git a/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx b/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx index 041c495c90..24ef39a05c 100644 --- a/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx +++ b/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx @@ -92,7 +92,15 @@ const pickClassName = ( return classes.neutral; }; -const BuildWithStepsPage: FC<{}> = () => { +const Page = () => ( + + + + + +); + +const BuildWithSteps: FC<{}> = () => { const { buildId = '' } = useParams(); const classes = useStyles(); const [settings] = useSettings(); @@ -106,23 +114,21 @@ const BuildWithStepsPage: FC<{}> = () => { }, [buildId, settings]); return ( - - - + <> + - - - } - cardClassName={classes.cardContent} - > - {loading ? : } - - + + + } + cardClassName={classes.cardContent} + > + {loading ? : } + - - + + ); }; @@ -156,4 +162,5 @@ const ActionsList: FC<{ actions: BuildStepAction[]; name: string }> = ({ ); }; -export default BuildWithStepsPage; +export default Page; +export { BuildWithSteps }; diff --git a/plugins/circleci/src/pages/BuildWithStepsPage/index.ts b/plugins/circleci/src/pages/BuildWithStepsPage/index.ts index 2fb1f48e12..fddff7088c 100644 --- a/plugins/circleci/src/pages/BuildWithStepsPage/index.ts +++ b/plugins/circleci/src/pages/BuildWithStepsPage/index.ts @@ -13,4 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { default as DetailedViewPage } from './BuildWithStepsPage'; +export { + default as DetailedViewPage, + BuildWithSteps, +} from './BuildWithStepsPage'; diff --git a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx index 01593ebf4d..7b124c03c1 100644 --- a/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx +++ b/plugins/circleci/src/pages/BuildsPage/BuildsPage.tsx @@ -16,21 +16,28 @@ import React, { FC } from 'react'; import { Content } from '@backstage/core'; import { Grid } from '@material-ui/core'; -import { Builds } from './lib/Builds'; +import { Builds as BuildsComp } from './lib/Builds'; import { Layout } from '../../components/Layout'; import { PluginHeader } from '../../components/PluginHeader'; const BuildsPage: FC<{}> = () => ( - - - - - - + ); +const Builds = () => ( + <> + + + + + + + +); + export default BuildsPage; +export { Builds }; diff --git a/plugins/circleci/src/pages/BuildsPage/index.ts b/plugins/circleci/src/pages/BuildsPage/index.ts index 9b555f0f12..72b46d6bc9 100644 --- a/plugins/circleci/src/pages/BuildsPage/index.ts +++ b/plugins/circleci/src/pages/BuildsPage/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { default as BuildsPage } from './BuildsPage'; +export { default as BuildsPage, Builds } from './BuildsPage'; From 89a4f6a31b487f2e4ae2d64300208843ff88399d Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 18 May 2020 19:30:39 +0200 Subject: [PATCH 82/90] fix: quick fix --- .../src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx | 6 +++--- plugins/circleci/src/state/AppState.tsx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx b/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx index 24ef39a05c..8493913576 100644 --- a/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx +++ b/plugins/circleci/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx @@ -95,12 +95,12 @@ const pickClassName = ( const Page = () => ( - + ); -const BuildWithSteps: FC<{}> = () => { +const BuildWithStepsView: FC<{}> = () => { const { buildId = '' } = useParams(); const classes = useStyles(); const [settings] = useSettings(); @@ -163,4 +163,4 @@ const ActionsList: FC<{ actions: BuildStepAction[]; name: string }> = ({ }; export default Page; -export { BuildWithSteps }; +export { BuildWithStepsView as BuildWithSteps }; diff --git a/plugins/circleci/src/state/AppState.tsx b/plugins/circleci/src/state/AppState.tsx index f229175111..49d55b602e 100644 --- a/plugins/circleci/src/state/AppState.tsx +++ b/plugins/circleci/src/state/AppState.tsx @@ -16,7 +16,7 @@ import React, { FC, useReducer, Dispatch, Reducer } from 'react'; import { circleCIApiRef } from '../api'; import type { State, Action, SettingsState } from './types'; -export { SettingsState }; +export type { SettingsState }; export const AppContext = React.createContext<[State, Dispatch]>( [] as any, From 931342c92f3309798fdd845e5b0733f2c16d8bfd Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 18 May 2020 19:33:10 +0200 Subject: [PATCH 83/90] feat: navtarget and explore card --- plugins/circleci/src/index.ts | 1 + plugins/circleci/src/plugin.ts | 3 ++- plugins/explore/src/components/ExplorePluginPage.tsx | 9 +++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/circleci/src/index.ts b/plugins/circleci/src/index.ts index 33b8fe0067..9a0a37f415 100644 --- a/plugins/circleci/src/index.ts +++ b/plugins/circleci/src/index.ts @@ -17,3 +17,4 @@ export { plugin } from './plugin'; export * from './api'; export * from './proxy'; +export * from './navTargets'; diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index 77a223a162..26030a5d26 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -15,10 +15,11 @@ */ import { createPlugin } from '@backstage/core'; import { App } from './components/App'; +import { navTargetCircleCI } from './navTargets'; export const plugin = createPlugin({ id: 'circleci', register({ router }) { - router.registerRoute('/circleci', App, { exact: false }); + router.addRoute(navTargetCircleCI, App); }, }); diff --git a/plugins/explore/src/components/ExplorePluginPage.tsx b/plugins/explore/src/components/ExplorePluginPage.tsx index 1dd2f135a4..00b8222688 100644 --- a/plugins/explore/src/components/ExplorePluginPage.tsx +++ b/plugins/explore/src/components/ExplorePluginPage.tsx @@ -64,6 +64,15 @@ const toolsCards = [ 'https://camo.githubusercontent.com/517398c3fbe0687d3d4dcbe05da82970b882e75a/68747470733a2f2f64337676366c703535716a6171632e636c6f756466726f6e742e6e65742f6974656d732f33413061324e314c3346324f304c3377326e316a2f477261706869514c382e706e673f582d436c6f75644170702d56697369746f722d49643d3433363432', tags: ['graphql', 'dev'], }, + { + title: 'CircleCI', + description: + 'Provides builds overview, detailed build info and retriggering functionality for CircleCI.', + url: '/circleci', + image: + 'https://raw.githubusercontent.com/CircleCI-Public/cimg-base/master/img/circle-circleci.svg', + tags: ['circleci', 'ci', 'dev'], + }, ]; const ExplorePluginPage: FC<{}> = () => { From 860bf5172834685229ccd5724d1134daf5aa07a4 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 18 May 2020 19:44:05 +0200 Subject: [PATCH 84/90] fix: navTarget, remove assets --- .../src/assets/circle-logo-badge-black.png | Bin 50079 -> 0 bytes .../src/assets/circle-logo-badge-white-15.png | Bin 46850 -> 0 bytes .../assets/circle-logo-horizontal-black.png | Bin 13927 -> 0 bytes .../assets/circle-logo-horizontal-white.png | Bin 15625 -> 0 bytes plugins/circleci/src/assets/screenshot-1.png | Bin 232916 -> 0 bytes plugins/circleci/src/assets/screenshot-2.png | Bin 155747 -> 0 bytes plugins/circleci/src/navTargets.tsx | 22 +++++++----------- plugins/circleci/src/plugin.ts | 2 +- 8 files changed, 10 insertions(+), 14 deletions(-) delete mode 100644 plugins/circleci/src/assets/circle-logo-badge-black.png delete mode 100644 plugins/circleci/src/assets/circle-logo-badge-white-15.png delete mode 100644 plugins/circleci/src/assets/circle-logo-horizontal-black.png delete mode 100644 plugins/circleci/src/assets/circle-logo-horizontal-white.png delete mode 100644 plugins/circleci/src/assets/screenshot-1.png delete mode 100644 plugins/circleci/src/assets/screenshot-2.png diff --git a/plugins/circleci/src/assets/circle-logo-badge-black.png b/plugins/circleci/src/assets/circle-logo-badge-black.png deleted file mode 100644 index dc5de12c8a5de445b272838c4f18513ac7a33d16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50079 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 diff --git a/plugins/circleci/src/assets/circle-logo-badge-white-15.png b/plugins/circleci/src/assets/circle-logo-badge-white-15.png deleted file mode 100644 index 4d094c9c5725e334e8ec712e1bc5f5161caa31f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46850 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 z 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 diff --git a/plugins/circleci/src/assets/circle-logo-horizontal-black.png b/plugins/circleci/src/assets/circle-logo-horizontal-black.png deleted file mode 100644 index 419d97e69bae509d0575c55f3714bba6a60f3829..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13927 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

jPO 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�$Tc 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 diff --git a/plugins/circleci/src/assets/screenshot-2.png b/plugins/circleci/src/assets/screenshot-2.png deleted file mode 100644 index 8c4fef13b925f475845f3850d81cbede0f4f506a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155747 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⁢ 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 P_#^Z9$)jQkL%;t6ckRAZ diff --git a/plugins/circleci/src/navTargets.tsx b/plugins/circleci/src/navTargets.tsx index 14284a1d93..ce4553207e 100644 --- a/plugins/circleci/src/navTargets.tsx +++ b/plugins/circleci/src/navTargets.tsx @@ -19,19 +19,15 @@ import { createNavTarget } from '@backstage/core'; import { SvgIcon, SvgIconProps } from '@material-ui/core'; const CircleCIIcon: FC = (props) => ( - - - - + + ); diff --git a/plugins/circleci/src/plugin.ts b/plugins/circleci/src/plugin.ts index 26030a5d26..1eceb60dae 100644 --- a/plugins/circleci/src/plugin.ts +++ b/plugins/circleci/src/plugin.ts @@ -20,6 +20,6 @@ import { navTargetCircleCI } from './navTargets'; export const plugin = createPlugin({ id: 'circleci', register({ router }) { - router.addRoute(navTargetCircleCI, App); + router.addRoute(navTargetCircleCI, App, { exact: false }); }, }); From 9c7599970125bfd9e6016b4b14b264ba1e9f4e8e Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 18 May 2020 19:50:45 +0200 Subject: [PATCH 85/90] fix: pr edits --- packages/app/src/setupProxy.js | 34 ----------------------- packages/cli/package.json | 1 + packages/cli/src/commands/app/serve.ts | 6 ---- packages/cli/src/commands/plugin/serve.ts | 8 +----- 4 files changed, 2 insertions(+), 47 deletions(-) delete mode 100644 packages/app/src/setupProxy.js diff --git a/packages/app/src/setupProxy.js b/packages/app/src/setupProxy.js deleted file mode 100644 index 68ab231e89..0000000000 --- a/packages/app/src/setupProxy.js +++ /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. - */ -// eslint-disable-next-line -const createProxyMiddleware = require('http-proxy-middleware'); - -// FIXME: somehow get it from within the plugin itself? -const circleCIProxySettings = { - '/circleci/api': { - target: 'https://circleci.com/api/v1.1', - changeOrigin: true, - logLevel: 'debug', - pathRewrite: { - '^/circleci/api/': '/', - }, - }, -}; - -module.exports = (/** @type {import('express').Application} */ app) => - Object.entries(circleCIProxySettings).forEach(([url, settings]) => - app.use(url, createProxyMiddleware(settings)), - ); diff --git a/packages/cli/package.json b/packages/cli/package.json index c3d768eec2..56dd2febd7 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -83,6 +83,7 @@ "@types/diff": "^4.0.2", "@types/fs-extra": "^8.1.0", "@types/html-webpack-plugin": "^3.2.2", + "@types/http-proxy": "^1.17.4", "@types/inquirer": "^6.5.0", "@types/mini-css-extract-plugin": "^0.9.1", "@types/node": "^13.7.2", diff --git a/packages/cli/src/commands/app/serve.ts b/packages/cli/src/commands/app/serve.ts index 58e9e5fc16..416f8f0151 100644 --- a/packages/cli/src/commands/app/serve.ts +++ b/packages/cli/src/commands/app/serve.ts @@ -14,19 +14,13 @@ * limitations under the License. */ -import fs from 'fs-extra'; import { Command } from 'commander'; import { serveBundle } from '../../lib/bundler'; -import { paths } from '../../lib/paths'; export default async (cmd: Command) => { - const pkgPath = paths.resolveTarget('package.json'); - const pkg = await fs.readJson(pkgPath); - const waitForExit = await serveBundle({ entry: 'src/index', checksEnabled: cmd.check, - proxy: pkg.proxy, }); await waitForExit(); diff --git a/packages/cli/src/commands/plugin/serve.ts b/packages/cli/src/commands/plugin/serve.ts index f9768ec497..8abbd92440 100644 --- a/packages/cli/src/commands/plugin/serve.ts +++ b/packages/cli/src/commands/plugin/serve.ts @@ -14,19 +14,13 @@ * limitations under the License. */ -import fs from 'fs-extra'; -import { serveBundle } from '../../lib/bundler'; import { Command } from 'commander'; -import { paths } from '../../lib/paths'; +import { serveBundle } from '../../lib/bundler'; export default async (cmd: Command) => { - const pkgPath = paths.resolveTarget('package.json'); - const pkg = await fs.readJson(pkgPath); - const waitForExit = await serveBundle({ entry: 'dev/index', checksEnabled: cmd.check, - proxy: pkg.proxy, }); await waitForExit(); From 7dd484d4df3190b9f615e63a201c62fd22f2e276 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Mon, 18 May 2020 19:50:45 +0200 Subject: [PATCH 86/90] fix: pr edits --- packages/app/src/setupProxy.js | 34 --------- packages/cli/package.json | 1 + packages/cli/src/commands/app/serve.ts | 6 -- packages/cli/src/commands/plugin/serve.ts | 8 +- packages/cli/src/lib/bundler/types.ts | 2 - plugins/circleci/package.json | 1 - yarn.lock | 93 ++--------------------- 7 files changed, 7 insertions(+), 138 deletions(-) delete mode 100644 packages/app/src/setupProxy.js diff --git a/packages/app/src/setupProxy.js b/packages/app/src/setupProxy.js deleted file mode 100644 index 68ab231e89..0000000000 --- a/packages/app/src/setupProxy.js +++ /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. - */ -// eslint-disable-next-line -const createProxyMiddleware = require('http-proxy-middleware'); - -// FIXME: somehow get it from within the plugin itself? -const circleCIProxySettings = { - '/circleci/api': { - target: 'https://circleci.com/api/v1.1', - changeOrigin: true, - logLevel: 'debug', - pathRewrite: { - '^/circleci/api/': '/', - }, - }, -}; - -module.exports = (/** @type {import('express').Application} */ app) => - Object.entries(circleCIProxySettings).forEach(([url, settings]) => - app.use(url, createProxyMiddleware(settings)), - ); diff --git a/packages/cli/package.json b/packages/cli/package.json index c3d768eec2..56dd2febd7 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -83,6 +83,7 @@ "@types/diff": "^4.0.2", "@types/fs-extra": "^8.1.0", "@types/html-webpack-plugin": "^3.2.2", + "@types/http-proxy": "^1.17.4", "@types/inquirer": "^6.5.0", "@types/mini-css-extract-plugin": "^0.9.1", "@types/node": "^13.7.2", diff --git a/packages/cli/src/commands/app/serve.ts b/packages/cli/src/commands/app/serve.ts index 58e9e5fc16..416f8f0151 100644 --- a/packages/cli/src/commands/app/serve.ts +++ b/packages/cli/src/commands/app/serve.ts @@ -14,19 +14,13 @@ * limitations under the License. */ -import fs from 'fs-extra'; import { Command } from 'commander'; import { serveBundle } from '../../lib/bundler'; -import { paths } from '../../lib/paths'; export default async (cmd: Command) => { - const pkgPath = paths.resolveTarget('package.json'); - const pkg = await fs.readJson(pkgPath); - const waitForExit = await serveBundle({ entry: 'src/index', checksEnabled: cmd.check, - proxy: pkg.proxy, }); await waitForExit(); diff --git a/packages/cli/src/commands/plugin/serve.ts b/packages/cli/src/commands/plugin/serve.ts index f9768ec497..8abbd92440 100644 --- a/packages/cli/src/commands/plugin/serve.ts +++ b/packages/cli/src/commands/plugin/serve.ts @@ -14,19 +14,13 @@ * limitations under the License. */ -import fs from 'fs-extra'; -import { serveBundle } from '../../lib/bundler'; import { Command } from 'commander'; -import { paths } from '../../lib/paths'; +import { serveBundle } from '../../lib/bundler'; export default async (cmd: Command) => { - const pkgPath = paths.resolveTarget('package.json'); - const pkg = await fs.readJson(pkgPath); - const waitForExit = await serveBundle({ entry: 'dev/index', checksEnabled: cmd.check, - proxy: pkg.proxy, }); await waitForExit(); diff --git a/packages/cli/src/lib/bundler/types.ts b/packages/cli/src/lib/bundler/types.ts index 5e14760574..4182226d69 100644 --- a/packages/cli/src/lib/bundler/types.ts +++ b/packages/cli/src/lib/bundler/types.ts @@ -15,7 +15,6 @@ */ import { BundlingPathsOptions } from './paths'; -import { ProxyConfigMap } from 'webpack-dev-server'; export type BundlingOptions = { checksEnabled: boolean; @@ -24,7 +23,6 @@ export type BundlingOptions = { export type ServeOptions = BundlingPathsOptions & { checksEnabled: boolean; - proxy?: ProxyConfigMap; }; export type BuildOptions = BundlingPathsOptions & { diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index e3e0372d88..097fa5349f 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -33,7 +33,6 @@ "@material-ui/lab": "4.0.0-alpha.45", "@types/react-lazylog": "^4.5.0", "circleci-api": "^4.0.0", - "fast-deep-equal": "^3.1.1", "moment": "^2.25.3", "react": "^16.13.1", "react-dom": "^16.13.1", diff --git a/yarn.lock b/yarn.lock index 81393b5d65..80629c73a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -870,7 +870,7 @@ core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@^7.9.6": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2", "@babel/runtime@^7.9.6": version "7.9.6" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f" integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ== @@ -3554,21 +3554,6 @@ dom-accessibility-api "^0.4.2" pretty-format "^25.1.0" -"@testing-library/jest-dom@^4.2.4": - version "4.2.4" - resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz#00dfa0cbdd837d9a3c2a7f3f0a248ea6e7b89742" - integrity sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg== - dependencies: - "@babel/runtime" "^7.5.1" - chalk "^2.4.1" - css "^2.2.3" - css.escape "^1.5.1" - jest-diff "^24.0.0" - jest-matcher-utils "^24.0.0" - lodash "^4.17.11" - pretty-format "^24.0.0" - redent "^3.0.0" - "@testing-library/jest-dom@^5.7.0": version "5.7.0" resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.7.0.tgz#b2e2acb4c088a293d52ba2cd1674b526282a2f87" @@ -3598,11 +3583,6 @@ resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-10.3.1.tgz#8ed6fbfa40fbb866fa4666c9a62d7f7ff151f93b" integrity sha512-HozvWlr/xHmkoJrrDdZBbUOXAC/STAeXGyNU+g5KgEwWBpLJi1RPCHJKbTjwz8hp2jDFsk/jjfD0530eZjcFEg== -"@testing-library/user-event@^7.1.2": - version "7.2.1" - resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-7.2.1.tgz#2ad4e844175a3738cb9e7064be5ea070b8863a1c" - integrity sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA== - "@theme-ui/color-modes@^0.3.1": version "0.3.1" resolved "https://registry.npmjs.org/@theme-ui/color-modes/-/color-modes-0.3.1.tgz#8c2b18fb170e6c998287b7381240a8b9cca8b0d1" @@ -3997,13 +3977,6 @@ jest-diff "^25.2.1" pretty-format "^25.2.1" -"@types/jest@^24.0.0": - version "24.9.1" - resolved "https://registry.npmjs.org/@types/jest/-/jest-24.9.1.tgz#02baf9573c78f1b9974a5f36778b366aa77bd534" - integrity sha512-Fb38HkXSVA4L8fGKEZ6le5bB8r6MRWlOCZbVuWZcmOMSCd2wCYOwN1ibj8daIoV9naq7aaOZjrLCoCMptKU/4Q== - dependencies: - jest-diff "^24.3.0" - "@types/jquery@*", "@types/jquery@^3.3.34": version "3.3.38" resolved "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.38.tgz#6385f1e1b30bd2bff55ae8ee75ea42a999cc3608" @@ -4018,11 +3991,6 @@ dependencies: "@types/sizzle" "*" -"@types/js-cookie@2.2.5": - version "2.2.5" - resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.5.tgz#38dfaacae8623b37cc0b0d27398e574e3fc28b1e" - integrity sha512-cpmwBRcHJmmZx0OGU7aPVwGWGbs4iKwVYchk9iuMtxNCA2zorwdaTz4GkLgs2WGxiRZRFKnV1k6tRUHX7tBMxg== - "@types/js-cookie@2.2.6": version "2.2.6" resolved "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f" @@ -4373,13 +4341,6 @@ dependencies: pretty-format "^25.1.0" -"@types/testing-library__jest-dom@5.0.2": - version "5.0.2" - resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.0.2.tgz#89b782e0f187fe1e80d6375133da74182ba02065" - integrity sha512-dZP+/WHndgCSmdaImITy0KhjGAa9c0hlGGkzefbtrPFpnGEPZECDA0zyvfSp8RKhHECJJSKHFExjOwzo0rHyIA== - dependencies: - "@types/jest" "*" - "@types/testing-library__jest-dom@^5.0.2": version "5.7.0" resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.7.0.tgz#078790bf4dc89152a74428591a228ec5f9433251" @@ -7448,7 +7409,7 @@ css.escape@^1.5.1: resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= -css@^2.2.3, css@^2.2.4: +css@^2.2.4: version "2.2.4" resolved "https://registry.npmjs.org/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== @@ -8024,11 +7985,6 @@ diagnostics@^1.1.1: enabled "1.0.x" kuler "1.0.x" -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== - diff-sequences@^25.2.6: version "25.2.6" resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" @@ -11970,16 +11926,6 @@ jest-css-modules@^2.1.0: dependencies: identity-obj-proxy "3.0.0" -jest-diff@^24.0.0, jest-diff@^24.3.0, jest-diff@^24.9.0: - version "24.9.0" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" - integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== - dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - jest-diff@^25.1.0, jest-diff@^25.2.1: version "25.5.0" resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" @@ -12122,16 +12068,6 @@ jest-leak-detector@^25.1.0: jest-get-type "^25.1.0" pretty-format "^25.1.0" -jest-matcher-utils@^24.0.0: - version "24.9.0" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" - integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== - dependencies: - chalk "^2.0.1" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - jest-matcher-utils@^25.1.0: version "25.1.0" resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz#fa5996c45c7193a3c24e73066fc14acdee020220" @@ -16130,7 +16066,7 @@ pretty-error@^2.0.2, pretty-error@^2.1.1: renderkid "^2.0.1" utila "~0.4" -pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0: +pretty-format@^24.3.0, pretty-format@^24.9.0: version "24.9.0" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== @@ -16625,7 +16561,7 @@ react-docgen@^5.0.0: node-dir "^0.1.10" strip-indent "^3.0.0" -react-dom@16.13.1, react-dom@^16.12.0, react-dom@^16.13.1, react-dom@^16.8.3: +react-dom@^16.12.0, react-dom@^16.13.1, react-dom@^16.8.3: version "16.13.1" resolved "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f" integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag== @@ -16897,25 +16833,6 @@ react-transition-group@^4.0.0, react-transition-group@^4.3.0: loose-envify "^1.4.0" prop-types "^15.6.2" -react-use@^13.0.0: - version "13.27.1" - resolved "https://registry.npmjs.org/react-use/-/react-use-13.27.1.tgz#e2ae2b708dafc7893c4772628801589aab9de370" - integrity sha512-bAwdqDMXs5lovEanXnL1izledfrPEUUv1afoTVB59eUiYcDyKul+M/dT/2WcgHjoY/R6QlrTcZoW4R7ifwvBfw== - dependencies: - "@types/js-cookie" "2.2.5" - "@xobotyi/scrollbar-width" "1.9.5" - copy-to-clipboard "^3.2.0" - fast-deep-equal "^3.1.1" - fast-shallow-equal "^1.0.0" - js-cookie "^2.2.1" - nano-css "^5.2.1" - resize-observer-polyfill "^1.5.1" - screenfull "^5.0.0" - set-harmonic-interval "^1.0.1" - throttle-debounce "^2.1.0" - ts-easing "^0.2.0" - tslib "^1.10.0" - react-use@^14.2.0: version "14.2.0" resolved "https://registry.npmjs.org/react-use/-/react-use-14.2.0.tgz#abac033fae5e358599b7e38084ff11b02e5d4868" @@ -16947,7 +16864,7 @@ react-virtualized@^9.21.0: prop-types "^15.6.0" react-lifecycles-compat "^3.0.4" -react@16.13.1, react@^16.0.0, react@^16.12.0, react@^16.13.1, react@^16.8.3: +react@^16.0.0, react@^16.12.0, react@^16.13.1, react@^16.8.3: version "16.13.1" resolved "https://registry.npmjs.org/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== From 5a67b901424447d264d39922cb005375c0aa97ff Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 18 May 2020 20:01:07 +0200 Subject: [PATCH 87/90] fix: remove obsolete package --- package.json | 1 - yarn.lock | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 4d3d678690..11215b0d30 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,6 @@ "@spotify/eslint-config-oss": "^1.0.1", "file-loader": "^6.0.0", "husky": "^4.2.3", - "identity-obj-proxy": "^3.0.0", "lerna": "^3.20.2", "lint-staged": "^10.1.0", "patch-package": "^6.2.2", diff --git a/yarn.lock b/yarn.lock index 80629c73a8..69633198cc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10861,7 +10861,7 @@ icss-utils@^4.0.0, icss-utils@^4.1.1: dependencies: postcss "^7.0.14" -identity-obj-proxy@3.0.0, identity-obj-proxy@^3.0.0: +identity-obj-proxy@3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= From 10ee5eb5b47064cb6791d8a1bd174e0d36faf44a Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Mon, 18 May 2020 20:17:49 +0200 Subject: [PATCH 88/90] fix: remove obsolete package and fix tests --- packages/app/package.json | 1 - plugins/catalog-backend/src/database/Database.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/app/package.json b/packages/app/package.json index 36e6f12f5f..5c4321f362 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -18,7 +18,6 @@ "@material-ui/core": "^4.9.1", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", - "@types/http-proxy": "^1.17.4", "prop-types": "^15.7.2", "react": "^16.12.0", "react-dom": "^16.12.0", diff --git a/plugins/catalog-backend/src/database/Database.ts b/plugins/catalog-backend/src/database/Database.ts index ed11f091fe..46eedd95e5 100644 --- a/plugins/catalog-backend/src/database/Database.ts +++ b/plugins/catalog-backend/src/database/Database.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { NotFoundError } from '@backstage/backend-common'; import Knex from 'knex'; import { v4 as uuidv4 } from 'uuid'; +import { NotFoundError } from '../../../../packages/backend-common/src/errors'; import { AddDatabaseComponent, AddDatabaseLocation, From 6f19b178ee04d09b755225781484af6dfa68558f Mon Sep 17 00:00:00 2001 From: Nikita Nek Dudnik Date: Tue, 19 May 2020 10:36:47 +0200 Subject: [PATCH 89/90] fix: PR comments --- package.json | 1 - plugins/circleci/package.json | 2 +- plugins/circleci/src/components/Settings/Settings.tsx | 10 +++++----- plugins/circleci/tsconfig.json | 7 ------- yarn.lock | 8 -------- 5 files changed, 6 insertions(+), 22 deletions(-) delete mode 100644 plugins/circleci/tsconfig.json diff --git a/package.json b/package.json index 11215b0d30..e5028bfd2f 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,6 @@ "version": "1.0.0", "devDependencies": { "@spotify/eslint-config-oss": "^1.0.1", - "file-loader": "^6.0.0", "husky": "^4.2.3", "lerna": "^3.20.2", "lint-staged": "^10.1.0", diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 097fa5349f..297b06fb6d 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -2,7 +2,7 @@ "name": "@backstage/plugin-circleci", "version": "0.1.1-alpha.4", "main": "dist/index.esm.js", - "module": "dist/index.esm.js", + "main:src": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", "private": true, diff --git a/plugins/circleci/src/components/Settings/Settings.tsx b/plugins/circleci/src/components/Settings/Settings.tsx index 5159c156cc..e853bb46bb 100644 --- a/plugins/circleci/src/components/Settings/Settings.tsx +++ b/plugins/circleci/src/components/Settings/Settings.tsx @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import { Button, TextField, @@ -38,11 +38,11 @@ const Settings = () => { { saveSettings, hideSettings }, ] = useSettings(); - const [token, setToken] = React.useState(() => tokenFromStore); - const [owner, setOwner] = React.useState(() => ownerFromStore); - const [repo, setRepo] = React.useState(() => repoFromStore); + const [token, setToken] = useState(() => tokenFromStore); + const [owner, setOwner] = useState(() => ownerFromStore); + const [repo, setRepo] = useState(() => repoFromStore); - React.useEffect(() => { + useEffect(() => { if (tokenFromStore !== token) { setToken(tokenFromStore); } diff --git a/plugins/circleci/tsconfig.json b/plugins/circleci/tsconfig.json deleted file mode 100644 index 5cf0a023cb..0000000000 --- a/plugins/circleci/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "include": ["src"], - "compilerOptions": { - "module": "esnext" - } -} diff --git a/yarn.lock b/yarn.lock index 69633198cc..090255a316 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9255,14 +9255,6 @@ file-loader@^4.2.0: loader-utils "^1.2.3" schema-utils "^2.5.0" -file-loader@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f" - integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== - dependencies: - loader-utils "^2.0.0" - schema-utils "^2.6.5" - file-system-cache@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/file-system-cache/-/file-system-cache-1.0.5.tgz#84259b36a2bbb8d3d6eb1021d3132ffe64cfff4f" From e8c521d11173bffb9378c8404fb8e5e3ea8865a0 Mon Sep 17 00:00:00 2001 From: Ivan Shmidt Date: Tue, 19 May 2020 14:21:43 +0200 Subject: [PATCH 90/90] fix: type exports --- .../circleci/src/pages/BuildsPage/lib/CITable/index.ts | 3 ++- plugins/circleci/src/state/useBuilds.ts | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/plugins/circleci/src/pages/BuildsPage/lib/CITable/index.ts b/plugins/circleci/src/pages/BuildsPage/lib/CITable/index.ts index 600d6d689f..358939e69f 100644 --- a/plugins/circleci/src/pages/BuildsPage/lib/CITable/index.ts +++ b/plugins/circleci/src/pages/BuildsPage/lib/CITable/index.ts @@ -13,4 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { CITable, CITableBuildInfo } from './CITable'; +export { CITable } from './CITable'; +export type { CITableBuildInfo } from './CITable'; diff --git a/plugins/circleci/src/state/useBuilds.ts b/plugins/circleci/src/state/useBuilds.ts index 248cc677f6..f90311b56b 100644 --- a/plugins/circleci/src/state/useBuilds.ts +++ b/plugins/circleci/src/state/useBuilds.ts @@ -18,7 +18,7 @@ import { BuildSummary, GitType } from 'circleci-api'; import { useCallback, useEffect, useState } from 'react'; import { useAsyncRetry } from 'react-use'; import { circleCIApiRef } from '../api/index'; -import { CITableBuildInfo } from '../pages/BuildsPage/lib/CITable'; +import type { CITableBuildInfo } from '../pages/BuildsPage/lib/CITable'; import { useSettings } from './useSettings'; const makeReadableStatus = (status: string | undefined) => { @@ -44,7 +44,7 @@ export const transform = ( buildsData: BuildSummary[], restartBuild: { (buildId: number): Promise }, ): CITableBuildInfo[] => { - return buildsData.map((buildData) => { + return buildsData.map(buildData => { const tableBuildInfo: CITableBuildInfo = { id: String(buildData.build_num), buildName: buildData.subject @@ -120,7 +120,7 @@ export function useBuilds() { }; useEffect(() => { - getBuilds({ limit: 1, offset: 0 }).then((b) => setTotal(b?.[0].build_num!)); + getBuilds({ limit: 1, offset: 0 }).then(b => setTotal(b?.[0].build_num!)); }, [repo]); const { loading, value, retry } = useAsyncRetry( @@ -128,7 +128,7 @@ export function useBuilds() { getBuilds({ offset: page * pageSize, limit: pageSize, - }).then((builds) => transform(builds ?? [], restartBuild)), + }).then(builds => transform(builds ?? [], restartBuild)), [page, pageSize, getBuilds], );