@backstage-community/plugin-gocd 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @backstage-community/plugin-gocd
2
2
 
3
+ ## 0.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 87f0a61: Backstage version bump to v1.38.1
8
+
9
+ ## 0.5.1
10
+
11
+ ### Patch Changes
12
+
13
+ - 4aad9f3: remove unused devDependency `canvas`
14
+
3
15
  ## 0.5.0
4
16
 
5
17
  ### Minor Changes
@@ -1,4 +1,5 @@
1
- import React, { useState } from 'react';
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
2
3
  import { useEntity, MissingAnnotationEmptyState } from '@backstage/plugin-catalog-react';
3
4
  import { EmptyState, Page, Content, ContentHeader } from '@backstage/core-components';
4
5
  import { useApi, configApiRef } from '@backstage/core-plugin-api';
@@ -35,10 +36,10 @@ const GoCdBuildsComponent = () => {
35
36
  return apiResult?.message !== void 0;
36
37
  }
37
38
  if (!rawPipelines) {
38
- return /* @__PURE__ */ React.createElement(MissingAnnotationEmptyState, { annotation: GOCD_PIPELINES_ANNOTATION });
39
+ return /* @__PURE__ */ jsx(MissingAnnotationEmptyState, { annotation: GOCD_PIPELINES_ANNOTATION });
39
40
  }
40
41
  if (isError(pipelineHistory)) {
41
- return /* @__PURE__ */ React.createElement(
42
+ return /* @__PURE__ */ jsx(
42
43
  EmptyState,
43
44
  {
44
45
  title: "GoCD pipelines",
@@ -48,7 +49,7 @@ const GoCdBuildsComponent = () => {
48
49
  );
49
50
  }
50
51
  if (!loading && !pipelineHistory) {
51
- return /* @__PURE__ */ React.createElement(
52
+ return /* @__PURE__ */ jsx(
52
53
  EmptyState,
53
54
  {
54
55
  title: "GoCD pipelines",
@@ -57,30 +58,34 @@ const GoCdBuildsComponent = () => {
57
58
  }
58
59
  );
59
60
  }
60
- return /* @__PURE__ */ React.createElement(Page, { themeId: "tool" }, /* @__PURE__ */ React.createElement(Content, { noPadding: true }, /* @__PURE__ */ React.createElement(ContentHeader, { title: entity.metadata.name }, /* @__PURE__ */ React.createElement(
61
- SelectComponent,
62
- {
63
- value: selectedPipeline,
64
- onChange: (pipeline) => onSelectedPipelineChanged(pipeline),
65
- label: "Pipeline",
66
- items: getSelectionItems(rawPipelines)
67
- }
68
- )), /* @__PURE__ */ React.createElement(
69
- GoCdBuildsInsights,
70
- {
71
- pipelineHistory,
72
- loading,
73
- error
74
- }
75
- ), /* @__PURE__ */ React.createElement(
76
- GoCdBuildsTable,
77
- {
78
- goCdBaseUrl: config.getString("gocd.baseUrl"),
79
- pipelineHistory,
80
- loading,
81
- error
82
- }
83
- )));
61
+ return /* @__PURE__ */ jsx(Page, { themeId: "tool", children: /* @__PURE__ */ jsxs(Content, { noPadding: true, children: [
62
+ /* @__PURE__ */ jsx(ContentHeader, { title: entity.metadata.name, children: /* @__PURE__ */ jsx(
63
+ SelectComponent,
64
+ {
65
+ value: selectedPipeline,
66
+ onChange: (pipeline) => onSelectedPipelineChanged(pipeline),
67
+ label: "Pipeline",
68
+ items: getSelectionItems(rawPipelines)
69
+ }
70
+ ) }),
71
+ /* @__PURE__ */ jsx(
72
+ GoCdBuildsInsights,
73
+ {
74
+ pipelineHistory,
75
+ loading,
76
+ error
77
+ }
78
+ ),
79
+ /* @__PURE__ */ jsx(
80
+ GoCdBuildsTable,
81
+ {
82
+ goCdBaseUrl: config.getString("gocd.baseUrl"),
83
+ pipelineHistory,
84
+ loading,
85
+ error
86
+ }
87
+ )
88
+ ] }) });
84
89
  };
85
90
 
86
91
  export { GOCD_PIPELINES_ANNOTATION, GoCdBuildsComponent, isGoCdAvailable };
@@ -1 +1 @@
1
- {"version":3,"file":"GoCdBuildsComponent.esm.js","sources":["../../../src/components/GoCdBuildsComponent/GoCdBuildsComponent.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState } from 'react';\nimport { Entity } from '@backstage/catalog-model';\nimport {\n useEntity,\n MissingAnnotationEmptyState,\n} from '@backstage/plugin-catalog-react';\nimport {\n Content,\n ContentHeader,\n EmptyState,\n Page,\n} from '@backstage/core-components';\nimport { useApi, configApiRef } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\nimport { gocdApiRef } from '../../plugin';\nimport { GoCdBuildsTable } from '../GoCdBuildsTable/GoCdBuildsTable';\nimport { GoCdBuildsInsights } from '../GoCdBuildsInsights/GoCdBuildsInsights';\nimport { GoCdApiError, PipelineHistory } from '../../api/gocdApi.model';\nimport { Item, Select } from '../Select';\n\n/**\n * Constant storing GoCD pipelines annotation.\n *\n * @public\n */\nexport const GOCD_PIPELINES_ANNOTATION = 'gocd.org/pipelines';\n\n/**\n * Returns true if GoCD annotation is present in the given entity.\n *\n * @public\n */\nexport const isGoCdAvailable = (entity: Entity): boolean =>\n Boolean(entity.metadata.annotations?.[GOCD_PIPELINES_ANNOTATION]);\n\nexport const GoCdBuildsComponent = (): JSX.Element => {\n const { entity } = useEntity();\n const config = useApi(configApiRef);\n const rawPipelines: string[] | undefined = (\n entity.metadata.annotations?.[GOCD_PIPELINES_ANNOTATION] as\n | string\n | undefined\n )\n ?.split(',')\n .map(p => p.trim());\n const gocdApi = useApi(gocdApiRef);\n\n const [selectedPipeline, setSelectedPipeline] = useState<string>(\n rawPipelines ? rawPipelines[0] : '',\n );\n\n const {\n value: pipelineHistory,\n loading,\n error,\n } = useAsync(async (): Promise<PipelineHistory | GoCdApiError> => {\n return await gocdApi.getPipelineHistory(selectedPipeline);\n }, [selectedPipeline]);\n\n const onSelectedPipelineChanged = (pipeline: string) => {\n setSelectedPipeline(pipeline);\n };\n\n const getSelectionItems = (pipelines: string[]): Item[] => {\n return pipelines.map(p => ({ label: p, value: p }));\n };\n\n function isError(\n apiResult: PipelineHistory | GoCdApiError | undefined,\n ): apiResult is GoCdApiError {\n return (apiResult as GoCdApiError)?.message !== undefined;\n }\n\n if (!rawPipelines) {\n return (\n <MissingAnnotationEmptyState annotation={GOCD_PIPELINES_ANNOTATION} />\n );\n }\n\n if (isError(pipelineHistory)) {\n return (\n <EmptyState\n title=\"GoCD pipelines\"\n description={`Could not fetch pipelines defined for entity ${entity.metadata.name}. Error: ${pipelineHistory.message}`}\n missing=\"content\"\n />\n );\n }\n\n if (!loading && !pipelineHistory) {\n return (\n <EmptyState\n title=\"GoCD pipelines\"\n description={`We could not find pipelines defined for entity ${entity.metadata.name}.`}\n missing=\"data\"\n />\n );\n }\n\n return (\n <Page themeId=\"tool\">\n <Content noPadding>\n <ContentHeader title={entity.metadata.name}>\n <Select\n value={selectedPipeline}\n onChange={pipeline => onSelectedPipelineChanged(pipeline)}\n label=\"Pipeline\"\n items={getSelectionItems(rawPipelines)}\n />\n </ContentHeader>\n <GoCdBuildsInsights\n pipelineHistory={pipelineHistory}\n loading={loading}\n error={error}\n />\n <GoCdBuildsTable\n goCdBaseUrl={config.getString('gocd.baseUrl')}\n pipelineHistory={pipelineHistory}\n loading={loading}\n error={error}\n />\n </Content>\n </Page>\n );\n};\n"],"names":["Select"],"mappings":"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"}
1
+ {"version":3,"file":"GoCdBuildsComponent.esm.js","sources":["../../../src/components/GoCdBuildsComponent/GoCdBuildsComponent.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState } from 'react';\nimport { Entity } from '@backstage/catalog-model';\nimport {\n useEntity,\n MissingAnnotationEmptyState,\n} from '@backstage/plugin-catalog-react';\nimport {\n Content,\n ContentHeader,\n EmptyState,\n Page,\n} from '@backstage/core-components';\nimport { useApi, configApiRef } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\nimport { gocdApiRef } from '../../plugin';\nimport { GoCdBuildsTable } from '../GoCdBuildsTable/GoCdBuildsTable';\nimport { GoCdBuildsInsights } from '../GoCdBuildsInsights/GoCdBuildsInsights';\nimport { GoCdApiError, PipelineHistory } from '../../api/gocdApi.model';\nimport { Item, Select } from '../Select';\n\n/**\n * Constant storing GoCD pipelines annotation.\n *\n * @public\n */\nexport const GOCD_PIPELINES_ANNOTATION = 'gocd.org/pipelines';\n\n/**\n * Returns true if GoCD annotation is present in the given entity.\n *\n * @public\n */\nexport const isGoCdAvailable = (entity: Entity): boolean =>\n Boolean(entity.metadata.annotations?.[GOCD_PIPELINES_ANNOTATION]);\n\nexport const GoCdBuildsComponent = (): JSX.Element => {\n const { entity } = useEntity();\n const config = useApi(configApiRef);\n const rawPipelines: string[] | undefined = (\n entity.metadata.annotations?.[GOCD_PIPELINES_ANNOTATION] as\n | string\n | undefined\n )\n ?.split(',')\n .map(p => p.trim());\n const gocdApi = useApi(gocdApiRef);\n\n const [selectedPipeline, setSelectedPipeline] = useState<string>(\n rawPipelines ? rawPipelines[0] : '',\n );\n\n const {\n value: pipelineHistory,\n loading,\n error,\n } = useAsync(async (): Promise<PipelineHistory | GoCdApiError> => {\n return await gocdApi.getPipelineHistory(selectedPipeline);\n }, [selectedPipeline]);\n\n const onSelectedPipelineChanged = (pipeline: string) => {\n setSelectedPipeline(pipeline);\n };\n\n const getSelectionItems = (pipelines: string[]): Item[] => {\n return pipelines.map(p => ({ label: p, value: p }));\n };\n\n function isError(\n apiResult: PipelineHistory | GoCdApiError | undefined,\n ): apiResult is GoCdApiError {\n return (apiResult as GoCdApiError)?.message !== undefined;\n }\n\n if (!rawPipelines) {\n return (\n <MissingAnnotationEmptyState annotation={GOCD_PIPELINES_ANNOTATION} />\n );\n }\n\n if (isError(pipelineHistory)) {\n return (\n <EmptyState\n title=\"GoCD pipelines\"\n description={`Could not fetch pipelines defined for entity ${entity.metadata.name}. Error: ${pipelineHistory.message}`}\n missing=\"content\"\n />\n );\n }\n\n if (!loading && !pipelineHistory) {\n return (\n <EmptyState\n title=\"GoCD pipelines\"\n description={`We could not find pipelines defined for entity ${entity.metadata.name}.`}\n missing=\"data\"\n />\n );\n }\n\n return (\n <Page themeId=\"tool\">\n <Content noPadding>\n <ContentHeader title={entity.metadata.name}>\n <Select\n value={selectedPipeline}\n onChange={pipeline => onSelectedPipelineChanged(pipeline)}\n label=\"Pipeline\"\n items={getSelectionItems(rawPipelines)}\n />\n </ContentHeader>\n <GoCdBuildsInsights\n pipelineHistory={pipelineHistory}\n loading={loading}\n error={error}\n />\n <GoCdBuildsTable\n goCdBaseUrl={config.getString('gocd.baseUrl')}\n pipelineHistory={pipelineHistory}\n loading={loading}\n error={error}\n />\n </Content>\n </Page>\n );\n};\n"],"names":["Select"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
2
  import { mean, groupBy } from 'lodash';
3
3
  import { toBuildResultStatus, GoCdBuildResultStatus } from '../../api/gocdApi.model.esm.js';
4
4
  import Box from '@material-ui/core/Box';
@@ -114,12 +114,30 @@ function failureRate(jobs) {
114
114
  const GoCdBuildsInsights = (props) => {
115
115
  const { pipelineHistory, loading, error } = props;
116
116
  if (loading || error || !pipelineHistory) {
117
- return /* @__PURE__ */ React.createElement(React.Fragment, null);
117
+ return /* @__PURE__ */ jsx(Fragment, {});
118
118
  }
119
119
  const stages = pipelineHistory.pipelines.slice().reverse().map((p) => p.stages).flat();
120
120
  const jobs = stages.map((s) => s.jobs).flat();
121
121
  const failureRateObj = failureRate(jobs);
122
- return /* @__PURE__ */ React.createElement(Box, { "data-testid": "GoCdBuildsInsightsBox", sx: { mb: 1 } }, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 1 }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 6, sm: 3 }, /* @__PURE__ */ React.createElement(Tooltip, { title: "What is your deployment frequency?" }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, "Run Frequency"), /* @__PURE__ */ React.createElement(Typography, { variant: "h4" }, runFrequency(pipelineHistory)))))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 6, sm: 3 }, /* @__PURE__ */ React.createElement(Tooltip, { title: "How long does it take to fix a failure?" }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, "Mean Time to Recovery"), /* @__PURE__ */ React.createElement(Typography, { variant: "h4" }, meanTimeToRecovery(jobs)))))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 6, sm: 3 }, /* @__PURE__ */ React.createElement(Tooltip, { title: "How often do changes fail?" }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, "Mean Time Between Failures"), /* @__PURE__ */ React.createElement(Typography, { variant: "h4" }, meanTimeBetweenFailures(jobs)))))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 6, sm: 3 }, /* @__PURE__ */ React.createElement(Tooltip, { title: "What percentage of changes result in a failure?" }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, "Failure Rate"), /* @__PURE__ */ React.createElement(Typography, { variant: "h4" }, failureRateObj.title), /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, failureRateObj.subtitle)))))));
122
+ return /* @__PURE__ */ jsx(Box, { "data-testid": "GoCdBuildsInsightsBox", sx: { mb: 1 }, children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 1, children: [
123
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 6, sm: 3, children: /* @__PURE__ */ jsx(Tooltip, { title: "What is your deployment frequency?", children: /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { children: [
124
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: "Run Frequency" }),
125
+ /* @__PURE__ */ jsx(Typography, { variant: "h4", children: runFrequency(pipelineHistory) })
126
+ ] }) }) }) }),
127
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 6, sm: 3, children: /* @__PURE__ */ jsx(Tooltip, { title: "How long does it take to fix a failure?", children: /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { children: [
128
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: "Mean Time to Recovery" }),
129
+ /* @__PURE__ */ jsx(Typography, { variant: "h4", children: meanTimeToRecovery(jobs) })
130
+ ] }) }) }) }),
131
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 6, sm: 3, children: /* @__PURE__ */ jsx(Tooltip, { title: "How often do changes fail?", children: /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { children: [
132
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: "Mean Time Between Failures" }),
133
+ /* @__PURE__ */ jsx(Typography, { variant: "h4", children: meanTimeBetweenFailures(jobs) })
134
+ ] }) }) }) }),
135
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 6, sm: 3, children: /* @__PURE__ */ jsx(Tooltip, { title: "What percentage of changes result in a failure?", children: /* @__PURE__ */ jsx(Card, { children: /* @__PURE__ */ jsxs(CardContent, { children: [
136
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: "Failure Rate" }),
137
+ /* @__PURE__ */ jsx(Typography, { variant: "h4", children: failureRateObj.title }),
138
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: failureRateObj.subtitle })
139
+ ] }) }) }) })
140
+ ] }) });
123
141
  };
