@backstage-community/plugin-xcmetrics 0.2.58 → 0.4.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-xcmetrics
2
2
 
3
+ ## 0.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - b3b4886: Backstage version bump to v1.35.1
8
+
9
+ ## 0.3.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 411bcf2: Backstage version bump to v1.34.1
14
+
3
15
  ## 0.2.58
4
16
 
5
17
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"XcmetricsClient.esm.js","sources":["../../src/api/XcmetricsClient.ts"],"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 */\n\nimport { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport { DateTime } from 'luxon';\nimport {\n Build,\n BuildCount,\n BuildError,\n BuildFilters,\n BuildHost,\n BuildMetadata,\n BuildResponse,\n BuildStatusResult,\n BuildTime,\n BuildWarning,\n PaginationResult,\n XcmetricsApi,\n} from './types';\n\ninterface Options {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n}\n\nexport class XcmetricsClient implements XcmetricsApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly fetchApi: FetchApi;\n\n constructor(options: Options) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n }\n\n async getBuild(id: string): Promise<BuildResponse> {\n const response = await this.get(`/build/${id}`);\n return (await response.json()) as BuildResponse;\n }\n\n async getBuilds(limit: number = 10): Promise<Build[]> {\n const response = await this.get(`/build?per=${limit}`);\n return ((await response.json()) as PaginationResult<Build>).items;\n }\n\n async getFilteredBuilds(\n filters: BuildFilters,\n page?: number,\n perPage?: number,\n ): Promise<PaginationResult<Build>> {\n const response = await this.post('/build/filter', {\n from: DateTime.fromISO(filters.from)\n .startOf('day')\n .toISO({ suppressMilliseconds: true }),\n to: DateTime.fromISO(filters.to)\n .endOf('day')\n .startOf('second')\n .toISO({ suppressMilliseconds: true }),\n status: filters.buildStatus,\n projectName: filters.project,\n page,\n per: perPage,\n excludeCI: false,\n });\n\n return (await response.json()) as PaginationResult<Build>;\n }\n\n async getBuildCounts(days: number): Promise<BuildCount[]> {\n const response = await this.get(`/statistics/build/count?days=${days}`);\n return (await response.json()) as BuildCount[];\n }\n\n async getBuildErrors(buildId: string): Promise<BuildError[]> {\n const response = await this.get(`/build/error/${buildId}`);\n return (await response.json()) as BuildError[];\n }\n\n async getBuildHost(buildId: string): Promise<BuildHost> {\n const response = await this.get(`/build/host/${buildId}`);\n return (await response.json()) as BuildHost;\n }\n\n async getBuildMetadata(buildId: string): Promise<BuildMetadata> {\n const response = await this.get(`/build/metadata/${buildId}`);\n return ((await response.json()) as Record<'metadata', BuildMetadata>)\n .metadata;\n }\n\n async getBuildTimes(days: number): Promise<BuildTime[]> {\n const response = await this.get(`/statistics/build/time?days=${days}`);\n return (await response.json()) as BuildTime[];\n }\n\n async getBuildStatuses(limit: number): Promise<BuildStatusResult[]> {\n const response = await this.get(`/statistics/build/status?per=${limit}`);\n return ((await response.json()) as PaginationResult<BuildStatusResult>)\n .items;\n }\n\n async getBuildWarnings(buildId: string): Promise<BuildWarning[]> {\n const response = await this.get(`/build/warning/${buildId}`);\n return (await response.json()) as BuildWarning[];\n }\n\n async getProjects(): Promise<string[]> {\n const response = await this.get('/build/project');\n return (await response.json()) as string[];\n }\n\n private async get(path: string): Promise<Response> {\n const baseUrl = `${await this.discoveryApi.getBaseUrl('proxy')}/xcmetrics`;\n const response = await this.fetchApi.fetch(`${baseUrl}${path}`);\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response;\n }\n\n private async post(path: string, body: Object): Promise<Response> {\n const baseUrl = `${await this.discoveryApi.getBaseUrl('proxy')}/xcmetrics`;\n const response = await this.fetchApi.fetch(`${baseUrl}${path}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"XcmetricsClient.esm.js","sources":["../../src/api/XcmetricsClient.ts"],"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 */\n\nimport { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport { DateTime } from 'luxon';\nimport {\n Build,\n BuildCount,\n BuildError,\n BuildFilters,\n BuildHost,\n BuildMetadata,\n BuildResponse,\n BuildStatusResult,\n BuildTime,\n BuildWarning,\n PaginationResult,\n XcmetricsApi,\n} from './types';\n\ninterface Options {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n}\n\nexport class XcmetricsClient implements XcmetricsApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly fetchApi: FetchApi;\n\n constructor(options: Options) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n }\n\n async getBuild(id: string): Promise<BuildResponse> {\n const response = await this.get(`/build/${id}`);\n return (await response.json()) as BuildResponse;\n }\n\n async getBuilds(limit: number = 10): Promise<Build[]> {\n const response = await this.get(`/build?per=${limit}`);\n return ((await response.json()) as PaginationResult<Build>).items;\n }\n\n async getFilteredBuilds(\n filters: BuildFilters,\n page?: number,\n perPage?: number,\n ): Promise<PaginationResult<Build>> {\n const response = await this.post('/build/filter', {\n from: DateTime.fromISO(filters.from)\n .startOf('day')\n .toISO({ suppressMilliseconds: true }),\n to: DateTime.fromISO(filters.to)\n .endOf('day')\n .startOf('second')\n .toISO({ suppressMilliseconds: true }),\n status: filters.buildStatus,\n projectName: filters.project,\n page,\n per: perPage,\n excludeCI: false,\n });\n\n return (await response.json()) as PaginationResult<Build>;\n }\n\n async getBuildCounts(days: number): Promise<BuildCount[]> {\n const response = await this.get(`/statistics/build/count?days=${days}`);\n return (await response.json()) as BuildCount[];\n }\n\n async getBuildErrors(buildId: string): Promise<BuildError[]> {\n const response = await this.get(`/build/error/${buildId}`);\n return (await response.json()) as BuildError[];\n }\n\n async getBuildHost(buildId: string): Promise<BuildHost> {\n const response = await this.get(`/build/host/${buildId}`);\n return (await response.json()) as BuildHost;\n }\n\n async getBuildMetadata(buildId: string): Promise<BuildMetadata> {\n const response = await this.get(`/build/metadata/${buildId}`);\n return ((await response.json()) as Record<'metadata', BuildMetadata>)\n .metadata;\n }\n\n async getBuildTimes(days: number): Promise<BuildTime[]> {\n const response = await this.get(`/statistics/build/time?days=${days}`);\n return (await response.json()) as BuildTime[];\n }\n\n async getBuildStatuses(limit: number): Promise<BuildStatusResult[]> {\n const response = await this.get(`/statistics/build/status?per=${limit}`);\n return ((await response.json()) as PaginationResult<BuildStatusResult>)\n .items;\n }\n\n async getBuildWarnings(buildId: string): Promise<BuildWarning[]> {\n const response = await this.get(`/build/warning/${buildId}`);\n return (await response.json()) as BuildWarning[];\n }\n\n async getProjects(): Promise<string[]> {\n const response = await this.get('/build/project');\n return (await response.json()) as string[];\n }\n\n private async get(path: string): Promise<Response> {\n const baseUrl = `${await this.discoveryApi.getBaseUrl('proxy')}/xcmetrics`;\n const response = await this.fetchApi.fetch(`${baseUrl}${path}`);\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response;\n }\n\n private async post(path: string, body: Object): Promise<Response> {\n const baseUrl = `${await this.discoveryApi.getBaseUrl('proxy')}/xcmetrics`;\n const response = await this.fetchApi.fetch(`${baseUrl}${path}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.esm.js","sources":["../../src/api/types.ts"],"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 */\n\nimport { createApiRef } from '@backstage/core-plugin-api';\n\nexport type BuildStatus = 'succeeded' | 'failed' | 'stopped';\n\nexport type Build = {\n userid: string;\n warningCount: number;\n duration: number;\n startTimestamp: string;\n isCi: boolean;\n startTimestampMicroseconds: number;\n category: string;\n endTimestampMicroseconds: number;\n day: string;\n compilationEndTimestamp: string;\n tag: string;\n projectName: string;\n compilationEndTimestampMicroseconds: number;\n errorCount: number;\n id: string;\n buildStatus: BuildStatus;\n compilationDuration: number;\n schema: string;\n compiledCount: number;\n endTimestamp: string;\n userid256: string;\n machineName: string;\n wasSuspended: boolean;\n};\n\nexport type BuildStatusResult = Pick<Build, 'id' | 'buildStatus'>;\n\nexport type BuildCount = {\n day: string;\n errors: number;\n builds: number;\n};\n\nexport type BuildError = {\n detail: string;\n characterRangeEnd: number;\n id: string;\n endingColumn: number;\n parentIdentifier: string;\n day: string;\n type: string;\n title: string;\n endingLine: number;\n severity: number;\n startingLine: number;\n parentType: string;\n buildIdentifier: string;\n startingColumn: number;\n characterRangeStart: number;\n documentURL: string;\n};\n\nexport type BuildHost = {\n id: string;\n swapFreeMb: number;\n hostOsFamily: string;\n isVirtual: boolean;\n uptimeSeconds: number;\n hostModel: string;\n hostOsVersion: string;\n day: string;\n cpuCount: number;\n swapTotalMb: number;\n hostOs: string;\n hostArchitecture: string;\n memoryTotalMb: number;\n timezone: string;\n cpuModel: string;\n buildIdentifier: string;\n memoryFreeMb: number;\n cpuSpeedGhz: number;\n};\n\nexport type BuildMetadata = {\n [key: string]: string;\n};\n\nexport type BuildTime = {\n day: string;\n durationP50: number;\n durationP95: number;\n totalDuration: number;\n};\n\nexport type BuildWarning = {\n detail: string | null;\n characterRangeEnd: number;\n documentURL: string;\n endingColumn: number;\n id: string;\n parentIdentifier: string;\n day: string;\n type: string;\n title: string;\n endingLine: number;\n severity: number;\n startingLine: number;\n parentType: string;\n clangFlag: string;\n startingColumn: number;\n buildIdentifier: string;\n characterRangeStart: number;\n};\n\nexport type PaginationResult<T> = {\n items: T[];\n metadata: {\n per: number;\n total: number;\n page: number;\n };\n};\n\nexport type Target = {\n id: string;\n category: string;\n startTimestamp: string;\n compilationEndTimestampMicroseconds: number;\n endTimestampMicroseconds: number;\n endTimestamp: string;\n fetchedFromCache: boolean;\n errorCount: number;\n day: string;\n warningCount: number;\n compilationEndTimestamp: string;\n compilationDuration: number;\n compiledCount: number;\n duration: number;\n buildIdentifier: string;\n name: string;\n startTimestampMicroseconds: number;\n};\n\nexport type Xcode = {\n buildNumber: string;\n id: string;\n buildIdentifier: string;\n day: string;\n version: string;\n};\n\nexport type BuildResponse = {\n build: Build;\n targets: Target[];\n xcode?: Xcode; // Can be undefined if XCMetrics version < v0.0.8\n};\n\nexport type BuildFilters = {\n from: string; // ISO Date (e.g. \"2021-01-01\")\n to: string; // ISO Date (e.g. \"2021-01-02\")\n buildStatus?: BuildStatus;\n project?: string;\n};\n\nexport interface XcmetricsApi {\n getBuild(id: string): Promise<BuildResponse>;\n getBuilds(limit?: number): Promise<Build[]>;\n getFilteredBuilds(\n filters: BuildFilters,\n page?: number,\n perPage?: number,\n ): Promise<PaginationResult<Build>>;\n getBuildErrors(buildId: string): Promise<BuildError[]>;\n getBuildCounts(days: number): Promise<BuildCount[]>;\n getBuildHost(buildId: string): Promise<BuildHost>;\n getBuildMetadata(buildId: string): Promise<BuildMetadata>;\n getBuildTimes(days: number): Promise<BuildTime[]>;\n getBuildStatuses(limit: number): Promise<BuildStatusResult[]>;\n getBuildWarnings(buildId: string): Promise<BuildWarning[]>;\n getProjects(): Promise<string[]>;\n}\n\nexport const xcmetricsApiRef = createApiRef<XcmetricsApi>({\n id: 'plugin.xcmetrics.api',\n});\n"],"names":[],"mappings":";;AAiMO,MAAM,kBAAkB,YAA2B,CAAA;AAAA,EACxD,EAAI,EAAA,sBAAA;AACN,CAAC;;;;"}
1
+ {"version":3,"file":"types.esm.js","sources":["../../src/api/types.ts"],"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 */\n\nimport { createApiRef } from '@backstage/core-plugin-api';\n\nexport type BuildStatus = 'succeeded' | 'failed' | 'stopped';\n\nexport type Build = {\n userid: string;\n warningCount: number;\n duration: number;\n startTimestamp: string;\n isCi: boolean;\n startTimestampMicroseconds: number;\n category: string;\n endTimestampMicroseconds: number;\n day: string;\n compilationEndTimestamp: string;\n tag: string;\n projectName: string;\n compilationEndTimestampMicroseconds: number;\n errorCount: number;\n id: string;\n buildStatus: BuildStatus;\n compilationDuration: number;\n schema: string;\n compiledCount: number;\n endTimestamp: string;\n userid256: string;\n machineName: string;\n wasSuspended: boolean;\n};\n\nexport type BuildStatusResult = Pick<Build, 'id' | 'buildStatus'>;\n\nexport type BuildCount = {\n day: string;\n errors: number;\n builds: number;\n};\n\nexport type BuildError = {\n detail: string;\n characterRangeEnd: number;\n id: string;\n endingColumn: number;\n parentIdentifier: string;\n day: string;\n type: string;\n title: string;\n endingLine: number;\n severity: number;\n startingLine: number;\n parentType: string;\n buildIdentifier: string;\n startingColumn: number;\n characterRangeStart: number;\n documentURL: string;\n};\n\nexport type BuildHost = {\n id: string;\n swapFreeMb: number;\n hostOsFamily: string;\n isVirtual: boolean;\n uptimeSeconds: number;\n hostModel: string;\n hostOsVersion: string;\n day: string;\n cpuCount: number;\n swapTotalMb: number;\n hostOs: string;\n hostArchitecture: string;\n memoryTotalMb: number;\n timezone: string;\n cpuModel: string;\n buildIdentifier: string;\n memoryFreeMb: number;\n cpuSpeedGhz: number;\n};\n\nexport type BuildMetadata = {\n [key: string]: string;\n};\n\nexport type BuildTime = {\n day: string;\n durationP50: number;\n durationP95: number;\n totalDuration: number;\n};\n\nexport type BuildWarning = {\n detail: string | null;\n characterRangeEnd: number;\n documentURL: string;\n endingColumn: number;\n id: string;\n parentIdentifier: string;\n day: string;\n type: string;\n title: string;\n endingLine: number;\n severity: number;\n startingLine: number;\n parentType: string;\n clangFlag: string;\n startingColumn: number;\n buildIdentifier: string;\n characterRangeStart: number;\n};\n\nexport type PaginationResult<T> = {\n items: T[];\n metadata: {\n per: number;\n total: number;\n page: number;\n };\n};\n\nexport type Target = {\n id: string;\n category: string;\n startTimestamp: string;\n compilationEndTimestampMicroseconds: number;\n endTimestampMicroseconds: number;\n endTimestamp: string;\n fetchedFromCache: boolean;\n errorCount: number;\n day: string;\n warningCount: number;\n compilationEndTimestamp: string;\n compilationDuration: number;\n compiledCount: number;\n duration: number;\n buildIdentifier: string;\n name: string;\n startTimestampMicroseconds: number;\n};\n\nexport type Xcode = {\n buildNumber: string;\n id: string;\n buildIdentifier: string;\n day: string;\n version: string;\n};\n\nexport type BuildResponse = {\n build: Build;\n targets: Target[];\n xcode?: Xcode; // Can be undefined if XCMetrics version < v0.0.8\n};\n\nexport type BuildFilters = {\n from: string; // ISO Date (e.g. \"2021-01-01\")\n to: string; // ISO Date (e.g. \"2021-01-02\")\n buildStatus?: BuildStatus;\n project?: string;\n};\n\nexport interface XcmetricsApi {\n getBuild(id: string): Promise<BuildResponse>;\n getBuilds(limit?: number): Promise<Build[]>;\n getFilteredBuilds(\n filters: BuildFilters,\n page?: number,\n perPage?: number,\n ): Promise<PaginationResult<Build>>;\n getBuildErrors(buildId: string): Promise<BuildError[]>;\n getBuildCounts(days: number): Promise<BuildCount[]>;\n getBuildHost(buildId: string): Promise<BuildHost>;\n getBuildMetadata(buildId: string): Promise<BuildMetadata>;\n getBuildTimes(days: number): Promise<BuildTime[]>;\n getBuildStatuses(limit: number): Promise<BuildStatusResult[]>;\n getBuildWarnings(buildId: string): Promise<BuildWarning[]>;\n getProjects(): Promise<string[]>;\n}\n\nexport const xcmetricsApiRef = createApiRef<XcmetricsApi>({\n id: 'plugin.xcmetrics.api',\n});\n"],"names":[],"mappings":";;AAiMO,MAAM,kBAAkB,YAA2B,CAAA;AAAA,EACxD,EAAI,EAAA;AACN,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Accordion.esm.js","sources":["../../../src/components/Accordion/Accordion.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 */\n\nimport MuiAccordion from '@material-ui/core/Accordion';\nimport MuiAccordionSummary from '@material-ui/core/AccordionSummary';\nimport Typography from '@material-ui/core/Typography';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport { makeStyles, createStyles } from '@material-ui/core/styles';\nimport React, { PropsWithChildren } from 'react';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n heading: {\n flexBasis: '33.33%',\n flexShrink: 0,\n },\n secondaryHeading: {\n color: theme.palette.text.secondary,\n },\n }),\n);\n\ninterface AccordionProps {\n id: string;\n heading: string;\n secondaryHeading?: string | number;\n disabled?: boolean;\n unmountOnExit?: boolean;\n}\n\nexport const Accordion = (props: PropsWithChildren<AccordionProps>) => {\n const classes = useStyles();\n\n return (\n <MuiAccordion\n disabled={props.disabled}\n TransitionProps={{ unmountOnExit: props.unmountOnExit ?? false }}\n >\n <MuiAccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls={`${props.id}-content`}\n id={`${props.id}-header`}\n >\n <Typography className={classes.heading}>{props.heading}</Typography>\n <Typography className={classes.secondaryHeading}>\n {props.secondaryHeading}\n </Typography>\n </MuiAccordionSummary>\n <AccordionDetails>{props.children}</AccordionDetails>\n </MuiAccordion>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAwBA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,WAC3B,YAAa,CAAA;AAAA,IACX,OAAS,EAAA;AAAA,MACP,SAAW,EAAA,QAAA;AAAA,MACX,UAAY,EAAA,CAAA;AAAA,KACd;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA,SAAA;AAAA,KAC5B;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAUa,MAAA,SAAA,GAAY,CAAC,KAA6C,KAAA;AACrE,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAE1B,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,UAAU,KAAM,CAAA,QAAA;AAAA,MAChB,eAAiB,EAAA,EAAE,aAAe,EAAA,KAAA,CAAM,iBAAiB,KAAM,EAAA;AAAA,KAAA;AAAA,oBAE/D,KAAA,CAAA,aAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,UAAA,sCAAa,cAAe,EAAA,IAAA,CAAA;AAAA,QAC5B,eAAA,EAAe,CAAG,EAAA,KAAA,CAAM,EAAE,CAAA,QAAA,CAAA;AAAA,QAC1B,EAAA,EAAI,CAAG,EAAA,KAAA,CAAM,EAAE,CAAA,OAAA,CAAA;AAAA,OAAA;AAAA,0CAEd,UAAW,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,OAAA,EAAA,EAAU,MAAM,OAAQ,CAAA;AAAA,0CACtD,UAAW,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,gBAAA,EAAA,EAC5B,MAAM,gBACT,CAAA;AAAA,KACF;AAAA,oBACA,KAAA,CAAA,aAAA,CAAC,gBAAkB,EAAA,IAAA,EAAA,KAAA,CAAM,QAAS,CAAA;AAAA,GACpC,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"Accordion.esm.js","sources":["../../../src/components/Accordion/Accordion.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 */\n\nimport MuiAccordion from '@material-ui/core/Accordion';\nimport MuiAccordionSummary from '@material-ui/core/AccordionSummary';\nimport Typography from '@material-ui/core/Typography';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport { makeStyles, createStyles } from '@material-ui/core/styles';\nimport React, { PropsWithChildren } from 'react';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n heading: {\n flexBasis: '33.33%',\n flexShrink: 0,\n },\n secondaryHeading: {\n color: theme.palette.text.secondary,\n },\n }),\n);\n\ninterface AccordionProps {\n id: string;\n heading: string;\n secondaryHeading?: string | number;\n disabled?: boolean;\n unmountOnExit?: boolean;\n}\n\nexport const Accordion = (props: PropsWithChildren<AccordionProps>) => {\n const classes = useStyles();\n\n return (\n <MuiAccordion\n disabled={props.disabled}\n TransitionProps={{ unmountOnExit: props.unmountOnExit ?? false }}\n >\n <MuiAccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls={`${props.id}-content`}\n id={`${props.id}-header`}\n >\n <Typography className={classes.heading}>{props.heading}</Typography>\n <Typography className={classes.secondaryHeading}>\n {props.secondaryHeading}\n </Typography>\n </MuiAccordionSummary>\n <AccordionDetails>{props.children}</AccordionDetails>\n </MuiAccordion>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAwBA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,WAC3B,YAAa,CAAA;AAAA,IACX,OAAS,EAAA;AAAA,MACP,SAAW,EAAA,QAAA;AAAA,MACX,UAAY,EAAA;AAAA,KACd;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,IAAK,CAAA;AAAA;AAC5B,GACD;AACH,CAAA;AAUa,MAAA,SAAA,GAAY,CAAC,KAA6C,KAAA;AACrE,EAAA,MAAM,UAAU,SAAU,EAAA;AAE1B,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,UAAU,KAAM,CAAA,QAAA;AAAA,MAChB,eAAiB,EAAA,EAAE,aAAe,EAAA,KAAA,CAAM,iBAAiB,KAAM;AAAA,KAAA;AAAA,oBAE/D,KAAA,CAAA,aAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,UAAA,sCAAa,cAAe,EAAA,IAAA,CAAA;AAAA,QAC5B,eAAA,EAAe,CAAG,EAAA,KAAA,CAAM,EAAE,CAAA,QAAA,CAAA;AAAA,QAC1B,EAAA,EAAI,CAAG,EAAA,KAAA,CAAM,EAAE,CAAA,OAAA;AAAA,OAAA;AAAA,0CAEd,UAAW,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,OAAA,EAAA,EAAU,MAAM,OAAQ,CAAA;AAAA,0CACtD,UAAW,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,gBAAA,EAAA,EAC5B,MAAM,gBACT;AAAA,KACF;AAAA,oBACA,KAAA,CAAA,aAAA,CAAC,gBAAkB,EAAA,IAAA,EAAA,KAAA,CAAM,QAAS;AAAA,GACpC;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"BuildDetails.esm.js","sources":["../../../src/components/BuildDetails/BuildDetails.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 */\n\nimport Divider from '@material-ui/core/Divider';\nimport Grid from '@material-ui/core/Grid';\nimport { createStyles, makeStyles } from '@material-ui/core/styles';\nimport React from 'react';\nimport { BuildResponse, xcmetricsApiRef } from '../../api';\nimport { Progress, StructuredMetadataTable } from '@backstage/core-components';\nimport Alert from '@material-ui/lab/Alert';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { formatDuration, formatStatus, formatTime } from '../../utils';\nimport { StatusIcon } from '../StatusIcon';\nimport { Accordion } from '../Accordion';\nimport { BuildTimeline } from '../BuildTimeline';\nimport { PreformattedText } from '../PreformattedText';\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n divider: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n }),\n);\n\ninterface BuildDetailsProps {\n buildData: BuildResponse;\n showId?: boolean;\n}\n\nexport const BuildDetails = ({\n buildData: { build, targets, xcode },\n showId,\n}: BuildDetailsProps) => {\n const classes = useStyles();\n const client = useApi(xcmetricsApiRef);\n const hostResult = useAsync(\n async () => client.getBuildHost(build.id),\n [build.id],\n );\n const errorsResult = useAsync(\n async () => client.getBuildErrors(build.id),\n [build.id],\n );\n const warningsResult = useAsync(\n async () => client.getBuildWarnings(build.id),\n [build.id],\n );\n const metadataResult = useAsync(\n async () => client.getBuildMetadata(build.id),\n [build.id],\n );\n\n const buildDetails = {\n project: build.projectName,\n schema: build.schema,\n category: build.category,\n userId: build.userid,\n 'started at': formatTime(build.startTimestamp),\n 'ended at': formatTime(build.endTimestamp),\n duration: formatDuration(build.duration),\n status: (\n <>\n <StatusIcon buildStatus={build.buildStatus} />\n {formatStatus(build.buildStatus)}\n </>\n ),\n xcode: xcode ? `${xcode.version} (${xcode.buildNumber})` : 'Unknown',\n CI: build.isCi,\n };\n\n return (\n <Grid container item direction=\"row\">\n <Grid item xs={4}>\n <StructuredMetadataTable\n metadata={\n showId === false ? buildDetails : { id: build.id, ...buildDetails }\n }\n />\n </Grid>\n <Grid item xs={8}>\n <Accordion\n id=\"buildHost\"\n heading=\"Host\"\n secondaryHeading={build.machineName}\n >\n {hostResult.loading && <Progress />}\n {!hostResult.loading && hostResult.value && (\n <StructuredMetadataTable metadata={hostResult.value} />\n )}\n </Accordion>\n\n <Accordion\n id=\"buildErrors\"\n heading=\"Errors\"\n secondaryHeading={build.errorCount}\n disabled={build.errorCount === 0}\n >\n <div>\n {errorsResult.loading && <Progress />}\n {!errorsResult.loading &&\n errorsResult.value?.map((error, idx) => (\n <div key={error.id}>\n <PreformattedText\n title=\"Error Details\"\n text={error.detail}\n maxChars={190}\n expandable\n />\n {idx !== errorsResult.value.length - 1 && (\n <Divider className={classes.divider} />\n )}\n </div>\n ))}\n </div>\n </Accordion>\n\n <Accordion\n id=\"buildWarnings\"\n heading=\"Warnings\"\n secondaryHeading={build.warningCount}\n disabled={build.warningCount === 0}\n >\n <div>\n {warningsResult.loading && <Progress />}\n {!warningsResult.loading &&\n warningsResult.value?.map((warning, idx) => (\n <div key={warning.id}>\n <PreformattedText\n title=\"Warning Details\"\n text={warning.detail ?? warning.title}\n maxChars={190}\n expandable\n />\n {idx !== warningsResult.value.length - 1 && (\n <Divider className={classes.divider} />\n )}\n </div>\n ))}\n </div>\n </Accordion>\n\n <Accordion\n id=\"buildMetadata\"\n heading=\"Metadata\"\n disabled={!metadataResult.loading && !metadataResult.value}\n >\n {metadataResult.loading && <Progress />}\n {!metadataResult.loading && metadataResult.value && (\n <StructuredMetadataTable metadata={metadataResult.value} />\n )}\n </Accordion>\n\n <Accordion id=\"buildTimeline\" heading=\"Timeline\" unmountOnExit>\n <BuildTimeline targets={targets} />\n </Accordion>\n </Grid>\n </Grid>\n );\n};\n\ntype WithRequestProps = Omit<BuildDetailsProps, 'buildData'> & {\n buildId: string;\n};\n\nexport const withRequest =\n (Component: typeof BuildDetails) =>\n ({ buildId, ...props }: WithRequestProps) => {\n const client = useApi(xcmetricsApiRef);\n const {\n value: buildResponse,\n loading,\n error,\n } = useAsync(async () => client.getBuild(buildId), []);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n if (!buildResponse) {\n return <Alert severity=\"error\">Could not load build {buildId}</Alert>;\n }\n\n return <Component {...props} buildData={buildResponse} />;\n };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BuildDetails.esm.js","sources":["../../../src/components/BuildDetails/BuildDetails.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 */\n\nimport Divider from '@material-ui/core/Divider';\nimport Grid from '@material-ui/core/Grid';\nimport { createStyles, makeStyles } from '@material-ui/core/styles';\nimport React from 'react';\nimport { BuildResponse, xcmetricsApiRef } from '../../api';\nimport { Progress, StructuredMetadataTable } from '@backstage/core-components';\nimport Alert from '@material-ui/lab/Alert';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { formatDuration, formatStatus, formatTime } from '../../utils';\nimport { StatusIcon } from '../StatusIcon';\nimport { Accordion } from '../Accordion';\nimport { BuildTimeline } from '../BuildTimeline';\nimport { PreformattedText } from '../PreformattedText';\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n divider: {\n marginTop: theme.spacing(2),\n marginBottom: theme.spacing(2),\n },\n }),\n);\n\ninterface BuildDetailsProps {\n buildData: BuildResponse;\n showId?: boolean;\n}\n\nexport const BuildDetails = ({\n buildData: { build, targets, xcode },\n showId,\n}: BuildDetailsProps) => {\n const classes = useStyles();\n const client = useApi(xcmetricsApiRef);\n const hostResult = useAsync(\n async () => client.getBuildHost(build.id),\n [build.id],\n );\n const errorsResult = useAsync(\n async () => client.getBuildErrors(build.id),\n [build.id],\n );\n const warningsResult = useAsync(\n async () => client.getBuildWarnings(build.id),\n [build.id],\n );\n const metadataResult = useAsync(\n async () => client.getBuildMetadata(build.id),\n [build.id],\n );\n\n const buildDetails = {\n project: build.projectName,\n schema: build.schema,\n category: build.category,\n userId: build.userid,\n 'started at': formatTime(build.startTimestamp),\n 'ended at': formatTime(build.endTimestamp),\n duration: formatDuration(build.duration),\n status: (\n <>\n <StatusIcon buildStatus={build.buildStatus} />\n {formatStatus(build.buildStatus)}\n </>\n ),\n xcode: xcode ? `${xcode.version} (${xcode.buildNumber})` : 'Unknown',\n CI: build.isCi,\n };\n\n return (\n <Grid container item direction=\"row\">\n <Grid item xs={4}>\n <StructuredMetadataTable\n metadata={\n showId === false ? buildDetails : { id: build.id, ...buildDetails }\n }\n />\n </Grid>\n <Grid item xs={8}>\n <Accordion\n id=\"buildHost\"\n heading=\"Host\"\n secondaryHeading={build.machineName}\n >\n {hostResult.loading && <Progress />}\n {!hostResult.loading && hostResult.value && (\n <StructuredMetadataTable metadata={hostResult.value} />\n )}\n </Accordion>\n\n <Accordion\n id=\"buildErrors\"\n heading=\"Errors\"\n secondaryHeading={build.errorCount}\n disabled={build.errorCount === 0}\n >\n <div>\n {errorsResult.loading && <Progress />}\n {!errorsResult.loading &&\n errorsResult.value?.map((error, idx) => (\n <div key={error.id}>\n <PreformattedText\n title=\"Error Details\"\n text={error.detail}\n maxChars={190}\n expandable\n />\n {idx !== errorsResult.value.length - 1 && (\n <Divider className={classes.divider} />\n )}\n </div>\n ))}\n </div>\n </Accordion>\n\n <Accordion\n id=\"buildWarnings\"\n heading=\"Warnings\"\n secondaryHeading={build.warningCount}\n disabled={build.warningCount === 0}\n >\n <div>\n {warningsResult.loading && <Progress />}\n {!warningsResult.loading &&\n warningsResult.value?.map((warning, idx) => (\n <div key={warning.id}>\n <PreformattedText\n title=\"Warning Details\"\n text={warning.detail ?? warning.title}\n maxChars={190}\n expandable\n />\n {idx !== warningsResult.value.length - 1 && (\n <Divider className={classes.divider} />\n )}\n </div>\n ))}\n </div>\n </Accordion>\n\n <Accordion\n id=\"buildMetadata\"\n heading=\"Metadata\"\n disabled={!metadataResult.loading && !metadataResult.value}\n >\n {metadataResult.loading && <Progress />}\n {!metadataResult.loading && metadataResult.value && (\n <StructuredMetadataTable metadata={metadataResult.value} />\n )}\n </Accordion>\n\n <Accordion id=\"buildTimeline\" heading=\"Timeline\" unmountOnExit>\n <BuildTimeline targets={targets} />\n </Accordion>\n </Grid>\n </Grid>\n );\n};\n\ntype WithRequestProps = Omit<BuildDetailsProps, 'buildData'> & {\n buildId: string;\n};\n\nexport const withRequest =\n (Component: typeof BuildDetails) =>\n ({ buildId, ...props }: WithRequestProps) => {\n const client = useApi(xcmetricsApiRef);\n const {\n value: buildResponse,\n loading,\n error,\n } = useAsync(async () => client.getBuild(buildId), []);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n if (!buildResponse) {\n return <Alert severity=\"error\">Could not load build {buildId}</Alert>;\n }\n\n return <Component {...props} buildData={buildResponse} />;\n };\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"BuildList.esm.js","sources":["../../../src/components/BuildList/BuildList.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 */\n\nimport React, { useRef, useState } from 'react';\nimport { Table } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { BuildFilters, xcmetricsApiRef } from '../../api';\nimport Grid from '@material-ui/core/Grid';\nimport { createStyles, makeStyles } from '@material-ui/core/styles';\nimport { BuildListFilter as Filters } from '../BuildListFilter';\nimport { DateTime } from 'luxon';\nimport { buildPageColumns } from '../BuildTableColumns';\nimport { BuildDetails, withRequest } from '../BuildDetails';\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n detailPanel: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.paper,\n },\n }),\n);\n\nexport const BuildList = () => {\n const classes = useStyles();\n const client = useApi(xcmetricsApiRef);\n const tableRef = useRef<any>();\n\n const initialFilters = {\n from: DateTime.now().minus({ years: 1 }).toISODate()!,\n to: DateTime.now().toISODate()!,\n };\n\n const [filters, setFilters] = useState<BuildFilters>(initialFilters);\n\n const handleFilterChange = (values: BuildFilters) => {\n setFilters(values);\n tableRef.current?.onQueryChange();\n };\n\n return (\n <Grid container spacing={3} direction=\"column\">\n <Filters\n onFilterChange={handleFilterChange}\n initialValues={initialFilters}\n />\n <Table\n title=\"Builds\"\n columns={buildPageColumns}\n options={{ paging: true, sorting: false, search: false, pageSize: 10 }}\n tableRef={tableRef}\n data={query => {\n return new Promise((resolve, reject) => {\n if (!query) return;\n client\n .getFilteredBuilds(\n filters,\n query.page + 1, // Page is 0-indexed in Table\n query.pageSize,\n )\n .then(result => {\n resolve({\n data: result.items,\n page: result.metadata.page - 1,\n totalCount: result.metadata.total,\n });\n })\n .catch(reason => reject(reason));\n });\n }}\n detailPanel={rowData => {\n const BuildDetailsWithRequest = withRequest(BuildDetails);\n return (\n <div className={classes.detailPanel}>\n <BuildDetailsWithRequest buildId={(rowData as any).rowData.id} />\n </div>\n );\n }}\n />\n </Grid>\n );\n};\n"],"names":["Filters"],"mappings":";;;;;;;;;;;;AA2BA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,WAC3B,YAAa,CAAA;AAAA,IACX,WAAa,EAAA;AAAA,MACX,OAAA,EAAS,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACxB,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA,KAAA;AAAA,KAC5C;AAAA,GACD,CAAA;AACH,CAAA,CAAA;AAEO,MAAM,YAAY,MAAM;AAC7B,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAC1B,EAAM,MAAA,MAAA,GAAS,OAAO,eAAe,CAAA,CAAA;AACrC,EAAA,MAAM,WAAW,MAAY,EAAA,CAAA;AAE7B,EAAA,MAAM,cAAiB,GAAA;AAAA,IACrB,IAAA,EAAM,QAAS,CAAA,GAAA,EAAM,CAAA,KAAA,CAAM,EAAE,KAAO,EAAA,CAAA,EAAG,CAAA,CAAE,SAAU,EAAA;AAAA,IACnD,EAAI,EAAA,QAAA,CAAS,GAAI,EAAA,CAAE,SAAU,EAAA;AAAA,GAC/B,CAAA;AAEA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAuB,cAAc,CAAA,CAAA;AAEnE,EAAM,MAAA,kBAAA,GAAqB,CAAC,MAAyB,KAAA;AACnD,IAAA,UAAA,CAAW,MAAM,CAAA,CAAA;AACjB,IAAA,QAAA,CAAS,SAAS,aAAc,EAAA,CAAA;AAAA,GAClC,CAAA;AAEA,EAAA,2CACG,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,OAAS,EAAA,CAAA,EAAG,WAAU,QACpC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAACA,eAAA;AAAA,IAAA;AAAA,MACC,cAAgB,EAAA,kBAAA;AAAA,MAChB,aAAe,EAAA,cAAA;AAAA,KAAA;AAAA,GAEjB,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAM,EAAA,QAAA;AAAA,MACN,OAAS,EAAA,gBAAA;AAAA,MACT,OAAA,EAAS,EAAE,MAAQ,EAAA,IAAA,EAAM,SAAS,KAAO,EAAA,MAAA,EAAQ,KAAO,EAAA,QAAA,EAAU,EAAG,EAAA;AAAA,MACrE,QAAA;AAAA,MACA,MAAM,CAAS,KAAA,KAAA;AACb,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,UAAA,IAAI,CAAC,KAAO,EAAA,OAAA;AACZ,UACG,MAAA,CAAA,iBAAA;AAAA,YACC,OAAA;AAAA,YACA,MAAM,IAAO,GAAA,CAAA;AAAA;AAAA,YACb,KAAM,CAAA,QAAA;AAAA,WACR,CACC,KAAK,CAAU,MAAA,KAAA;AACd,YAAQ,OAAA,CAAA;AAAA,cACN,MAAM,MAAO,CAAA,KAAA;AAAA,cACb,IAAA,EAAM,MAAO,CAAA,QAAA,CAAS,IAAO,GAAA,CAAA;AAAA,cAC7B,UAAA,EAAY,OAAO,QAAS,CAAA,KAAA;AAAA,aAC7B,CAAA,CAAA;AAAA,WACF,CACA,CAAA,KAAA,CAAM,CAAU,MAAA,KAAA,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AAAA,SAClC,CAAA,CAAA;AAAA,OACH;AAAA,MACA,aAAa,CAAW,OAAA,KAAA;AACtB,QAAM,MAAA,uBAAA,GAA0B,YAAY,YAAY,CAAA,CAAA;AACxD,QACE,uBAAA,KAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,WAAA,EAAA,kBACrB,KAAA,CAAA,aAAA,CAAA,uBAAA,EAAA,EAAwB,OAAU,EAAA,OAAA,CAAgB,OAAQ,CAAA,EAAA,EAAI,CACjE,CAAA,CAAA;AAAA,OAEJ;AAAA,KAAA;AAAA,GAEJ,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"BuildList.esm.js","sources":["../../../src/components/BuildList/BuildList.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 */\n\nimport React, { useRef, useState } from 'react';\nimport { Table } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { BuildFilters, xcmetricsApiRef } from '../../api';\nimport Grid from '@material-ui/core/Grid';\nimport { createStyles, makeStyles } from '@material-ui/core/styles';\nimport { BuildListFilter as Filters } from '../BuildListFilter';\nimport { DateTime } from 'luxon';\nimport { buildPageColumns } from '../BuildTableColumns';\nimport { BuildDetails, withRequest } from '../BuildDetails';\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n detailPanel: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.paper,\n },\n }),\n);\n\nexport const BuildList = () => {\n const classes = useStyles();\n const client = useApi(xcmetricsApiRef);\n const tableRef = useRef<any>();\n\n const initialFilters = {\n from: DateTime.now().minus({ years: 1 }).toISODate()!,\n to: DateTime.now().toISODate()!,\n };\n\n const [filters, setFilters] = useState<BuildFilters>(initialFilters);\n\n const handleFilterChange = (values: BuildFilters) => {\n setFilters(values);\n tableRef.current?.onQueryChange();\n };\n\n return (\n <Grid container spacing={3} direction=\"column\">\n <Filters\n onFilterChange={handleFilterChange}\n initialValues={initialFilters}\n />\n <Table\n title=\"Builds\"\n columns={buildPageColumns}\n options={{ paging: true, sorting: false, search: false, pageSize: 10 }}\n tableRef={tableRef}\n data={query => {\n return new Promise((resolve, reject) => {\n if (!query) return;\n client\n .getFilteredBuilds(\n filters,\n query.page + 1, // Page is 0-indexed in Table\n query.pageSize,\n )\n .then(result => {\n resolve({\n data: result.items,\n page: result.metadata.page - 1,\n totalCount: result.metadata.total,\n });\n })\n .catch(reason => reject(reason));\n });\n }}\n detailPanel={rowData => {\n const BuildDetailsWithRequest = withRequest(BuildDetails);\n return (\n <div className={classes.detailPanel}>\n <BuildDetailsWithRequest buildId={(rowData as any).rowData.id} />\n </div>\n );\n }}\n />\n </Grid>\n );\n};\n"],"names":["Filters"],"mappings":";;;;;;;;;;;;AA2BA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,WAC3B,YAAa,CAAA;AAAA,IACX,WAAa,EAAA;AAAA,MACX,OAAA,EAAS,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACxB,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA;AAAA;AAC5C,GACD;AACH,CAAA;AAEO,MAAM,YAAY,MAAM;AAC7B,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAM,MAAA,MAAA,GAAS,OAAO,eAAe,CAAA;AACrC,EAAA,MAAM,WAAW,MAAY,EAAA;AAE7B,EAAA,MAAM,cAAiB,GAAA;AAAA,IACrB,IAAA,EAAM,QAAS,CAAA,GAAA,EAAM,CAAA,KAAA,CAAM,EAAE,KAAO,EAAA,CAAA,EAAG,CAAA,CAAE,SAAU,EAAA;AAAA,IACnD,EAAI,EAAA,QAAA,CAAS,GAAI,EAAA,CAAE,SAAU;AAAA,GAC/B;AAEA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAuB,cAAc,CAAA;AAEnE,EAAM,MAAA,kBAAA,GAAqB,CAAC,MAAyB,KAAA;AACnD,IAAA,UAAA,CAAW,MAAM,CAAA;AACjB,IAAA,QAAA,CAAS,SAAS,aAAc,EAAA;AAAA,GAClC;AAEA,EAAA,2CACG,IAAK,EAAA,EAAA,SAAA,EAAS,MAAC,OAAS,EAAA,CAAA,EAAG,WAAU,QACpC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAACA,eAAA;AAAA,IAAA;AAAA,MACC,cAAgB,EAAA,kBAAA;AAAA,MAChB,aAAe,EAAA;AAAA;AAAA,GAEjB,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAM,EAAA,QAAA;AAAA,MACN,OAAS,EAAA,gBAAA;AAAA,MACT,OAAA,EAAS,EAAE,MAAQ,EAAA,IAAA,EAAM,SAAS,KAAO,EAAA,MAAA,EAAQ,KAAO,EAAA,QAAA,EAAU,EAAG,EAAA;AAAA,MACrE,QAAA;AAAA,MACA,MAAM,CAAS,KAAA,KAAA;AACb,QAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,UAAA,IAAI,CAAC,KAAO,EAAA;AACZ,UACG,MAAA,CAAA,iBAAA;AAAA,YACC,OAAA;AAAA,YACA,MAAM,IAAO,GAAA,CAAA;AAAA;AAAA,YACb,KAAM,CAAA;AAAA,WACR,CACC,KAAK,CAAU,MAAA,KAAA;AACd,YAAQ,OAAA,CAAA;AAAA,cACN,MAAM,MAAO,CAAA,KAAA;AAAA,cACb,IAAA,EAAM,MAAO,CAAA,QAAA,CAAS,IAAO,GAAA,CAAA;AAAA,cAC7B,UAAA,EAAY,OAAO,QAAS,CAAA;AAAA,aAC7B,CAAA;AAAA,WACF,CACA,CAAA,KAAA,CAAM,CAAU,MAAA,KAAA,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,SAClC,CAAA;AAAA,OACH;AAAA,MACA,aAAa,CAAW,OAAA,KAAA;AACtB,QAAM,MAAA,uBAAA,GAA0B,YAAY,YAAY,CAAA;AACxD,QACE,uBAAA,KAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,WAAA,EAAA,kBACrB,KAAA,CAAA,aAAA,CAAA,uBAAA,EAAA,EAAwB,OAAU,EAAA,OAAA,CAAgB,OAAQ,CAAA,EAAA,EAAI,CACjE,CAAA;AAAA;AAEJ;AAAA,GAEJ,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"BuildListFilter.esm.js","sources":["../../../src/components/BuildListFilter/BuildListFilter.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 */\n\nimport React, { useEffect, useState } from 'react';\nimport IconButton from '@material-ui/core/IconButton';\nimport Grid from '@material-ui/core/Grid';\nimport Button from '@material-ui/core/Button';\nimport { makeStyles } from '@material-ui/core/styles';\nimport FilterList from '@material-ui/icons/FilterList';\nimport { InfoCard, Select } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\nimport { BuildFilters, BuildStatus, xcmetricsApiRef } from '../../api';\nimport { DatePicker } from '../DatePicker';\n\nconst toSelectItems = (strings: string[]) => {\n return strings.map(str => ({ label: str, value: str }));\n};\n\nconst useStyles = makeStyles(theme => ({\n filtersContent: {\n padding: theme.spacing(2, 2, 2, 2.5),\n },\n}));\n\ntype FilterOption<T> = T | 'all';\n\ninterface FiltersProps {\n initialValues: BuildFilters;\n onFilterChange: (filters: BuildFilters) => void;\n}\n\nexport const BuildListFilter = ({\n onFilterChange,\n initialValues,\n}: FiltersProps) => {\n const client = useApi(xcmetricsApiRef);\n const classes = useStyles();\n const [open, setOpen] = useState(false);\n const [values, setValues] = useState(initialValues);\n\n useEffect(() => onFilterChange(values), [onFilterChange, values]);\n\n const numFilters = Object.keys(values).reduce((sum, key) => {\n const filtersKey = key as keyof BuildFilters;\n return sum + Number(values[filtersKey] !== initialValues[filtersKey]);\n }, 0);\n\n const title = (\n <>\n <IconButton\n onClick={() => setOpen(!open)}\n aria-label={`${open ? 'hide' : 'show'} filters`}\n >\n <FilterList />\n </IconButton>\n Filters ({numFilters})\n {!!numFilters && (\n <Button color=\"primary\" onClick={() => setValues(initialValues)}>\n Clear all\n </Button>\n )}\n </>\n );\n\n const statusItems: { label: string; value: FilterOption<BuildStatus> }[] = [\n { label: 'All', value: 'all' },\n { label: 'Succeeded', value: 'succeeded' },\n { label: 'Failed', value: 'failed' },\n { label: 'Stopped', value: 'stopped' },\n ];\n\n const { value: projects, loading } = useAsync(async () => {\n return client.getProjects();\n }, []);\n\n const content = (\n <Grid\n container\n spacing={3}\n direction=\"row\"\n className={classes.filtersContent}\n >\n <Grid item sm={6} md={4} lg={2}>\n <DatePicker\n label=\"From\"\n value={values.from}\n onDateChange={date => setValues({ ...values, from: date })}\n />\n </Grid>\n <Grid item sm={6} md={4} lg={2}>\n <DatePicker\n label=\"To\"\n value={values.to}\n onDateChange={date => setValues({ ...values, to: date })}\n />\n </Grid>\n <Grid item sm={6} md={4} lg={2}>\n <Select\n label=\"Status\"\n items={statusItems}\n selected={!values.buildStatus ? 'all' : values.buildStatus}\n onChange={selection => {\n const buildStatus =\n selection === 'all' ? undefined : (selection as BuildStatus);\n setValues({ ...values, buildStatus });\n }}\n />\n </Grid>\n <Grid item sm={6} md={4} lg={2}>\n {loading ? (\n <Select\n label=\"Project\"\n placeholder=\"Loading..\"\n items={[]}\n onChange={() => undefined}\n />\n ) : (\n <Select\n label=\"Project\"\n items={toSelectItems(['All'].concat(projects ?? []))}\n selected={values.project ? values.project : 'All'}\n onChange={selection =>\n setValues({\n ...values,\n project:\n selection === 'All' ? undefined : (selection as string),\n })\n }\n />\n )}\n </Grid>\n </Grid>\n );\n\n return (\n <InfoCard\n title={title}\n titleTypographyProps={{ variant: 'h6' }}\n divider={open}\n noPadding\n variant=\"gridItem\"\n >\n {open && content}\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BuildListFilter.esm.js","sources":["../../../src/components/BuildListFilter/BuildListFilter.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 */\n\nimport React, { useEffect, useState } from 'react';\nimport IconButton from '@material-ui/core/IconButton';\nimport Grid from '@material-ui/core/Grid';\nimport Button from '@material-ui/core/Button';\nimport { makeStyles } from '@material-ui/core/styles';\nimport FilterList from '@material-ui/icons/FilterList';\nimport { InfoCard, Select } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\nimport { BuildFilters, BuildStatus, xcmetricsApiRef } from '../../api';\nimport { DatePicker } from '../DatePicker';\n\nconst toSelectItems = (strings: string[]) => {\n return strings.map(str => ({ label: str, value: str }));\n};\n\nconst useStyles = makeStyles(theme => ({\n filtersContent: {\n padding: theme.spacing(2, 2, 2, 2.5),\n },\n}));\n\ntype FilterOption<T> = T | 'all';\n\ninterface FiltersProps {\n initialValues: BuildFilters;\n onFilterChange: (filters: BuildFilters) => void;\n}\n\nexport const BuildListFilter = ({\n onFilterChange,\n initialValues,\n}: FiltersProps) => {\n const client = useApi(xcmetricsApiRef);\n const classes = useStyles();\n const [open, setOpen] = useState(false);\n const [values, setValues] = useState(initialValues);\n\n useEffect(() => onFilterChange(values), [onFilterChange, values]);\n\n const numFilters = Object.keys(values).reduce((sum, key) => {\n const filtersKey = key as keyof BuildFilters;\n return sum + Number(values[filtersKey] !== initialValues[filtersKey]);\n }, 0);\n\n const title = (\n <>\n <IconButton\n onClick={() => setOpen(!open)}\n aria-label={`${open ? 'hide' : 'show'} filters`}\n >\n <FilterList />\n </IconButton>\n Filters ({numFilters})\n {!!numFilters && (\n <Button color=\"primary\" onClick={() => setValues(initialValues)}>\n Clear all\n </Button>\n )}\n </>\n );\n\n const statusItems: { label: string; value: FilterOption<BuildStatus> }[] = [\n { label: 'All', value: 'all' },\n { label: 'Succeeded', value: 'succeeded' },\n { label: 'Failed', value: 'failed' },\n { label: 'Stopped', value: 'stopped' },\n ];\n\n const { value: projects, loading } = useAsync(async () => {\n return client.getProjects();\n }, []);\n\n const content = (\n <Grid\n container\n spacing={3}\n direction=\"row\"\n className={classes.filtersContent}\n >\n <Grid item sm={6} md={4} lg={2}>\n <DatePicker\n label=\"From\"\n value={values.from}\n onDateChange={date => setValues({ ...values, from: date })}\n />\n </Grid>\n <Grid item sm={6} md={4} lg={2}>\n <DatePicker\n label=\"To\"\n value={values.to}\n onDateChange={date => setValues({ ...values, to: date })}\n />\n </Grid>\n <Grid item sm={6} md={4} lg={2}>\n <Select\n label=\"Status\"\n items={statusItems}\n selected={!values.buildStatus ? 'all' : values.buildStatus}\n onChange={selection => {\n const buildStatus =\n selection === 'all' ? undefined : (selection as BuildStatus);\n setValues({ ...values, buildStatus });\n }}\n />\n </Grid>\n <Grid item sm={6} md={4} lg={2}>\n {loading ? (\n <Select\n label=\"Project\"\n placeholder=\"Loading..\"\n items={[]}\n onChange={() => undefined}\n />\n ) : (\n <Select\n label=\"Project\"\n items={toSelectItems(['All'].concat(projects ?? []))}\n selected={values.project ? values.project : 'All'}\n onChange={selection =>\n setValues({\n ...values,\n project:\n selection === 'All' ? undefined : (selection as string),\n })\n }\n />\n )}\n </Grid>\n </Grid>\n );\n\n return (\n <InfoCard\n title={title}\n titleTypographyProps={{ variant: 'h6' }}\n divider={open}\n noPadding\n variant=\"gridItem\"\n >\n {open && content}\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"BuildTableColumns.esm.js","sources":["../../src/components/BuildTableColumns.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 */\n\nimport Chip from '@material-ui/core/Chip';\nimport React from 'react';\nimport { TableColumn } from '@backstage/core-components';\nimport { Build } from '../api';\nimport { formatTime, formatDuration } from '../utils';\nimport { StatusIcon } from './StatusIcon';\n\nconst baseColumns: TableColumn<Build>[] = [\n {\n field: 'buildStatus',\n render: data => <StatusIcon buildStatus={data.buildStatus} />,\n },\n {\n title: 'Project',\n field: 'projectName',\n },\n {\n title: 'Schema',\n field: 'schema',\n },\n {\n title: 'Started',\n field: 'startedAt',\n render: data => formatTime(data.startTimestamp),\n cellStyle: { whiteSpace: 'nowrap' },\n },\n {\n title: 'Duration',\n field: 'duration',\n render: data => formatDuration(data.duration),\n },\n {\n title: 'User',\n field: 'userid',\n },\n];\n\nconst isCi: TableColumn<Build> = {\n field: 'isCI',\n render: data => data.isCi && <Chip label=\"CI\" size=\"small\" />,\n width: '10',\n sorting: false,\n};\n\nexport const overviewColumns: TableColumn<Build>[] = [...baseColumns, isCi];\n\nexport const buildPageColumns: TableColumn<Build>[] = [\n ...baseColumns,\n {\n title: 'Host',\n field: 'machineName',\n },\n {\n title: 'Warnings',\n field: 'warningCount',\n },\n {\n title: 'Category',\n field: 'category',\n render: data => <Chip label={data.category} size=\"small\" />,\n },\n isCi,\n];\n"],"names":[],"mappings":";;;;;AAuBA,MAAM,WAAoC,GAAA;AAAA,EACxC;AAAA,IACE,KAAO,EAAA,aAAA;AAAA,IACP,QAAQ,CAAQ,IAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,WAAA,EAAa,KAAK,WAAa,EAAA,CAAA;AAAA,GAC7D;AAAA,EACA;AAAA,IACE,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA,aAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAO,EAAA,QAAA;AAAA,IACP,KAAO,EAAA,QAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA,WAAA;AAAA,IACP,MAAQ,EAAA,CAAA,IAAA,KAAQ,UAAW,CAAA,IAAA,CAAK,cAAc,CAAA;AAAA,IAC9C,SAAA,EAAW,EAAE,UAAA,EAAY,QAAS,EAAA;AAAA,GACpC;AAAA,EACA;AAAA,IACE,KAAO,EAAA,UAAA;AAAA,IACP,KAAO,EAAA,UAAA;AAAA,IACP,MAAQ,EAAA,CAAA,IAAA,KAAQ,cAAe,CAAA,IAAA,CAAK,QAAQ,CAAA;AAAA,GAC9C;AAAA,EACA;AAAA,IACE,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA,QAAA;AAAA,GACT;AACF,CAAA,CAAA;AAEA,MAAM,IAA2B,GAAA;AAAA,EAC/B,KAAO,EAAA,MAAA;AAAA,EACP,MAAA,EAAQ,UAAQ,IAAK,CAAA,IAAA,wCAAS,IAAK,EAAA,EAAA,KAAA,EAAM,IAAK,EAAA,IAAA,EAAK,OAAQ,EAAA,CAAA;AAAA,EAC3D,KAAO,EAAA,IAAA;AAAA,EACP,OAAS,EAAA,KAAA;AACX,CAAA,CAAA;AAEO,MAAM,eAAwC,GAAA,CAAC,GAAG,WAAA,EAAa,IAAI,EAAA;AAEnE,MAAM,gBAAyC,GAAA;AAAA,EACpD,GAAG,WAAA;AAAA,EACH;AAAA,IACE,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA,aAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAO,EAAA,UAAA;AAAA,IACP,KAAO,EAAA,cAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAO,EAAA,UAAA;AAAA,IACP,KAAO,EAAA,UAAA;AAAA,IACP,MAAA,EAAQ,0BAAS,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,OAAO,IAAK,CAAA,QAAA,EAAU,MAAK,OAAQ,EAAA,CAAA;AAAA,GAC3D;AAAA,EACA,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"BuildTableColumns.esm.js","sources":["../../src/components/BuildTableColumns.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 */\n\nimport Chip from '@material-ui/core/Chip';\nimport React from 'react';\nimport { TableColumn } from '@backstage/core-components';\nimport { Build } from '../api';\nimport { formatTime, formatDuration } from '../utils';\nimport { StatusIcon } from './StatusIcon';\n\nconst baseColumns: TableColumn<Build>[] = [\n {\n field: 'buildStatus',\n render: data => <StatusIcon buildStatus={data.buildStatus} />,\n },\n {\n title: 'Project',\n field: 'projectName',\n },\n {\n title: 'Schema',\n field: 'schema',\n },\n {\n title: 'Started',\n field: 'startedAt',\n render: data => formatTime(data.startTimestamp),\n cellStyle: { whiteSpace: 'nowrap' },\n },\n {\n title: 'Duration',\n field: 'duration',\n render: data => formatDuration(data.duration),\n },\n {\n title: 'User',\n field: 'userid',\n },\n];\n\nconst isCi: TableColumn<Build> = {\n field: 'isCI',\n render: data => data.isCi && <Chip label=\"CI\" size=\"small\" />,\n width: '10',\n sorting: false,\n};\n\nexport const overviewColumns: TableColumn<Build>[] = [...baseColumns, isCi];\n\nexport const buildPageColumns: TableColumn<Build>[] = [\n ...baseColumns,\n {\n title: 'Host',\n field: 'machineName',\n },\n {\n title: 'Warnings',\n field: 'warningCount',\n },\n {\n title: 'Category',\n field: 'category',\n render: data => <Chip label={data.category} size=\"small\" />,\n },\n isCi,\n];\n"],"names":[],"mappings":";;;;;AAuBA,MAAM,WAAoC,GAAA;AAAA,EACxC;AAAA,IACE,KAAO,EAAA,aAAA;AAAA,IACP,QAAQ,CAAQ,IAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,WAAA,EAAa,KAAK,WAAa,EAAA;AAAA,GAC7D;AAAA,EACA;AAAA,IACE,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAO,EAAA,QAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA,WAAA;AAAA,IACP,MAAQ,EAAA,CAAA,IAAA,KAAQ,UAAW,CAAA,IAAA,CAAK,cAAc,CAAA;AAAA,IAC9C,SAAA,EAAW,EAAE,UAAA,EAAY,QAAS;AAAA,GACpC;AAAA,EACA;AAAA,IACE,KAAO,EAAA,UAAA;AAAA,IACP,KAAO,EAAA,UAAA;AAAA,IACP,MAAQ,EAAA,CAAA,IAAA,KAAQ,cAAe,CAAA,IAAA,CAAK,QAAQ;AAAA,GAC9C;AAAA,EACA;AAAA,IACE,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA;AAAA;AAEX,CAAA;AAEA,MAAM,IAA2B,GAAA;AAAA,EAC/B,KAAO,EAAA,MAAA;AAAA,EACP,MAAA,EAAQ,UAAQ,IAAK,CAAA,IAAA,wCAAS,IAAK,EAAA,EAAA,KAAA,EAAM,IAAK,EAAA,IAAA,EAAK,OAAQ,EAAA,CAAA;AAAA,EAC3D,KAAO,EAAA,IAAA;AAAA,EACP,OAAS,EAAA;AACX,CAAA;AAEO,MAAM,eAAwC,GAAA,CAAC,GAAG,WAAA,EAAa,IAAI;AAEnE,MAAM,gBAAyC,GAAA;AAAA,EACpD,GAAG,WAAA;AAAA,EACH;AAAA,IACE,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAO,EAAA,UAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAO,EAAA,UAAA;AAAA,IACP,KAAO,EAAA,UAAA;AAAA,IACP,MAAA,EAAQ,0BAAS,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,OAAO,IAAK,CAAA,QAAA,EAAU,MAAK,OAAQ,EAAA;AAAA,GAC3D;AAAA,EACA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"BuildTimeline.esm.js","sources":["../../../src/components/BuildTimeline/BuildTimeline.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 */\n\nimport { createStyles, makeStyles, useTheme } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport React from 'react';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Legend,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { Target } from '../../api';\nimport { formatSecondsInterval, formatPercentage } from '../../utils';\n\nconst EMPTY_HEIGHT = 100;\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n toolTip: {\n backgroundColor: theme.palette.background.paper,\n opacity: 0.8,\n padding: 8,\n },\n }),\n);\n\nconst TargetToolTip = ({ active, payload, label }: any) => {\n const classes = useStyles();\n\n if (active && payload && payload.length === 2) {\n const buildTime = payload[0].value[1] - payload[0].value[0];\n const compileTime = payload[1].value[1] - payload[1].value[0];\n return (\n <div className={classes.toolTip}>\n {`${label}: ${formatSecondsInterval(payload[0].value)}`}\n <br />\n {buildTime > 0 &&\n `Compile time: ${formatPercentage(compileTime / buildTime)}`}\n </div>\n );\n }\n\n return null;\n};\n\nconst getTimelineData = (targets: Target[]) => {\n const min = targets[0].startTimestampMicroseconds;\n\n return targets\n .filter(target => target.fetchedFromCache === false)\n .map(target => ({\n name: target.name,\n buildTime: [\n target.startTimestampMicroseconds - min,\n target.endTimestampMicroseconds - min,\n ],\n compileTime: [\n target.startTimestampMicroseconds - min,\n target.compilationEndTimestampMicroseconds - min,\n ],\n }));\n};\n\nexport interface BuildTimelineProps {\n targets: Target[];\n height?: number;\n width?: number;\n}\n\nexport const BuildTimeline = ({\n targets,\n height,\n width,\n}: BuildTimelineProps) => {\n const theme = useTheme();\n if (!targets.length) return <Typography paragraph>No Targets</Typography>;\n\n const data = getTimelineData(targets);\n\n return (\n <ResponsiveContainer\n height={height}\n width={width}\n minHeight={EMPTY_HEIGHT + targets.length * 5}\n >\n <BarChart layout=\"vertical\" data={data} maxBarSize={10} barGap={0}>\n <CartesianGrid strokeDasharray=\"2 2\" />\n <XAxis type=\"number\" domain={[0, 'dataMax']} />\n <YAxis type=\"category\" dataKey=\"name\" padding={{ top: 0, bottom: 0 }} />\n <Tooltip content={<TargetToolTip />} />\n <Legend />\n <Bar\n dataKey=\"buildTime\"\n fill={theme.palette.grey[400]}\n minPointSize={1}\n />\n <Bar dataKey=\"compileTime\" fill={theme.palette.primary.main} />\n </BarChart>\n </ResponsiveContainer>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BuildTimeline.esm.js","sources":["../../../src/components/BuildTimeline/BuildTimeline.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 */\n\nimport { createStyles, makeStyles, useTheme } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport React from 'react';\nimport {\n Bar,\n BarChart,\n CartesianGrid,\n Legend,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\nimport { Target } from '../../api';\nimport { formatSecondsInterval, formatPercentage } from '../../utils';\n\nconst EMPTY_HEIGHT = 100;\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n toolTip: {\n backgroundColor: theme.palette.background.paper,\n opacity: 0.8,\n padding: 8,\n },\n }),\n);\n\nconst TargetToolTip = ({ active, payload, label }: any) => {\n const classes = useStyles();\n\n if (active && payload && payload.length === 2) {\n const buildTime = payload[0].value[1] - payload[0].value[0];\n const compileTime = payload[1].value[1] - payload[1].value[0];\n return (\n <div className={classes.toolTip}>\n {`${label}: ${formatSecondsInterval(payload[0].value)}`}\n <br />\n {buildTime > 0 &&\n `Compile time: ${formatPercentage(compileTime / buildTime)}`}\n </div>\n );\n }\n\n return null;\n};\n\nconst getTimelineData = (targets: Target[]) => {\n const min = targets[0].startTimestampMicroseconds;\n\n return targets\n .filter(target => target.fetchedFromCache === false)\n .map(target => ({\n name: target.name,\n buildTime: [\n target.startTimestampMicroseconds - min,\n target.endTimestampMicroseconds - min,\n ],\n compileTime: [\n target.startTimestampMicroseconds - min,\n target.compilationEndTimestampMicroseconds - min,\n ],\n }));\n};\n\nexport interface BuildTimelineProps {\n targets: Target[];\n height?: number;\n width?: number;\n}\n\nexport const BuildTimeline = ({\n targets,\n height,\n width,\n}: BuildTimelineProps) => {\n const theme = useTheme();\n if (!targets.length) return <Typography paragraph>No Targets</Typography>;\n\n const data = getTimelineData(targets);\n\n return (\n <ResponsiveContainer\n height={height}\n width={width}\n minHeight={EMPTY_HEIGHT + targets.length * 5}\n >\n <BarChart layout=\"vertical\" data={data} maxBarSize={10} barGap={0}>\n <CartesianGrid strokeDasharray=\"2 2\" />\n <XAxis type=\"number\" domain={[0, 'dataMax']} />\n <YAxis type=\"category\" dataKey=\"name\" padding={{ top: 0, bottom: 0 }} />\n <Tooltip content={<TargetToolTip />} />\n <Legend />\n <Bar\n dataKey=\"buildTime\"\n fill={theme.palette.grey[400]}\n minPointSize={1}\n />\n <Bar dataKey=\"compileTime\" fill={theme.palette.primary.main} />\n </BarChart>\n </ResponsiveContainer>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DataValue.esm.js","sources":["../../../src/components/DataValue/DataValue.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 Grid from '@material-ui/core/Grid';\nimport { GridSize } from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport React from 'react';\n\ninterface DataValueProps {\n field: string;\n value?: string | number | null | undefined;\n}\n\nexport const DataValue = ({ field, value }: DataValueProps) => {\n return (\n <div>\n <Typography variant=\"caption\">{field}</Typography>\n <Typography variant=\"subtitle1\">{value ?? '--'}</Typography>\n </div>\n );\n};\n\ninterface GridProps {\n xs?: GridSize;\n md?: GridSize;\n lg?: GridSize;\n}\n\nexport const DataValueGridItem = (props: DataValueProps & GridProps) => (\n <Grid item xs={props.xs ?? 6} md={props.md ?? 6} lg={props.lg ?? 4}>\n <DataValue {...props} />\n </Grid>\n);\n"],"names":[],"mappings":";;;;AAyBO,MAAM,SAAY,GAAA,CAAC,EAAE,KAAA,EAAO,OAA4B,KAAA;AAC7D,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,SAAQ,SAAW,EAAA,EAAA,KAAM,CACrC,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,WAAa,EAAA,EAAA,KAAA,IAAS,IAAK,CACjD,CAAA,CAAA;AAEJ,EAAA;AAQa,MAAA,iBAAA,GAAoB,CAAC,KAChC,qBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,KAAA,CAAM,EAAM,IAAA,CAAA,EAAG,IAAI,KAAM,CAAA,EAAA,IAAM,CAAG,EAAA,EAAA,EAAI,KAAM,CAAA,EAAA,IAAM,qBAC9D,KAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAW,GAAG,KAAA,EAAO,CACxB;;;;"}
1
+ {"version":3,"file":"DataValue.esm.js","sources":["../../../src/components/DataValue/DataValue.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 Grid from '@material-ui/core/Grid';\nimport { GridSize } from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport React from 'react';\n\ninterface DataValueProps {\n field: string;\n value?: string | number | null | undefined;\n}\n\nexport const DataValue = ({ field, value }: DataValueProps) => {\n return (\n <div>\n <Typography variant=\"caption\">{field}</Typography>\n <Typography variant=\"subtitle1\">{value ?? '--'}</Typography>\n </div>\n );\n};\n\ninterface GridProps {\n xs?: GridSize;\n md?: GridSize;\n lg?: GridSize;\n}\n\nexport const DataValueGridItem = (props: DataValueProps & GridProps) => (\n <Grid item xs={props.xs ?? 6} md={props.md ?? 6} lg={props.lg ?? 4}>\n <DataValue {...props} />\n </Grid>\n);\n"],"names":[],"mappings":";;;;AAyBO,MAAM,SAAY,GAAA,CAAC,EAAE,KAAA,EAAO,OAA4B,KAAA;AAC7D,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,SAAQ,SAAW,EAAA,EAAA,KAAM,CACrC,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,WAAa,EAAA,EAAA,KAAA,IAAS,IAAK,CACjD,CAAA;AAEJ;AAQa,MAAA,iBAAA,GAAoB,CAAC,KAChC,qBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,KAAA,CAAM,EAAM,IAAA,CAAA,EAAG,IAAI,KAAM,CAAA,EAAA,IAAM,CAAG,EAAA,EAAA,EAAI,KAAM,CAAA,EAAA,IAAM,qBAC9D,KAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAW,GAAG,KAAA,EAAO,CACxB;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"DatePicker.esm.js","sources":["../../../src/components/DatePicker/DatePicker.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 */\n\nimport React from 'react';\nimport { createStyles } from '@material-ui/core/styles';\nimport { InputProps } from '@material-ui/core/Input';\nimport withStyles from '@material-ui/core/styles/withStyles';\nimport { Theme } from '@material-ui/core/styles/createTheme';\nimport InputBase from '@material-ui/core/InputBase/InputBase';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport Typography from '@material-ui/core/Typography/Typography';\n\nconst BootstrapInput = withStyles((theme: Theme) =>\n createStyles({\n root: {\n margin: theme.spacing(1, 0),\n maxWidth: 300,\n 'label + &': {\n marginTop: theme.spacing(3),\n },\n },\n input: {\n borderRadius: 4,\n position: 'relative',\n backgroundColor: theme.palette.background.paper,\n border: '1px solid #ced4da',\n fontSize: 16,\n padding: '10px 26px 10px 12px',\n transition: theme.transitions.create(['border-color', 'box-shadow']),\n fontFamily: 'Helvetica Neue',\n height: 25,\n '&:focus': {\n background: theme.palette.background.paper,\n borderRadius: 4,\n },\n },\n }),\n)(InputBase);\n\nconst useStyles = makeStyles({\n root: {\n display: 'flex',\n flexDirection: 'column',\n },\n});\n\ninterface DatePickerProps {\n label: string;\n onDateChange?: (date: string) => void;\n}\n\nexport const DatePicker = ({\n label,\n onDateChange,\n ...inputProps\n}: InputProps & DatePickerProps) => {\n const classes = useStyles();\n\n return (\n <div className={classes.root}>\n <Typography variant=\"button\">{label}</Typography>\n <BootstrapInput\n inputProps={{ 'aria-label': label }}\n type=\"date\"\n fullWidth\n onChange={event => onDateChange?.(event.target.value)}\n {...inputProps}\n />\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAyBA,MAAM,cAAiB,GAAA,UAAA;AAAA,EAAW,CAAC,UACjC,YAAa,CAAA;AAAA,IACX,IAAM,EAAA;AAAA,MACJ,MAAQ,EAAA,KAAA,CAAM,OAAQ,CAAA,CAAA,EAAG,CAAC,CAAA;AAAA,MAC1B,QAAU,EAAA,GAAA;AAAA,MACV,WAAa,EAAA;AAAA,QACX,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,OAC5B;AAAA,KACF;AAAA,IACA,KAAO,EAAA;AAAA,MACL,YAAc,EAAA,CAAA;AAAA,MACd,QAAU,EAAA,UAAA;AAAA,MACV,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA,KAAA;AAAA,MAC1C,MAAQ,EAAA,mBAAA;AAAA,MACR,QAAU,EAAA,EAAA;AAAA,MACV,OAAS,EAAA,qBAAA;AAAA,MACT,YAAY,KAAM,CAAA,WAAA,CAAY,OAAO,CAAC,cAAA,EAAgB,YAAY,CAAC,CAAA;AAAA,MACnE,UAAY,EAAA,gBAAA;AAAA,MACZ,MAAQ,EAAA,EAAA;AAAA,MACR,SAAW,EAAA;AAAA,QACT,UAAA,EAAY,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA,KAAA;AAAA,QACrC,YAAc,EAAA,CAAA;AAAA,OAChB;AAAA,KACF;AAAA,GACD,CAAA;AACH,CAAA,CAAE,SAAS,CAAA,CAAA;AAEX,MAAM,YAAY,UAAW,CAAA;AAAA,EAC3B,IAAM,EAAA;AAAA,IACJ,OAAS,EAAA,MAAA;AAAA,IACT,aAAe,EAAA,QAAA;AAAA,GACjB;AACF,CAAC,CAAA,CAAA;AAOM,MAAM,aAAa,CAAC;AAAA,EACzB,KAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAG,UAAA;AACL,CAAoC,KAAA;AAClC,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAE1B,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,IAAA,EAAA,sCACrB,UAAW,EAAA,EAAA,OAAA,EAAQ,QAAU,EAAA,EAAA,KAAM,CACpC,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY,EAAE,YAAA,EAAc,KAAM,EAAA;AAAA,MAClC,IAAK,EAAA,MAAA;AAAA,MACL,SAAS,EAAA,IAAA;AAAA,MACT,QAAU,EAAA,CAAA,KAAA,KAAS,YAAe,GAAA,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,MACnD,GAAG,UAAA;AAAA,KAAA;AAAA,GAER,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"DatePicker.esm.js","sources":["../../../src/components/DatePicker/DatePicker.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 */\n\nimport React from 'react';\nimport { createStyles } from '@material-ui/core/styles';\nimport { InputProps } from '@material-ui/core/Input';\nimport withStyles from '@material-ui/core/styles/withStyles';\nimport { Theme } from '@material-ui/core/styles/createTheme';\nimport InputBase from '@material-ui/core/InputBase/InputBase';\nimport makeStyles from '@material-ui/core/styles/makeStyles';\nimport Typography from '@material-ui/core/Typography/Typography';\n\nconst BootstrapInput = withStyles((theme: Theme) =>\n createStyles({\n root: {\n margin: theme.spacing(1, 0),\n maxWidth: 300,\n 'label + &': {\n marginTop: theme.spacing(3),\n },\n },\n input: {\n borderRadius: 4,\n position: 'relative',\n backgroundColor: theme.palette.background.paper,\n border: '1px solid #ced4da',\n fontSize: 16,\n padding: '10px 26px 10px 12px',\n transition: theme.transitions.create(['border-color', 'box-shadow']),\n fontFamily: 'Helvetica Neue',\n height: 25,\n '&:focus': {\n background: theme.palette.background.paper,\n borderRadius: 4,\n },\n },\n }),\n)(InputBase);\n\nconst useStyles = makeStyles({\n root: {\n display: 'flex',\n flexDirection: 'column',\n },\n});\n\ninterface DatePickerProps {\n label: string;\n onDateChange?: (date: string) => void;\n}\n\nexport const DatePicker = ({\n label,\n onDateChange,\n ...inputProps\n}: InputProps & DatePickerProps) => {\n const classes = useStyles();\n\n return (\n <div className={classes.root}>\n <Typography variant=\"button\">{label}</Typography>\n <BootstrapInput\n inputProps={{ 'aria-label': label }}\n type=\"date\"\n fullWidth\n onChange={event => onDateChange?.(event.target.value)}\n {...inputProps}\n />\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAyBA,MAAM,cAAiB,GAAA,UAAA;AAAA,EAAW,CAAC,UACjC,YAAa,CAAA;AAAA,IACX,IAAM,EAAA;AAAA,MACJ,MAAQ,EAAA,KAAA,CAAM,OAAQ,CAAA,CAAA,EAAG,CAAC,CAAA;AAAA,MAC1B,QAAU,EAAA,GAAA;AAAA,MACV,WAAa,EAAA;AAAA,QACX,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA;AAC5B,KACF;AAAA,IACA,KAAO,EAAA;AAAA,MACL,YAAc,EAAA,CAAA;AAAA,MACd,QAAU,EAAA,UAAA;AAAA,MACV,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA,KAAA;AAAA,MAC1C,MAAQ,EAAA,mBAAA;AAAA,MACR,QAAU,EAAA,EAAA;AAAA,MACV,OAAS,EAAA,qBAAA;AAAA,MACT,YAAY,KAAM,CAAA,WAAA,CAAY,OAAO,CAAC,cAAA,EAAgB,YAAY,CAAC,CAAA;AAAA,MACnE,UAAY,EAAA,gBAAA;AAAA,MACZ,MAAQ,EAAA,EAAA;AAAA,MACR,SAAW,EAAA;AAAA,QACT,UAAA,EAAY,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA,KAAA;AAAA,QACrC,YAAc,EAAA;AAAA;AAChB;AACF,GACD;AACH,CAAA,CAAE,SAAS,CAAA;AAEX,MAAM,YAAY,UAAW,CAAA;AAAA,EAC3B,IAAM,EAAA;AAAA,IACJ,OAAS,EAAA,MAAA;AAAA,IACT,aAAe,EAAA;AAAA;AAEnB,CAAC,CAAA;AAOM,MAAM,aAAa,CAAC;AAAA,EACzB,KAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAG;AACL,CAAoC,KAAA;AAClC,EAAA,MAAM,UAAU,SAAU,EAAA;AAE1B,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,IAAA,EAAA,sCACrB,UAAW,EAAA,EAAA,OAAA,EAAQ,QAAU,EAAA,EAAA,KAAM,CACpC,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY,EAAE,YAAA,EAAc,KAAM,EAAA;AAAA,MAClC,IAAK,EAAA,MAAA;AAAA,MACL,SAAS,EAAA,IAAA;AAAA,MACT,QAAU,EAAA,CAAA,KAAA,KAAS,YAAe,GAAA,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,MACnD,GAAG;AAAA;AAAA,GAER,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Overview.esm.js","sources":["../../../src/components/Overview/Overview.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 {\n ContentHeader,\n SupportButton,\n Progress,\n Table,\n EmptyState,\n InfoCard,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { xcmetricsApiRef } from '../../api';\nimport useAsync from 'react-use/esm/useAsync';\nimport Alert from '@material-ui/lab/Alert';\nimport { StatusMatrix } from '../StatusMatrix';\nimport Grid from '@material-ui/core/Grid';\nimport { OverviewTrends } from '../OverviewTrends';\nimport { overviewColumns } from '../BuildTableColumns';\n\nexport const Overview = () => {\n const client = useApi(xcmetricsApiRef);\n const {\n value: builds,\n loading,\n error,\n } = useAsync(async () => client.getBuilds(), []);\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n if (!builds || !builds.length) {\n return (\n <EmptyState\n missing=\"data\"\n title=\"No builds to show\"\n description=\"There are no builds in XCMetrics yet\"\n />\n );\n }\n\n return (\n <>\n <ContentHeader title=\"XCMetrics Dashboard\">\n <SupportButton>Dashboard for XCMetrics</SupportButton>\n </ContentHeader>\n <Grid container spacing={3} direction=\"row\">\n <Grid item xs={12} md={8} lg={8} xl={9}>\n <Table\n options={{\n paging: false,\n search: false,\n sorting: false,\n draggable: false,\n }}\n data={builds}\n columns={overviewColumns}\n title={\n <>\n Latest Builds\n <StatusMatrix />\n </>\n }\n />\n </Grid>\n <Grid item xs={12} md={4} lg={4} xl={3}>\n <InfoCard>\n <OverviewTrends />\n </InfoCard>\n </Grid>\n </Grid>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AAiCO,MAAM,WAAW,MAAM;AAC5B,EAAM,MAAA,MAAA,GAAS,OAAO,eAAe,CAAA,CAAA;AACrC,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,MAAA;AAAA,IACP,OAAA;AAAA,IACA,KAAA;AAAA,MACE,QAAS,CAAA,YAAY,OAAO,SAAU,EAAA,EAAG,EAAE,CAAA,CAAA;AAE/C,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2CAAQ,QAAS,EAAA,IAAA,CAAA,CAAA;AAAA,aACR,KAAO,EAAA;AAChB,IAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,OAAA,EAAA,EAAS,MAAM,OAAQ,CAAA,CAAA;AAAA,GAChD;AAEA,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,MAAQ,EAAA;AAC7B,IACE,uBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,MAAA;AAAA,QACR,KAAM,EAAA,mBAAA;AAAA,QACN,WAAY,EAAA,sCAAA;AAAA,OAAA;AAAA,KACd,CAAA;AAAA,GAEJ;AAEA,EAAA,uBAEI,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,aAAc,EAAA,EAAA,KAAA,EAAM,qBACnB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,aAAc,EAAA,IAAA,EAAA,yBAAuB,CACxC,CAAA,kBACC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAC,OAAS,EAAA,CAAA,EAAG,SAAU,EAAA,KAAA,EAAA,kBACnC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAI,EAAI,EAAA,CAAA,EAAG,EAAI,EAAA,CAAA,EAAG,IAAI,CACnC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,OAAS,EAAA;AAAA,QACP,MAAQ,EAAA,KAAA;AAAA,QACR,MAAQ,EAAA,KAAA;AAAA,QACR,OAAS,EAAA,KAAA;AAAA,QACT,SAAW,EAAA,KAAA;AAAA,OACb;AAAA,MACA,IAAM,EAAA,MAAA;AAAA,MACN,OAAS,EAAA,eAAA;AAAA,MACT,KACE,kBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAE,eAEA,kBAAA,KAAA,CAAA,aAAA,CAAC,kBAAa,CAChB,CAAA;AAAA,KAAA;AAAA,GAGN,mBACC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,IAAI,EAAI,EAAA,CAAA,EAAG,IAAI,CAAG,EAAA,EAAA,EAAI,qBAClC,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAA,sCACE,cAAe,EAAA,IAAA,CAClB,CACF,CACF,CACF,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"Overview.esm.js","sources":["../../../src/components/Overview/Overview.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 {\n ContentHeader,\n SupportButton,\n Progress,\n Table,\n EmptyState,\n InfoCard,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { xcmetricsApiRef } from '../../api';\nimport useAsync from 'react-use/esm/useAsync';\nimport Alert from '@material-ui/lab/Alert';\nimport { StatusMatrix } from '../StatusMatrix';\nimport Grid from '@material-ui/core/Grid';\nimport { OverviewTrends } from '../OverviewTrends';\nimport { overviewColumns } from '../BuildTableColumns';\n\nexport const Overview = () => {\n const client = useApi(xcmetricsApiRef);\n const {\n value: builds,\n loading,\n error,\n } = useAsync(async () => client.getBuilds(), []);\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n if (!builds || !builds.length) {\n return (\n <EmptyState\n missing=\"data\"\n title=\"No builds to show\"\n description=\"There are no builds in XCMetrics yet\"\n />\n );\n }\n\n return (\n <>\n <ContentHeader title=\"XCMetrics Dashboard\">\n <SupportButton>Dashboard for XCMetrics</SupportButton>\n </ContentHeader>\n <Grid container spacing={3} direction=\"row\">\n <Grid item xs={12} md={8} lg={8} xl={9}>\n <Table\n options={{\n paging: false,\n search: false,\n sorting: false,\n draggable: false,\n }}\n data={builds}\n columns={overviewColumns}\n title={\n <>\n Latest Builds\n <StatusMatrix />\n </>\n }\n />\n </Grid>\n <Grid item xs={12} md={4} lg={4} xl={3}>\n <InfoCard>\n <OverviewTrends />\n </InfoCard>\n </Grid>\n </Grid>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AAiCO,MAAM,WAAW,MAAM;AAC5B,EAAM,MAAA,MAAA,GAAS,OAAO,eAAe,CAAA;AACrC,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,MAAA;AAAA,IACP,OAAA;AAAA,IACA;AAAA,MACE,QAAS,CAAA,YAAY,OAAO,SAAU,EAAA,EAAG,EAAE,CAAA;AAE/C,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2CAAQ,QAAS,EAAA,IAAA,CAAA;AAAA,aACR,KAAO,EAAA;AAChB,IAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,OAAA,EAAA,EAAS,MAAM,OAAQ,CAAA;AAAA;AAGhD,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,MAAQ,EAAA;AAC7B,IACE,uBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,MAAA;AAAA,QACR,KAAM,EAAA,mBAAA;AAAA,QACN,WAAY,EAAA;AAAA;AAAA,KACd;AAAA;AAIJ,EAAA,uBAEI,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,aAAc,EAAA,EAAA,KAAA,EAAM,qBACnB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,aAAc,EAAA,IAAA,EAAA,yBAAuB,CACxC,CAAA,kBACC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAC,OAAS,EAAA,CAAA,EAAG,SAAU,EAAA,KAAA,EAAA,kBACnC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAI,EAAI,EAAA,CAAA,EAAG,EAAI,EAAA,CAAA,EAAG,IAAI,CACnC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,OAAS,EAAA;AAAA,QACP,MAAQ,EAAA,KAAA;AAAA,QACR,MAAQ,EAAA,KAAA;AAAA,QACR,OAAS,EAAA,KAAA;AAAA,QACT,SAAW,EAAA;AAAA,OACb;AAAA,MACA,IAAM,EAAA,MAAA;AAAA,MACN,OAAS,EAAA,eAAA;AAAA,MACT,KACE,kBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAE,eAEA,kBAAA,KAAA,CAAA,aAAA,CAAC,kBAAa,CAChB;AAAA;AAAA,GAGN,mBACC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,IAAI,EAAI,EAAA,CAAA,EAAG,IAAI,CAAG,EAAA,EAAA,EAAI,qBAClC,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,IAAA,sCACE,cAAe,EAAA,IAAA,CAClB,CACF,CACF,CACF,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"OverviewTrends.esm.js","sources":["../../../src/components/OverviewTrends/OverviewTrends.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 */\n\nimport Grid from '@material-ui/core/Grid';\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport React, { useState } from 'react';\nimport { Progress, Select } from '@backstage/core-components';\nimport { Trend } from '../Trend';\nimport Alert from '@material-ui/lab/Alert';\nimport AlertTitle from '@material-ui/lab/AlertTitle';\nimport { xcmetricsApiRef } from '../../api';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { DataValueGridItem } from '../DataValue';\nimport {\n formatDuration,\n formatPercentage,\n getAverageDuration,\n getErrorRatios,\n getValues,\n sumField,\n} from '../../utils';\n\nconst useStyles = makeStyles({\n spacingTop: {\n marginTop: 8,\n },\n spacingVertical: {\n marginTop: 8,\n marginBottom: 8,\n },\n});\n\nconst DAYS_SELECT_ITEMS = [\n { label: '7 days', value: 7 },\n { label: '14 days', value: 14 },\n { label: '30 days', value: 30 },\n { label: '60 days', value: 60 },\n];\n\nexport const OverviewTrends = () => {\n const [days, setDays] = useState(14);\n const theme = useTheme();\n const classes = useStyles();\n const client = useApi(xcmetricsApiRef);\n const buildCountsResult = useAsync(\n async () => client.getBuildCounts(days),\n [days],\n );\n const buildTimesResult = useAsync(\n async () => client.getBuildTimes(days),\n [days],\n );\n\n if (buildCountsResult.loading && buildTimesResult.loading) {\n return <Progress />;\n }\n\n const sumBuilds = sumField(b => b.builds, buildCountsResult.value);\n const sumErrors = sumField(b => b.errors, buildCountsResult.value);\n const errorRate = sumBuilds && sumErrors ? sumErrors / sumBuilds : undefined;\n\n const averageBuildDurationP50 = getAverageDuration(\n buildTimesResult.value,\n b => b.durationP50,\n );\n const averageBuildDurationP95 = getAverageDuration(\n buildTimesResult.value,\n b => b.durationP95,\n );\n const totalBuildTime = sumField(t => t.totalDuration, buildTimesResult.value);\n\n return (\n <>\n <Select\n selected={days}\n items={DAYS_SELECT_ITEMS}\n label=\"Trends for\"\n onChange={selection => setDays(selection as number)}\n />\n {buildCountsResult.error && (\n <Alert severity=\"error\" className={classes.spacingVertical}>\n <AlertTitle>Failed to fetch build counts</AlertTitle>\n {buildCountsResult?.error?.message}\n </Alert>\n )}\n {buildTimesResult.error && (\n <Alert severity=\"error\" className={classes.spacingVertical}>\n <AlertTitle>Failed to fetch build times</AlertTitle>\n {buildTimesResult?.error?.message}\n </Alert>\n )}\n {(!buildCountsResult.error || !buildTimesResult.error) && (\n <div className={classes.spacingVertical}>\n <Trend\n title=\"Build Time\"\n color={theme.palette.secondary.main}\n data={getValues(e => e.durationP50, buildTimesResult.value)}\n />\n <Trend\n title=\"Error Rate\"\n color={theme.palette.status.warning}\n data={getErrorRatios(buildCountsResult.value)}\n />\n <Trend\n title=\"Build Count\"\n color={theme.palette.primary.main}\n data={getValues(e => e.builds, buildCountsResult.value)}\n />\n <Grid\n container\n spacing={3}\n direction=\"row\"\n className={classes.spacingTop}\n >\n <DataValueGridItem field=\"Build Count\" value={sumBuilds} />\n <DataValueGridItem field=\"Error Count\" value={sumErrors} />\n <DataValueGridItem\n field=\"Error Rate\"\n value={errorRate && formatPercentage(errorRate)}\n />\n <DataValueGridItem\n field=\"Avg. Build Time (P50)\"\n value={averageBuildDurationP50}\n />\n <DataValueGridItem\n field=\"Avg. Build Time (P95)\"\n value={averageBuildDurationP95}\n />\n <DataValueGridItem\n field=\"Total Build Time\"\n value={totalBuildTime && formatDuration(totalBuildTime)}\n />\n </Grid>\n </div>\n )}\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OverviewTrends.esm.js","sources":["../../../src/components/OverviewTrends/OverviewTrends.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 */\n\nimport Grid from '@material-ui/core/Grid';\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\nimport React, { useState } from 'react';\nimport { Progress, Select } from '@backstage/core-components';\nimport { Trend } from '../Trend';\nimport Alert from '@material-ui/lab/Alert';\nimport AlertTitle from '@material-ui/lab/AlertTitle';\nimport { xcmetricsApiRef } from '../../api';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { DataValueGridItem } from '../DataValue';\nimport {\n formatDuration,\n formatPercentage,\n getAverageDuration,\n getErrorRatios,\n getValues,\n sumField,\n} from '../../utils';\n\nconst useStyles = makeStyles({\n spacingTop: {\n marginTop: 8,\n },\n spacingVertical: {\n marginTop: 8,\n marginBottom: 8,\n },\n});\n\nconst DAYS_SELECT_ITEMS = [\n { label: '7 days', value: 7 },\n { label: '14 days', value: 14 },\n { label: '30 days', value: 30 },\n { label: '60 days', value: 60 },\n];\n\nexport const OverviewTrends = () => {\n const [days, setDays] = useState(14);\n const theme = useTheme();\n const classes = useStyles();\n const client = useApi(xcmetricsApiRef);\n const buildCountsResult = useAsync(\n async () => client.getBuildCounts(days),\n [days],\n );\n const buildTimesResult = useAsync(\n async () => client.getBuildTimes(days),\n [days],\n );\n\n if (buildCountsResult.loading && buildTimesResult.loading) {\n return <Progress />;\n }\n\n const sumBuilds = sumField(b => b.builds, buildCountsResult.value);\n const sumErrors = sumField(b => b.errors, buildCountsResult.value);\n const errorRate = sumBuilds && sumErrors ? sumErrors / sumBuilds : undefined;\n\n const averageBuildDurationP50 = getAverageDuration(\n buildTimesResult.value,\n b => b.durationP50,\n );\n const averageBuildDurationP95 = getAverageDuration(\n buildTimesResult.value,\n b => b.durationP95,\n );\n const totalBuildTime = sumField(t => t.totalDuration, buildTimesResult.value);\n\n return (\n <>\n <Select\n selected={days}\n items={DAYS_SELECT_ITEMS}\n label=\"Trends for\"\n onChange={selection => setDays(selection as number)}\n />\n {buildCountsResult.error && (\n <Alert severity=\"error\" className={classes.spacingVertical}>\n <AlertTitle>Failed to fetch build counts</AlertTitle>\n {buildCountsResult?.error?.message}\n </Alert>\n )}\n {buildTimesResult.error && (\n <Alert severity=\"error\" className={classes.spacingVertical}>\n <AlertTitle>Failed to fetch build times</AlertTitle>\n {buildTimesResult?.error?.message}\n </Alert>\n )}\n {(!buildCountsResult.error || !buildTimesResult.error) && (\n <div className={classes.spacingVertical}>\n <Trend\n title=\"Build Time\"\n color={theme.palette.secondary.main}\n data={getValues(e => e.durationP50, buildTimesResult.value)}\n />\n <Trend\n title=\"Error Rate\"\n color={theme.palette.status.warning}\n data={getErrorRatios(buildCountsResult.value)}\n />\n <Trend\n title=\"Build Count\"\n color={theme.palette.primary.main}\n data={getValues(e => e.builds, buildCountsResult.value)}\n />\n <Grid\n container\n spacing={3}\n direction=\"row\"\n className={classes.spacingTop}\n >\n <DataValueGridItem field=\"Build Count\" value={sumBuilds} />\n <DataValueGridItem field=\"Error Count\" value={sumErrors} />\n <DataValueGridItem\n field=\"Error Rate\"\n value={errorRate && formatPercentage(errorRate)}\n />\n <DataValueGridItem\n field=\"Avg. Build Time (P50)\"\n value={averageBuildDurationP50}\n />\n <DataValueGridItem\n field=\"Avg. Build Time (P95)\"\n value={averageBuildDurationP95}\n />\n <DataValueGridItem\n field=\"Total Build Time\"\n value={totalBuildTime && formatDuration(totalBuildTime)}\n />\n </Grid>\n </div>\n )}\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PreformattedText.esm.js","sources":["../../../src/components/PreformattedText/PreformattedText.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 */\n\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport IconButton from '@material-ui/core/IconButton';\nimport { createStyles, makeStyles } from '@material-ui/core/styles';\nimport CloseIcon from '@material-ui/icons/Close';\nimport React, { useState } from 'react';\nimport { cn } from '../../utils';\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n pre: {\n whiteSpace: 'pre-line',\n wordBreak: 'break-all',\n },\n expandable: {\n cursor: 'pointer',\n },\n fullPre: {\n whiteSpace: 'pre-wrap',\n },\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\ninterface PreformattedTextProps {\n text: string;\n maxChars: number;\n}\n\ninterface ExpandableProps extends PreformattedTextProps {\n expandable: boolean;\n title: string;\n}\n\ninterface NonExpandableProps extends PreformattedTextProps {\n expandable?: never;\n title?: string;\n}\n\nexport const PreformattedText = ({\n text,\n maxChars,\n expandable,\n title,\n}: NonExpandableProps | ExpandableProps) => {\n const [open, setOpen] = useState(false);\n const classes = useStyles();\n\n const handleKeyUp = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (expandable && event.key === 'Enter') {\n setOpen(true);\n }\n };\n\n return (\n <>\n <div\n role={expandable ? 'button' : undefined}\n onClick={() => expandable && setOpen(true)}\n onKeyUp={handleKeyUp}\n tabIndex={expandable ? 0 : undefined}\n >\n <pre className={cn(classes.pre, expandable && classes.expandable)}>\n {text.slice(0, maxChars - 1).trim()}\n {text.length > maxChars - 1 && '…'}\n </pre>\n </div>\n\n {expandable && (\n <Dialog\n open={open}\n onClose={() => setOpen(false)}\n aria-labelledby=\"dialog-title\"\n aria-describedby=\"dialog-description\"\n maxWidth=\"xl\"\n fullWidth\n >\n <DialogTitle id=\"dialog-title\">\n {title}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={() => setOpen(false)}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <pre className={classes.fullPre}>{text}</pre>\n </DialogContent>\n <DialogActions>\n <Button color=\"primary\" onClick={() => setOpen(false)}>\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )}\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PreformattedText.esm.js","sources":["../../../src/components/PreformattedText/PreformattedText.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 */\n\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport IconButton from '@material-ui/core/IconButton';\nimport { createStyles, makeStyles } from '@material-ui/core/styles';\nimport CloseIcon from '@material-ui/icons/Close';\nimport React, { useState } from 'react';\nimport { cn } from '../../utils';\n\nconst useStyles = makeStyles(theme =>\n createStyles({\n pre: {\n whiteSpace: 'pre-line',\n wordBreak: 'break-all',\n },\n expandable: {\n cursor: 'pointer',\n },\n fullPre: {\n whiteSpace: 'pre-wrap',\n },\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\ninterface PreformattedTextProps {\n text: string;\n maxChars: number;\n}\n\ninterface ExpandableProps extends PreformattedTextProps {\n expandable: boolean;\n title: string;\n}\n\ninterface NonExpandableProps extends PreformattedTextProps {\n expandable?: never;\n title?: string;\n}\n\nexport const PreformattedText = ({\n text,\n maxChars,\n expandable,\n title,\n}: NonExpandableProps | ExpandableProps) => {\n const [open, setOpen] = useState(false);\n const classes = useStyles();\n\n const handleKeyUp = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (expandable && event.key === 'Enter') {\n setOpen(true);\n }\n };\n\n return (\n <>\n <div\n role={expandable ? 'button' : undefined}\n onClick={() => expandable && setOpen(true)}\n onKeyUp={handleKeyUp}\n tabIndex={expandable ? 0 : undefined}\n >\n <pre className={cn(classes.pre, expandable && classes.expandable)}>\n {text.slice(0, maxChars - 1).trim()}\n {text.length > maxChars - 1 && '…'}\n </pre>\n </div>\n\n {expandable && (\n <Dialog\n open={open}\n onClose={() => setOpen(false)}\n aria-labelledby=\"dialog-title\"\n aria-describedby=\"dialog-description\"\n maxWidth=\"xl\"\n fullWidth\n >\n <DialogTitle id=\"dialog-title\">\n {title}\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={() => setOpen(false)}\n >\n <CloseIcon />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <pre className={classes.fullPre}>{text}</pre>\n </DialogContent>\n <DialogActions>\n <Button color=\"primary\" onClick={() => setOpen(false)}>\n Close\n </Button>\n </DialogActions>\n </Dialog>\n )}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AA2BA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,WAC3B,YAAa,CAAA;AAAA,IACX,GAAK,EAAA;AAAA,MACH,UAAY,EAAA,UAAA;AAAA,MACZ,SAAW,EAAA;AAAA,KACb;AAAA,IACA,UAAY,EAAA;AAAA,MACV,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,OAAS,EAAA;AAAA,MACP,UAAY,EAAA;AAAA,KACd;AAAA,IACA,WAAa,EAAA;AAAA,MACX,QAAU,EAAA,UAAA;AAAA,MACV,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACtB,GAAA,EAAK,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACpB,KAAO,EAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,CAAK,GAAG;AAAA;AAC/B,GACD;AACH,CAAA;AAiBO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,IAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAA4C,KAAA;AAC1C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,UAAU,SAAU,EAAA;AAE1B,EAAM,MAAA,WAAA,GAAc,CAAC,KAA+C,KAAA;AAClE,IAAI,IAAA,UAAA,IAAc,KAAM,CAAA,GAAA,KAAQ,OAAS,EAAA;AACvC,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA;AACd,GACF;AAEA,EAAA,uBAEI,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,aAAa,QAAW,GAAA,KAAA,CAAA;AAAA,MAC9B,OAAS,EAAA,MAAM,UAAc,IAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACzC,OAAS,EAAA,WAAA;AAAA,MACT,QAAA,EAAU,aAAa,CAAI,GAAA,KAAA;AAAA,KAAA;AAAA,oBAE3B,KAAA,CAAA,aAAA,CAAC,SAAI,SAAW,EAAA,EAAA,CAAG,QAAQ,GAAK,EAAA,UAAA,IAAc,OAAQ,CAAA,UAAU,CAC7D,EAAA,EAAA,IAAA,CAAK,MAAM,CAAG,EAAA,QAAA,GAAW,CAAC,CAAE,CAAA,IAAA,IAC5B,IAAK,CAAA,MAAA,GAAS,QAAW,GAAA,CAAA,IAAK,QACjC;AAAA,KAGD,UACC,oBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC5B,iBAAgB,EAAA,cAAA;AAAA,MAChB,kBAAiB,EAAA,oBAAA;AAAA,MACjB,QAAS,EAAA,IAAA;AAAA,MACT,SAAS,EAAA;AAAA,KAAA;AAAA,oBAER,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,EAAG,EAAA,cAAA,EAAA,EACb,KACD,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,YAAW,EAAA,OAAA;AAAA,QACX,WAAW,OAAQ,CAAA,WAAA;AAAA,QACnB,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK;AAAA,OAAA;AAAA,0CAE3B,SAAU,EAAA,IAAA;AAAA,KAEf,CAAA;AAAA,oBACA,KAAA,CAAA,aAAA,CAAC,qCACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,WAAW,OAAQ,CAAA,OAAA,EAAA,EAAU,IAAK,CACzC,CAAA;AAAA,oBACC,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAO,KAAM,EAAA,SAAA,EAAU,OAAS,EAAA,MAAM,OAAQ,CAAA,KAAK,CAAG,EAAA,EAAA,OAEvD,CACF;AAAA,GAGN,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"StatusCell.esm.js","sources":["../../../src/components/StatusCell/StatusCell.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 */\n\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { makeStyles, Theme } from '@material-ui/core/styles';\nimport React from 'react';\nimport { BuildStatus, BuildStatusResult, xcmetricsApiRef } from '../../api';\nimport { cn, formatDuration, formatStatus } from '../../utils';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { Progress } from '@backstage/core-components';\n\ninterface TooltipContentProps {\n buildId: string;\n}\n\nconst TooltipContent = ({ buildId }: TooltipContentProps) => {\n const client = useApi(xcmetricsApiRef);\n const { value, loading, error } = useAsync(\n async () => client.getBuild(buildId),\n [],\n );\n\n if (error) {\n return <div>{error.message}</div>;\n }\n\n if (loading || !value?.build) {\n return <Progress style={{ width: 100 }} />;\n }\n\n return (\n <table>\n <tbody>\n <tr>\n <td>Started</td>\n <td>{new Date(value.build.startTimestamp).toLocaleString()}</td>\n </tr>\n <tr>\n <td>Duration</td>\n <td>{formatDuration(value.build.duration)}</td>\n </tr>\n <tr>\n <td>Status</td>\n <td>{formatStatus(value.build.buildStatus)}</td>\n </tr>\n </tbody>\n </table>\n );\n};\n\ninterface StatusCellProps {\n buildStatus?: BuildStatusResult;\n size: number;\n spacing: number;\n}\n\ntype StatusStyle = {\n [key in BuildStatus]: any;\n};\n\nconst useStyles = makeStyles<Theme, StatusCellProps>(theme => ({\n root: {\n width: ({ size }) => size,\n height: ({ size }) => size,\n marginRight: ({ spacing }) => spacing,\n marginBottom: ({ spacing }) => spacing,\n backgroundColor: theme.palette.grey[600],\n '&:hover': {\n transform: 'scale(1.2)',\n },\n },\n ...({\n succeeded: {\n backgroundColor:\n theme.palette.type === 'light'\n ? theme.palette.success.light\n : theme.palette.success.main,\n },\n } as StatusStyle), // Make sure that key matches a status\n ...({\n failed: {\n backgroundColor: theme.palette.error[theme.palette.type],\n },\n } as StatusStyle),\n ...({\n stopped: {\n backgroundColor: theme.palette.warning[theme.palette.type],\n },\n } as StatusStyle),\n}));\n\nexport const StatusCell = (props: StatusCellProps) => {\n const classes = useStyles(props);\n const { buildStatus } = props;\n\n if (!buildStatus) {\n return <div className={classes.root} />;\n }\n\n return (\n <Tooltip\n title={<TooltipContent buildId={buildStatus.id} />}\n enterNextDelay={500}\n arrow\n >\n <div\n data-testid={buildStatus.id}\n className={cn(classes.root, classes[buildStatus.buildStatus])}\n />\n </Tooltip>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StatusCell.esm.js","sources":["../../../src/components/StatusCell/StatusCell.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 */\n\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { makeStyles, Theme } from '@material-ui/core/styles';\nimport React from 'react';\nimport { BuildStatus, BuildStatusResult, xcmetricsApiRef } from '../../api';\nimport { cn, formatDuration, formatStatus } from '../../utils';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { Progress } from '@backstage/core-components';\n\ninterface TooltipContentProps {\n buildId: string;\n}\n\nconst TooltipContent = ({ buildId }: TooltipContentProps) => {\n const client = useApi(xcmetricsApiRef);\n const { value, loading, error } = useAsync(\n async () => client.getBuild(buildId),\n [],\n );\n\n if (error) {\n return <div>{error.message}</div>;\n }\n\n if (loading || !value?.build) {\n return <Progress style={{ width: 100 }} />;\n }\n\n return (\n <table>\n <tbody>\n <tr>\n <td>Started</td>\n <td>{new Date(value.build.startTimestamp).toLocaleString()}</td>\n </tr>\n <tr>\n <td>Duration</td>\n <td>{formatDuration(value.build.duration)}</td>\n </tr>\n <tr>\n <td>Status</td>\n <td>{formatStatus(value.build.buildStatus)}</td>\n </tr>\n </tbody>\n </table>\n );\n};\n\ninterface StatusCellProps {\n buildStatus?: BuildStatusResult;\n size: number;\n spacing: number;\n}\n\ntype StatusStyle = {\n [key in BuildStatus]: any;\n};\n\nconst useStyles = makeStyles<Theme, StatusCellProps>(theme => ({\n root: {\n width: ({ size }) => size,\n height: ({ size }) => size,\n marginRight: ({ spacing }) => spacing,\n marginBottom: ({ spacing }) => spacing,\n backgroundColor: theme.palette.grey[600],\n '&:hover': {\n transform: 'scale(1.2)',\n },\n },\n ...({\n succeeded: {\n backgroundColor:\n theme.palette.type === 'light'\n ? theme.palette.success.light\n : theme.palette.success.main,\n },\n } as StatusStyle), // Make sure that key matches a status\n ...({\n failed: {\n backgroundColor: theme.palette.error[theme.palette.type],\n },\n } as StatusStyle),\n ...({\n stopped: {\n backgroundColor: theme.palette.warning[theme.palette.type],\n },\n } as StatusStyle),\n}));\n\nexport const StatusCell = (props: StatusCellProps) => {\n const classes = useStyles(props);\n const { buildStatus } = props;\n\n if (!buildStatus) {\n return <div className={classes.root} />;\n }\n\n return (\n <Tooltip\n title={<TooltipContent buildId={buildStatus.id} />}\n enterNextDelay={500}\n arrow\n >\n <div\n data-testid={buildStatus.id}\n className={cn(classes.root, classes[buildStatus.buildStatus])}\n />\n </Tooltip>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"StatusIcon.esm.js","sources":["../../../src/components/StatusIcon/StatusIcon.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 {\n StatusAborted,\n StatusError,\n StatusOK,\n StatusWarning,\n} from '@backstage/core-components';\nimport { BuildStatus } from '../../api';\n\nconst STATUS_ICONS: { [key in BuildStatus]: JSX.Element } = {\n succeeded: <StatusOK />,\n failed: <StatusError />,\n stopped: <StatusWarning />,\n};\n\ninterface StatusIconProps {\n buildStatus: BuildStatus;\n}\n\nexport const StatusIcon = ({ buildStatus }: StatusIconProps) =>\n STATUS_ICONS[buildStatus] ?? <StatusAborted />;\n"],"names":[],"mappings":";;;AAwBA,MAAM,YAAsD,GAAA;AAAA,EAC1D,SAAA,sCAAY,QAAS,EAAA,IAAA,CAAA;AAAA,EACrB,MAAA,sCAAS,WAAY,EAAA,IAAA,CAAA;AAAA,EACrB,OAAA,sCAAU,aAAc,EAAA,IAAA,CAAA;AAC1B,CAAA,CAAA;AAMa,MAAA,UAAA,GAAa,CAAC,EAAE,WAAA,OAC3B,YAAa,CAAA,WAAW,CAAK,oBAAA,KAAA,CAAA,aAAA,CAAC,aAAc,EAAA,IAAA;;;;"}
1
+ {"version":3,"file":"StatusIcon.esm.js","sources":["../../../src/components/StatusIcon/StatusIcon.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 {\n StatusAborted,\n StatusError,\n StatusOK,\n StatusWarning,\n} from '@backstage/core-components';\nimport { BuildStatus } from '../../api';\n\nconst STATUS_ICONS: { [key in BuildStatus]: JSX.Element } = {\n succeeded: <StatusOK />,\n failed: <StatusError />,\n stopped: <StatusWarning />,\n};\n\ninterface StatusIconProps {\n buildStatus: BuildStatus;\n}\n\nexport const StatusIcon = ({ buildStatus }: StatusIconProps) =>\n STATUS_ICONS[buildStatus] ?? <StatusAborted />;\n"],"names":[],"mappings":";;;AAwBA,MAAM,YAAsD,GAAA;AAAA,EAC1D,SAAA,sCAAY,QAAS,EAAA,IAAA,CAAA;AAAA,EACrB,MAAA,sCAAS,WAAY,EAAA,IAAA,CAAA;AAAA,EACrB,OAAA,sCAAU,aAAc,EAAA,IAAA;AAC1B,CAAA;AAMa,MAAA,UAAA,GAAa,CAAC,EAAE,WAAA,OAC3B,YAAa,CAAA,WAAW,CAAK,oBAAA,KAAA,CAAA,aAAA,CAAC,aAAc,EAAA,IAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"StatusMatrix.esm.js","sources":["../../../src/components/StatusMatrix/StatusMatrix.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 */\n\nimport React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { xcmetricsApiRef } from '../../api';\nimport useAsync from 'react-use/esm/useAsync';\nimport useMeasure from 'react-use/esm/useMeasure';\nimport { cn } from '../../utils';\nimport { useApi } from '@backstage/core-plugin-api';\nimport Alert from '@material-ui/lab/Alert';\nimport { StatusCell } from '../StatusCell';\n\nconst CELL_SIZE = 12;\nconst CELL_MARGIN = 4;\nconst MAX_ROWS = 4;\n\nconst useStyles = makeStyles(theme => ({\n root: {\n marginTop: 8,\n display: 'flex',\n flexWrap: 'wrap',\n width: '100%',\n },\n loading: {\n animation: `$loadingOpacity 900ms ${theme.transitions.easing.easeInOut}`,\n animationIterationCount: 'infinite',\n },\n '@keyframes loadingOpacity': {\n '0%': { opacity: 0.3 },\n '100%': { opacity: 0.8 },\n },\n}));\n\nexport const StatusMatrix = () => {\n const classes = useStyles();\n const [measureRef, { width: rootWidth }] = useMeasure<HTMLDivElement>();\n const client = useApi(xcmetricsApiRef);\n const {\n value: builds,\n loading,\n error,\n } = useAsync(async () => client.getBuildStatuses(300), []);\n\n if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n const cols = Math.trunc(rootWidth / (CELL_SIZE + CELL_MARGIN)) || 1;\n\n return (\n <div\n className={cn(classes.root, loading && classes.loading)}\n ref={measureRef}\n >\n {loading &&\n [...new Array(cols * MAX_ROWS)].map((_, index) => {\n return (\n <StatusCell key={index} size={CELL_SIZE} spacing={CELL_MARGIN} />\n );\n })}\n\n {builds &&\n builds\n .slice(0, cols * MAX_ROWS)\n .map((buildStatus, index) => (\n <StatusCell\n key={index}\n buildStatus={buildStatus}\n size={CELL_SIZE}\n spacing={CELL_MARGIN}\n />\n ))}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AA0BA,MAAM,SAAY,GAAA,EAAA,CAAA;AAClB,MAAM,WAAc,GAAA,CAAA,CAAA;AACpB,MAAM,QAAW,GAAA,CAAA,CAAA;AAEjB,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,IAAM,EAAA;AAAA,IACJ,SAAW,EAAA,CAAA;AAAA,IACX,OAAS,EAAA,MAAA;AAAA,IACT,QAAU,EAAA,MAAA;AAAA,IACV,KAAO,EAAA,MAAA;AAAA,GACT;AAAA,EACA,OAAS,EAAA;AAAA,IACP,SAAW,EAAA,CAAA,sBAAA,EAAyB,KAAM,CAAA,WAAA,CAAY,OAAO,SAAS,CAAA,CAAA;AAAA,IACtE,uBAAyB,EAAA,UAAA;AAAA,GAC3B;AAAA,EACA,2BAA6B,EAAA;AAAA,IAC3B,IAAA,EAAM,EAAE,OAAA,EAAS,GAAI,EAAA;AAAA,IACrB,MAAA,EAAQ,EAAE,OAAA,EAAS,GAAI,EAAA;AAAA,GACzB;AACF,CAAE,CAAA,CAAA,CAAA;AAEK,MAAM,eAAe,MAAM;AAChC,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAC1B,EAAA,MAAM,CAAC,UAAY,EAAA,EAAE,OAAO,SAAU,EAAC,IAAI,UAA2B,EAAA,CAAA;AACtE,EAAM,MAAA,MAAA,GAAS,OAAO,eAAe,CAAA,CAAA;AACrC,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,MAAA;AAAA,IACP,OAAA;AAAA,IACA,KAAA;AAAA,GACF,GAAI,SAAS,YAAY,MAAA,CAAO,iBAAiB,GAAG,CAAA,EAAG,EAAE,CAAA,CAAA;AAEzD,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,OAAA,EAAA,EAAS,MAAM,OAAQ,CAAA,CAAA;AAAA,GAChD;AAEA,EAAA,MAAM,OAAO,IAAK,CAAA,KAAA,CAAM,SAAa,IAAA,SAAA,GAAY,YAAY,CAAK,IAAA,CAAA,CAAA;AAElE,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAW,EAAG,CAAA,OAAA,CAAQ,IAAM,EAAA,OAAA,IAAW,QAAQ,OAAO,CAAA;AAAA,MACtD,GAAK,EAAA,UAAA;AAAA,KAAA;AAAA,IAEJ,OACC,IAAA,CAAC,GAAG,IAAI,KAAM,CAAA,IAAA,GAAO,QAAQ,CAAC,CAAE,CAAA,GAAA,CAAI,CAAC,CAAA,EAAG,KAAU,KAAA;AAChD,MAAA,2CACG,UAAW,EAAA,EAAA,GAAA,EAAK,OAAO,IAAM,EAAA,SAAA,EAAW,SAAS,WAAa,EAAA,CAAA,CAAA;AAAA,KAElE,CAAA;AAAA,IAEF,MAAA,IACC,MACG,CAAA,KAAA,CAAM,CAAG,EAAA,IAAA,GAAO,QAAQ,CACxB,CAAA,GAAA,CAAI,CAAC,WAAA,EAAa,KACjB,qBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAK,EAAA,KAAA;AAAA,QACL,WAAA;AAAA,QACA,IAAM,EAAA,SAAA;AAAA,QACN,OAAS,EAAA,WAAA;AAAA,OAAA;AAAA,KAEZ,CAAA;AAAA,GACP,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"StatusMatrix.esm.js","sources":["../../../src/components/StatusMatrix/StatusMatrix.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 */\n\nimport React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { xcmetricsApiRef } from '../../api';\nimport useAsync from 'react-use/esm/useAsync';\nimport useMeasure from 'react-use/esm/useMeasure';\nimport { cn } from '../../utils';\nimport { useApi } from '@backstage/core-plugin-api';\nimport Alert from '@material-ui/lab/Alert';\nimport { StatusCell } from '../StatusCell';\n\nconst CELL_SIZE = 12;\nconst CELL_MARGIN = 4;\nconst MAX_ROWS = 4;\n\nconst useStyles = makeStyles(theme => ({\n root: {\n marginTop: 8,\n display: 'flex',\n flexWrap: 'wrap',\n width: '100%',\n },\n loading: {\n animation: `$loadingOpacity 900ms ${theme.transitions.easing.easeInOut}`,\n animationIterationCount: 'infinite',\n },\n '@keyframes loadingOpacity': {\n '0%': { opacity: 0.3 },\n '100%': { opacity: 0.8 },\n },\n}));\n\nexport const StatusMatrix = () => {\n const classes = useStyles();\n const [measureRef, { width: rootWidth }] = useMeasure<HTMLDivElement>();\n const client = useApi(xcmetricsApiRef);\n const {\n value: builds,\n loading,\n error,\n } = useAsync(async () => client.getBuildStatuses(300), []);\n\n if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n const cols = Math.trunc(rootWidth / (CELL_SIZE + CELL_MARGIN)) || 1;\n\n return (\n <div\n className={cn(classes.root, loading && classes.loading)}\n ref={measureRef}\n >\n {loading &&\n [...new Array(cols * MAX_ROWS)].map((_, index) => {\n return (\n <StatusCell key={index} size={CELL_SIZE} spacing={CELL_MARGIN} />\n );\n })}\n\n {builds &&\n builds\n .slice(0, cols * MAX_ROWS)\n .map((buildStatus, index) => (\n <StatusCell\n key={index}\n buildStatus={buildStatus}\n size={CELL_SIZE}\n spacing={CELL_MARGIN}\n />\n ))}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;AA0BA,MAAM,SAAY,GAAA,EAAA;AAClB,MAAM,WAAc,GAAA,CAAA;AACpB,MAAM,QAAW,GAAA,CAAA;AAEjB,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,IAAM,EAAA;AAAA,IACJ,SAAW,EAAA,CAAA;AAAA,IACX,OAAS,EAAA,MAAA;AAAA,IACT,QAAU,EAAA,MAAA;AAAA,IACV,KAAO,EAAA;AAAA,GACT;AAAA,EACA,OAAS,EAAA;AAAA,IACP,SAAW,EAAA,CAAA,sBAAA,EAAyB,KAAM,CAAA,WAAA,CAAY,OAAO,SAAS,CAAA,CAAA;AAAA,IACtE,uBAAyB,EAAA;AAAA,GAC3B;AAAA,EACA,2BAA6B,EAAA;AAAA,IAC3B,IAAA,EAAM,EAAE,OAAA,EAAS,GAAI,EAAA;AAAA,IACrB,MAAA,EAAQ,EAAE,OAAA,EAAS,GAAI;AAAA;AAE3B,CAAE,CAAA,CAAA;AAEK,MAAM,eAAe,MAAM;AAChC,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAA,MAAM,CAAC,UAAY,EAAA,EAAE,OAAO,SAAU,EAAC,IAAI,UAA2B,EAAA;AACtE,EAAM,MAAA,MAAA,GAAS,OAAO,eAAe,CAAA;AACrC,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,MAAA;AAAA,IACP,OAAA;AAAA,IACA;AAAA,GACF,GAAI,SAAS,YAAY,MAAA,CAAO,iBAAiB,GAAG,CAAA,EAAG,EAAE,CAAA;AAEzD,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,OAAA,EAAA,EAAS,MAAM,OAAQ,CAAA;AAAA;AAGhD,EAAA,MAAM,OAAO,IAAK,CAAA,KAAA,CAAM,SAAa,IAAA,SAAA,GAAY,YAAY,CAAK,IAAA,CAAA;AAElE,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAW,EAAG,CAAA,OAAA,CAAQ,IAAM,EAAA,OAAA,IAAW,QAAQ,OAAO,CAAA;AAAA,MACtD,GAAK,EAAA;AAAA,KAAA;AAAA,IAEJ,OACC,IAAA,CAAC,GAAG,IAAI,KAAM,CAAA,IAAA,GAAO,QAAQ,CAAC,CAAE,CAAA,GAAA,CAAI,CAAC,CAAA,EAAG,KAAU,KAAA;AAChD,MAAA,2CACG,UAAW,EAAA,EAAA,GAAA,EAAK,OAAO,IAAM,EAAA,SAAA,EAAW,SAAS,WAAa,EAAA,CAAA;AAAA,KAElE,CAAA;AAAA,IAEF,MAAA,IACC,MACG,CAAA,KAAA,CAAM,CAAG,EAAA,IAAA,GAAO,QAAQ,CACxB,CAAA,GAAA,CAAI,CAAC,WAAA,EAAa,KACjB,qBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAK,EAAA,KAAA;AAAA,QACL,WAAA;AAAA,QACA,IAAM,EAAA,SAAA;AAAA,QACN,OAAS,EAAA;AAAA;AAAA,KAEZ;AAAA,GACP;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Trend.esm.js","sources":["../../../src/components/Trend/Trend.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 { TrendLine } from '@backstage/core-components';\nimport Typography from '@material-ui/core/Typography';\n\ninterface TrendProps {\n data?: number[];\n title: string;\n color: string;\n}\n\nexport const Trend = ({ data, title, color }: TrendProps) => {\n const emptyData = [0, 0];\n const max = Math.max(...(data ?? emptyData));\n\n return (\n <>\n <Typography variant=\"overline\">{title}</Typography>\n <TrendLine\n data={data ?? emptyData}\n title={title}\n max={max}\n color={data && color}\n />\n </>\n );\n};\n"],"names":[],"mappings":";;;;AAyBO,MAAM,QAAQ,CAAC,EAAE,IAAM,EAAA,KAAA,EAAO,OAAwB,KAAA;AAC3D,EAAM,MAAA,SAAA,GAAY,CAAC,CAAA,EAAG,CAAC,CAAA,CAAA;AACvB,EAAA,MAAM,GAAM,GAAA,IAAA,CAAK,GAAI,CAAA,GAAI,QAAQ,SAAU,CAAA,CAAA;AAE3C,EAAA,iFAEK,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,UAAA,EAAA,EAAY,KAAM,CACtC,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,MAAM,IAAQ,IAAA,SAAA;AAAA,MACd,KAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAO,IAAQ,IAAA,KAAA;AAAA,KAAA;AAAA,GAEnB,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"Trend.esm.js","sources":["../../../src/components/Trend/Trend.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 { TrendLine } from '@backstage/core-components';\nimport Typography from '@material-ui/core/Typography';\n\ninterface TrendProps {\n data?: number[];\n title: string;\n color: string;\n}\n\nexport const Trend = ({ data, title, color }: TrendProps) => {\n const emptyData = [0, 0];\n const max = Math.max(...(data ?? emptyData));\n\n return (\n <>\n <Typography variant=\"overline\">{title}</Typography>\n <TrendLine\n data={data ?? emptyData}\n title={title}\n max={max}\n color={data && color}\n />\n </>\n );\n};\n"],"names":[],"mappings":";;;;AAyBO,MAAM,QAAQ,CAAC,EAAE,IAAM,EAAA,KAAA,EAAO,OAAwB,KAAA;AAC3D,EAAM,MAAA,SAAA,GAAY,CAAC,CAAA,EAAG,CAAC,CAAA;AACvB,EAAA,MAAM,GAAM,GAAA,IAAA,CAAK,GAAI,CAAA,GAAI,QAAQ,SAAU,CAAA;AAE3C,EAAA,iFAEK,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,UAAA,EAAA,EAAY,KAAM,CACtC,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,MAAM,IAAQ,IAAA,SAAA;AAAA,MACd,KAAA;AAAA,MACA,GAAA;AAAA,MACA,OAAO,IAAQ,IAAA;AAAA;AAAA,GAEnB,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"XcmetricsLayout.esm.js","sources":["../../../src/components/XcmetricsLayout/XcmetricsLayout.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, { ReactChild } from 'react';\nimport {\n Content,\n Header,\n HeaderLabel,\n Page,\n TabbedLayout,\n} from '@backstage/core-components';\nimport { Overview } from '../Overview';\nimport { buildsRouteRef } from '../../routes';\nimport { BuildList } from '../BuildList';\n\nexport interface TabConfig {\n path: string;\n title: string;\n component: ReactChild;\n}\n\nconst TABS: TabConfig[] = [\n {\n path: '/',\n title: 'Overview',\n component: <Overview />,\n },\n {\n path: buildsRouteRef.path,\n title: 'Builds',\n component: <BuildList />,\n },\n];\n\nexport const XcmetricsLayout = () => (\n <Page themeId=\"tool\">\n <Header title=\"XCMetrics\" subtitle=\"Dashboard\">\n <HeaderLabel label=\"Owner\" value=\"Spotify\" />\n <HeaderLabel label=\"Lifecycle\" value=\"Alpha\" />\n </Header>\n <TabbedLayout>\n {TABS.map(tab => (\n <TabbedLayout.Route key={tab.path} path={tab.path} title={tab.title}>\n <Content>{tab.component}</Content>\n </TabbedLayout.Route>\n ))}\n </TabbedLayout>\n </Page>\n);\n"],"names":[],"mappings":";;;;;;AAiCA,MAAM,IAAoB,GAAA;AAAA,EACxB;AAAA,IACE,IAAM,EAAA,GAAA;AAAA,IACN,KAAO,EAAA,UAAA;AAAA,IACP,SAAA,sCAAY,QAAS,EAAA,IAAA,CAAA;AAAA,GACvB;AAAA,EACA;AAAA,IACE,MAAM,cAAe,CAAA,IAAA;AAAA,IACrB,KAAO,EAAA,QAAA;AAAA,IACP,SAAA,sCAAY,SAAU,EAAA,IAAA,CAAA;AAAA,GACxB;AACF,CAAA,CAAA;AAEa,MAAA,eAAA,GAAkB,sBAC7B,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,0BACX,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAO,KAAM,EAAA,WAAA,EAAY,QAAS,EAAA,WAAA,EAAA,sCAChC,WAAY,EAAA,EAAA,KAAA,EAAM,OAAQ,EAAA,KAAA,EAAM,SAAU,EAAA,CAAA,sCAC1C,WAAY,EAAA,EAAA,KAAA,EAAM,WAAY,EAAA,KAAA,EAAM,OAAQ,EAAA,CAC/C,mBACC,KAAA,CAAA,aAAA,CAAA,YAAA,EAAA,IAAA,EACE,IAAK,CAAA,GAAA,CAAI,CACR,GAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,aAAa,KAAb,EAAA,EAAmB,GAAK,EAAA,GAAA,CAAI,IAAM,EAAA,IAAA,EAAM,IAAI,IAAM,EAAA,KAAA,EAAO,GAAI,CAAA,KAAA,EAAA,kBAC3D,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA,EAAS,IAAI,SAAU,CAC1B,CACD,CACH,CACF;;;;"}
1
+ {"version":3,"file":"XcmetricsLayout.esm.js","sources":["../../../src/components/XcmetricsLayout/XcmetricsLayout.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, { ReactChild } from 'react';\nimport {\n Content,\n Header,\n HeaderLabel,\n Page,\n TabbedLayout,\n} from '@backstage/core-components';\nimport { Overview } from '../Overview';\nimport { buildsRouteRef } from '../../routes';\nimport { BuildList } from '../BuildList';\n\nexport interface TabConfig {\n path: string;\n title: string;\n component: ReactChild;\n}\n\nconst TABS: TabConfig[] = [\n {\n path: '/',\n title: 'Overview',\n component: <Overview />,\n },\n {\n path: buildsRouteRef.path,\n title: 'Builds',\n component: <BuildList />,\n },\n];\n\nexport const XcmetricsLayout = () => (\n <Page themeId=\"tool\">\n <Header title=\"XCMetrics\" subtitle=\"Dashboard\">\n <HeaderLabel label=\"Owner\" value=\"Spotify\" />\n <HeaderLabel label=\"Lifecycle\" value=\"Alpha\" />\n </Header>\n <TabbedLayout>\n {TABS.map(tab => (\n <TabbedLayout.Route key={tab.path} path={tab.path} title={tab.title}>\n <Content>{tab.component}</Content>\n </TabbedLayout.Route>\n ))}\n </TabbedLayout>\n </Page>\n);\n"],"names":[],"mappings":";;;;;;AAiCA,MAAM,IAAoB,GAAA;AAAA,EACxB;AAAA,IACE,IAAM,EAAA,GAAA;AAAA,IACN,KAAO,EAAA,UAAA;AAAA,IACP,SAAA,sCAAY,QAAS,EAAA,IAAA;AAAA,GACvB;AAAA,EACA;AAAA,IACE,MAAM,cAAe,CAAA,IAAA;AAAA,IACrB,KAAO,EAAA,QAAA;AAAA,IACP,SAAA,sCAAY,SAAU,EAAA,IAAA;AAAA;AAE1B,CAAA;AAEa,MAAA,eAAA,GAAkB,sBAC7B,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,0BACX,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAO,KAAM,EAAA,WAAA,EAAY,QAAS,EAAA,WAAA,EAAA,sCAChC,WAAY,EAAA,EAAA,KAAA,EAAM,OAAQ,EAAA,KAAA,EAAM,SAAU,EAAA,CAAA,sCAC1C,WAAY,EAAA,EAAA,KAAA,EAAM,WAAY,EAAA,KAAA,EAAM,OAAQ,EAAA,CAC/C,mBACC,KAAA,CAAA,aAAA,CAAA,YAAA,EAAA,IAAA,EACE,IAAK,CAAA,GAAA,CAAI,CACR,GAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,aAAa,KAAb,EAAA,EAAmB,GAAK,EAAA,GAAA,CAAI,IAAM,EAAA,IAAA,EAAM,IAAI,IAAM,EAAA,KAAA,EAAO,GAAI,CAAA,KAAA,EAAA,kBAC3D,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,IAAA,EAAS,IAAI,SAAU,CAC1B,CACD,CACH,CACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"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 */\n\nimport {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport { xcmetricsApiRef, XcmetricsClient } from './api';\nimport { rootRouteRef } from './routes';\n\n/** @public */\nexport const xcmetricsPlugin = createPlugin({\n id: 'xcmetrics',\n routes: {\n root: rootRouteRef,\n },\n apis: [\n createApiFactory({\n api: xcmetricsApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory({ discoveryApi, fetchApi }) {\n return new XcmetricsClient({ discoveryApi, fetchApi });\n },\n }),\n ],\n});\n\n/** @public */\nexport const XcmetricsPage = xcmetricsPlugin.provide(\n createRoutableExtension({\n name: 'XcmetricsPage',\n component: () =>\n import('./components/XcmetricsLayout').then(m => m.XcmetricsLayout),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;AA2BO,MAAM,kBAAkB,YAAa,CAAA;AAAA,EAC1C,EAAI,EAAA,WAAA;AAAA,EACJ,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,YAAA;AAAA,GACR;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,eAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,QAAU,EAAA,WAAA;AAAA,OACZ;AAAA,MACA,OAAQ,CAAA,EAAE,YAAc,EAAA,QAAA,EAAY,EAAA;AAClC,QAAA,OAAO,IAAI,eAAA,CAAgB,EAAE,YAAA,EAAc,UAAU,CAAA,CAAA;AAAA,OACvD;AAAA,KACD,CAAA;AAAA,GACH;AACF,CAAC,EAAA;AAGM,MAAM,gBAAgB,eAAgB,CAAA,OAAA;AAAA,EAC3C,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,eAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,2CAA8B,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,eAAe,CAAA;AAAA,IACpE,UAAY,EAAA,YAAA;AAAA,GACb,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"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 */\n\nimport {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n} from '@backstage/core-plugin-api';\nimport { xcmetricsApiRef, XcmetricsClient } from './api';\nimport { rootRouteRef } from './routes';\n\n/** @public */\nexport const xcmetricsPlugin = createPlugin({\n id: 'xcmetrics',\n routes: {\n root: rootRouteRef,\n },\n apis: [\n createApiFactory({\n api: xcmetricsApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory({ discoveryApi, fetchApi }) {\n return new XcmetricsClient({ discoveryApi, fetchApi });\n },\n }),\n ],\n});\n\n/** @public */\nexport const XcmetricsPage = xcmetricsPlugin.provide(\n createRoutableExtension({\n name: 'XcmetricsPage',\n component: () =>\n import('./components/XcmetricsLayout').then(m => m.XcmetricsLayout),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;AA2BO,MAAM,kBAAkB,YAAa,CAAA;AAAA,EAC1C,EAAI,EAAA,WAAA;AAAA,EACJ,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA;AAAA,GACR;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,eAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,OAAQ,CAAA,EAAE,YAAc,EAAA,QAAA,EAAY,EAAA;AAClC,QAAA,OAAO,IAAI,eAAA,CAAgB,EAAE,YAAA,EAAc,UAAU,CAAA;AAAA;AACvD,KACD;AAAA;AAEL,CAAC;AAGM,MAAM,gBAAgB,eAAgB,CAAA,OAAA;AAAA,EAC3C,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,eAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,2CAA8B,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,eAAe,CAAA;AAAA,IACpE,UAAY,EAAA;AAAA,GACb;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"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 { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'xcmetrics',\n});\n\nexport const buildsRouteRef = createSubRouteRef({\n id: 'xcmetrics-builds',\n parent: rootRouteRef,\n path: '/builds',\n});\n"],"names":[],"mappings":";;AAiBO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA,WAAA;AACN,CAAC,EAAA;AAEM,MAAM,iBAAiB,iBAAkB,CAAA;AAAA,EAC9C,EAAI,EAAA,kBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA,SAAA;AACR,CAAC;;;;"}
1
+ {"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"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 { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'xcmetrics',\n});\n\nexport const buildsRouteRef = createSubRouteRef({\n id: 'xcmetrics-builds',\n parent: rootRouteRef,\n path: '/builds',\n});\n"],"names":[],"mappings":";;AAiBO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA;AACN,CAAC;AAEM,MAAM,iBAAiB,iBAAkB,CAAA;AAAA,EAC9C,EAAI,EAAA,kBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"array.esm.js","sources":["../../src/utils/array.ts"],"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 */\n\nexport const sumField = <T extends {}>(\n field: (element: T) => number,\n arr?: T[],\n) => {\n return arr?.reduce((sum, current) => sum + field(current), 0);\n};\n\nexport const getValues = <T extends {}>(\n field: (element: T) => number,\n arr?: T[],\n) => {\n if (!arr?.length) {\n return undefined;\n }\n\n return arr.map(element => field(element));\n};\n"],"names":[],"mappings":"AAgBa,MAAA,QAAA,GAAW,CACtB,KAAA,EACA,GACG,KAAA;AACH,EAAO,OAAA,GAAA,EAAK,OAAO,CAAC,GAAA,EAAK,YAAY,GAAM,GAAA,KAAA,CAAM,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA;AAC9D,EAAA;AAEa,MAAA,SAAA,GAAY,CACvB,KAAA,EACA,GACG,KAAA;AACH,EAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AAEA,EAAA,OAAO,GAAI,CAAA,GAAA,CAAI,CAAW,OAAA,KAAA,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA;AAC1C;;;;"}
1
+ {"version":3,"file":"array.esm.js","sources":["../../src/utils/array.ts"],"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 */\n\nexport const sumField = <T extends {}>(\n field: (element: T) => number,\n arr?: T[],\n) => {\n return arr?.reduce((sum, current) => sum + field(current), 0);\n};\n\nexport const getValues = <T extends {}>(\n field: (element: T) => number,\n arr?: T[],\n) => {\n if (!arr?.length) {\n return undefined;\n }\n\n return arr.map(element => field(element));\n};\n"],"names":[],"mappings":"AAgBa,MAAA,QAAA,GAAW,CACtB,KAAA,EACA,GACG,KAAA;AACH,EAAO,OAAA,GAAA,EAAK,OAAO,CAAC,GAAA,EAAK,YAAY,GAAM,GAAA,KAAA,CAAM,OAAO,CAAA,EAAG,CAAC,CAAA;AAC9D;AAEa,MAAA,SAAA,GAAY,CACvB,KAAA,EACA,GACG,KAAA;AACH,EAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,IAAO,OAAA,KAAA,CAAA;AAAA;AAGT,EAAA,OAAO,GAAI,CAAA,GAAA,CAAI,CAAW,OAAA,KAAA,KAAA,CAAM,OAAO,CAAC,CAAA;AAC1C;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"buildData.esm.js","sources":["../../src/utils/buildData.ts"],"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 */\n\nimport { formatDuration } from './format';\nimport { BuildCount, BuildTime } from '../api';\n\nexport const getErrorRatios = (buildCounts?: BuildCount[]) => {\n if (!buildCounts?.length) {\n return undefined;\n }\n\n return buildCounts.map(counts =>\n counts.builds === 0 ? 0 : counts.errors / counts.builds,\n );\n};\n\nexport const getAverageDuration = (\n buildTimes: BuildTime[] | undefined,\n field: (b: BuildTime) => number,\n) => {\n if (!buildTimes?.length) {\n return undefined;\n }\n\n return formatDuration(\n buildTimes.reduce((sum, current) => sum + field(current), 0) /\n buildTimes.length,\n );\n};\n"],"names":[],"mappings":";;AAmBa,MAAA,cAAA,GAAiB,CAAC,WAA+B,KAAA;AAC5D,EAAI,IAAA,CAAC,aAAa,MAAQ,EAAA;AACxB,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AAEA,EAAA,OAAO,WAAY,CAAA,GAAA;AAAA,IAAI,YACrB,MAAO,CAAA,MAAA,KAAW,IAAI,CAAI,GAAA,MAAA,CAAO,SAAS,MAAO,CAAA,MAAA;AAAA,GACnD,CAAA;AACF,EAAA;AAEa,MAAA,kBAAA,GAAqB,CAChC,UAAA,EACA,KACG,KAAA;AACH,EAAI,IAAA,CAAC,YAAY,MAAQ,EAAA;AACvB,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AAEA,EAAO,OAAA,cAAA;AAAA,IACL,UAAA,CAAW,MAAO,CAAA,CAAC,GAAK,EAAA,OAAA,KAAY,GAAM,GAAA,KAAA,CAAM,OAAO,CAAA,EAAG,CAAC,CAAA,GACzD,UAAW,CAAA,MAAA;AAAA,GACf,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"buildData.esm.js","sources":["../../src/utils/buildData.ts"],"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 */\n\nimport { formatDuration } from './format';\nimport { BuildCount, BuildTime } from '../api';\n\nexport const getErrorRatios = (buildCounts?: BuildCount[]) => {\n if (!buildCounts?.length) {\n return undefined;\n }\n\n return buildCounts.map(counts =>\n counts.builds === 0 ? 0 : counts.errors / counts.builds,\n );\n};\n\nexport const getAverageDuration = (\n buildTimes: BuildTime[] | undefined,\n field: (b: BuildTime) => number,\n) => {\n if (!buildTimes?.length) {\n return undefined;\n }\n\n return formatDuration(\n buildTimes.reduce((sum, current) => sum + field(current), 0) /\n buildTimes.length,\n );\n};\n"],"names":[],"mappings":";;AAmBa,MAAA,cAAA,GAAiB,CAAC,WAA+B,KAAA;AAC5D,EAAI,IAAA,CAAC,aAAa,MAAQ,EAAA;AACxB,IAAO,OAAA,KAAA,CAAA;AAAA;AAGT,EAAA,OAAO,WAAY,CAAA,GAAA;AAAA,IAAI,YACrB,MAAO,CAAA,MAAA,KAAW,IAAI,CAAI,GAAA,MAAA,CAAO,SAAS,MAAO,CAAA;AAAA,GACnD;AACF;AAEa,MAAA,kBAAA,GAAqB,CAChC,UAAA,EACA,KACG,KAAA;AACH,EAAI,IAAA,CAAC,YAAY,MAAQ,EAAA;AACvB,IAAO,OAAA,KAAA,CAAA;AAAA;AAGT,EAAO,OAAA,cAAA;AAAA,IACL,UAAA,CAAW,MAAO,CAAA,CAAC,GAAK,EAAA,OAAA,KAAY,GAAM,GAAA,KAAA,CAAM,OAAO,CAAA,EAAG,CAAC,CAAA,GACzD,UAAW,CAAA;AAAA,GACf;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"classnames.esm.js","sources":["../../src/utils/classnames.ts"],"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 */\n\ntype ClassName = string | false | undefined | null;\n\nexport const classNames = (...args: ClassName[]) =>\n args.filter(c => !!c).join(' ');\n\nexport const cn = classNames;\n"],"names":[],"mappings":"AAkBa,MAAA,UAAA,GAAa,CAAI,GAAA,IAAA,KAC5B,IAAK,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAC,CAAC,CAAC,CAAE,CAAA,IAAA,CAAK,GAAG,EAAA;AAEzB,MAAM,EAAK,GAAA;;;;"}
1
+ {"version":3,"file":"classnames.esm.js","sources":["../../src/utils/classnames.ts"],"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 */\n\ntype ClassName = string | false | undefined | null;\n\nexport const classNames = (...args: ClassName[]) =>\n args.filter(c => !!c).join(' ');\n\nexport const cn = classNames;\n"],"names":[],"mappings":"AAkBa,MAAA,UAAA,GAAa,CAAI,GAAA,IAAA,KAC5B,IAAK,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAC,CAAC,CAAC,CAAE,CAAA,IAAA,CAAK,GAAG;AAEzB,MAAM,EAAK,GAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"format.esm.js","sources":["../../src/utils/format.ts"],"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 { DateTime, Duration } from 'luxon';\nimport { BuildStatus } from '../api';\nimport upperFirst from 'lodash/upperFirst';\n\nexport const formatDuration = (seconds: number) => {\n const duration = Duration.fromObject({\n seconds: seconds,\n }).shiftTo('hours', 'minutes', 'seconds', 'milliseconds');\n\n if (duration.hours + duration.minutes + duration.seconds === 0) {\n return `${Math.round(duration.milliseconds)} ms`;\n }\n\n const h = duration.hours ? `${duration.hours} h` : '';\n const m = duration.minutes ? `${duration.minutes} m` : '';\n const s = duration.hours < 12 ? `${duration.seconds ?? 0} s` : '';\n\n return `${h} ${m} ${s}`;\n};\n\nexport const formatSecondsInterval = ([start, end]: [number, number]) => {\n return `${Math.round(start * 100) / 100} s - ${\n Math.round(end * 100) / 100\n } s`;\n};\n\nexport const formatTime = (timestamp: string) => {\n return DateTime.fromISO(timestamp).toLocaleString(\n DateTime.DATETIME_SHORT_WITH_SECONDS,\n );\n};\n\nexport const formatPercentage = (number: number) => {\n return `${Math.round(number * 100)} %`;\n};\n\nexport const formatStatus = (status: BuildStatus) => upperFirst(status);\n"],"names":[],"mappings":";;;AAmBa,MAAA,cAAA,GAAiB,CAAC,OAAoB,KAAA;AACjD,EAAM,MAAA,QAAA,GAAW,SAAS,UAAW,CAAA;AAAA,IACnC,OAAA;AAAA,GACD,CAAE,CAAA,OAAA,CAAQ,OAAS,EAAA,SAAA,EAAW,WAAW,cAAc,CAAA,CAAA;AAExD,EAAA,IAAI,SAAS,KAAQ,GAAA,QAAA,CAAS,OAAU,GAAA,QAAA,CAAS,YAAY,CAAG,EAAA;AAC9D,IAAA,OAAO,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,QAAA,CAAS,YAAY,CAAC,CAAA,GAAA,CAAA,CAAA;AAAA,GAC7C;AAEA,EAAA,MAAM,IAAI,QAAS,CAAA,KAAA,GAAQ,CAAG,EAAA,QAAA,CAAS,KAAK,CAAO,EAAA,CAAA,GAAA,EAAA,CAAA;AACnD,EAAA,MAAM,IAAI,QAAS,CAAA,OAAA,GAAU,CAAG,EAAA,QAAA,CAAS,OAAO,CAAO,EAAA,CAAA,GAAA,EAAA,CAAA;AACvD,EAAM,MAAA,CAAA,GAAI,SAAS,KAAQ,GAAA,EAAA,GAAK,GAAG,QAAS,CAAA,OAAA,IAAW,CAAC,CAAO,EAAA,CAAA,GAAA,EAAA,CAAA;AAE/D,EAAA,OAAO,CAAG,EAAA,CAAC,CAAI,CAAA,EAAA,CAAC,IAAI,CAAC,CAAA,CAAA,CAAA;AACvB,EAAA;AAEO,MAAM,qBAAwB,GAAA,CAAC,CAAC,KAAA,EAAO,GAAG,CAAwB,KAAA;AACvE,EAAA,OAAO,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,KAAA,GAAQ,GAAG,CAAA,GAAI,GAAG,CAAA,KAAA,EACrC,IAAK,CAAA,KAAA,CAAM,GAAM,GAAA,GAAG,IAAI,GAC1B,CAAA,EAAA,CAAA,CAAA;AACF,EAAA;AAEa,MAAA,UAAA,GAAa,CAAC,SAAsB,KAAA;AAC/C,EAAO,OAAA,QAAA,CAAS,OAAQ,CAAA,SAAS,CAAE,CAAA,cAAA;AAAA,IACjC,QAAS,CAAA,2BAAA;AAAA,GACX,CAAA;AACF,EAAA;AAEa,MAAA,gBAAA,GAAmB,CAAC,MAAmB,KAAA;AAClD,EAAA,OAAO,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,MAAA,GAAS,GAAG,CAAC,CAAA,EAAA,CAAA,CAAA;AACpC,EAAA;AAEO,MAAM,YAAe,GAAA,CAAC,MAAwB,KAAA,UAAA,CAAW,MAAM;;;;"}
1
+ {"version":3,"file":"format.esm.js","sources":["../../src/utils/format.ts"],"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 { DateTime, Duration } from 'luxon';\nimport { BuildStatus } from '../api';\nimport upperFirst from 'lodash/upperFirst';\n\nexport const formatDuration = (seconds: number) => {\n const duration = Duration.fromObject({\n seconds: seconds,\n }).shiftTo('hours', 'minutes', 'seconds', 'milliseconds');\n\n if (duration.hours + duration.minutes + duration.seconds === 0) {\n return `${Math.round(duration.milliseconds)} ms`;\n }\n\n const h = duration.hours ? `${duration.hours} h` : '';\n const m = duration.minutes ? `${duration.minutes} m` : '';\n const s = duration.hours < 12 ? `${duration.seconds ?? 0} s` : '';\n\n return `${h} ${m} ${s}`;\n};\n\nexport const formatSecondsInterval = ([start, end]: [number, number]) => {\n return `${Math.round(start * 100) / 100} s - ${\n Math.round(end * 100) / 100\n } s`;\n};\n\nexport const formatTime = (timestamp: string) => {\n return DateTime.fromISO(timestamp).toLocaleString(\n DateTime.DATETIME_SHORT_WITH_SECONDS,\n );\n};\n\nexport const formatPercentage = (number: number) => {\n return `${Math.round(number * 100)} %`;\n};\n\nexport const formatStatus = (status: BuildStatus) => upperFirst(status);\n"],"names":[],"mappings":";;;AAmBa,MAAA,cAAA,GAAiB,CAAC,OAAoB,KAAA;AACjD,EAAM,MAAA,QAAA,GAAW,SAAS,UAAW,CAAA;AAAA,IACnC;AAAA,GACD,CAAE,CAAA,OAAA,CAAQ,OAAS,EAAA,SAAA,EAAW,WAAW,cAAc,CAAA;AAExD,EAAA,IAAI,SAAS,KAAQ,GAAA,QAAA,CAAS,OAAU,GAAA,QAAA,CAAS,YAAY,CAAG,EAAA;AAC9D,IAAA,OAAO,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,QAAA,CAAS,YAAY,CAAC,CAAA,GAAA,CAAA;AAAA;AAG7C,EAAA,MAAM,IAAI,QAAS,CAAA,KAAA,GAAQ,CAAG,EAAA,QAAA,CAAS,KAAK,CAAO,EAAA,CAAA,GAAA,EAAA;AACnD,EAAA,MAAM,IAAI,QAAS,CAAA,OAAA,GAAU,CAAG,EAAA,QAAA,CAAS,OAAO,CAAO,EAAA,CAAA,GAAA,EAAA;AACvD,EAAM,MAAA,CAAA,GAAI,SAAS,KAAQ,GAAA,EAAA,GAAK,GAAG,QAAS,CAAA,OAAA,IAAW,CAAC,CAAO,EAAA,CAAA,GAAA,EAAA;AAE/D,EAAA,OAAO,CAAG,EAAA,CAAC,CAAI,CAAA,EAAA,CAAC,IAAI,CAAC,CAAA,CAAA;AACvB;AAEO,MAAM,qBAAwB,GAAA,CAAC,CAAC,KAAA,EAAO,GAAG,CAAwB,KAAA;AACvE,EAAA,OAAO,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,KAAA,GAAQ,GAAG,CAAA,GAAI,GAAG,CAAA,KAAA,EACrC,IAAK,CAAA,KAAA,CAAM,GAAM,GAAA,GAAG,IAAI,GAC1B,CAAA,EAAA,CAAA;AACF;AAEa,MAAA,UAAA,GAAa,CAAC,SAAsB,KAAA;AAC/C,EAAO,OAAA,QAAA,CAAS,OAAQ,CAAA,SAAS,CAAE,CAAA,cAAA;AAAA,IACjC,QAAS,CAAA;AAAA,GACX;AACF;AAEa,MAAA,gBAAA,GAAmB,CAAC,MAAmB,KAAA;AAClD,EAAA,OAAO,CAAG,EAAA,IAAA,CAAK,KAAM,CAAA,MAAA,GAAS,GAAG,CAAC,CAAA,EAAA,CAAA;AACpC;AAEO,MAAM,YAAe,GAAA,CAAC,MAAwB,KAAA,UAAA,CAAW,MAAM;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-xcmetrics",
3
- "version": "0.2.58",
3
+ "version": "0.4.0",
4
4
  "description": "A Backstage plugin that shows XCode build metrics for your components",
5
5
  "backstage": {
6
6
  "role": "frontend-plugin",
@@ -37,9 +37,9 @@
37
37
  "test": "backstage-cli package test"
38
38
  },
39
39
  "dependencies": {
40
- "@backstage/core-components": "^0.15.1",
41
- "@backstage/core-plugin-api": "^1.10.0",
42
- "@backstage/errors": "^1.2.4",
40
+ "@backstage/core-components": "^0.16.3",
41
+ "@backstage/core-plugin-api": "^1.10.3",
42
+ "@backstage/errors": "^1.2.7",
43
43
  "@material-ui/core": "^4.12.2",
44
44
  "@material-ui/icons": "^4.9.1",
45
45
  "@material-ui/lab": "4.0.0-alpha.61",
@@ -50,9 +50,9 @@
50
50
  "recharts": "^2.5.0"
51
51
  },
52
52
  "devDependencies": {
53
- "@backstage/cli": "^0.28.0",
54
- "@backstage/dev-utils": "^1.1.2",
55
- "@backstage/test-utils": "^1.7.0",
53
+ "@backstage/cli": "^0.29.6",
54
+ "@backstage/dev-utils": "^1.1.6",
55
+ "@backstage/test-utils": "^1.7.4",
56
56
  "@testing-library/dom": "^10.0.0",
57
57
  "@testing-library/jest-dom": "^6.0.0",
58
58
  "@testing-library/react": "^15.0.0",
@@ -70,5 +70,12 @@
70
70
  "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0",
71
71
  "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
72
72
  },
73
+ "typesVersions": {
74
+ "*": {
75
+ "index": [
76
+ "dist/index.d.ts"
77
+ ]
78
+ }
79
+ },
73
80
  "module": "./dist/index.esm.js"
74
81
  }