124
142
 
125
143
  export { GoCdBuildsInsights };
@@ -1 +1 @@
1
- {"version":3,"file":"GoCdBuildsInsights.esm.js","sources":["../../../src/components/GoCdBuildsInsights/GoCdBuildsInsights.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { groupBy, mean } from 'lodash';\nimport {\n PipelineHistory,\n Job,\n toBuildResultStatus,\n GoCdBuildResultStatus,\n} from '../../api/gocdApi.model';\nimport Box from '@material-ui/core/Box';\nimport Grid from '@material-ui/core/Grid';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Typography from '@material-ui/core/Typography';\nimport { DateTime, Duration } from 'luxon';\n\nexport type GoCdBuildsInsightsProps = {\n pipelineHistory: PipelineHistory | undefined;\n loading: boolean;\n error: Error | undefined;\n};\n\nfunction runFrequency(pipelineHistory: PipelineHistory): string {\n const lastMonth = DateTime.now().minus({ month: 1 });\n const buildLastMonth = pipelineHistory.pipelines\n .map(p => p.scheduled_date)\n .filter((d): d is number => !!d)\n .map(d => DateTime.fromMillis(d))\n .filter(d => d > lastMonth).length;\n return `${buildLastMonth} last month`;\n}\n\nfunction meanTimeBetweenFailures(jobs: Job[]): string {\n const timeBetweenFailures: Duration[] = [];\n for (let index = 1; index < jobs.length; index++) {\n const job = jobs[index];\n if (!job.result) {\n continue;\n }\n if (toBuildResultStatus(job.result) === GoCdBuildResultStatus.error) {\n let previousFailedJob: Job | null = null;\n for (let j = index - 1; j >= 0; j--) {\n const candidateJob = jobs[j];\n if (!candidateJob.result) {\n continue;\n }\n if (\n toBuildResultStatus(candidateJob.result) ===\n GoCdBuildResultStatus.error\n ) {\n previousFailedJob = candidateJob;\n break;\n }\n }\n if (\n !previousFailedJob ||\n !job.scheduled_date ||\n !previousFailedJob.scheduled_date\n ) {\n continue;\n }\n const failedJobDate = DateTime.fromMillis(job.scheduled_date);\n const previousFailedJobDate = DateTime.fromMillis(\n previousFailedJob.scheduled_date,\n );\n const timeBetweenFailure = failedJobDate.diff(previousFailedJobDate);\n timeBetweenFailures.push(timeBetweenFailure);\n }\n }\n return formatMean(timeBetweenFailures);\n}\n\n/**\n * Imagine a sequence like:\n * S - S - S - F - S - F - F - S - S\n *\n * We iterate until finding a failure, and then iterate forward\n * until we find the first immediate success to then\n * calculate the time difference between the scheduling of the jobs.\n */\nfunction meanTimeToRecovery(jobs: Job[]): string {\n const timeToRecoverIntervals: Duration[] = [];\n for (let index = 0; index < jobs.length; index++) {\n const job = jobs[index];\n if (!job.result) {\n continue;\n }\n if (toBuildResultStatus(job.result) === GoCdBuildResultStatus.error) {\n let nextSuccessfulJob: Job | null = null;\n for (let j = index + 1; j < jobs.length; j++) {\n const candidateJob = jobs[j];\n if (!candidateJob.result) {\n continue;\n }\n if (\n toBuildResultStatus(candidateJob.result) ===\n GoCdBuildResultStatus.successful\n ) {\n nextSuccessfulJob = candidateJob;\n break;\n }\n }\n if (\n !nextSuccessfulJob ||\n !job.scheduled_date ||\n !nextSuccessfulJob.scheduled_date\n ) {\n continue;\n }\n const failedJobDate = DateTime.fromMillis(job.scheduled_date);\n const successfulJobDate = DateTime.fromMillis(\n nextSuccessfulJob.scheduled_date,\n );\n const timeToRecovery = successfulJobDate.diff(failedJobDate);\n timeToRecoverIntervals.push(timeToRecovery);\n }\n }\n\n return formatMean(timeToRecoverIntervals);\n}\n\nfunction formatMean(durations: Duration[]): string {\n if (durations.length === 0) {\n return 'N/A';\n }\n\n const mttr: Duration = Duration.fromMillis(\n mean(durations.map(i => i.milliseconds)),\n );\n return mttr.toFormat(\"d'd' h'h' m'm' s's'\");\n}\n\nfunction failureRate(jobs: Job[]): {\n title: string;\n subtitle: string;\n} {\n const resultGroups = new Map(\n Object.entries(groupBy(jobs, 'result')).map(([key, value]) => [\n toBuildResultStatus(key),\n value.flat(),\n ]),\n );\n const failedJobs = resultGroups.get(GoCdBuildResultStatus.error);\n if (!failedJobs) {\n return {\n title: '0',\n subtitle: '(no failed jobs found)',\n };\n }\n\n resultGroups.delete(GoCdBuildResultStatus.error);\n const nonFailedJobs = Array.from(resultGroups.values()).flat();\n\n const totalJobs = failedJobs.length + nonFailedJobs.length;\n const percentage = (failedJobs.length / totalJobs) * 100;\n const decimalPercentage = (Math.round(percentage * 100) / 100).toFixed(2);\n return {\n title: `${decimalPercentage}%`,\n subtitle: `(${failedJobs.length} out of ${totalJobs} jobs)`,\n };\n}\n\nexport const GoCdBuildsInsights = (\n props: GoCdBuildsInsightsProps,\n): JSX.Element => {\n const { pipelineHistory, loading, error } = props;\n\n if (loading || error || !pipelineHistory) {\n return <></>;\n }\n\n // We reverse the array to calculate insights to make sure jobs are ordered\n // by their schedule date.\n const stages = pipelineHistory.pipelines\n .slice()\n .reverse()\n .map(p => p.stages)\n .flat();\n const jobs = stages.map(s => s.jobs).flat();\n\n const failureRateObj: { title: string; subtitle: string } = failureRate(jobs);\n\n return (\n <Box data-testid=\"GoCdBuildsInsightsBox\" sx={{ mb: 1 }}>\n <Grid container spacing={1}>\n <Grid item xs={6} sm={3}>\n <Tooltip title=\"What is your deployment frequency?\">\n <Card>\n <CardContent>\n <Typography variant=\"body2\">Run Frequency</Typography>\n <Typography variant=\"h4\">\n {runFrequency(pipelineHistory)}\n </Typography>\n </CardContent>\n </Card>\n </Tooltip>\n </Grid>\n <Grid item xs={6} sm={3}>\n <Tooltip title=\"How long does it take to fix a failure?\">\n <Card>\n <CardContent>\n <Typography variant=\"body2\">Mean Time to Recovery</Typography>\n <Typography variant=\"h4\">{meanTimeToRecovery(jobs)}</Typography>\n </CardContent>\n </Card>\n </Tooltip>\n </Grid>\n <Grid item xs={6} sm={3}>\n <Tooltip title=\"How often do changes fail?\">\n <Card>\n <CardContent>\n <Typography variant=\"body2\">\n Mean Time Between Failures\n </Typography>\n <Typography variant=\"h4\">\n {meanTimeBetweenFailures(jobs)}\n </Typography>\n </CardContent>\n </Card>\n </Tooltip>\n </Grid>\n <Grid item xs={6} sm={3}>\n <Tooltip title=\"What percentage of changes result in a failure?\">\n <Card>\n <CardContent>\n <Typography variant=\"body2\">Failure Rate</Typography>\n <Typography variant=\"h4\">{failureRateObj.title}</Typography>\n <Typography variant=\"body2\">\n {failureRateObj.subtitle}\n </Typography>\n </CardContent>\n </Card>\n </Tooltip>\n </Grid>\n </Grid>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GoCdBuildsInsights.esm.js","sources":["../../../src/components/GoCdBuildsInsights/GoCdBuildsInsights.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { groupBy, mean } from 'lodash';\nimport {\n PipelineHistory,\n Job,\n toBuildResultStatus,\n GoCdBuildResultStatus,\n} from '../../api/gocdApi.model';\nimport Box from '@material-ui/core/Box';\nimport Grid from '@material-ui/core/Grid';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Typography from '@material-ui/core/Typography';\nimport { DateTime, Duration } from 'luxon';\n\nexport type GoCdBuildsInsightsProps = {\n pipelineHistory: PipelineHistory | undefined;\n loading: boolean;\n error: Error | undefined;\n};\n\nfunction runFrequency(pipelineHistory: PipelineHistory): string {\n const lastMonth = DateTime.now().minus({ month: 1 });\n const buildLastMonth = pipelineHistory.pipelines\n .map(p => p.scheduled_date)\n .filter((d): d is number => !!d)\n .map(d => DateTime.fromMillis(d))\n .filter(d => d > lastMonth).length;\n return `${buildLastMonth} last month`;\n}\n\nfunction meanTimeBetweenFailures(jobs: Job[]): string {\n const timeBetweenFailures: Duration[] = [];\n for (let index = 1; index < jobs.length; index++) {\n const job = jobs[index];\n if (!job.result) {\n continue;\n }\n if (toBuildResultStatus(job.result) === GoCdBuildResultStatus.error) {\n let previousFailedJob: Job | null = null;\n for (let j = index - 1; j >= 0; j--) {\n const candidateJob = jobs[j];\n if (!candidateJob.result) {\n continue;\n }\n if (\n toBuildResultStatus(candidateJob.result) ===\n GoCdBuildResultStatus.error\n ) {\n previousFailedJob = candidateJob;\n break;\n }\n }\n if (\n !previousFailedJob ||\n !job.scheduled_date ||\n !previousFailedJob.scheduled_date\n ) {\n continue;\n }\n const failedJobDate = DateTime.fromMillis(job.scheduled_date);\n const previousFailedJobDate = DateTime.fromMillis(\n previousFailedJob.scheduled_date,\n );\n const timeBetweenFailure = failedJobDate.diff(previousFailedJobDate);\n timeBetweenFailures.push(timeBetweenFailure);\n }\n }\n return formatMean(timeBetweenFailures);\n}\n\n/**\n * Imagine a sequence like:\n * S - S - S - F - S - F - F - S - S\n *\n * We iterate until finding a failure, and then iterate forward\n * until we find the first immediate success to then\n * calculate the time difference between the scheduling of the jobs.\n */\nfunction meanTimeToRecovery(jobs: Job[]): string {\n const timeToRecoverIntervals: Duration[] = [];\n for (let index = 0; index < jobs.length; index++) {\n const job = jobs[index];\n if (!job.result) {\n continue;\n }\n if (toBuildResultStatus(job.result) === GoCdBuildResultStatus.error) {\n let nextSuccessfulJob: Job | null = null;\n for (let j = index + 1; j < jobs.length; j++) {\n const candidateJob = jobs[j];\n if (!candidateJob.result) {\n continue;\n }\n if (\n toBuildResultStatus(candidateJob.result) ===\n GoCdBuildResultStatus.successful\n ) {\n nextSuccessfulJob = candidateJob;\n break;\n }\n }\n if (\n !nextSuccessfulJob ||\n !job.scheduled_date ||\n !nextSuccessfulJob.scheduled_date\n ) {\n continue;\n }\n const failedJobDate = DateTime.fromMillis(job.scheduled_date);\n const successfulJobDate = DateTime.fromMillis(\n nextSuccessfulJob.scheduled_date,\n );\n const timeToRecovery = successfulJobDate.diff(failedJobDate);\n timeToRecoverIntervals.push(timeToRecovery);\n }\n }\n\n return formatMean(timeToRecoverIntervals);\n}\n\nfunction formatMean(durations: Duration[]): string {\n if (durations.length === 0) {\n return 'N/A';\n }\n\n const mttr: Duration = Duration.fromMillis(\n mean(durations.map(i => i.milliseconds)),\n );\n return mttr.toFormat(\"d'd' h'h' m'm' s's'\");\n}\n\nfunction failureRate(jobs: Job[]): {\n title: string;\n subtitle: string;\n} {\n const resultGroups = new Map(\n Object.entries(groupBy(jobs, 'result')).map(([key, value]) => [\n toBuildResultStatus(key),\n value.flat(),\n ]),\n );\n const failedJobs = resultGroups.get(GoCdBuildResultStatus.error);\n if (!failedJobs) {\n return {\n title: '0',\n subtitle: '(no failed jobs found)',\n };\n }\n\n resultGroups.delete(GoCdBuildResultStatus.error);\n const nonFailedJobs = Array.from(resultGroups.values()).flat();\n\n const totalJobs = failedJobs.length + nonFailedJobs.length;\n const percentage = (failedJobs.length / totalJobs) * 100;\n const decimalPercentage = (Math.round(percentage * 100) / 100).toFixed(2);\n return {\n title: `${decimalPercentage}%`,\n subtitle: `(${failedJobs.length} out of ${totalJobs} jobs)`,\n };\n}\n\nexport const GoCdBuildsInsights = (\n props: GoCdBuildsInsightsProps,\n): JSX.Element => {\n const { pipelineHistory, loading, error } = props;\n\n if (loading || error || !pipelineHistory) {\n return <></>;\n }\n\n // We reverse the array to calculate insights to make sure jobs are ordered\n // by their schedule date.\n const stages = pipelineHistory.pipelines\n .slice()\n .reverse()\n .map(p => p.stages)\n .flat();\n const jobs = stages.map(s => s.jobs).flat();\n\n const failureRateObj: { title: string; subtitle: string } = failureRate(jobs);\n\n return (\n <Box data-testid=\"GoCdBuildsInsightsBox\" sx={{ mb: 1 }}>\n <Grid container spacing={1}>\n <Grid item xs={6} sm={3}>\n <Tooltip title=\"What is your deployment frequency?\">\n <Card>\n <CardContent>\n <Typography variant=\"body2\">Run Frequency</Typography>\n <Typography variant=\"h4\">\n {runFrequency(pipelineHistory)}\n </Typography>\n </CardContent>\n </Card>\n </Tooltip>\n </Grid>\n <Grid item xs={6} sm={3}>\n <Tooltip title=\"How long does it take to fix a failure?\">\n <Card>\n <CardContent>\n <Typography variant=\"body2\">Mean Time to Recovery</Typography>\n <Typography variant=\"h4\">{meanTimeToRecovery(jobs)}</Typography>\n </CardContent>\n </Card>\n </Tooltip>\n </Grid>\n <Grid item xs={6} sm={3}>\n <Tooltip title=\"How often do changes fail?\">\n <Card>\n <CardContent>\n <Typography variant=\"body2\">\n Mean Time Between Failures\n </Typography>\n <Typography variant=\"h4\">\n {meanTimeBetweenFailures(jobs)}\n </Typography>\n </CardContent>\n </Card>\n </Tooltip>\n </Grid>\n <Grid item xs={6} sm={3}>\n <Tooltip title=\"What percentage of changes result in a failure?\">\n <Card>\n <CardContent>\n <Typography variant=\"body2\">Failure Rate</Typography>\n <Typography variant=\"h4\">{failureRateObj.title}</Typography>\n <Typography variant=\"body2\">\n {failureRateObj.subtitle}\n </Typography>\n </CardContent>\n </Card>\n </Tooltip>\n </Grid>\n </Grid>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import React, { useState } from 'react';
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
2
3
  import { getEntitySourceLocation } from '@backstage/catalog-model';
3
4
  import { useEntity } from '@backstage/plugin-catalog-react';
4
5
  import Alert from '@material-ui/lab/Alert';
@@ -9,51 +10,79 @@ import { DateTime } from 'luxon';
9
10
  import { Table, SubvalueCell, StatusWarning, StatusPending, StatusAborted, StatusRunning, StatusError, StatusOK, Link } from '@backstage/core-components';
10
11
 
11
12
  const renderTrigger = (build) => {
12
- const subvalue = /* @__PURE__ */ React.createElement(React.Fragment, null, build.pipeline, /* @__PURE__ */ React.createElement("br", null), build.author);
13
- return /* @__PURE__ */ React.createElement(SubvalueCell, { value: build.message, subvalue });
13
+ const subvalue = /* @__PURE__ */ jsxs(Fragment, { children: [
14
+ build.pipeline,
15
+ /* @__PURE__ */ jsx("br", {}),
16
+ build.author
17
+ ] });
18
+ return /* @__PURE__ */ jsx(SubvalueCell, { value: build.message, subvalue });
14
19
  };
15
20
  const renderStages = (build) => {
16
21
  return build.stages.map((s) => {
17
22
  switch (s.status) {
18
23
  case GoCdBuildResultStatus.successful: {
19
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(StatusOK, null, s.text), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement("br", null));
24
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
25
+ /* @__PURE__ */ jsx(StatusOK, { children: s.text }),
26
+ /* @__PURE__ */ jsx("br", {}),
27
+ /* @__PURE__ */ jsx("br", {})
28
+ ] });
20
29
  }
21
30
  case GoCdBuildResultStatus.error: {
22
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(StatusError, null, s.text), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement("br", null));
31
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
32
+ /* @__PURE__ */ jsx(StatusError, { children: s.text }),
33
+ /* @__PURE__ */ jsx("br", {}),
34
+ /* @__PURE__ */ jsx("br", {})
35
+ ] });
23
36
  }
24
37
  case GoCdBuildResultStatus.running: {
25
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(StatusRunning, null, s.text), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement("br", null));
38
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
39
+ /* @__PURE__ */ jsx(StatusRunning, { children: s.text }),
40
+ /* @__PURE__ */ jsx("br", {}),
41
+ /* @__PURE__ */ jsx("br", {})
42
+ ] });
26
43
  }
27
44
  case GoCdBuildResultStatus.aborted: {
28
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(StatusAborted, null, s.text), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement("br", null));
45
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
46
+ /* @__PURE__ */ jsx(StatusAborted, { children: s.text }),
47
+ /* @__PURE__ */ jsx("br", {}),
48
+ /* @__PURE__ */ jsx("br", {})
49
+ ] });
29
50
  }
30
51
  case GoCdBuildResultStatus.pending: {
31
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(StatusPending, null, s.text), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement("br", null));
52
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
53
+ /* @__PURE__ */ jsx(StatusPending, { children: s.text }),
54
+ /* @__PURE__ */ jsx("br", {}),
55
+ /* @__PURE__ */ jsx("br", {})
56
+ ] });
32
57
  }
33
58
  default: {
34
- return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(StatusWarning, null, s.text), /* @__PURE__ */ React.createElement("br", null), /* @__PURE__ */ React.createElement("br", null));
59
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
60
+ /* @__PURE__ */ jsx(StatusWarning, { children: s.text }),
61
+ /* @__PURE__ */ jsx("br", {}),
62
+ /* @__PURE__ */ jsx("br", {})
63
+ ] });
35
64
  }
36
65
  }
37
66
  });
38
67
  };
39
68
  const renderSource = (build) => {
40
- return /* @__PURE__ */ React.createElement(
69
+ return /* @__PURE__ */ jsx(
41
70
  Button,
42
71
  {
43
72
  href: build.source,
44
73
  target: "_blank",
45
74
  rel: "noreferrer",
46
- startIcon: /* @__PURE__ */ React.createElement(GitHubIcon, null)
47
- },
48
- build.commitHash
75
+ startIcon: /* @__PURE__ */ jsx(GitHubIcon, {}),
76
+ children: build.commitHash
77
+ }
49
78
  );
50
79
  };
51
80
  const renderId = (goCdBaseUrl, build) => {
52
81
  const goCdBuildUrl = `${goCdBaseUrl}/go/pipelines/value_stream_map/${build.buildSlug}`;
53
- return /* @__PURE__ */ React.createElement(
82
+ return /* @__PURE__ */ jsx(
54
83
  SubvalueCell,
55
84
  {
56
- value: /* @__PURE__ */ React.createElement(Link, { to: goCdBuildUrl, target: "_blank", rel: "noreferrer" }, build.id),
85
+ value: /* @__PURE__ */ jsx(Link, { to: goCdBuildUrl, target: "_blank", rel: "noreferrer", children: build.id }),
57
86
  subvalue: build.triggerTime && DateTime.fromMillis(build.triggerTime).toLocaleString(
58
87
  DateTime.DATETIME_MED
59
88
  )
@@ -61,7 +90,7 @@ const renderId = (goCdBaseUrl, build) => {
61
90
  );
62
91
  };
63
92
  const renderError = (error) => {
64
- return /* @__PURE__ */ React.createElement(Alert, { severity: "error" }, error.message);
93
+ return /* @__PURE__ */ jsx(Alert, { severity: "error", children: error.message });
65
94
  };
66
95
  const toBuildResults = (entity, builds) => {
67
96
  const entitySourceLocation = getEntitySourceLocation(entity).target.split("/tree")[0];
@@ -109,26 +138,29 @@ const GoCdBuildsTable = (props) => {
109
138
  render: (build) => renderSource(build)
110
139
  }
111
140
  ];
112
- return /* @__PURE__ */ React.createElement(React.Fragment, null, error && renderError(error), !error && /* @__PURE__ */ React.createElement(
113
- Table,
114
- {
115
- title: "GoCD builds",
116
- isLoading: loading,
117
- options: {
118
- search: true,
119
- searchAutoFocus: true,
120
- debounceInterval: 800,
121
- paging: true,
122
- padding: "dense",
123
- pageSizeOptions: [5, 10, 20, 50],
124
- showFirstLastPageButtons: false,
125
- pageSize: 20
126
- },
127
- columns,
128
- data: pipelineHistory ? toBuildResults(entity, pipelineHistory.pipelines) || [] : [],
129
- onSearchChange: (searchTerm) => setSelectedSearchTerm(searchTerm)
130
- }
131
- ));
141
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
142
+ error && renderError(error),
143
+ !error && /* @__PURE__ */ jsx(
144
+ Table,
145
+ {
146
+ title: "GoCD builds",
147
+ isLoading: loading,
148
+ options: {
149
+ search: true,
150
+ searchAutoFocus: true,
151
+ debounceInterval: 800,
152
+ paging: true,
153
+ padding: "dense",
154
+ pageSizeOptions: [5, 10, 20, 50],
155
+ showFirstLastPageButtons: false,
156
+ pageSize: 20
157
+ },
158
+ columns,
159
+ data: pipelineHistory ? toBuildResults(entity, pipelineHistory.pipelines) || [] : [],
160
+ onSearchChange: (searchTerm) => setSelectedSearchTerm(searchTerm)
161
+ }
162
+ )
163
+ ] });
132
164
  };
133
165
 
134
166
  export { GoCdBuildsTable };
@@ -1 +1 @@
1
- {"version":3,"file":"GoCdBuildsTable.esm.js","sources":["../../../src/components/GoCdBuildsTable/GoCdBuildsTable.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState } from 'react';\nimport { Entity, getEntitySourceLocation } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport Alert from '@material-ui/lab/Alert';\nimport Button from '@material-ui/core/Button';\nimport GitHubIcon from '@material-ui/icons/GitHub';\nimport {\n GoCdBuildResult,\n GoCdBuildResultStatus,\n toBuildResultStatus,\n PipelineHistory,\n Pipeline,\n} from '../../api/gocdApi.model';\nimport { DateTime } from 'luxon';\nimport {\n Table,\n TableColumn,\n Link,\n SubvalueCell,\n StatusOK,\n StatusWarning,\n StatusAborted,\n StatusError,\n StatusRunning,\n StatusPending,\n} from '@backstage/core-components';\n\ntype GoCdBuildsProps = {\n goCdBaseUrl: string;\n pipelineHistory: PipelineHistory | undefined;\n loading: boolean;\n error: Error | undefined;\n};\n\nconst renderTrigger = (build: GoCdBuildResult): React.ReactNode => {\n const subvalue = (\n <>\n {build.pipeline}\n <br />\n {build.author}\n </>\n );\n return <SubvalueCell value={build.message} subvalue={subvalue} />;\n};\n\nconst renderStages = (build: GoCdBuildResult): React.ReactNode => {\n return build.stages.map(s => {\n switch (s.status) {\n case GoCdBuildResultStatus.successful: {\n return (\n <>\n <StatusOK>{s.text}</StatusOK>\n <br />\n <br />\n </>\n );\n }\n case GoCdBuildResultStatus.error: {\n return (\n <>\n <StatusError>{s.text}</StatusError>\n <br />\n <br />\n </>\n );\n }\n case GoCdBuildResultStatus.running: {\n return (\n <>\n <StatusRunning>{s.text}</StatusRunning>\n <br />\n <br />\n </>\n );\n }\n case GoCdBuildResultStatus.aborted: {\n return (\n <>\n <StatusAborted>{s.text}</StatusAborted>\n <br />\n <br />\n </>\n );\n }\n case GoCdBuildResultStatus.pending: {\n return (\n <>\n <StatusPending>{s.text}</StatusPending>\n <br />\n <br />\n </>\n );\n }\n default: {\n return (\n <>\n <StatusWarning>{s.text}</StatusWarning>\n <br />\n <br />\n </>\n );\n }\n }\n });\n};\n\nconst renderSource = (build: GoCdBuildResult): React.ReactNode => {\n return (\n <Button\n href={build.source}\n target=\"_blank\"\n rel=\"noreferrer\"\n startIcon={<GitHubIcon />}\n >\n {build.commitHash}\n </Button>\n );\n};\n\nconst renderId = (\n goCdBaseUrl: string,\n build: GoCdBuildResult,\n): React.ReactNode => {\n const goCdBuildUrl = `${goCdBaseUrl}/go/pipelines/value_stream_map/${build.buildSlug}`;\n return (\n <SubvalueCell\n value={\n <Link to={goCdBuildUrl} target=\"_blank\" rel=\"noreferrer\">\n {build.id}\n </Link>\n }\n subvalue={\n build.triggerTime &&\n DateTime.fromMillis(build.triggerTime).toLocaleString(\n DateTime.DATETIME_MED,\n )\n }\n />\n );\n};\n\nconst renderError = (error: Error): JSX.Element => {\n return <Alert severity=\"error\">{error.message}</Alert>;\n};\n\nconst toBuildResults = (\n entity: Entity,\n builds: Pipeline[],\n): GoCdBuildResult[] | undefined => {\n // TODO(julioz): What if not git 'type'?\n const entitySourceLocation =\n getEntitySourceLocation(entity).target.split('/tree')[0];\n return builds.map(build => ({\n id: build.counter,\n source: `${entitySourceLocation}/commit/${build.build_cause?.material_revisions[0]?.modifications[0].revision}`,\n stages: build.stages.map(s => ({\n status: toBuildResultStatus(s.status),\n text: s.name,\n })),\n buildSlug: `${build.name}/${build.counter}`,\n message:\n build.build_cause?.material_revisions[0]?.modifications[0].comment ?? '',\n pipeline: build.name,\n author:\n build.build_cause?.material_revisions[0]?.modifications[0].user_name,\n commitHash: build.label,\n triggerTime: build.scheduled_date,\n }));\n};\n\nexport const GoCdBuildsTable = (props: GoCdBuildsProps): JSX.Element => {\n const { pipelineHistory, loading, error } = props;\n const { entity } = useEntity();\n const [, setSelectedSearchTerm] = useState<string>('');\n\n const columns: TableColumn<GoCdBuildResult>[] = [\n {\n title: 'ID',\n field: 'id',\n highlight: true,\n render: build => renderId(props.goCdBaseUrl, build),\n },\n {\n title: 'Trigger',\n customFilterAndSearch: (query, row: GoCdBuildResult) =>\n `${row.message} ${row.pipeline} ${row.author}`\n .toLocaleUpperCase('en-US')\n .includes(query.toLocaleUpperCase('en-US')),\n field: 'message',\n highlight: true,\n render: build => renderTrigger(build),\n },\n {\n title: 'Stages',\n field: 'status',\n render: build => renderStages(build),\n },\n {\n title: 'Source',\n field: 'source',\n render: build => renderSource(build),\n },\n ];\n\n return (\n <>\n {error && renderError(error)}\n {!error && (\n <Table\n title=\"GoCD builds\"\n isLoading={loading}\n options={{\n search: true,\n searchAutoFocus: true,\n debounceInterval: 800,\n paging: true,\n padding: 'dense',\n pageSizeOptions: [5, 10, 20, 50],\n showFirstLastPageButtons: false,\n pageSize: 20,\n }}\n columns={columns}\n data={\n pipelineHistory\n ? toBuildResults(entity, pipelineHistory.pipelines) || []\n : []\n }\n onSearchChange={(searchTerm: string) =>\n setSelectedSearchTerm(searchTerm)\n }\n />\n )}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAiDA,MAAM,aAAA,GAAgB,CAAC,KAA4C,KAAA;AACjE,EAAM,MAAA,QAAA,6DAED,KAAM,CAAA,QAAA,sCACN,IAAG,EAAA,IAAA,CAAA,EACH,MAAM,MACT,CAAA;AAEF,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,YAAA,EAAA,EAAa,KAAO,EAAA,KAAA,CAAM,SAAS,QAAoB,EAAA,CAAA;AACjE,CAAA;AAEA,MAAM,YAAA,GAAe,CAAC,KAA4C,KAAA;AAChE,EAAO,OAAA,KAAA,CAAM,MAAO,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA;AAC3B,IAAA,QAAQ,EAAE,MAAQ;AAAA,MAChB,KAAK,sBAAsB,UAAY,EAAA;AACrC,QACE,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBACG,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAA,EAAU,CAAE,CAAA,IAAK,CAClB,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAG,EAAA,IAAA,CAAA,kBACH,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,CACN,CAAA;AAAA;AAEJ,MACA,KAAK,sBAAsB,KAAO,EAAA;AAChC,QACE,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBACG,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,IAAA,EAAa,CAAE,CAAA,IAAK,CACrB,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAG,EAAA,IAAA,CAAA,kBACH,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,CACN,CAAA;AAAA;AAEJ,MACA,KAAK,sBAAsB,OAAS,EAAA;AAClC,QACE,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBACG,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,EAAe,CAAE,CAAA,IAAK,CACvB,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAG,EAAA,IAAA,CAAA,kBACH,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,CACN,CAAA;AAAA;AAEJ,MACA,KAAK,sBAAsB,OAAS,EAAA;AAClC,QACE,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBACG,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,EAAe,CAAE,CAAA,IAAK,CACvB,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAG,EAAA,IAAA,CAAA,kBACH,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,CACN,CAAA;AAAA;AAEJ,MACA,KAAK,sBAAsB,OAAS,EAAA;AAClC,QACE,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBACG,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,EAAe,CAAE,CAAA,IAAK,CACvB,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAG,EAAA,IAAA,CAAA,kBACH,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,CACN,CAAA;AAAA;AAEJ,MACA,SAAS;AACP,QACE,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBACG,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,EAAe,CAAE,CAAA,IAAK,CACvB,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAG,EAAA,IAAA,CAAA,kBACH,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,IAAG,CACN,CAAA;AAAA;AAEJ;AACF,GACD,CAAA;AACH,CAAA;AAEA,MAAM,YAAA,GAAe,CAAC,KAA4C,KAAA;AAChE,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,MAAM,KAAM,CAAA,MAAA;AAAA,MACZ,MAAO,EAAA,QAAA;AAAA,MACP,GAAI,EAAA,YAAA;AAAA,MACJ,SAAA,sCAAY,UAAW,EAAA,IAAA;AAAA,KAAA;AAAA,IAEtB,KAAM,CAAA;AAAA,GACT;AAEJ,CAAA;AAEA,MAAM,QAAA,GAAW,CACf,WAAA,EACA,KACoB,KAAA;AACpB,EAAA,MAAM,YAAe,GAAA,CAAA,EAAG,WAAW,CAAA,+BAAA,EAAkC,MAAM,SAAS,CAAA,CAAA;AACpF,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,KAAA,kBACG,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,EAAI,EAAA,YAAA,EAAc,QAAO,QAAS,EAAA,GAAA,EAAI,YACzC,EAAA,EAAA,KAAA,CAAM,EACT,CAAA;AAAA,MAEF,UACE,KAAM,CAAA,WAAA,IACN,SAAS,UAAW,CAAA,KAAA,CAAM,WAAW,CAAE,CAAA,cAAA;AAAA,QACrC,QAAS,CAAA;AAAA;AACX;AAAA,GAEJ;AAEJ,CAAA;AAEA,MAAM,WAAA,GAAc,CAAC,KAA8B,KAAA;AACjD,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,OAAA,EAAA,EAAS,MAAM,OAAQ,CAAA;AAChD,CAAA;AAEA,MAAM,cAAA,GAAiB,CACrB,MAAA,EACA,MACkC,KAAA;AAElC,EAAM,MAAA,oBAAA,GACJ,wBAAwB,MAAM,CAAA,CAAE,OAAO,KAAM,CAAA,OAAO,EAAE,CAAC,CAAA;AACzD,EAAO,OAAA,MAAA,CAAO,IAAI,CAAU,KAAA,MAAA;AAAA,IAC1B,IAAI,KAAM,CAAA,OAAA;AAAA,IACV,MAAQ,EAAA,CAAA,EAAG,oBAAoB,CAAA,QAAA,EAAW,KAAM,CAAA,WAAA,EAAa,kBAAmB,CAAA,CAAC,CAAG,EAAA,aAAA,CAAc,CAAC,CAAA,CAAE,QAAQ,CAAA,CAAA;AAAA,IAC7G,MAAQ,EAAA,KAAA,CAAM,MAAO,CAAA,GAAA,CAAI,CAAM,CAAA,MAAA;AAAA,MAC7B,MAAA,EAAQ,mBAAoB,CAAA,CAAA,CAAE,MAAM,CAAA;AAAA,MACpC,MAAM,CAAE,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,IACF,WAAW,CAAG,EAAA,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,MAAM,OAAO,CAAA,CAAA;AAAA,IACzC,OAAA,EACE,MAAM,WAAa,EAAA,kBAAA,CAAmB,CAAC,CAAG,EAAA,aAAA,CAAc,CAAC,CAAA,CAAE,OAAW,IAAA,EAAA;AAAA,IACxE,UAAU,KAAM,CAAA,IAAA;AAAA,IAChB,MAAA,EACE,MAAM,WAAa,EAAA,kBAAA,CAAmB,CAAC,CAAG,EAAA,aAAA,CAAc,CAAC,CAAE,CAAA,SAAA;AAAA,IAC7D,YAAY,KAAM,CAAA,KAAA;AAAA,IAClB,aAAa,KAAM,CAAA;AAAA,GACnB,CAAA,CAAA;AACJ,CAAA;AAEa,MAAA,eAAA,GAAkB,CAAC,KAAwC,KAAA;AACtE,EAAA,MAAM,EAAE,eAAA,EAAiB,OAAS,EAAA,KAAA,EAAU,GAAA,KAAA;AAC5C,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAA,MAAM,GAAG,qBAAqB,CAAA,GAAI,SAAiB,EAAE,CAAA;AAErD,EAAA,MAAM,OAA0C,GAAA;AAAA,IAC9C;AAAA,MACE,KAAO,EAAA,IAAA;AAAA,MACP,KAAO,EAAA,IAAA;AAAA,MACP,SAAW,EAAA,IAAA;AAAA,MACX,MAAQ,EAAA,CAAA,KAAA,KAAS,QAAS,CAAA,KAAA,CAAM,aAAa,KAAK;AAAA,KACpD;AAAA,IACA;AAAA,MACE,KAAO,EAAA,SAAA;AAAA,MACP,qBAAA,EAAuB,CAAC,KAAO,EAAA,GAAA,KAC7B,GAAG,GAAI,CAAA,OAAO,IAAI,GAAI,CAAA,QAAQ,IAAI,GAAI,CAAA,MAAM,GACzC,iBAAkB,CAAA,OAAO,EACzB,QAAS,CAAA,KAAA,CAAM,iBAAkB,CAAA,OAAO,CAAC,CAAA;AAAA,MAC9C,KAAO,EAAA,SAAA;AAAA,MACP,SAAW,EAAA,IAAA;AAAA,MACX,MAAA,EAAQ,CAAS,KAAA,KAAA,aAAA,CAAc,KAAK;AAAA,KACtC;AAAA,IACA;AAAA,MACE,KAAO,EAAA,QAAA;AAAA,MACP,KAAO,EAAA,QAAA;AAAA,MACP,MAAA,EAAQ,CAAS,KAAA,KAAA,YAAA,CAAa,KAAK;AAAA,KACrC;AAAA,IACA;AAAA,MACE,KAAO,EAAA,QAAA;AAAA,MACP,KAAO,EAAA,QAAA;AAAA,MACP,MAAA,EAAQ,CAAS,KAAA,KAAA,YAAA,CAAa,KAAK;AAAA;AACrC,GACF;AAEA,EAAA,iEAEK,KAAS,IAAA,WAAA,CAAY,KAAK,CAAA,EAC1B,CAAC,KACA,oBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAM,EAAA,aAAA;AAAA,MACN,SAAW,EAAA,OAAA;AAAA,MACX,OAAS,EAAA;AAAA,QACP,MAAQ,EAAA,IAAA;AAAA,QACR,eAAiB,EAAA,IAAA;AAAA,QACjB,gBAAkB,EAAA,GAAA;AAAA,QAClB,MAAQ,EAAA,IAAA;AAAA,QACR,OAAS,EAAA,OAAA;AAAA,QACT,eAAiB,EAAA,CAAC,CAAG,EAAA,EAAA,EAAI,IAAI,EAAE,CAAA;AAAA,QAC/B,wBAA0B,EAAA,KAAA;AAAA,QAC1B,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EACE,kBACI,cAAe,CAAA,MAAA,EAAQ,gBAAgB,SAAS,CAAA,IAAK,EAAC,GACtD,EAAC;AAAA,MAEP,cAAgB,EAAA,CAAC,UACf,KAAA,qBAAA,CAAsB,UAAU;AAAA;AAAA,GAIxC,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"GoCdBuildsTable.esm.js","sources":["../../../src/components/GoCdBuildsTable/GoCdBuildsTable.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState } from 'react';\n\nimport * as React from 'react';\nimport { Entity, getEntitySourceLocation } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport Alert from '@material-ui/lab/Alert';\nimport Button from '@material-ui/core/Button';\nimport GitHubIcon from '@material-ui/icons/GitHub';\nimport {\n GoCdBuildResult,\n GoCdBuildResultStatus,\n toBuildResultStatus,\n PipelineHistory,\n Pipeline,\n} from '../../api/gocdApi.model';\nimport { DateTime } from 'luxon';\nimport {\n Table,\n TableColumn,\n Link,\n SubvalueCell,\n StatusOK,\n StatusWarning,\n StatusAborted,\n StatusError,\n StatusRunning,\n StatusPending,\n} from '@backstage/core-components';\n\ntype GoCdBuildsProps = {\n goCdBaseUrl: string;\n pipelineHistory: PipelineHistory | undefined;\n loading: boolean;\n error: Error | undefined;\n};\n\nconst renderTrigger = (build: GoCdBuildResult): React.ReactNode => {\n const subvalue = (\n <>\n {build.pipeline}\n <br />\n {build.author}\n </>\n );\n return <SubvalueCell value={build.message} subvalue={subvalue} />;\n};\n\nconst renderStages = (build: GoCdBuildResult): React.ReactNode => {\n return build.stages.map(s => {\n switch (s.status) {\n case GoCdBuildResultStatus.successful: {\n return (\n <>\n <StatusOK>{s.text}</StatusOK>\n <br />\n <br />\n </>\n );\n }\n case GoCdBuildResultStatus.error: {\n return (\n <>\n <StatusError>{s.text}</StatusError>\n <br />\n <br />\n </>\n );\n }\n case GoCdBuildResultStatus.running: {\n return (\n <>\n <StatusRunning>{s.text}</StatusRunning>\n <br />\n <br />\n </>\n );\n }\n case GoCdBuildResultStatus.aborted: {\n return (\n <>\n <StatusAborted>{s.text}</StatusAborted>\n <br />\n <br />\n </>\n );\n }\n case GoCdBuildResultStatus.pending: {\n return (\n <>\n <StatusPending>{s.text}</StatusPending>\n <br />\n <br />\n </>\n );\n }\n default: {\n return (\n <>\n <StatusWarning>{s.text}</StatusWarning>\n <br />\n <br />\n </>\n );\n }\n }\n });\n};\n\nconst renderSource = (build: GoCdBuildResult): React.ReactNode => {\n return (\n <Button\n href={build.source}\n target=\"_blank\"\n rel=\"noreferrer\"\n startIcon={<GitHubIcon />}\n >\n {build.commitHash}\n </Button>\n );\n};\n\nconst renderId = (\n goCdBaseUrl: string,\n build: GoCdBuildResult,\n): React.ReactNode => {\n const goCdBuildUrl = `${goCdBaseUrl}/go/pipelines/value_stream_map/${build.buildSlug}`;\n return (\n <SubvalueCell\n value={\n <Link to={goCdBuildUrl} target=\"_blank\" rel=\"noreferrer\">\n {build.id}\n </Link>\n }\n subvalue={\n build.triggerTime &&\n DateTime.fromMillis(build.triggerTime).toLocaleString(\n DateTime.DATETIME_MED,\n )\n }\n />\n );\n};\n\nconst renderError = (error: Error): JSX.Element => {\n return <Alert severity=\"error\">{error.message}</Alert>;\n};\n\nconst toBuildResults = (\n entity: Entity,\n builds: Pipeline[],\n): GoCdBuildResult[] | undefined => {\n // TODO(julioz): What if not git 'type'?\n const entitySourceLocation =\n getEntitySourceLocation(entity).target.split('/tree')[0];\n return builds.map(build => ({\n id: build.counter,\n source: `${entitySourceLocation}/commit/${build.build_cause?.material_revisions[0]?.modifications[0].revision}`,\n stages: build.stages.map(s => ({\n status: toBuildResultStatus(s.status),\n text: s.name,\n })),\n buildSlug: `${build.name}/${build.counter}`,\n message:\n build.build_cause?.material_revisions[0]?.modifications[0].comment ?? '',\n pipeline: build.name,\n author:\n build.build_cause?.material_revisions[0]?.modifications[0].user_name,\n commitHash: build.label,\n triggerTime: build.scheduled_date,\n }));\n};\n\nexport const GoCdBuildsTable = (props: GoCdBuildsProps): JSX.Element => {\n const { pipelineHistory, loading, error } = props;\n const { entity } = useEntity();\n const [, setSelectedSearchTerm] = useState<string>('');\n\n const columns: TableColumn<GoCdBuildResult>[] = [\n {\n title: 'ID',\n field: 'id',\n highlight: true,\n render: build => renderId(props.goCdBaseUrl, build),\n },\n {\n title: 'Trigger',\n customFilterAndSearch: (query, row: GoCdBuildResult) =>\n `${row.message} ${row.pipeline} ${row.author}`\n .toLocaleUpperCase('en-US')\n .includes(query.toLocaleUpperCase('en-US')),\n field: 'message',\n highlight: true,\n render: build => renderTrigger(build),\n },\n {\n title: 'Stages',\n field: 'status',\n render: build => renderStages(build),\n },\n {\n title: 'Source',\n field: 'source',\n render: build => renderSource(build),\n },\n ];\n\n return (\n <>\n {error && renderError(error)}\n {!error && (\n <Table\n title=\"GoCD builds\"\n isLoading={loading}\n options={{\n search: true,\n searchAutoFocus: true,\n debounceInterval: 800,\n paging: true,\n padding: 'dense',\n pageSizeOptions: [5, 10, 20, 50],\n showFirstLastPageButtons: false,\n pageSize: 20,\n }}\n columns={columns}\n data={\n pipelineHistory\n ? toBuildResults(entity, pipelineHistory.pipelines) || []\n : []\n }\n onSearchChange={(searchTerm: string) =>\n setSelectedSearchTerm(searchTerm)\n }\n />\n )}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAmDA,MAAM,aAAA,GAAgB,CAAC,KAA4C,KAAA;AACjE,EAAA,MAAM,2BAED,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,IAAM,KAAA,CAAA,QAAA;AAAA,wBACN,IAAG,EAAA,EAAA,CAAA;AAAA,IACH,KAAM,CAAA;AAAA,GACT,EAAA,CAAA;AAEF,EAAA,uBAAQ,GAAA,CAAA,YAAA,EAAA,EAAa,KAAO,EAAA,KAAA,CAAM,SAAS,QAAoB,EAAA,CAAA;AACjE,CAAA;AAEA,MAAM,YAAA,GAAe,CAAC,KAA4C,KAAA;AAChE,EAAO,OAAA,KAAA,CAAM,MAAO,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA;AAC3B,IAAA,QAAQ,EAAE,MAAQ;AAAA,MAChB,KAAK,sBAAsB,UAAY,EAAA;AACrC,QAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAA,QAAA,EAAA,EAAU,YAAE,IAAK,EAAA,CAAA;AAAA,8BACjB,IAAG,EAAA,EAAA,CAAA;AAAA,8BACH,IAAG,EAAA,EAAA;AAAA,SACN,EAAA,CAAA;AAAA;AAEJ,MACA,KAAK,sBAAsB,KAAO,EAAA;AAChC,QAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAA,WAAA,EAAA,EAAa,YAAE,IAAK,EAAA,CAAA;AAAA,8BACpB,IAAG,EAAA,EAAA,CAAA;AAAA,8BACH,IAAG,EAAA,EAAA;AAAA,SACN,EAAA,CAAA;AAAA;AAEJ,MACA,KAAK,sBAAsB,OAAS,EAAA;AAClC,QAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAA,aAAA,EAAA,EAAe,YAAE,IAAK,EAAA,CAAA;AAAA,8BACtB,IAAG,EAAA,EAAA,CAAA;AAAA,8BACH,IAAG,EAAA,EAAA;AAAA,SACN,EAAA,CAAA;AAAA;AAEJ,MACA,KAAK,sBAAsB,OAAS,EAAA;AAClC,QAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAA,aAAA,EAAA,EAAe,YAAE,IAAK,EAAA,CAAA;AAAA,8BACtB,IAAG,EAAA,EAAA,CAAA;AAAA,8BACH,IAAG,EAAA,EAAA;AAAA,SACN,EAAA,CAAA;AAAA;AAEJ,MACA,KAAK,sBAAsB,OAAS,EAAA;AAClC,QAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAA,aAAA,EAAA,EAAe,YAAE,IAAK,EAAA,CAAA;AAAA,8BACtB,IAAG,EAAA,EAAA,CAAA;AAAA,8BACH,IAAG,EAAA,EAAA;AAAA,SACN,EAAA,CAAA;AAAA;AAEJ,MACA,SAAS;AACP,QAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAA,aAAA,EAAA,EAAe,YAAE,IAAK,EAAA,CAAA;AAAA,8BACtB,IAAG,EAAA,EAAA,CAAA;AAAA,8BACH,IAAG,EAAA,EAAA;AAAA,SACN,EAAA,CAAA;AAAA;AAEJ;AACF,GACD,CAAA;AACH,CAAA;AAEA,MAAM,YAAA,GAAe,CAAC,KAA4C,KAAA;AAChE,EACE,uBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,MAAM,KAAM,CAAA,MAAA;AAAA,MACZ,MAAO,EAAA,QAAA;AAAA,MACP,GAAI,EAAA,YAAA;AAAA,MACJ,SAAA,sBAAY,UAAW,EAAA,EAAA,CAAA;AAAA,MAEtB,QAAM,EAAA,KAAA,CAAA;AAAA;AAAA,GACT;AAEJ,CAAA;AAEA,MAAM,QAAA,GAAW,CACf,WAAA,EACA,KACoB,KAAA;AACpB,EAAA,MAAM,YAAe,GAAA,CAAA,EAAG,WAAW,CAAA,+BAAA,EAAkC,MAAM,SAAS,CAAA,CAAA;AACpF,EACE,uBAAA,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,KAAA,kBACG,GAAA,CAAA,IAAA,EAAA,EAAK,EAAI,EAAA,YAAA,EAAc,QAAO,QAAS,EAAA,GAAA,EAAI,YACzC,EAAA,QAAA,EAAA,KAAA,CAAM,EACT,EAAA,CAAA;AAAA,MAEF,UACE,KAAM,CAAA,WAAA,IACN,SAAS,UAAW,CAAA,KAAA,CAAM,WAAW,CAAE,CAAA,cAAA;AAAA,QACrC,QAAS,CAAA;AAAA;AACX;AAAA,GAEJ;AAEJ,CAAA;AAEA,MAAM,WAAA,GAAc,CAAC,KAA8B,KAAA;AACjD,EAAA,uBAAQ,GAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,OAAA,EAAS,gBAAM,OAAQ,EAAA,CAAA;AAChD,CAAA;AAEA,MAAM,cAAA,GAAiB,CACrB,MAAA,EACA,MACkC,KAAA;AAElC,EAAM,MAAA,oBAAA,GACJ,wBAAwB,MAAM,CAAA,CAAE,OAAO,KAAM,CAAA,OAAO,EAAE,CAAC,CAAA;AACzD,EAAO,OAAA,MAAA,CAAO,IAAI,CAAU,KAAA,MAAA;AAAA,IAC1B,IAAI,KAAM,CAAA,OAAA;AAAA,IACV,MAAQ,EAAA,CAAA,EAAG,oBAAoB,CAAA,QAAA,EAAW,KAAM,CAAA,WAAA,EAAa,kBAAmB,CAAA,CAAC,CAAG,EAAA,aAAA,CAAc,CAAC,CAAA,CAAE,QAAQ,CAAA,CAAA;AAAA,IAC7G,MAAQ,EAAA,KAAA,CAAM,MAAO,CAAA,GAAA,CAAI,CAAM,CAAA,MAAA;AAAA,MAC7B,MAAA,EAAQ,mBAAoB,CAAA,CAAA,CAAE,MAAM,CAAA;AAAA,MACpC,MAAM,CAAE,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,IACF,WAAW,CAAG,EAAA,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,MAAM,OAAO,CAAA,CAAA;AAAA,IACzC,OAAA,EACE,MAAM,WAAa,EAAA,kBAAA,CAAmB,CAAC,CAAG,EAAA,aAAA,CAAc,CAAC,CAAA,CAAE,OAAW,IAAA,EAAA;AAAA,IACxE,UAAU,KAAM,CAAA,IAAA;AAAA,IAChB,MAAA,EACE,MAAM,WAAa,EAAA,kBAAA,CAAmB,CAAC,CAAG,EAAA,aAAA,CAAc,CAAC,CAAE,CAAA,SAAA;AAAA,IAC7D,YAAY,KAAM,CAAA,KAAA;AAAA,IAClB,aAAa,KAAM,CAAA;AAAA,GACnB,CAAA,CAAA;AACJ,CAAA;AAEa,MAAA,eAAA,GAAkB,CAAC,KAAwC,KAAA;AACtE,EAAA,MAAM,EAAE,eAAA,EAAiB,OAAS,EAAA,KAAA,EAAU,GAAA,KAAA;AAC5C,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAA,MAAM,GAAG,qBAAqB,CAAA,GAAI,SAAiB,EAAE,CAAA;AAErD,EAAA,MAAM,OAA0C,GAAA;AAAA,IAC9C;AAAA,MACE,KAAO,EAAA,IAAA;AAAA,MACP,KAAO,EAAA,IAAA;AAAA,MACP,SAAW,EAAA,IAAA;AAAA,MACX,MAAQ,EAAA,CAAA,KAAA,KAAS,QAAS,CAAA,KAAA,CAAM,aAAa,KAAK;AAAA,KACpD;AAAA,IACA;AAAA,MACE,KAAO,EAAA,SAAA;AAAA,MACP,qBAAA,EAAuB,CAAC,KAAO,EAAA,GAAA,KAC7B,GAAG,GAAI,CAAA,OAAO,IAAI,GAAI,CAAA,QAAQ,IAAI,GAAI,CAAA,MAAM,GACzC,iBAAkB,CAAA,OAAO,EACzB,QAAS,CAAA,KAAA,CAAM,iBAAkB,CAAA,OAAO,CAAC,CAAA;AAAA,MAC9C,KAAO,EAAA,SAAA;AAAA,MACP,SAAW,EAAA,IAAA;AAAA,MACX,MAAA,EAAQ,CAAS,KAAA,KAAA,aAAA,CAAc,KAAK;AAAA,KACtC;AAAA,IACA;AAAA,MACE,KAAO,EAAA,QAAA;AAAA,MACP,KAAO,EAAA,QAAA;AAAA,MACP,MAAA,EAAQ,CAAS,KAAA,KAAA,YAAA,CAAa,KAAK;AAAA,KACrC;AAAA,IACA;AAAA,MACE,KAAO,EAAA,QAAA;AAAA,MACP,KAAO,EAAA,QAAA;AAAA,MACP,MAAA,EAAQ,CAAS,KAAA,KAAA,YAAA,CAAa,KAAK;AAAA;AACrC,GACF;AAEA,EAAA,uBAEK,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,IAAA,KAAA,IAAS,YAAY,KAAK,CAAA;AAAA,IAC1B,CAAC,KACA,oBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAM,EAAA,aAAA;AAAA,QACN,SAAW,EAAA,OAAA;AAAA,QACX,OAAS,EAAA;AAAA,UACP,MAAQ,EAAA,IAAA;AAAA,UACR,eAAiB,EAAA,IAAA;AAAA,UACjB,gBAAkB,EAAA,GAAA;AAAA,UAClB,MAAQ,EAAA,IAAA;AAAA,UACR,OAAS,EAAA,OAAA;AAAA,UACT,eAAiB,EAAA,CAAC,CAAG,EAAA,EAAA,EAAI,IAAI,EAAE,CAAA;AAAA,UAC/B,wBAA0B,EAAA,KAAA;AAAA,UAC1B,QAAU,EAAA;AAAA,SACZ;AAAA,QACA,OAAA;AAAA,QACA,IAAA,EACE,kBACI,cAAe,CAAA,MAAA,EAAQ,gBAAgB,SAAS,CAAA,IAAK,EAAC,GACtD,EAAC;AAAA,QAEP,cAAgB,EAAA,CAAC,UACf,KAAA,qBAAA,CAAsB,UAAU;AAAA;AAAA;AAEpC,GAEJ,EAAA,CAAA;AAEJ;;;;"}
@@ -1,9 +1,9 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
1
2
  import FormControl from '@material-ui/core/FormControl';
2
3
  import InputLabel from '@material-ui/core/InputLabel';
3
4
  import MenuItem from '@material-ui/core/MenuItem';
4
5
  import Select from '@material-ui/core/Select';
5
6
  import { makeStyles, createStyles } from '@material-ui/core/styles';
6
- import React from 'react';
7
7
 
8
8
  const useStyles = makeStyles(
9
9
  (theme) => createStyles({
@@ -18,7 +18,7 @@ const useStyles = makeStyles(
18
18
  );
19
19
  const renderItems = (items) => {
20
20
  return items.map((item) => {
21
- return /* @__PURE__ */ React.createElement(MenuItem, { value: item.value, key: item.label }, item.label);
21
+ return /* @__PURE__ */ jsx(MenuItem, { value: item.value, children: item.label }, item.label);
22
22
  });
23
23
  };
24
24
  const SelectComponent = ({
@@ -32,15 +32,17 @@ const SelectComponent = ({
32
32
  const val = event.target.value;
33
33
  onChange(val);
34
34
  };
35
- return /* @__PURE__ */ React.createElement(
35
+ return /* @__PURE__ */ jsxs(
36
36
  FormControl,
37
37
  {
38
38
  variant: "outlined",
39
39
  className: classes.formControl,
40
- disabled: items.length === 0
41
- },
42
- /* @__PURE__ */ React.createElement(InputLabel, null, label),
43
- /* @__PURE__ */ React.createElement(Select, { label, value, onChange: handleChange }, renderItems(items))
40
+ disabled: items.length === 0,
41
+ children: [
42
+ /* @__PURE__ */ jsx(InputLabel, { children: label }),
43
+ /* @__PURE__ */ jsx(Select, { label, value, onChange: handleChange, children: renderItems(items) })
44
+ ]
45
+ }
44
46
  );
45
47
  };
46
48
 
@@ -1 +1 @@
1
- {"version":3,"file":"Select.esm.js","sources":["../../../src/components/Select/Select.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport FormControl from '@material-ui/core/FormControl';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport React from 'react';\n\nexport type Item = {\n label: string;\n value: string | number;\n};\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n formControl: {\n margin: theme.spacing(1),\n minWidth: 120,\n },\n selectEmpty: {\n marginTop: theme.spacing(2),\n },\n }),\n);\n\ntype SelectComponentProps = {\n value: string;\n items: Item[];\n label: string;\n onChange: (value: string) => void;\n};\n\nconst renderItems = (items: Item[]) => {\n return items.map(item => {\n return (\n <MenuItem value={item.value} key={item.label}>\n {item.label}\n </MenuItem>\n );\n });\n};\n\nexport const SelectComponent = ({\n value,\n items,\n label,\n onChange,\n}: SelectComponentProps): JSX.Element => {\n const classes = useStyles();\n\n const handleChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n const val = event.target.value as string;\n onChange(val);\n };\n\n return (\n <FormControl\n variant=\"outlined\"\n className={classes.formControl}\n disabled={items.length === 0}\n >\n <InputLabel>{label}</InputLabel>\n <Select label={label} value={value} onChange={handleChange}>\n {renderItems(items)}\n </Select>\n </FormControl>\n );\n};\n"],"names":[],"mappings":";;;;;;;AA2BA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,CAAC,UAC5B,YAAa,CAAA;AAAA,IACX,WAAa,EAAA;AAAA,MACX,MAAA,EAAQ,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACvB,QAAU,EAAA;AAAA,KACZ;AAAA,IACA,WAAa,EAAA;AAAA,MACX,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA;AAC5B,GACD;AACH,CAAA;AASA,MAAM,WAAA,GAAc,CAAC,KAAkB,KAAA;AACrC,EAAO,OAAA,KAAA,CAAM,IAAI,CAAQ,IAAA,KAAA;AACvB,IACE,uBAAA,KAAA,CAAA,aAAA,CAAC,YAAS,KAAO,EAAA,IAAA,CAAK,OAAO,GAAK,EAAA,IAAA,CAAK,KACpC,EAAA,EAAA,IAAA,CAAK,KACR,CAAA;AAAA,GAEH,CAAA;AACH,CAAA;AAEO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAyC,KAAA;AACvC,EAAA,MAAM,UAAU,SAAU,EAAA;AAE1B,EAAM,MAAA,YAAA,GAAe,CAAC,KAAiD,KAAA;AACrE,IAAM,MAAA,GAAA,GAAM,MAAM,MAAO,CAAA,KAAA;AACzB,IAAA,QAAA,CAAS,GAAG,CAAA;AAAA,GACd;AAEA,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,UAAA;AAAA,MACR,WAAW,OAAQ,CAAA,WAAA;AAAA,MACnB,QAAA,EAAU,MAAM,MAAW,KAAA;AAAA,KAAA;AAAA,oBAE3B,KAAA,CAAA,aAAA,CAAC,kBAAY,KAAM,CAAA;AAAA,oBACnB,KAAA,CAAA,aAAA,CAAC,UAAO,KAAc,EAAA,KAAA,EAAc,UAAU,YAC3C,EAAA,EAAA,WAAA,CAAY,KAAK,CACpB;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"Select.esm.js","sources":["../../../src/components/Select/Select.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport FormControl from '@material-ui/core/FormControl';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport * as React from 'react';\n\nexport type Item = {\n label: string;\n value: string | number;\n};\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n formControl: {\n margin: theme.spacing(1),\n minWidth: 120,\n },\n selectEmpty: {\n marginTop: theme.spacing(2),\n },\n }),\n);\n\ntype SelectComponentProps = {\n value: string;\n items: Item[];\n label: string;\n onChange: (value: string) => void;\n};\n\nconst renderItems = (items: Item[]) => {\n return items.map(item => {\n return (\n <MenuItem value={item.value} key={item.label}>\n {item.label}\n </MenuItem>\n );\n });\n};\n\nexport const SelectComponent = ({\n value,\n items,\n label,\n onChange,\n}: SelectComponentProps): JSX.Element => {\n const classes = useStyles();\n\n const handleChange = (event: React.ChangeEvent<{ value: unknown }>) => {\n const val = event.target.value as string;\n onChange(val);\n };\n\n return (\n <FormControl\n variant=\"outlined\"\n className={classes.formControl}\n disabled={items.length === 0}\n >\n <InputLabel>{label}</InputLabel>\n <Select label={label} value={value} onChange={handleChange}>\n {renderItems(items)}\n </Select>\n </FormControl>\n );\n};\n"],"names":[],"mappings":";;;;;;;AA2BA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,CAAC,UAC5B,YAAa,CAAA;AAAA,IACX,WAAa,EAAA;AAAA,MACX,MAAA,EAAQ,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACvB,QAAU,EAAA;AAAA,KACZ;AAAA,IACA,WAAa,EAAA;AAAA,MACX,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA;AAC5B,GACD;AACH,CAAA;AASA,MAAM,WAAA,GAAc,CAAC,KAAkB,KAAA;AACrC,EAAO,OAAA,KAAA,CAAM,IAAI,CAAQ,IAAA,KAAA;AACvB,IACE,uBAAA,GAAA,CAAC,YAAS,KAAO,EAAA,IAAA,CAAK,OACnB,QAAK,EAAA,IAAA,CAAA,KAAA,EAAA,EAD0B,KAAK,KAEvC,CAAA;AAAA,GAEH,CAAA;AACH,CAAA;AAEO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAyC,KAAA;AACvC,EAAA,MAAM,UAAU,SAAU,EAAA;AAE1B,EAAM,MAAA,YAAA,GAAe,CAAC,KAAiD,KAAA;AACrE,IAAM,MAAA,GAAA,GAAM,MAAM,MAAO,CAAA,KAAA;AACzB,IAAA,QAAA,CAAS,GAAG,CAAA;AAAA,GACd;AAEA,EACE,uBAAA,IAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,UAAA;AAAA,MACR,WAAW,OAAQ,CAAA,WAAA;AAAA,MACnB,QAAA,EAAU,MAAM,MAAW,KAAA,CAAA;AAAA,MAE3B,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,cAAY,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,wBACnB,GAAA,CAAC,UAAO,KAAc,EAAA,KAAA,EAAc,UAAU,YAC3C,EAAA,QAAA,EAAA,WAAA,CAAY,KAAK,CACpB,EAAA;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-gocd",
3
- "version": "0.5.0",
3
+ "version": "0.6.0",
4
4
  "description": "A Backstage plugin that integrates towards GoCD",
5
5
  "backstage": {
6
6
  "role": "frontend-plugin",
@@ -39,10 +39,10 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "@backstage/catalog-model": "^1.7.3",
42
- "@backstage/core-components": "^0.17.0",
43
- "@backstage/core-plugin-api": "^1.10.5",
42
+ "@backstage/core-components": "^0.17.1",
43
+ "@backstage/core-plugin-api": "^1.10.6",
44
44
  "@backstage/errors": "^1.2.7",
45
- "@backstage/plugin-catalog-react": "^1.16.0",
45
+ "@backstage/plugin-catalog-react": "^1.17.0",
46
46
  "@material-ui/core": "^4.12.2",
47
47
  "@material-ui/icons": "^4.9.1",
48
48
  "@material-ui/lab": "4.0.0-alpha.61",
@@ -52,10 +52,10 @@
52
52
  "react-use": "^17.2.4"
53
53
  },
54
54
  "devDependencies": {
55
- "@backstage/cli": "^0.31.0",
56
- "@backstage/core-app-api": "^1.16.0",
57
- "@backstage/dev-utils": "^1.1.8",
58
- "@backstage/test-utils": "^1.7.6",
55
+ "@backstage/cli": "^0.32.0",
56
+ "@backstage/core-app-api": "^1.16.1",
57
+ "@backstage/dev-utils": "^1.1.9",
58
+ "@backstage/test-utils": "^1.7.7",
59
59
  "@testing-library/dom": "^10.0.0",
60
60
  "@testing-library/jest-dom": "^6.0.0",
61
61
  "@testing-library/react": "^15.0.0",
@@ -64,7 +64,6 @@
64
64
  "@types/luxon": "^3.0.0",
65
65
  "@types/react": "^16.13.1 || ^17.0.0",
66
66
  "@types/react-dom": "^18.2.19",
67
- "canvas": "^2.11.2",
68
67
  "msw": "^2.0.0",
69
68
  "react": "^16.13.1 || ^17.0.0 || ^18.0.0",
70
69
  "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0",
@@ -83,5 +82,12 @@
83
82
  ]
84
83
  }
85
84
  },
85
+ "typesVersions": {
86
+ "*": {
87
+ "package.json": [
88
+ "package.json"
89
+ ]
90
+ }
91
+ },
86
92
  "module": "./dist/index.esm.js"
87
93
  }