@backstage-community/plugin-cicd-statistics 0.1.40 → 0.2.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 +12 -0
- package/dist/alpha/entityContent.esm.js.map +1 -1
- package/dist/alpha.d.ts +27 -17
- package/dist/alpha.esm.js +2 -2
- package/dist/alpha.esm.js.map +1 -1
- package/dist/apis/cicd-statistics.esm.js.map +1 -1
- package/dist/apis/types.esm.js.map +1 -1
- package/dist/charts/colors.esm.js.map +1 -1
- package/dist/charts/logic/analysis.esm.js.map +1 -1
- package/dist/charts/logic/conversions.esm.js.map +1 -1
- package/dist/charts/logic/count-builds-per-day.esm.js.map +1 -1
- package/dist/charts/logic/daily-summary.esm.js.map +1 -1
- package/dist/charts/logic/finalize-stage.esm.js.map +1 -1
- package/dist/charts/logic/utils.esm.js.map +1 -1
- package/dist/charts/stage-chart.esm.js.map +1 -1
- package/dist/charts/status-chart.esm.js.map +1 -1
- package/dist/charts/zoom.esm.js.map +1 -1
- package/dist/components/button-switch.esm.js.map +1 -1
- package/dist/components/chart-filters.esm.js.map +1 -1
- package/dist/components/duration-slider.esm.js.map +1 -1
- package/dist/components/label.esm.js.map +1 -1
- package/dist/components/progress.esm.js.map +1 -1
- package/dist/components/toggle.esm.js.map +1 -1
- package/dist/components/utils.esm.js.map +1 -1
- package/dist/entity-page.esm.js.map +1 -1
- package/dist/hooks/use-cicd-configuration.esm.js.map +1 -1
- package/dist/hooks/use-cicd-statistics-api.esm.js.map +1 -1
- package/dist/hooks/use-cicd-statistics.esm.js.map +1 -1
- package/dist/plugin.esm.js.map +1 -1
- package/dist/utils/api.esm.js.map +1 -1
- package/dist/utils/stage-names.esm.js.map +1 -1
- package/package.json +19 -9
- package/alpha/package.json +0 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @backstage-community/plugin-cicd-statistics
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- b0190ad: Backstage version bump to v1.34.1
|
|
8
|
+
|
|
9
|
+
## 0.1.41
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- a624400: Backstage version bump to v1.32.0
|
|
14
|
+
|
|
3
15
|
## 0.1.40
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entityContent.esm.js","sources":["../../src/alpha/entityContent.tsx"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"entityContent.esm.js","sources":["../../src/alpha/entityContent.tsx"],"sourcesContent":["/*\n * Copyright 2024 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 { convertLegacyRouteRef } from '@backstage/core-compat-api';\nimport { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { rootCatalogCicdStatsRouteRef } from '../plugin';\n\n/**\n * @alpha\n */\nexport const entityCicdChartsContent = EntityContentBlueprint.make({\n name: 'entity',\n params: {\n defaultPath: 'cicd-statistics',\n defaultTitle: 'CI/CD Statistics',\n filter: 'kind:component',\n routeRef: convertLegacyRouteRef(rootCatalogCicdStatsRouteRef),\n loader: async () => {\n const { EntityPageCicdCharts } = await import('../entity-page');\n return <EntityPageCicdCharts />;\n },\n },\n});\n"],"names":[],"mappings":";;;;;AAuBa,MAAA,uBAAA,GAA0B,uBAAuB,IAAK,CAAA;AAAA,EACjE,IAAM,EAAA,QAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,WAAa,EAAA,iBAAA;AAAA,IACb,YAAc,EAAA,kBAAA;AAAA,IACd,MAAQ,EAAA,gBAAA;AAAA,IACR,QAAA,EAAU,sBAAsB,4BAA4B,CAAA;AAAA,IAC5D,QAAQ,YAAY;AAClB,MAAA,MAAM,EAAE,oBAAA,EAAyB,GAAA,MAAM,OAAO,uBAAgB,CAAA;AAC9D,MAAA,2CAAQ,oBAAqB,EAAA,IAAA,CAAA;AAAA;AAC/B;AAEJ,CAAC;;;;"}
|
package/dist/alpha.d.ts
CHANGED
|
@@ -1,32 +1,42 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
import * as
|
|
2
|
+
import * as _backstage_catalog_model_index from '@backstage/catalog-model/index';
|
|
3
3
|
import * as react from 'react';
|
|
4
4
|
import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* @alpha
|
|
8
8
|
*/
|
|
9
|
-
declare const _default: _backstage_frontend_plugin_api.
|
|
9
|
+
declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{
|
|
10
10
|
entityContent: _backstage_frontend_plugin_api.RouteRef<undefined>;
|
|
11
11
|
}, {}, {
|
|
12
12
|
"entity-content:cicd-statistics/entity": _backstage_frontend_plugin_api.ExtensionDefinition<{
|
|
13
|
-
path: string | undefined;
|
|
14
|
-
title: string | undefined;
|
|
15
|
-
filter: string | undefined;
|
|
16
|
-
}, {
|
|
17
|
-
filter?: string | undefined;
|
|
18
|
-
title?: string | undefined;
|
|
19
|
-
path?: string | undefined;
|
|
20
|
-
}, _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
|
|
21
|
-
optional: true;
|
|
22
|
-
}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
|
|
23
|
-
optional: true;
|
|
24
|
-
}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-filter-expression", {
|
|
25
|
-
optional: true;
|
|
26
|
-
}>, {}, {
|
|
27
13
|
kind: "entity-content";
|
|
28
|
-
namespace: undefined;
|
|
29
14
|
name: "entity";
|
|
15
|
+
config: {
|
|
16
|
+
path: string | undefined;
|
|
17
|
+
title: string | undefined;
|
|
18
|
+
filter: string | undefined;
|
|
19
|
+
};
|
|
20
|
+
configInput: {
|
|
21
|
+
filter?: string | undefined;
|
|
22
|
+
title?: string | undefined;
|
|
23
|
+
path?: string | undefined;
|
|
24
|
+
};
|
|
25
|
+
output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
|
|
26
|
+
optional: true;
|
|
27
|
+
}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model_index.Entity) => boolean, "catalog.entity-filter-function", {
|
|
28
|
+
optional: true;
|
|
29
|
+
}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-filter-expression", {
|
|
30
|
+
optional: true;
|
|
31
|
+
}>;
|
|
32
|
+
inputs: {};
|
|
33
|
+
params: {
|
|
34
|
+
loader: () => Promise<JSX.Element>;
|
|
35
|
+
defaultPath: string;
|
|
36
|
+
defaultTitle: string;
|
|
37
|
+
routeRef?: _backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams> | undefined;
|
|
38
|
+
filter?: string | ((entity: _backstage_catalog_model_index.Entity) => boolean) | undefined;
|
|
39
|
+
};
|
|
30
40
|
}>;
|
|
31
41
|
}>;
|
|
32
42
|
|
package/dist/alpha.esm.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { convertLegacyRouteRefs } from '@backstage/core-compat-api';
|
|
2
|
-
import {
|
|
2
|
+
import { createFrontendPlugin } from '@backstage/frontend-plugin-api';
|
|
3
3
|
import { entityCicdChartsContent } from './alpha/entityContent.esm.js';
|
|
4
4
|
import { rootCatalogCicdStatsRouteRef } from './plugin.esm.js';
|
|
5
5
|
|
|
6
|
-
var alpha =
|
|
6
|
+
var alpha = createFrontendPlugin({
|
|
7
7
|
id: "cicd-statistics",
|
|
8
8
|
routes: convertLegacyRouteRefs({
|
|
9
9
|
entityContent: rootCatalogCicdStatsRouteRef
|
package/dist/alpha.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"alpha.esm.js","sources":["../src/alpha.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { convertLegacyRouteRefs } from '@backstage/core-compat-api';\nimport { createFrontendPlugin } from '@backstage/frontend-plugin-api';\nimport { entityCicdChartsContent } from './alpha/index';\nimport { rootCatalogCicdStatsRouteRef } from './plugin';\n\n/**\n * @alpha\n */\nexport default createFrontendPlugin({\n id: 'cicd-statistics',\n routes: convertLegacyRouteRefs({\n entityContent: rootCatalogCicdStatsRouteRef,\n }),\n extensions: [entityCicdChartsContent],\n});\n"],"names":[],"mappings":";;;;;AAuBA,YAAe,oBAAqB,CAAA;AAAA,EAClC,EAAI,EAAA,iBAAA;AAAA,EACJ,QAAQ,sBAAuB,CAAA;AAAA,IAC7B,aAAe,EAAA;AAAA,GAChB,CAAA;AAAA,EACD,UAAA,EAAY,CAAC,uBAAuB;AACtC,CAAC,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cicd-statistics.esm.js","sources":["../../src/apis/cicd-statistics.ts"],"sourcesContent":["/*\n * Copyright 2022 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';\nimport { CicdStatisticsApi } from './types';\n\n/** @public */\nexport const cicdStatisticsApiRef = createApiRef<CicdStatisticsApi>({\n id: 'cicd-statistics-api',\n});\n"],"names":[],"mappings":";;AAoBO,MAAM,uBAAuB,YAAgC,CAAA;AAAA,EAClE,EAAI,EAAA
|
|
1
|
+
{"version":3,"file":"cicd-statistics.esm.js","sources":["../../src/apis/cicd-statistics.ts"],"sourcesContent":["/*\n * Copyright 2022 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';\nimport { CicdStatisticsApi } from './types';\n\n/** @public */\nexport const cicdStatisticsApiRef = createApiRef<CicdStatisticsApi>({\n id: 'cicd-statistics-api',\n});\n"],"names":[],"mappings":";;AAoBO,MAAM,uBAAuB,YAAgC,CAAA;AAAA,EAClE,EAAI,EAAA;AACN,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.esm.js","sources":["../../src/apis/types.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { Entity } from '@backstage/catalog-model';\n\n/**\n * This is a generic enum of build statuses.\n *\n * If all of these aren't applicable to the underlying CI/CD, these can be\n * configured to be hidden, using the `availableStatuses` in `CicdConfiguration`.\n *\n * @public\n */\nexport type FilterStatusType =\n | 'unknown'\n | 'enqueued'\n | 'scheduled'\n | 'running'\n | 'aborted'\n | 'succeeded'\n | 'failed'\n | 'stalled'\n | 'expired';\n\n/**\n * @public\n */\nexport const statusTypes: Array<FilterStatusType> = [\n 'succeeded',\n 'failed',\n 'enqueued',\n 'scheduled',\n 'running',\n 'aborted',\n 'stalled',\n 'expired',\n 'unknown',\n];\n\n/**\n * The branch enum of either 'master' or 'branch' (or possibly the meta 'all').\n *\n * The concept of what constitutes a master branch is generic. It might be called\n * something like 'release' or 'main' or 'trunk' in the underlying CI/CD system,\n * which is then up to the Api to map accordingly.\n *\n * @public\n */\nexport type FilterBranchType = 'master' | 'branch';\n\n/**\n * @public\n */\nexport type TriggerReason =\n /** Triggered by source code management, e.g. a Github hook */\n | 'scm'\n /** Triggered manually */\n | 'manual'\n /** Triggered internally (non-scm, or perhaps after being delayed/enqueued) */\n | 'internal'\n /** Triggered for some other reason */\n | 'other';\n\n/**\n * @public\n */\nexport const triggerReasons: Array<TriggerReason> = [\n 'scm',\n 'manual',\n 'internal',\n 'other',\n];\n\n/**\n * A Stage is a part of either a Build or a parent Stage.\n *\n * This may be called things like Stage or Step or Task in CI/CD systems, but is\n * generic here. There's also no concept of parallelism which might exist within\n * some stages.\n *\n * @public\n */\nexport interface Stage {\n name: string;\n\n /** The status of the stage */\n status: FilterStatusType;\n\n /** Stage duration in milliseconds */\n duration: number;\n\n /** Sub stages within this stage */\n stages?: Array<Stage>;\n}\n\n/**\n * Generic Build type.\n *\n * A build has e.g. a build type (master/branch), a status and (possibly) sub stages.\n *\n * @public\n */\nexport interface Build {\n raw?: unknown;\n\n /** Build id */\n id: string;\n\n /** The reason this build was started */\n triggeredBy?: TriggerReason;\n\n /** The status of the build */\n status: FilterStatusType;\n\n /** Branch type */\n branchType: FilterBranchType;\n\n /** Time when the build started */\n requestedAt: Date;\n\n /** The overall duration of the build */\n duration: number;\n\n /** Top-level build stages */\n stages: Array<Stage>;\n}\n\n/**\n * Helper type which is a Build with a certain typed 'raw' field.\n *\n * This can be useful in an Api to use while mapping internal data structures\n * (raw) into generic builds.\n *\n * @public\n */\nexport type BuildWithRaw<T = any> = Build & {\n raw: T;\n};\n\n/**\n * Chart type.\n *\n * Values are:\n * * `duration`: shows an area chart of the duration over time\n * * `count`: shows a bar chart of the number of build per day\n *\n * @public\n */\nexport type ChartType = 'duration' | 'count';\n\n/**\n * Chart types.\n *\n * @public\n */\nexport type ChartTypes = Array<ChartType>;\n\n/**\n * Default settings for the fetching options and view options.\n *\n * These are all optional, but can be overridden from the Api to whatever makes\n * most sense for that implementation.\n *\n * @public\n */\nexport interface CicdDefaults {\n timeFrom: Date;\n timeTo: Date;\n filterStatus: Array<FilterStatusType>;\n filterType: FilterBranchType | 'all';\n\n /** Lower-case all stage names (to potentially merge stages with different cases) */\n lowercaseNames: boolean;\n /** Normalize the from-to date range in all charts */\n normalizeTimeRange: boolean;\n /** Default collapse the stages with a max-duration below this value */\n collapsedLimit: number;\n /** Default hide stages with a max-duration below this value */\n hideLimit: number;\n /** Chart types per status */\n chartTypes: Record<FilterStatusType, ChartTypes>;\n}\n\n/**\n * A configuration interface which the Api must implement.\n *\n * When the UI for the CI/CD Statistics is loaded, it begins with fetching the\n * configuration before anything else.\n *\n * All of these fields are optional though, and will fallback to hard-coded defaults.\n *\n * @public\n */\nexport interface CicdConfiguration {\n /**\n * This field can be used to override what statuses are available\n */\n availableStatuses: ReadonlyArray<FilterStatusType>;\n\n /**\n * When transposing the list of builds into a tree of stages, the stage names\n * will be transformed through this function.\n *\n * Override this for a custom implementation. The default will try to remove\n * parent names off of child names, if they are prepended by them.\n *\n * For example; if a stage has the name 'Install' and a child stage has the\n * name 'Install - Fetch dependencies', the child name will be replaced with\n * 'Fetch dependencies'.\n */\n formatStageName: (parentNames: Array<string>, stageName: string) => string;\n\n /**\n * Default options for the UI\n */\n defaults: Partial<CicdDefaults>;\n}\n\n/**\n * If the Api implements support for aborting the fetching of builds, throw an\n * AbortError of this type (or any other error with name === 'AbortError').\n *\n * @public\n */\nexport class AbortError extends Error {}\n\n/**\n * The result type for `fetchBuilds`.\n *\n * @public\n */\nexport interface CicdState {\n builds: Array<Build>;\n}\n\n/**\n * When fetching, if applicable, the Api can feedback progress back to the UI.\n *\n * Use the `updateProgress(completed, total, started?)` to signal that\n * `completed` builds out of a `total` has finished. Optionally use the\n * `started` to signal how many builds have been started in total (i.e. at least\n * the amount of `completed`).\n *\n * This can be called at any rate. Rate limiting (debouncing) is implemented in\n * the UI.\n *\n * Optionally this can signal multiple progresses in several steps\n *\n * @public\n */\nexport interface UpdateProgress {\n (completed: number, total: number, started?: number): void;\n (\n steps: Array<{\n title: string;\n completed: number;\n total: number;\n started?: number;\n }>,\n ): void;\n}\n\n/**\n * When reading configuration, the Api can return a custom settings depending on\n * the entity being viewed.\n *\n * @public\n */\nexport interface GetConfigurationOptions {\n entity: Entity;\n}\n\n/**\n * When fetching, the Api should fetch build information about the `entity` and\n * respect the `timeFrom`, `timeTo`, `filterStatus` and `filterType`.\n *\n * Optionally implement support for `updateProgress` and `abortSignal` if\n * preferred.\n *\n * When the UI re-fetches, it will abort any previous fetching, so polling\n * `abortSignal.aborted`, and possibly throwing an `AbortError`, can be useful.\n *\n * @public\n */\nexport interface FetchBuildsOptions {\n entity: Entity;\n updateProgress: UpdateProgress;\n abortSignal: AbortSignal;\n timeFrom: Date;\n timeTo: Date;\n filterStatus: Array<FilterStatusType | 'all'>;\n filterType: FilterBranchType | 'all';\n}\n\n/**\n * The interface which is mapped to the `cicdStatisticsApiRef` which is used by\n * the UI.\n *\n * @public\n */\nexport interface CicdStatisticsApi {\n getConfiguration(\n options: GetConfigurationOptions,\n ): Promise<Partial<CicdConfiguration>>;\n fetchBuilds(options: FetchBuildsOptions): Promise<CicdState>;\n}\n"],"names":[],"mappings":"AAwCO,MAAM,WAAuC,GAAA;AAAA,EAClD,WAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA
|
|
1
|
+
{"version":3,"file":"types.esm.js","sources":["../../src/apis/types.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { Entity } from '@backstage/catalog-model';\n\n/**\n * This is a generic enum of build statuses.\n *\n * If all of these aren't applicable to the underlying CI/CD, these can be\n * configured to be hidden, using the `availableStatuses` in `CicdConfiguration`.\n *\n * @public\n */\nexport type FilterStatusType =\n | 'unknown'\n | 'enqueued'\n | 'scheduled'\n | 'running'\n | 'aborted'\n | 'succeeded'\n | 'failed'\n | 'stalled'\n | 'expired';\n\n/**\n * @public\n */\nexport const statusTypes: Array<FilterStatusType> = [\n 'succeeded',\n 'failed',\n 'enqueued',\n 'scheduled',\n 'running',\n 'aborted',\n 'stalled',\n 'expired',\n 'unknown',\n];\n\n/**\n * The branch enum of either 'master' or 'branch' (or possibly the meta 'all').\n *\n * The concept of what constitutes a master branch is generic. It might be called\n * something like 'release' or 'main' or 'trunk' in the underlying CI/CD system,\n * which is then up to the Api to map accordingly.\n *\n * @public\n */\nexport type FilterBranchType = 'master' | 'branch';\n\n/**\n * @public\n */\nexport type TriggerReason =\n /** Triggered by source code management, e.g. a Github hook */\n | 'scm'\n /** Triggered manually */\n | 'manual'\n /** Triggered internally (non-scm, or perhaps after being delayed/enqueued) */\n | 'internal'\n /** Triggered for some other reason */\n | 'other';\n\n/**\n * @public\n */\nexport const triggerReasons: Array<TriggerReason> = [\n 'scm',\n 'manual',\n 'internal',\n 'other',\n];\n\n/**\n * A Stage is a part of either a Build or a parent Stage.\n *\n * This may be called things like Stage or Step or Task in CI/CD systems, but is\n * generic here. There's also no concept of parallelism which might exist within\n * some stages.\n *\n * @public\n */\nexport interface Stage {\n name: string;\n\n /** The status of the stage */\n status: FilterStatusType;\n\n /** Stage duration in milliseconds */\n duration: number;\n\n /** Sub stages within this stage */\n stages?: Array<Stage>;\n}\n\n/**\n * Generic Build type.\n *\n * A build has e.g. a build type (master/branch), a status and (possibly) sub stages.\n *\n * @public\n */\nexport interface Build {\n raw?: unknown;\n\n /** Build id */\n id: string;\n\n /** The reason this build was started */\n triggeredBy?: TriggerReason;\n\n /** The status of the build */\n status: FilterStatusType;\n\n /** Branch type */\n branchType: FilterBranchType;\n\n /** Time when the build started */\n requestedAt: Date;\n\n /** The overall duration of the build */\n duration: number;\n\n /** Top-level build stages */\n stages: Array<Stage>;\n}\n\n/**\n * Helper type which is a Build with a certain typed 'raw' field.\n *\n * This can be useful in an Api to use while mapping internal data structures\n * (raw) into generic builds.\n *\n * @public\n */\nexport type BuildWithRaw<T = any> = Build & {\n raw: T;\n};\n\n/**\n * Chart type.\n *\n * Values are:\n * * `duration`: shows an area chart of the duration over time\n * * `count`: shows a bar chart of the number of build per day\n *\n * @public\n */\nexport type ChartType = 'duration' | 'count';\n\n/**\n * Chart types.\n *\n * @public\n */\nexport type ChartTypes = Array<ChartType>;\n\n/**\n * Default settings for the fetching options and view options.\n *\n * These are all optional, but can be overridden from the Api to whatever makes\n * most sense for that implementation.\n *\n * @public\n */\nexport interface CicdDefaults {\n timeFrom: Date;\n timeTo: Date;\n filterStatus: Array<FilterStatusType>;\n filterType: FilterBranchType | 'all';\n\n /** Lower-case all stage names (to potentially merge stages with different cases) */\n lowercaseNames: boolean;\n /** Normalize the from-to date range in all charts */\n normalizeTimeRange: boolean;\n /** Default collapse the stages with a max-duration below this value */\n collapsedLimit: number;\n /** Default hide stages with a max-duration below this value */\n hideLimit: number;\n /** Chart types per status */\n chartTypes: Record<FilterStatusType, ChartTypes>;\n}\n\n/**\n * A configuration interface which the Api must implement.\n *\n * When the UI for the CI/CD Statistics is loaded, it begins with fetching the\n * configuration before anything else.\n *\n * All of these fields are optional though, and will fallback to hard-coded defaults.\n *\n * @public\n */\nexport interface CicdConfiguration {\n /**\n * This field can be used to override what statuses are available\n */\n availableStatuses: ReadonlyArray<FilterStatusType>;\n\n /**\n * When transposing the list of builds into a tree of stages, the stage names\n * will be transformed through this function.\n *\n * Override this for a custom implementation. The default will try to remove\n * parent names off of child names, if they are prepended by them.\n *\n * For example; if a stage has the name 'Install' and a child stage has the\n * name 'Install - Fetch dependencies', the child name will be replaced with\n * 'Fetch dependencies'.\n */\n formatStageName: (parentNames: Array<string>, stageName: string) => string;\n\n /**\n * Default options for the UI\n */\n defaults: Partial<CicdDefaults>;\n}\n\n/**\n * If the Api implements support for aborting the fetching of builds, throw an\n * AbortError of this type (or any other error with name === 'AbortError').\n *\n * @public\n */\nexport class AbortError extends Error {}\n\n/**\n * The result type for `fetchBuilds`.\n *\n * @public\n */\nexport interface CicdState {\n builds: Array<Build>;\n}\n\n/**\n * When fetching, if applicable, the Api can feedback progress back to the UI.\n *\n * Use the `updateProgress(completed, total, started?)` to signal that\n * `completed` builds out of a `total` has finished. Optionally use the\n * `started` to signal how many builds have been started in total (i.e. at least\n * the amount of `completed`).\n *\n * This can be called at any rate. Rate limiting (debouncing) is implemented in\n * the UI.\n *\n * Optionally this can signal multiple progresses in several steps\n *\n * @public\n */\nexport interface UpdateProgress {\n (completed: number, total: number, started?: number): void;\n (\n steps: Array<{\n title: string;\n completed: number;\n total: number;\n started?: number;\n }>,\n ): void;\n}\n\n/**\n * When reading configuration, the Api can return a custom settings depending on\n * the entity being viewed.\n *\n * @public\n */\nexport interface GetConfigurationOptions {\n entity: Entity;\n}\n\n/**\n * When fetching, the Api should fetch build information about the `entity` and\n * respect the `timeFrom`, `timeTo`, `filterStatus` and `filterType`.\n *\n * Optionally implement support for `updateProgress` and `abortSignal` if\n * preferred.\n *\n * When the UI re-fetches, it will abort any previous fetching, so polling\n * `abortSignal.aborted`, and possibly throwing an `AbortError`, can be useful.\n *\n * @public\n */\nexport interface FetchBuildsOptions {\n entity: Entity;\n updateProgress: UpdateProgress;\n abortSignal: AbortSignal;\n timeFrom: Date;\n timeTo: Date;\n filterStatus: Array<FilterStatusType | 'all'>;\n filterType: FilterBranchType | 'all';\n}\n\n/**\n * The interface which is mapped to the `cicdStatisticsApiRef` which is used by\n * the UI.\n *\n * @public\n */\nexport interface CicdStatisticsApi {\n getConfiguration(\n options: GetConfigurationOptions,\n ): Promise<Partial<CicdConfiguration>>;\n fetchBuilds(options: FetchBuildsOptions): Promise<CicdState>;\n}\n"],"names":[],"mappings":"AAwCO,MAAM,WAAuC,GAAA;AAAA,EAClD,WAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF;AA6BO,MAAM,cAAuC,GAAA;AAAA,EAClD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AAyJO,MAAM,mBAAmB,KAAM,CAAA;AAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"colors.esm.js","sources":["../../src/charts/colors.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { FilterStatusType, TriggerReason } from '../apis/types';\n\nexport const statusColorMap: Record<FilterStatusType, string> = {\n unknown: '#3d01a4',\n enqueued: '#7ad1b9',\n scheduled: '#0391ce',\n running: '#f3f318',\n aborted: '#8600af',\n succeeded: '#66b032',\n failed: '#fe2712',\n stalled: '#fb9904',\n expired: '#a7194b',\n};\n\nexport const triggerColorMap: Record<TriggerReason, string> = {\n scm: '#0391ce',\n manual: '#a7194b',\n internal: '#82ca9d',\n other: '#f3f318',\n};\n\nexport const fireColors: Array<[percent: string, color: string]> = [\n ['5%', '#e19678'],\n ['30%', '#dfe178'],\n ['50%', '#82ca9d'],\n ['95%', '#82ca9d'],\n];\n\nexport const colorStroke = '#c0c0c0';\nexport const colorStrokeAvg = '#788ee1';\n"],"names":[],"mappings":"AAkBO,MAAM,cAAmD,GAAA;AAAA,EAC9D,OAAS,EAAA,SAAA;AAAA,EACT,QAAU,EAAA,SAAA;AAAA,EACV,SAAW,EAAA,SAAA;AAAA,EACX,OAAS,EAAA,SAAA;AAAA,EACT,OAAS,EAAA,SAAA;AAAA,EACT,SAAW,EAAA,SAAA;AAAA,EACX,MAAQ,EAAA,SAAA;AAAA,EACR,OAAS,EAAA,SAAA;AAAA,EACT,OAAS,EAAA
|
|
1
|
+
{"version":3,"file":"colors.esm.js","sources":["../../src/charts/colors.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { FilterStatusType, TriggerReason } from '../apis/types';\n\nexport const statusColorMap: Record<FilterStatusType, string> = {\n unknown: '#3d01a4',\n enqueued: '#7ad1b9',\n scheduled: '#0391ce',\n running: '#f3f318',\n aborted: '#8600af',\n succeeded: '#66b032',\n failed: '#fe2712',\n stalled: '#fb9904',\n expired: '#a7194b',\n};\n\nexport const triggerColorMap: Record<TriggerReason, string> = {\n scm: '#0391ce',\n manual: '#a7194b',\n internal: '#82ca9d',\n other: '#f3f318',\n};\n\nexport const fireColors: Array<[percent: string, color: string]> = [\n ['5%', '#e19678'],\n ['30%', '#dfe178'],\n ['50%', '#82ca9d'],\n ['95%', '#82ca9d'],\n];\n\nexport const colorStroke = '#c0c0c0';\nexport const colorStrokeAvg = '#788ee1';\n"],"names":[],"mappings":"AAkBO,MAAM,cAAmD,GAAA;AAAA,EAC9D,OAAS,EAAA,SAAA;AAAA,EACT,QAAU,EAAA,SAAA;AAAA,EACV,SAAW,EAAA,SAAA;AAAA,EACX,OAAS,EAAA,SAAA;AAAA,EACT,OAAS,EAAA,SAAA;AAAA,EACT,SAAW,EAAA,SAAA;AAAA,EACX,MAAQ,EAAA,SAAA;AAAA,EACR,OAAS,EAAA,SAAA;AAAA,EACT,OAAS,EAAA;AACX;AAEO,MAAM,eAAiD,GAAA;AAAA,EAC5D,GAAK,EAAA,SAAA;AAAA,EACL,MAAQ,EAAA,SAAA;AAAA,EACR,QAAU,EAAA,SAAA;AAAA,EACV,KAAO,EAAA;AACT;AAEO,MAAM,UAAsD,GAAA;AAAA,EACjE,CAAC,MAAM,SAAS,CAAA;AAAA,EAChB,CAAC,OAAO,SAAS,CAAA;AAAA,EACjB,CAAC,OAAO,SAAS,CAAA;AAAA,EACjB,CAAC,OAAO,SAAS;AACnB;AAEO,MAAM,WAAc,GAAA;AACpB,MAAM,cAAiB,GAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis.esm.js","sources":["../../../src/charts/logic/analysis.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { FilterStatusType } from '../../apis/types';\nimport { ChartableStageAnalysis, ChartableStageDatapoints } from '../types';\n\nexport function getAnalysis(\n values: Array<ChartableStageDatapoints>,\n status: FilterStatusType,\n): ChartableStageAnalysis {\n const analysis: ChartableStageAnalysis = {\n max: 0,\n min: 0,\n avg: 0,\n med: 0,\n };\n\n const definedValues = values\n .filter(value => typeof value[status] !== 'undefined')\n .map(value => value[status]!)\n .sort((a, b) => a - b);\n\n analysis.max = definedValues[definedValues.length - 1] ?? 0;\n\n analysis.min = definedValues[0] ?? 0;\n\n analysis.avg =\n definedValues.length === 0\n ? 0\n : definedValues.reduce((prev, cur) => prev + cur, 0) / values.length;\n\n analysis.med = definedValues[Math.ceil(definedValues.length / 2)] ?? 0;\n\n return analysis;\n}\n\nexport function makeCombinedAnalysis(\n analysis: Record<FilterStatusType, ChartableStageAnalysis>,\n allDurations: Array<number>,\n): ChartableStageAnalysis {\n if (analysis.succeeded) {\n // If succeeded is a viewed status, it's probably what's expected to see\n // overall. Otherwise combine all other.\n return analysis.succeeded;\n }\n\n const analysisValues = Object.values(analysis);\n\n const max = analysisValues.reduce((prev, cur) => Math.max(prev, cur.max), 0);\n const min = analysisValues.reduce(\n (prev, cur) => Math.min(prev, cur.min),\n max,\n );\n const avg = !allDurations.length\n ? 0\n : allDurations.reduce((prev, cur) => prev + cur, 0) / allDurations.length;\n allDurations.sort((a, b) => a - b);\n const med = allDurations[Math.ceil(allDurations.length / 2)] ?? 0;\n\n return {\n max,\n min,\n avg,\n med,\n };\n}\n"],"names":[],"mappings":"AAmBgB,SAAA,WAAA,CACd,QACA,MACwB,EAAA;AACxB,EAAA,MAAM,QAAmC,GAAA;AAAA,IACvC,GAAK,EAAA,CAAA;AAAA,IACL,GAAK,EAAA,CAAA;AAAA,IACL,GAAK,EAAA,CAAA;AAAA,IACL,GAAK,EAAA
|
|
1
|
+
{"version":3,"file":"analysis.esm.js","sources":["../../../src/charts/logic/analysis.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { FilterStatusType } from '../../apis/types';\nimport { ChartableStageAnalysis, ChartableStageDatapoints } from '../types';\n\nexport function getAnalysis(\n values: Array<ChartableStageDatapoints>,\n status: FilterStatusType,\n): ChartableStageAnalysis {\n const analysis: ChartableStageAnalysis = {\n max: 0,\n min: 0,\n avg: 0,\n med: 0,\n };\n\n const definedValues = values\n .filter(value => typeof value[status] !== 'undefined')\n .map(value => value[status]!)\n .sort((a, b) => a - b);\n\n analysis.max = definedValues[definedValues.length - 1] ?? 0;\n\n analysis.min = definedValues[0] ?? 0;\n\n analysis.avg =\n definedValues.length === 0\n ? 0\n : definedValues.reduce((prev, cur) => prev + cur, 0) / values.length;\n\n analysis.med = definedValues[Math.ceil(definedValues.length / 2)] ?? 0;\n\n return analysis;\n}\n\nexport function makeCombinedAnalysis(\n analysis: Record<FilterStatusType, ChartableStageAnalysis>,\n allDurations: Array<number>,\n): ChartableStageAnalysis {\n if (analysis.succeeded) {\n // If succeeded is a viewed status, it's probably what's expected to see\n // overall. Otherwise combine all other.\n return analysis.succeeded;\n }\n\n const analysisValues = Object.values(analysis);\n\n const max = analysisValues.reduce((prev, cur) => Math.max(prev, cur.max), 0);\n const min = analysisValues.reduce(\n (prev, cur) => Math.min(prev, cur.min),\n max,\n );\n const avg = !allDurations.length\n ? 0\n : allDurations.reduce((prev, cur) => prev + cur, 0) / allDurations.length;\n allDurations.sort((a, b) => a - b);\n const med = allDurations[Math.ceil(allDurations.length / 2)] ?? 0;\n\n return {\n max,\n min,\n avg,\n med,\n };\n}\n"],"names":[],"mappings":"AAmBgB,SAAA,WAAA,CACd,QACA,MACwB,EAAA;AACxB,EAAA,MAAM,QAAmC,GAAA;AAAA,IACvC,GAAK,EAAA,CAAA;AAAA,IACL,GAAK,EAAA,CAAA;AAAA,IACL,GAAK,EAAA,CAAA;AAAA,IACL,GAAK,EAAA;AAAA,GACP;AAEA,EAAM,MAAA,aAAA,GAAgB,OACnB,MAAO,CAAA,CAAA,KAAA,KAAS,OAAO,KAAM,CAAA,MAAM,MAAM,WAAW,CAAA,CACpD,IAAI,CAAS,KAAA,KAAA,KAAA,CAAM,MAAM,CAAE,CAAA,CAC3B,KAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,GAAI,CAAC,CAAA;AAEvB,EAAA,QAAA,CAAS,GAAM,GAAA,aAAA,CAAc,aAAc,CAAA,MAAA,GAAS,CAAC,CAAK,IAAA,CAAA;AAE1D,EAAS,QAAA,CAAA,GAAA,GAAM,aAAc,CAAA,CAAC,CAAK,IAAA,CAAA;AAEnC,EAAA,QAAA,CAAS,GACP,GAAA,aAAA,CAAc,MAAW,KAAA,CAAA,GACrB,IACA,aAAc,CAAA,MAAA,CAAO,CAAC,IAAA,EAAM,GAAQ,KAAA,IAAA,GAAO,GAAK,EAAA,CAAC,IAAI,MAAO,CAAA,MAAA;AAElE,EAAS,QAAA,CAAA,GAAA,GAAM,cAAc,IAAK,CAAA,IAAA,CAAK,cAAc,MAAS,GAAA,CAAC,CAAC,CAAK,IAAA,CAAA;AAErE,EAAO,OAAA,QAAA;AACT;AAEgB,SAAA,oBAAA,CACd,UACA,YACwB,EAAA;AACxB,EAAA,IAAI,SAAS,SAAW,EAAA;AAGtB,IAAA,OAAO,QAAS,CAAA,SAAA;AAAA;AAGlB,EAAM,MAAA,cAAA,GAAiB,MAAO,CAAA,MAAA,CAAO,QAAQ,CAAA;AAE7C,EAAA,MAAM,GAAM,GAAA,cAAA,CAAe,MAAO,CAAA,CAAC,IAAM,EAAA,GAAA,KAAQ,IAAK,CAAA,GAAA,CAAI,IAAM,EAAA,GAAA,CAAI,GAAG,CAAA,EAAG,CAAC,CAAA;AAC3E,EAAA,MAAM,MAAM,cAAe,CAAA,MAAA;AAAA,IACzB,CAAC,IAAM,EAAA,GAAA,KAAQ,KAAK,GAAI,CAAA,IAAA,EAAM,IAAI,GAAG,CAAA;AAAA,IACrC;AAAA,GACF;AACA,EAAA,MAAM,GAAM,GAAA,CAAC,YAAa,CAAA,MAAA,GACtB,IACA,YAAa,CAAA,MAAA,CAAO,CAAC,IAAA,EAAM,GAAQ,KAAA,IAAA,GAAO,GAAK,EAAA,CAAC,IAAI,YAAa,CAAA,MAAA;AACrE,EAAA,YAAA,CAAa,IAAK,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,IAAI,CAAC,CAAA;AACjC,EAAM,MAAA,GAAA,GAAM,aAAa,IAAK,CAAA,IAAA,CAAK,aAAa,MAAS,GAAA,CAAC,CAAC,CAAK,IAAA,CAAA;AAEhE,EAAO,OAAA;AAAA,IACL,GAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversions.esm.js","sources":["../../../src/charts/logic/conversions.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { map } from 'already';\n\nimport { Build, Stage, FilterStatusType } from '../../apis/types';\nimport { ChartableStage, ChartableStagesAnalysis } from '../types';\nimport { getOrSetStage, makeStage, sortStatuses } from './utils';\nimport { finalizeStage } from './finalize-stage';\nimport { dailySummary } from './daily-summary';\n\nexport interface ChartableStagesOptions {\n normalizeTimeRange: boolean;\n}\n\n/**\n * Converts a list of builds, each with a tree of stages (and durations) into a\n * merged tree of stages, and calculates {avg, min, max} of each stage.\n */\nexport async function buildsToChartableStages(\n builds: Array<Build>,\n options: ChartableStagesOptions,\n): Promise<ChartableStagesAnalysis> {\n const { normalizeTimeRange } = options;\n\n const total: ChartableStage = makeStage('Total');\n\n const recurseDown = (\n stageMap: Map<string, ChartableStage>,\n stage: Stage,\n __epoch: number,\n ) => {\n const { name, status, duration } = stage;\n\n const subChartableStage = getOrSetStage(stageMap, name);\n\n subChartableStage.statusSet.add(status);\n subChartableStage.values.push({\n __epoch,\n [status]: duration,\n [`${status} avg`]: duration,\n });\n\n stage.stages?.forEach(subStage => {\n recurseDown(subChartableStage.stages, subStage, __epoch);\n });\n };\n\n const stages = new Map<string, ChartableStage>();\n\n await map(builds, { chunk: 'idle' }, build => {\n const { duration, requestedAt, status } = build;\n const __epoch = requestedAt.getTime();\n\n total.statusSet.add(status);\n total.values.push({\n __epoch,\n [status]: duration,\n [`${status} avg`]: duration,\n });\n\n build.stages?.forEach(subStage => {\n recurseDown(stages, subStage, __epoch);\n });\n });\n\n const allEpochs = normalizeTimeRange\n ? builds.map(build => build.requestedAt.getTime())\n : [];\n\n // Recurse down again and calculate averages\n await map([...stages.values()], { chunk: 'idle' }, stage =>\n finalizeStage(stage, { allEpochs, averageWidth: 10 }),\n );\n finalizeStage(total, { allEpochs, averageWidth: 10 });\n\n const daily = dailySummary(builds);\n\n const statuses = findStatuses(total, [...stages.values()]);\n\n return { daily, total, stages, statuses };\n}\n\nfunction findStatuses(\n total: ChartableStage,\n stages: Array<ChartableStage>,\n): Array<string> {\n const statuses = new Set<string>();\n\n const addStatuses = (set: Set<FilterStatusType>) => {\n set.forEach(status => {\n statuses.add(status);\n });\n };\n\n addStatuses(total.statusSet);\n\n const recurse = (subStages: Array<ChartableStage>) => {\n subStages.forEach(stage => {\n addStatuses(stage.statusSet);\n recurse([...stage.stages.values()]);\n });\n };\n recurse(stages);\n\n return sortStatuses([...statuses]);\n}\n"],"names":[],"mappings":";;;;;AAgCsB,eAAA,uBAAA,CACpB,QACA,OACkC,EAAA;AAClC,EAAM,MAAA,EAAE,oBAAuB,GAAA,OAAA
|
|
1
|
+
{"version":3,"file":"conversions.esm.js","sources":["../../../src/charts/logic/conversions.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { map } from 'already';\n\nimport { Build, Stage, FilterStatusType } from '../../apis/types';\nimport { ChartableStage, ChartableStagesAnalysis } from '../types';\nimport { getOrSetStage, makeStage, sortStatuses } from './utils';\nimport { finalizeStage } from './finalize-stage';\nimport { dailySummary } from './daily-summary';\n\nexport interface ChartableStagesOptions {\n normalizeTimeRange: boolean;\n}\n\n/**\n * Converts a list of builds, each with a tree of stages (and durations) into a\n * merged tree of stages, and calculates {avg, min, max} of each stage.\n */\nexport async function buildsToChartableStages(\n builds: Array<Build>,\n options: ChartableStagesOptions,\n): Promise<ChartableStagesAnalysis> {\n const { normalizeTimeRange } = options;\n\n const total: ChartableStage = makeStage('Total');\n\n const recurseDown = (\n stageMap: Map<string, ChartableStage>,\n stage: Stage,\n __epoch: number,\n ) => {\n const { name, status, duration } = stage;\n\n const subChartableStage = getOrSetStage(stageMap, name);\n\n subChartableStage.statusSet.add(status);\n subChartableStage.values.push({\n __epoch,\n [status]: duration,\n [`${status} avg`]: duration,\n });\n\n stage.stages?.forEach(subStage => {\n recurseDown(subChartableStage.stages, subStage, __epoch);\n });\n };\n\n const stages = new Map<string, ChartableStage>();\n\n await map(builds, { chunk: 'idle' }, build => {\n const { duration, requestedAt, status } = build;\n const __epoch = requestedAt.getTime();\n\n total.statusSet.add(status);\n total.values.push({\n __epoch,\n [status]: duration,\n [`${status} avg`]: duration,\n });\n\n build.stages?.forEach(subStage => {\n recurseDown(stages, subStage, __epoch);\n });\n });\n\n const allEpochs = normalizeTimeRange\n ? builds.map(build => build.requestedAt.getTime())\n : [];\n\n // Recurse down again and calculate averages\n await map([...stages.values()], { chunk: 'idle' }, stage =>\n finalizeStage(stage, { allEpochs, averageWidth: 10 }),\n );\n finalizeStage(total, { allEpochs, averageWidth: 10 });\n\n const daily = dailySummary(builds);\n\n const statuses = findStatuses(total, [...stages.values()]);\n\n return { daily, total, stages, statuses };\n}\n\nfunction findStatuses(\n total: ChartableStage,\n stages: Array<ChartableStage>,\n): Array<string> {\n const statuses = new Set<string>();\n\n const addStatuses = (set: Set<FilterStatusType>) => {\n set.forEach(status => {\n statuses.add(status);\n });\n };\n\n addStatuses(total.statusSet);\n\n const recurse = (subStages: Array<ChartableStage>) => {\n subStages.forEach(stage => {\n addStatuses(stage.statusSet);\n recurse([...stage.stages.values()]);\n });\n };\n recurse(stages);\n\n return sortStatuses([...statuses]);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"count-builds-per-day.esm.js","sources":["../../../src/charts/logic/count-builds-per-day.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { groupBy } from 'lodash';\n\nimport { FilterStatusType, statusTypes } from '../../apis/types';\nimport { Countify, ChartableStageDatapoints } from '../types';\nimport { startOfDay } from './utils';\n\nexport function countBuildsPerDay(\n values: ReadonlyArray<ChartableStageDatapoints>,\n) {\n const days = groupBy(values, value => startOfDay(value.__epoch));\n Object.entries(days).forEach(([_startOfDay, valuesThisDay]) => {\n const counts = Object.fromEntries(\n statusTypes\n .map(\n type =>\n [\n type,\n valuesThisDay.filter(value => value[type] !== undefined).length,\n ] as const,\n )\n .filter(([_type, count]) => count > 0)\n .map(([type, count]): [Countify<FilterStatusType>, number] => [\n `${type} count`,\n count,\n ]),\n );\n\n // Assign the count for this day to the first value this day\n Object.assign(valuesThisDay[0], counts);\n });\n}\n"],"names":[],"mappings":";;;;AAsBO,SAAS,kBACd,MACA,EAAA;AACA,EAAA,MAAM,OAAO,OAAQ,CAAA,MAAA,EAAQ,WAAS,UAAW,CAAA,KAAA,CAAM,OAAO,CAAC,CAAA
|
|
1
|
+
{"version":3,"file":"count-builds-per-day.esm.js","sources":["../../../src/charts/logic/count-builds-per-day.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { groupBy } from 'lodash';\n\nimport { FilterStatusType, statusTypes } from '../../apis/types';\nimport { Countify, ChartableStageDatapoints } from '../types';\nimport { startOfDay } from './utils';\n\nexport function countBuildsPerDay(\n values: ReadonlyArray<ChartableStageDatapoints>,\n) {\n const days = groupBy(values, value => startOfDay(value.__epoch));\n Object.entries(days).forEach(([_startOfDay, valuesThisDay]) => {\n const counts = Object.fromEntries(\n statusTypes\n .map(\n type =>\n [\n type,\n valuesThisDay.filter(value => value[type] !== undefined).length,\n ] as const,\n )\n .filter(([_type, count]) => count > 0)\n .map(([type, count]): [Countify<FilterStatusType>, number] => [\n `${type} count`,\n count,\n ]),\n );\n\n // Assign the count for this day to the first value this day\n Object.assign(valuesThisDay[0], counts);\n });\n}\n"],"names":[],"mappings":";;;;AAsBO,SAAS,kBACd,MACA,EAAA;AACA,EAAA,MAAM,OAAO,OAAQ,CAAA,MAAA,EAAQ,WAAS,UAAW,CAAA,KAAA,CAAM,OAAO,CAAC,CAAA;AAC/D,EAAO,MAAA,CAAA,OAAA,CAAQ,IAAI,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,WAAA,EAAa,aAAa,CAAM,KAAA;AAC7D,IAAA,MAAM,SAAS,MAAO,CAAA,WAAA;AAAA,MACpB,WACG,CAAA,GAAA;AAAA,QACC,CACE,IAAA,KAAA;AAAA,UACE,IAAA;AAAA,UACA,cAAc,MAAO,CAAA,CAAA,KAAA,KAAS,MAAM,IAAI,CAAA,KAAM,MAAS,CAAE,CAAA;AAAA;AAC3D,OAEH,CAAA,MAAA,CAAO,CAAC,CAAC,OAAO,KAAK,CAAA,KAAM,KAAQ,GAAA,CAAC,EACpC,GAAI,CAAA,CAAC,CAAC,IAAA,EAAM,KAAK,CAA4C,KAAA;AAAA,QAC5D,GAAG,IAAI,CAAA,MAAA,CAAA;AAAA,QACP;AAAA,OACD;AAAA,KACL;AAGA,IAAA,MAAA,CAAO,MAAO,CAAA,aAAA,CAAc,CAAC,CAAA,EAAG,MAAM,CAAA;AAAA,GACvC,CAAA;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daily-summary.esm.js","sources":["../../../src/charts/logic/daily-summary.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { groupBy, countBy } from 'lodash';\n\nimport { Build } from '../../apis/types';\nimport {\n Epoch,\n TriggerReasonsDatapoint,\n StatusesDatapoint,\n ChartableDaily,\n} from '../types';\nimport { sortStatuses, sortTriggerReasons, startOfDay } from './utils';\n\nexport function dailySummary(builds: ReadonlyArray<Build>): ChartableDaily {\n const triggersDaily = countTriggersPerDay(builds);\n const statusesDaily = countStatusesPerDay(builds);\n\n const { triggerReasons } = triggersDaily;\n const { statuses } = statusesDaily;\n\n const reasonMap = new Map(\n triggersDaily.values.map(value => [value.__epoch, value]),\n );\n const statusMap = new Map(\n statusesDaily.values.map(value => [value.__epoch, value]),\n );\n\n const days = Object.keys(\n groupBy(builds, value => startOfDay(value.requestedAt)),\n )\n .map(epoch => parseInt(epoch, 10))\n .sort();\n\n return {\n values: days.map(epoch => ({\n __epoch: epoch,\n ...reasonMap.get(epoch),\n ...statusMap.get(epoch),\n })),\n triggerReasons,\n statuses,\n };\n}\n\nfunction countTriggersPerDay(builds: ReadonlyArray<Build>) {\n const days = groupBy(builds, value => startOfDay(value.requestedAt));\n\n const triggerReasons = sortTriggerReasons([\n ...new Set(\n builds\n .map(({ triggeredBy }) => triggeredBy)\n .filter((v): v is NonNullable<typeof v> => !!v),\n ),\n ]);\n\n const values = Object.entries(days).map(([epoch, buildsThisDay]) => {\n const datapoint = Object.fromEntries(\n triggerReasons\n .map(\n reason =>\n [\n reason,\n buildsThisDay.filter(build => build.triggeredBy === reason)\n .length,\n ] as const,\n )\n .filter(([_type, count]) => count > 0),\n ) as Omit<TriggerReasonsDatapoint, '__epoch'>;\n\n // Assign the count for this day to the first value this day\n const value: Epoch & TriggerReasonsDatapoint = Object.assign(datapoint, {\n __epoch: parseInt(epoch, 10),\n });\n\n return value;\n });\n\n return { triggerReasons, values };\n}\n\nfunction countStatusesPerDay(builds: ReadonlyArray<Build>) {\n const days = groupBy(builds, value => startOfDay(value.requestedAt));\n\n const foundStatuses = new Set<string>();\n\n const values = Object.entries(days).map(([epoch, buildsThisDay]) => {\n const byStatus = countBy(buildsThisDay, 'status');\n\n const value: Epoch & StatusesDatapoint = {\n __epoch: parseInt(epoch, 10),\n ...byStatus,\n };\n\n Object.keys(byStatus).forEach(status => {\n foundStatuses.add(status);\n });\n\n return value;\n });\n\n return {\n statuses: sortStatuses([...foundStatuses]),\n values,\n };\n}\n"],"names":[],"mappings":";;;AA2BO,SAAS,aAAa,MAA8C,EAAA;AACzE,EAAM,MAAA,aAAA,GAAgB,oBAAoB,MAAM,CAAA
|
|
1
|
+
{"version":3,"file":"daily-summary.esm.js","sources":["../../../src/charts/logic/daily-summary.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { groupBy, countBy } from 'lodash';\n\nimport { Build } from '../../apis/types';\nimport {\n Epoch,\n TriggerReasonsDatapoint,\n StatusesDatapoint,\n ChartableDaily,\n} from '../types';\nimport { sortStatuses, sortTriggerReasons, startOfDay } from './utils';\n\nexport function dailySummary(builds: ReadonlyArray<Build>): ChartableDaily {\n const triggersDaily = countTriggersPerDay(builds);\n const statusesDaily = countStatusesPerDay(builds);\n\n const { triggerReasons } = triggersDaily;\n const { statuses } = statusesDaily;\n\n const reasonMap = new Map(\n triggersDaily.values.map(value => [value.__epoch, value]),\n );\n const statusMap = new Map(\n statusesDaily.values.map(value => [value.__epoch, value]),\n );\n\n const days = Object.keys(\n groupBy(builds, value => startOfDay(value.requestedAt)),\n )\n .map(epoch => parseInt(epoch, 10))\n .sort();\n\n return {\n values: days.map(epoch => ({\n __epoch: epoch,\n ...reasonMap.get(epoch),\n ...statusMap.get(epoch),\n })),\n triggerReasons,\n statuses,\n };\n}\n\nfunction countTriggersPerDay(builds: ReadonlyArray<Build>) {\n const days = groupBy(builds, value => startOfDay(value.requestedAt));\n\n const triggerReasons = sortTriggerReasons([\n ...new Set(\n builds\n .map(({ triggeredBy }) => triggeredBy)\n .filter((v): v is NonNullable<typeof v> => !!v),\n ),\n ]);\n\n const values = Object.entries(days).map(([epoch, buildsThisDay]) => {\n const datapoint = Object.fromEntries(\n triggerReasons\n .map(\n reason =>\n [\n reason,\n buildsThisDay.filter(build => build.triggeredBy === reason)\n .length,\n ] as const,\n )\n .filter(([_type, count]) => count > 0),\n ) as Omit<TriggerReasonsDatapoint, '__epoch'>;\n\n // Assign the count for this day to the first value this day\n const value: Epoch & TriggerReasonsDatapoint = Object.assign(datapoint, {\n __epoch: parseInt(epoch, 10),\n });\n\n return value;\n });\n\n return { triggerReasons, values };\n}\n\nfunction countStatusesPerDay(builds: ReadonlyArray<Build>) {\n const days = groupBy(builds, value => startOfDay(value.requestedAt));\n\n const foundStatuses = new Set<string>();\n\n const values = Object.entries(days).map(([epoch, buildsThisDay]) => {\n const byStatus = countBy(buildsThisDay, 'status');\n\n const value: Epoch & StatusesDatapoint = {\n __epoch: parseInt(epoch, 10),\n ...byStatus,\n };\n\n Object.keys(byStatus).forEach(status => {\n foundStatuses.add(status);\n });\n\n return value;\n });\n\n return {\n statuses: sortStatuses([...foundStatuses]),\n values,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finalize-stage.esm.js","sources":["../../../src/charts/logic/finalize-stage.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { FilterStatusType, statusTypes } from '../../apis/types';\nimport { Averagify, ChartableStage } from '../types';\nimport { countBuildsPerDay } from './count-builds-per-day';\nimport { getAnalysis, makeCombinedAnalysis } from './analysis';\nimport { average } from './utils';\n\ninterface FinalizeStageOptions {\n averageWidth: number;\n allEpochs: Array<number>;\n}\n\n/**\n * Calculate:\n * * {avg, min, max}\n * * count per day\n * of a stage and its sub stages, recursively.\n *\n * This is calculated per status (successful, failed, etc).\n */\nexport function finalizeStage(\n stage: ChartableStage,\n options: FinalizeStageOptions,\n) {\n const { averageWidth, allEpochs } = options;\n const { values, analysis, combinedAnalysis } = stage;\n\n if (allEpochs.length > 0) {\n const valueEpochs = new Set(values.map(value => value.__epoch));\n\n allEpochs.forEach(epoch => {\n if (!valueEpochs.has(epoch)) {\n values.push({ __epoch: epoch });\n }\n });\n }\n\n values.sort((a, b) => a.__epoch - b.__epoch);\n\n countBuildsPerDay(values);\n\n const allDurations: Array<number> = [];\n\n statusTypes.forEach(status => {\n analysis[status] = getAnalysis(values, status);\n\n const durationsIndexes = values\n .map(value => value[status])\n .map((duration, index) => ({ index, duration }))\n .filter(({ duration }) => typeof duration !== 'undefined')\n .map(({ index }) => index);\n const durationsDense = values\n .map(value => value[status])\n .filter(\n (duration): duration is number => typeof duration !== 'undefined',\n );\n\n durationsDense.forEach(dur => allDurations.push(dur));\n\n const averages = durationsDense.map((_, i) =>\n average(\n durationsDense.slice(\n Math.max(i - averageWidth, 0),\n Math.min(i + averageWidth, durationsDense.length),\n ),\n ),\n );\n\n averages.forEach((avg, index) => {\n const key: Averagify<FilterStatusType> = `${status} avg`;\n values[durationsIndexes[index]][key] = avg;\n });\n });\n\n Object.assign(combinedAnalysis, makeCombinedAnalysis(analysis, allDurations));\n\n stage.stages.forEach(subStage => finalizeStage(subStage, options));\n}\n"],"names":[],"mappings":";;;;;AAmCgB,SAAA,aAAA,CACd,OACA,OACA,EAAA;AACA,EAAM,MAAA,EAAE,YAAc,EAAA,SAAA,EAAc,GAAA,OAAA
|
|
1
|
+
{"version":3,"file":"finalize-stage.esm.js","sources":["../../../src/charts/logic/finalize-stage.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { FilterStatusType, statusTypes } from '../../apis/types';\nimport { Averagify, ChartableStage } from '../types';\nimport { countBuildsPerDay } from './count-builds-per-day';\nimport { getAnalysis, makeCombinedAnalysis } from './analysis';\nimport { average } from './utils';\n\ninterface FinalizeStageOptions {\n averageWidth: number;\n allEpochs: Array<number>;\n}\n\n/**\n * Calculate:\n * * {avg, min, max}\n * * count per day\n * of a stage and its sub stages, recursively.\n *\n * This is calculated per status (successful, failed, etc).\n */\nexport function finalizeStage(\n stage: ChartableStage,\n options: FinalizeStageOptions,\n) {\n const { averageWidth, allEpochs } = options;\n const { values, analysis, combinedAnalysis } = stage;\n\n if (allEpochs.length > 0) {\n const valueEpochs = new Set(values.map(value => value.__epoch));\n\n allEpochs.forEach(epoch => {\n if (!valueEpochs.has(epoch)) {\n values.push({ __epoch: epoch });\n }\n });\n }\n\n values.sort((a, b) => a.__epoch - b.__epoch);\n\n countBuildsPerDay(values);\n\n const allDurations: Array<number> = [];\n\n statusTypes.forEach(status => {\n analysis[status] = getAnalysis(values, status);\n\n const durationsIndexes = values\n .map(value => value[status])\n .map((duration, index) => ({ index, duration }))\n .filter(({ duration }) => typeof duration !== 'undefined')\n .map(({ index }) => index);\n const durationsDense = values\n .map(value => value[status])\n .filter(\n (duration): duration is number => typeof duration !== 'undefined',\n );\n\n durationsDense.forEach(dur => allDurations.push(dur));\n\n const averages = durationsDense.map((_, i) =>\n average(\n durationsDense.slice(\n Math.max(i - averageWidth, 0),\n Math.min(i + averageWidth, durationsDense.length),\n ),\n ),\n );\n\n averages.forEach((avg, index) => {\n const key: Averagify<FilterStatusType> = `${status} avg`;\n values[durationsIndexes[index]][key] = avg;\n });\n });\n\n Object.assign(combinedAnalysis, makeCombinedAnalysis(analysis, allDurations));\n\n stage.stages.forEach(subStage => finalizeStage(subStage, options));\n}\n"],"names":[],"mappings":";;;;;AAmCgB,SAAA,aAAA,CACd,OACA,OACA,EAAA;AACA,EAAM,MAAA,EAAE,YAAc,EAAA,SAAA,EAAc,GAAA,OAAA;AACpC,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAU,EAAA,gBAAA,EAAqB,GAAA,KAAA;AAE/C,EAAI,IAAA,SAAA,CAAU,SAAS,CAAG,EAAA;AACxB,IAAM,MAAA,WAAA,GAAc,IAAI,GAAI,CAAA,MAAA,CAAO,IAAI,CAAS,KAAA,KAAA,KAAA,CAAM,OAAO,CAAC,CAAA;AAE9D,IAAA,SAAA,CAAU,QAAQ,CAAS,KAAA,KAAA;AACzB,MAAA,IAAI,CAAC,WAAA,CAAY,GAAI,CAAA,KAAK,CAAG,EAAA;AAC3B,QAAA,MAAA,CAAO,IAAK,CAAA,EAAE,OAAS,EAAA,KAAA,EAAO,CAAA;AAAA;AAChC,KACD,CAAA;AAAA;AAGH,EAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAE,CAAA,OAAA,GAAU,EAAE,OAAO,CAAA;AAE3C,EAAA,iBAAA,CAAkB,MAAM,CAAA;AAExB,EAAA,MAAM,eAA8B,EAAC;AAErC,EAAA,WAAA,CAAY,QAAQ,CAAU,MAAA,KAAA;AAC5B,IAAA,QAAA,CAAS,MAAM,CAAA,GAAI,WAAY,CAAA,MAAA,EAAQ,MAAM,CAAA;AAE7C,IAAA,MAAM,gBAAmB,GAAA,MAAA,CACtB,GAAI,CAAA,CAAA,KAAA,KAAS,KAAM,CAAA,MAAM,CAAC,CAAA,CAC1B,GAAI,CAAA,CAAC,QAAU,EAAA,KAAA,MAAW,EAAE,KAAO,EAAA,QAAA,EAAW,CAAA,CAAA,CAC9C,MAAO,CAAA,CAAC,EAAE,QAAA,OAAe,OAAO,QAAA,KAAa,WAAW,CAAA,CACxD,GAAI,CAAA,CAAC,EAAE,KAAA,OAAY,KAAK,CAAA;AAC3B,IAAA,MAAM,iBAAiB,MACpB,CAAA,GAAA,CAAI,WAAS,KAAM,CAAA,MAAM,CAAC,CAC1B,CAAA,MAAA;AAAA,MACC,CAAC,QAAiC,KAAA,OAAO,QAAa,KAAA;AAAA,KACxD;AAEF,IAAA,cAAA,CAAe,OAAQ,CAAA,CAAA,GAAA,KAAO,YAAa,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA;AAEpD,IAAA,MAAM,WAAW,cAAe,CAAA,GAAA;AAAA,MAAI,CAAC,GAAG,CACtC,KAAA,OAAA;AAAA,QACE,cAAe,CAAA,KAAA;AAAA,UACb,IAAK,CAAA,GAAA,CAAI,CAAI,GAAA,YAAA,EAAc,CAAC,CAAA;AAAA,UAC5B,IAAK,CAAA,GAAA,CAAI,CAAI,GAAA,YAAA,EAAc,eAAe,MAAM;AAAA;AAClD;AACF,KACF;AAEA,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAU,KAAA;AAC/B,MAAM,MAAA,GAAA,GAAmC,GAAG,MAAM,CAAA,IAAA,CAAA;AAClD,MAAA,MAAA,CAAO,gBAAiB,CAAA,KAAK,CAAC,CAAA,CAAE,GAAG,CAAI,GAAA,GAAA;AAAA,KACxC,CAAA;AAAA,GACF,CAAA;AAED,EAAA,MAAA,CAAO,MAAO,CAAA,gBAAA,EAAkB,oBAAqB,CAAA,QAAA,EAAU,YAAY,CAAC,CAAA;AAE5E,EAAA,KAAA,CAAM,OAAO,OAAQ,CAAA,CAAA,QAAA,KAAY,aAAc,CAAA,QAAA,EAAU,OAAO,CAAC,CAAA;AACnE;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.esm.js","sources":["../../../src/charts/logic/utils.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { DateTime } from 'luxon';\n\nimport { FilterStatusType, statusTypes } from '../../apis/types';\nimport { ChartableStage } from '../types';\n\nexport function average(values: number[]): number {\n return !values.length\n ? 0\n : Math.round(values.reduce((prev, cur) => prev + cur, 0) / values.length);\n}\n\nexport function getOrSetStage(\n stages: Map<string, ChartableStage>,\n name: string,\n): ChartableStage {\n const stage = stages.get(name);\n if (stage) return stage;\n\n const newStage: ChartableStage = makeStage(name);\n stages.set(name, newStage);\n return newStage;\n}\n\nexport function makeStage(name: string): ChartableStage {\n return {\n analysis: {\n unknown: { avg: 0, med: 0, max: 0, min: 0 },\n enqueued: { avg: 0, med: 0, max: 0, min: 0 },\n scheduled: { avg: 0, med: 0, max: 0, min: 0 },\n running: { avg: 0, med: 0, max: 0, min: 0 },\n aborted: { avg: 0, med: 0, max: 0, min: 0 },\n succeeded: { avg: 0, med: 0, max: 0, min: 0 },\n failed: { avg: 0, med: 0, max: 0, min: 0 },\n stalled: { avg: 0, med: 0, max: 0, min: 0 },\n expired: { avg: 0, med: 0, max: 0, min: 0 },\n },\n combinedAnalysis: { avg: 0, med: 0, max: 0, min: 0 },\n statusSet: new Set<FilterStatusType>(),\n name,\n values: [],\n stages: new Map(),\n };\n}\n\nexport function startOfDay(date: number | Date) {\n if (typeof date === 'number') {\n return DateTime.fromMillis(date).startOf('day').toMillis();\n }\n return DateTime.fromJSDate(date).startOf('day').toMillis();\n}\n\nexport function sortTriggerReasons(reasons: Array<string>): Array<string> {\n return reasons.sort((a, b) => {\n if (a === 'manual') return -1;\n else if (b === 'manual') return 1;\n else if (a === 'scm') return -1;\n else if (b === 'scm') return 1;\n else if (a === 'other') return -1;\n else if (b === 'other') return 1;\n return a.localeCompare(b);\n });\n}\n\nexport function sortStatuses(statuses: Array<string>): Array<string> {\n return [\n ...statusTypes.filter(status => statuses.includes(status)),\n ...statuses\n .filter(status => !(statusTypes as Array<string>).includes(status))\n .sort((a, b) => a.localeCompare(b)),\n ];\n}\n"],"names":[],"mappings":";;;AAqBO,SAAS,QAAQ,MAA0B,EAAA;AAChD,EAAA,OAAO,CAAC,MAAO,CAAA,MAAA,GACX,CACA,GAAA,IAAA,CAAK,MAAM,MAAO,CAAA,MAAA,CAAO,CAAC,IAAA,EAAM,QAAQ,IAAO,GAAA,GAAA,EAAK,CAAC,CAAA,GAAI,OAAO,MAAM,CAAA
|
|
1
|
+
{"version":3,"file":"utils.esm.js","sources":["../../../src/charts/logic/utils.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { DateTime } from 'luxon';\n\nimport { FilterStatusType, statusTypes } from '../../apis/types';\nimport { ChartableStage } from '../types';\n\nexport function average(values: number[]): number {\n return !values.length\n ? 0\n : Math.round(values.reduce((prev, cur) => prev + cur, 0) / values.length);\n}\n\nexport function getOrSetStage(\n stages: Map<string, ChartableStage>,\n name: string,\n): ChartableStage {\n const stage = stages.get(name);\n if (stage) return stage;\n\n const newStage: ChartableStage = makeStage(name);\n stages.set(name, newStage);\n return newStage;\n}\n\nexport function makeStage(name: string): ChartableStage {\n return {\n analysis: {\n unknown: { avg: 0, med: 0, max: 0, min: 0 },\n enqueued: { avg: 0, med: 0, max: 0, min: 0 },\n scheduled: { avg: 0, med: 0, max: 0, min: 0 },\n running: { avg: 0, med: 0, max: 0, min: 0 },\n aborted: { avg: 0, med: 0, max: 0, min: 0 },\n succeeded: { avg: 0, med: 0, max: 0, min: 0 },\n failed: { avg: 0, med: 0, max: 0, min: 0 },\n stalled: { avg: 0, med: 0, max: 0, min: 0 },\n expired: { avg: 0, med: 0, max: 0, min: 0 },\n },\n combinedAnalysis: { avg: 0, med: 0, max: 0, min: 0 },\n statusSet: new Set<FilterStatusType>(),\n name,\n values: [],\n stages: new Map(),\n };\n}\n\nexport function startOfDay(date: number | Date) {\n if (typeof date === 'number') {\n return DateTime.fromMillis(date).startOf('day').toMillis();\n }\n return DateTime.fromJSDate(date).startOf('day').toMillis();\n}\n\nexport function sortTriggerReasons(reasons: Array<string>): Array<string> {\n return reasons.sort((a, b) => {\n if (a === 'manual') return -1;\n else if (b === 'manual') return 1;\n else if (a === 'scm') return -1;\n else if (b === 'scm') return 1;\n else if (a === 'other') return -1;\n else if (b === 'other') return 1;\n return a.localeCompare(b);\n });\n}\n\nexport function sortStatuses(statuses: Array<string>): Array<string> {\n return [\n ...statusTypes.filter(status => statuses.includes(status)),\n ...statuses\n .filter(status => !(statusTypes as Array<string>).includes(status))\n .sort((a, b) => a.localeCompare(b)),\n ];\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stage-chart.esm.js","sources":["../../src/charts/stage-chart.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { CSSProperties, Fragment, useMemo } from 'react';\nimport {\n Area,\n Bar,\n ComposedChart,\n XAxis,\n YAxis,\n YAxisProps,\n CartesianGrid,\n Legend,\n LegendProps,\n Line,\n Tooltip,\n ResponsiveContainer,\n} from 'recharts';\nimport Alert from '@material-ui/lab/Alert';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { capitalize } from 'lodash';\n\nimport { useZoom, useZoomArea } from './zoom';\nimport { CicdDefaults, statusTypes } from '../apis/types';\nimport { ChartableStage } from './types';\nimport {\n pickElements,\n labelFormatter,\n tickFormatterX,\n tickFormatterY,\n tooltipValueFormatter,\n formatDuration,\n} from '../components/utils';\nimport {\n statusColorMap,\n fireColors,\n colorStroke,\n colorStrokeAvg,\n} from './colors';\n\nconst fullWidth: CSSProperties = { width: '100%' };\nconst noUserSelect: CSSProperties = { userSelect: 'none' };\n\nconst transitionProps = { unmountOnExit: true };\n\nexport interface StageChartProps {\n stage: ChartableStage;\n\n chartTypes: CicdDefaults['chartTypes'];\n defaultCollapsed?: number;\n defaultHidden?: number;\n zeroYAxis?: boolean;\n}\n\nexport function StageChart(props: StageChartProps) {\n const { stage, ...chartOptions } = props;\n const {\n chartTypes,\n defaultCollapsed = 0,\n defaultHidden = 0,\n zeroYAxis = false,\n } = chartOptions;\n\n const { zoomFilterValues } = useZoom();\n const { zoomProps, getZoomArea } = useZoomArea();\n\n const ticks = useMemo(\n () => pickElements(stage.values, 8).map(val => val.__epoch),\n [stage.values],\n );\n const domainY = useMemo(\n () => [zeroYAxis ? 0 : 'auto', 'auto'] as YAxisProps['domain'],\n [zeroYAxis],\n );\n const statuses = useMemo(\n () => statusTypes.filter(status => stage.statusSet.has(status)),\n [stage.statusSet],\n );\n const legendPayload = useMemo(\n (): LegendProps['payload'] =>\n statuses.map(status => ({\n value: capitalize(status),\n type: 'line',\n id: status,\n color: statusColorMap[status],\n })),\n [statuses],\n );\n\n const subStages = useMemo(\n () =>\n new Map<string, ChartableStage>(\n [...stage.stages.entries()].filter(\n ([_name, subStage]) => subStage.combinedAnalysis.max > defaultHidden,\n ),\n ),\n [stage.stages, defaultHidden],\n );\n\n const zoomFilteredValues = useMemo(\n () => zoomFilterValues(stage.values),\n [stage.values, zoomFilterValues],\n );\n\n return stage.combinedAnalysis.max < defaultHidden ? null : (\n <Accordion\n defaultExpanded={stage.combinedAnalysis.max > defaultCollapsed}\n TransitionProps={transitionProps}\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography>\n {stage.name} (med {formatDuration(stage.combinedAnalysis.med)}, avg{' '}\n {formatDuration(stage.combinedAnalysis.avg)})\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n {stage.values.length === 0 ? (\n <Alert severity=\"info\">No data</Alert>\n ) : (\n <Grid container direction=\"column\">\n <Grid item style={noUserSelect}>\n <ResponsiveContainer width=\"100%\" height={140}>\n <ComposedChart data={zoomFilteredValues} {...zoomProps}>\n <defs>\n <linearGradient id=\"colorDur\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n {fireColors.map(([percent, color]) => (\n <stop\n key={percent}\n offset={percent}\n stopColor={color}\n stopOpacity={0.8}\n />\n ))}\n </linearGradient>\n </defs>\n {statuses.length > 1 && <Legend payload={legendPayload} />}\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis\n dataKey=\"__epoch\"\n type=\"category\"\n ticks={ticks}\n tickFormatter={tickFormatterX}\n />\n <YAxis\n yAxisId={1}\n tickFormatter={tickFormatterY}\n type=\"number\"\n tickCount={5}\n name=\"Duration\"\n domain={domainY}\n />\n <YAxis\n yAxisId={2}\n orientation=\"right\"\n type=\"number\"\n tickCount={5}\n name=\"Count\"\n />\n <Tooltip\n formatter={tooltipValueFormatter}\n labelFormatter={labelFormatter}\n />\n {statuses.reverse().map(status => (\n <Fragment key={status}>\n {!chartTypes[status].includes('duration') ? null : (\n <>\n <Area\n isAnimationActive={false}\n yAxisId={1}\n type=\"monotone\"\n dataKey={status}\n stackId={status}\n stroke={\n statuses.length > 1\n ? statusColorMap[status]\n : colorStroke\n }\n fillOpacity={statuses.length > 1 ? 0.5 : 1}\n fill={\n statuses.length > 1\n ? statusColorMap[status]\n : 'url(#colorDur)'\n }\n connectNulls\n />\n <Line\n isAnimationActive={false}\n yAxisId={1}\n type=\"monotone\"\n dataKey={`${status} avg`}\n stroke={\n statuses.length > 1\n ? statusColorMap[status]\n : colorStrokeAvg\n }\n opacity={0.8}\n strokeWidth={2}\n dot={false}\n connectNulls\n />\n </>\n )}\n {!chartTypes[status].includes('count') ? null : (\n <Bar\n isAnimationActive={false}\n yAxisId={2}\n type=\"monotone\"\n dataKey={`${status} count`}\n stackId=\"1\"\n stroke={statusColorMap[status] ?? ''}\n fillOpacity={0.5}\n fill={statusColorMap[status] ?? ''}\n />\n )}\n </Fragment>\n ))}\n {getZoomArea({ yAxisId: 1 })}\n </ComposedChart>\n </ResponsiveContainer>\n </Grid>\n {subStages.size === 0 ? null : (\n <Grid item>\n <Accordion\n defaultExpanded={false}\n TransitionProps={transitionProps}\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography>Sub stages ({subStages.size})</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <div style={fullWidth}>\n {[...subStages.values()].map(subStage => (\n <StageChart\n key={subStage.name}\n {...chartOptions}\n stage={subStage}\n />\n ))}\n </div>\n </AccordionDetails>\n </Accordion>\n </Grid>\n )}\n </Grid>\n )}\n </AccordionDetails>\n </Accordion>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stage-chart.esm.js","sources":["../../src/charts/stage-chart.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { CSSProperties, Fragment, useMemo } from 'react';\nimport {\n Area,\n Bar,\n ComposedChart,\n XAxis,\n YAxis,\n YAxisProps,\n CartesianGrid,\n Legend,\n LegendProps,\n Line,\n Tooltip,\n ResponsiveContainer,\n} from 'recharts';\nimport Alert from '@material-ui/lab/Alert';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { capitalize } from 'lodash';\n\nimport { useZoom, useZoomArea } from './zoom';\nimport { CicdDefaults, statusTypes } from '../apis/types';\nimport { ChartableStage } from './types';\nimport {\n pickElements,\n labelFormatter,\n tickFormatterX,\n tickFormatterY,\n tooltipValueFormatter,\n formatDuration,\n} from '../components/utils';\nimport {\n statusColorMap,\n fireColors,\n colorStroke,\n colorStrokeAvg,\n} from './colors';\n\nconst fullWidth: CSSProperties = { width: '100%' };\nconst noUserSelect: CSSProperties = { userSelect: 'none' };\n\nconst transitionProps = { unmountOnExit: true };\n\nexport interface StageChartProps {\n stage: ChartableStage;\n\n chartTypes: CicdDefaults['chartTypes'];\n defaultCollapsed?: number;\n defaultHidden?: number;\n zeroYAxis?: boolean;\n}\n\nexport function StageChart(props: StageChartProps) {\n const { stage, ...chartOptions } = props;\n const {\n chartTypes,\n defaultCollapsed = 0,\n defaultHidden = 0,\n zeroYAxis = false,\n } = chartOptions;\n\n const { zoomFilterValues } = useZoom();\n const { zoomProps, getZoomArea } = useZoomArea();\n\n const ticks = useMemo(\n () => pickElements(stage.values, 8).map(val => val.__epoch),\n [stage.values],\n );\n const domainY = useMemo(\n () => [zeroYAxis ? 0 : 'auto', 'auto'] as YAxisProps['domain'],\n [zeroYAxis],\n );\n const statuses = useMemo(\n () => statusTypes.filter(status => stage.statusSet.has(status)),\n [stage.statusSet],\n );\n const legendPayload = useMemo(\n (): LegendProps['payload'] =>\n statuses.map(status => ({\n value: capitalize(status),\n type: 'line',\n id: status,\n color: statusColorMap[status],\n })),\n [statuses],\n );\n\n const subStages = useMemo(\n () =>\n new Map<string, ChartableStage>(\n [...stage.stages.entries()].filter(\n ([_name, subStage]) => subStage.combinedAnalysis.max > defaultHidden,\n ),\n ),\n [stage.stages, defaultHidden],\n );\n\n const zoomFilteredValues = useMemo(\n () => zoomFilterValues(stage.values),\n [stage.values, zoomFilterValues],\n );\n\n return stage.combinedAnalysis.max < defaultHidden ? null : (\n <Accordion\n defaultExpanded={stage.combinedAnalysis.max > defaultCollapsed}\n TransitionProps={transitionProps}\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography>\n {stage.name} (med {formatDuration(stage.combinedAnalysis.med)}, avg{' '}\n {formatDuration(stage.combinedAnalysis.avg)})\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n {stage.values.length === 0 ? (\n <Alert severity=\"info\">No data</Alert>\n ) : (\n <Grid container direction=\"column\">\n <Grid item style={noUserSelect}>\n <ResponsiveContainer width=\"100%\" height={140}>\n <ComposedChart data={zoomFilteredValues} {...zoomProps}>\n <defs>\n <linearGradient id=\"colorDur\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n {fireColors.map(([percent, color]) => (\n <stop\n key={percent}\n offset={percent}\n stopColor={color}\n stopOpacity={0.8}\n />\n ))}\n </linearGradient>\n </defs>\n {statuses.length > 1 && <Legend payload={legendPayload} />}\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis\n dataKey=\"__epoch\"\n type=\"category\"\n ticks={ticks}\n tickFormatter={tickFormatterX}\n />\n <YAxis\n yAxisId={1}\n tickFormatter={tickFormatterY}\n type=\"number\"\n tickCount={5}\n name=\"Duration\"\n domain={domainY}\n />\n <YAxis\n yAxisId={2}\n orientation=\"right\"\n type=\"number\"\n tickCount={5}\n name=\"Count\"\n />\n <Tooltip\n formatter={tooltipValueFormatter}\n labelFormatter={labelFormatter}\n />\n {statuses.reverse().map(status => (\n <Fragment key={status}>\n {!chartTypes[status].includes('duration') ? null : (\n <>\n <Area\n isAnimationActive={false}\n yAxisId={1}\n type=\"monotone\"\n dataKey={status}\n stackId={status}\n stroke={\n statuses.length > 1\n ? statusColorMap[status]\n : colorStroke\n }\n fillOpacity={statuses.length > 1 ? 0.5 : 1}\n fill={\n statuses.length > 1\n ? statusColorMap[status]\n : 'url(#colorDur)'\n }\n connectNulls\n />\n <Line\n isAnimationActive={false}\n yAxisId={1}\n type=\"monotone\"\n dataKey={`${status} avg`}\n stroke={\n statuses.length > 1\n ? statusColorMap[status]\n : colorStrokeAvg\n }\n opacity={0.8}\n strokeWidth={2}\n dot={false}\n connectNulls\n />\n </>\n )}\n {!chartTypes[status].includes('count') ? null : (\n <Bar\n isAnimationActive={false}\n yAxisId={2}\n type=\"monotone\"\n dataKey={`${status} count`}\n stackId=\"1\"\n stroke={statusColorMap[status] ?? ''}\n fillOpacity={0.5}\n fill={statusColorMap[status] ?? ''}\n />\n )}\n </Fragment>\n ))}\n {getZoomArea({ yAxisId: 1 })}\n </ComposedChart>\n </ResponsiveContainer>\n </Grid>\n {subStages.size === 0 ? null : (\n <Grid item>\n <Accordion\n defaultExpanded={false}\n TransitionProps={transitionProps}\n >\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography>Sub stages ({subStages.size})</Typography>\n </AccordionSummary>\n <AccordionDetails>\n <div style={fullWidth}>\n {[...subStages.values()].map(subStage => (\n <StageChart\n key={subStage.name}\n {...chartOptions}\n stage={subStage}\n />\n ))}\n </div>\n </AccordionDetails>\n </Accordion>\n </Grid>\n )}\n </Grid>\n )}\n </AccordionDetails>\n </Accordion>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-chart.esm.js","sources":["../../src/charts/status-chart.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { Fragment, useMemo } from 'react';\nimport {\n Area,\n Bar,\n ComposedChart,\n XAxis,\n YAxis,\n CartesianGrid,\n Legend,\n LegendProps,\n Tooltip,\n ResponsiveContainer,\n} from 'recharts';\nimport Alert from '@material-ui/lab/Alert';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { capitalize } from 'lodash';\n\nimport { useZoom, useZoomArea } from './zoom';\nimport { FilterStatusType, TriggerReason } from '../apis/types';\nimport { labelFormatterWithoutTime, tickFormatterX } from '../components/utils';\nimport { statusColorMap, triggerColorMap } from './colors';\nimport { ChartableStagesAnalysis } from './types';\n\nexport interface StatusChartProps {\n analysis: ChartableStagesAnalysis;\n}\n\nexport function StatusChart(props: StatusChartProps) {\n const { analysis } = props;\n\n const { zoomFilterValues } = useZoom();\n const { zoomProps, getZoomArea } = useZoomArea();\n\n const values = useMemo(() => {\n return analysis.daily.values.map(value => {\n const totTriggers = analysis.daily.triggerReasons.reduce(\n (prev, cur) => prev + (value[cur as TriggerReason] ?? 0),\n 0,\n );\n\n if (!totTriggers) {\n return value;\n }\n\n return {\n ...value,\n ...Object.fromEntries(\n analysis.daily.triggerReasons.map(reason => [\n reason,\n (value[reason as TriggerReason] ?? 0) / totTriggers,\n ]),\n ),\n };\n });\n }, [analysis.daily]);\n\n const triggerReasonLegendPayload = useMemo(\n (): NonNullable<LegendProps['payload']> =>\n analysis.daily.triggerReasons.map(reason => ({\n value: humanTriggerReason(reason),\n type: 'line',\n id: reason,\n color: triggerColorMap[reason as TriggerReason] ?? '',\n })),\n [analysis.daily.triggerReasons],\n );\n\n const statusesLegendPayload = useMemo(\n (): NonNullable<LegendProps['payload']> =>\n analysis.daily.statuses.map(status => ({\n value: capitalize(status),\n type: 'line',\n id: status,\n color: statusColorMap[status as FilterStatusType] ?? '',\n })),\n [analysis.daily.statuses],\n );\n\n const legendPayload = useMemo(\n (): NonNullable<LegendProps['payload']> => [\n ...triggerReasonLegendPayload,\n ...statusesLegendPayload,\n ],\n [statusesLegendPayload, triggerReasonLegendPayload],\n );\n\n const tooltipFormatter = useMemo(() => {\n const reasonSet = new Set(analysis.daily.triggerReasons);\n\n return (percentOrCount: number, name: string): [any, any] => {\n const label = reasonSet.has(name)\n ? humanTriggerReason(name)\n : capitalize(name);\n const valueText = reasonSet.has(name)\n ? `${(percentOrCount * 100).toFixed(0)}%`\n : percentOrCount;\n\n return [\n // TODO(Rugvip): Types don't allow returning elements, but it was here before so presumably works\n <Typography component=\"span\">\n {label}: {valueText}\n </Typography>,\n null,\n ];\n };\n }, [analysis.daily.triggerReasons]);\n\n const zoomFilteredValues = useMemo(\n () => zoomFilterValues(values),\n [values, zoomFilterValues],\n );\n\n const barSize = getBarSize(analysis.daily.values.length);\n\n return (\n <Accordion defaultExpanded={analysis.daily.statuses.length > 1}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography>\n Build count per status over build trigger reason\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n {values.length === 0 ? (\n <Alert severity=\"info\">No data</Alert>\n ) : (\n <ResponsiveContainer width=\"100%\" height={140}>\n <ComposedChart data={zoomFilteredValues} {...zoomProps}>\n <Legend payload={legendPayload} />\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis\n dataKey=\"__epoch\"\n type=\"category\"\n tickFormatter={tickFormatterX}\n />\n <YAxis yAxisId={1} type=\"number\" tickCount={5} name=\"Count\" />\n <YAxis yAxisId={2} type=\"number\" name=\"Triggers\" hide />\n <Tooltip\n labelFormatter={labelFormatterWithoutTime}\n formatter={tooltipFormatter}\n />\n {triggerReasonLegendPayload.map(reason => (\n <Fragment key={reason.id}>\n <Area\n isAnimationActive={false}\n type=\"monotone\"\n dataKey={reason.id!}\n stackId=\"triggers\"\n yAxisId={2}\n stroke={triggerColorMap[reason.id as TriggerReason] ?? ''}\n fillOpacity={0.5}\n fill={triggerColorMap[reason.id as TriggerReason] ?? ''}\n />\n </Fragment>\n ))}\n {[...analysis.daily.statuses].reverse().map(status => (\n <Fragment key={status}>\n <Bar\n isAnimationActive={false}\n type=\"monotone\"\n barSize={barSize}\n dataKey={status}\n stackId=\"statuses\"\n yAxisId={1}\n stroke={statusColorMap[status as FilterStatusType] ?? ''}\n fillOpacity={0.8}\n fill={statusColorMap[status as FilterStatusType] ?? ''}\n />\n </Fragment>\n ))}\n {getZoomArea({ yAxisId: 1 })}\n </ComposedChart>\n </ResponsiveContainer>\n )}\n </AccordionDetails>\n </Accordion>\n );\n}\n\nfunction humanTriggerReason(reason: string): string {\n if ((reason as TriggerReason) === 'manual') {\n return 'Triggered manually';\n } else if ((reason as TriggerReason) === 'scm') {\n return 'Triggered by SCM';\n } else if ((reason as TriggerReason) === 'internal') {\n return 'Triggered internally';\n } else if ((reason as TriggerReason) === 'other') {\n return 'Triggered by another reason';\n }\n return `Triggered by ${reason}`;\n}\n\nfunction getBarSize(count: number): number {\n if (count < 20) {\n return 10;\n } else if (count < 40) {\n return 8;\n }\n return 5;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"status-chart.esm.js","sources":["../../src/charts/status-chart.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { Fragment, useMemo } from 'react';\nimport {\n Area,\n Bar,\n ComposedChart,\n XAxis,\n YAxis,\n CartesianGrid,\n Legend,\n LegendProps,\n Tooltip,\n ResponsiveContainer,\n} from 'recharts';\nimport Alert from '@material-ui/lab/Alert';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { capitalize } from 'lodash';\n\nimport { useZoom, useZoomArea } from './zoom';\nimport { FilterStatusType, TriggerReason } from '../apis/types';\nimport { labelFormatterWithoutTime, tickFormatterX } from '../components/utils';\nimport { statusColorMap, triggerColorMap } from './colors';\nimport { ChartableStagesAnalysis } from './types';\n\nexport interface StatusChartProps {\n analysis: ChartableStagesAnalysis;\n}\n\nexport function StatusChart(props: StatusChartProps) {\n const { analysis } = props;\n\n const { zoomFilterValues } = useZoom();\n const { zoomProps, getZoomArea } = useZoomArea();\n\n const values = useMemo(() => {\n return analysis.daily.values.map(value => {\n const totTriggers = analysis.daily.triggerReasons.reduce(\n (prev, cur) => prev + (value[cur as TriggerReason] ?? 0),\n 0,\n );\n\n if (!totTriggers) {\n return value;\n }\n\n return {\n ...value,\n ...Object.fromEntries(\n analysis.daily.triggerReasons.map(reason => [\n reason,\n (value[reason as TriggerReason] ?? 0) / totTriggers,\n ]),\n ),\n };\n });\n }, [analysis.daily]);\n\n const triggerReasonLegendPayload = useMemo(\n (): NonNullable<LegendProps['payload']> =>\n analysis.daily.triggerReasons.map(reason => ({\n value: humanTriggerReason(reason),\n type: 'line',\n id: reason,\n color: triggerColorMap[reason as TriggerReason] ?? '',\n })),\n [analysis.daily.triggerReasons],\n );\n\n const statusesLegendPayload = useMemo(\n (): NonNullable<LegendProps['payload']> =>\n analysis.daily.statuses.map(status => ({\n value: capitalize(status),\n type: 'line',\n id: status,\n color: statusColorMap[status as FilterStatusType] ?? '',\n })),\n [analysis.daily.statuses],\n );\n\n const legendPayload = useMemo(\n (): NonNullable<LegendProps['payload']> => [\n ...triggerReasonLegendPayload,\n ...statusesLegendPayload,\n ],\n [statusesLegendPayload, triggerReasonLegendPayload],\n );\n\n const tooltipFormatter = useMemo(() => {\n const reasonSet = new Set(analysis.daily.triggerReasons);\n\n return (percentOrCount: number, name: string): [any, any] => {\n const label = reasonSet.has(name)\n ? humanTriggerReason(name)\n : capitalize(name);\n const valueText = reasonSet.has(name)\n ? `${(percentOrCount * 100).toFixed(0)}%`\n : percentOrCount;\n\n return [\n // TODO(Rugvip): Types don't allow returning elements, but it was here before so presumably works\n <Typography component=\"span\">\n {label}: {valueText}\n </Typography>,\n null,\n ];\n };\n }, [analysis.daily.triggerReasons]);\n\n const zoomFilteredValues = useMemo(\n () => zoomFilterValues(values),\n [values, zoomFilterValues],\n );\n\n const barSize = getBarSize(analysis.daily.values.length);\n\n return (\n <Accordion defaultExpanded={analysis.daily.statuses.length > 1}>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography>\n Build count per status over build trigger reason\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n {values.length === 0 ? (\n <Alert severity=\"info\">No data</Alert>\n ) : (\n <ResponsiveContainer width=\"100%\" height={140}>\n <ComposedChart data={zoomFilteredValues} {...zoomProps}>\n <Legend payload={legendPayload} />\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis\n dataKey=\"__epoch\"\n type=\"category\"\n tickFormatter={tickFormatterX}\n />\n <YAxis yAxisId={1} type=\"number\" tickCount={5} name=\"Count\" />\n <YAxis yAxisId={2} type=\"number\" name=\"Triggers\" hide />\n <Tooltip\n labelFormatter={labelFormatterWithoutTime}\n formatter={tooltipFormatter}\n />\n {triggerReasonLegendPayload.map(reason => (\n <Fragment key={reason.id}>\n <Area\n isAnimationActive={false}\n type=\"monotone\"\n dataKey={reason.id!}\n stackId=\"triggers\"\n yAxisId={2}\n stroke={triggerColorMap[reason.id as TriggerReason] ?? ''}\n fillOpacity={0.5}\n fill={triggerColorMap[reason.id as TriggerReason] ?? ''}\n />\n </Fragment>\n ))}\n {[...analysis.daily.statuses].reverse().map(status => (\n <Fragment key={status}>\n <Bar\n isAnimationActive={false}\n type=\"monotone\"\n barSize={barSize}\n dataKey={status}\n stackId=\"statuses\"\n yAxisId={1}\n stroke={statusColorMap[status as FilterStatusType] ?? ''}\n fillOpacity={0.8}\n fill={statusColorMap[status as FilterStatusType] ?? ''}\n />\n </Fragment>\n ))}\n {getZoomArea({ yAxisId: 1 })}\n </ComposedChart>\n </ResponsiveContainer>\n )}\n </AccordionDetails>\n </Accordion>\n );\n}\n\nfunction humanTriggerReason(reason: string): string {\n if ((reason as TriggerReason) === 'manual') {\n return 'Triggered manually';\n } else if ((reason as TriggerReason) === 'scm') {\n return 'Triggered by SCM';\n } else if ((reason as TriggerReason) === 'internal') {\n return 'Triggered internally';\n } else if ((reason as TriggerReason) === 'other') {\n return 'Triggered by another reason';\n }\n return `Triggered by ${reason}`;\n}\n\nfunction getBarSize(count: number): number {\n if (count < 20) {\n return 10;\n } else if (count < 40) {\n return 8;\n }\n return 5;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zoom.esm.js","sources":["../../src/charts/zoom.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 { throttle } from 'lodash';\nimport React, {\n PropsWithChildren,\n Dispatch,\n SetStateAction,\n Fragment,\n useContext,\n useState,\n useCallback,\n useMemo,\n useEffect,\n} from 'react';\nimport { ReferenceArea } from 'recharts';\n\nimport type { Epoch } from './types';\n\ninterface ZoomState {\n left?: number;\n right?: number;\n}\n\ninterface ZoomContext {\n registerSelection(setter: Dispatch<ZoomState>): void;\n setSelectState: Dispatch<SetStateAction<ZoomState>>;\n\n zoomState: ZoomState;\n setZoomState: Dispatch<SetStateAction<ZoomState>>;\n\n resetZoom: () => void;\n}\n\nconst context = React.createContext<ZoomContext>(undefined as any);\n\nexport function ZoomProvider({ children }: PropsWithChildren<{}>) {\n const [registeredSelectors, setRegisteredSelectors] = useState<\n Array<Dispatch<ZoomState>>\n >([]);\n const [selectState, setSelectState] = useState<ZoomState>({});\n const [zoomState, setZoomState] = useState<ZoomState>({});\n\n const registerSelection = useCallback(\n (selector: Dispatch<ZoomState>) => {\n setRegisteredSelectors(old => [...old, selector]);\n\n return () => {\n setRegisteredSelectors(old => old.filter(sel => sel === selector));\n };\n },\n [setRegisteredSelectors],\n );\n\n const callSelectors = useCallback(\n (state: ZoomState) => {\n registeredSelectors.forEach(selector => {\n selector(state);\n });\n },\n [registeredSelectors],\n );\n\n const throttledCallSelectors = useMemo(\n () => throttle(callSelectors, 200),\n [callSelectors],\n );\n\n useEffect(() => {\n throttledCallSelectors({\n left: selectState.left,\n right: selectState.right,\n });\n }, [selectState.left, selectState.right, throttledCallSelectors]);\n\n const resetZoom = useCallback(() => {\n setSelectState({});\n setZoomState({});\n }, [setSelectState, setZoomState]);\n\n const value = useMemo(\n (): ZoomContext => ({\n registerSelection,\n setSelectState,\n\n zoomState,\n setZoomState,\n\n resetZoom,\n }),\n [registerSelection, setSelectState, zoomState, setZoomState, resetZoom],\n );\n\n return <context.Provider value={value} children={children} />;\n}\n\nexport function useZoom() {\n const { zoomState, resetZoom } = useContext(context);\n\n const zoomFilterValues = useCallback(\n <T extends Epoch>(values: Array<T>): Array<T> => {\n const { left, right } = zoomState;\n return left === undefined || right === undefined\n ? values\n : values.filter(({ __epoch }) => __epoch > left && __epoch < right);\n },\n [zoomState],\n );\n\n return useMemo(\n () => ({\n resetZoom,\n zoomState,\n zoomFilterValues,\n }),\n [resetZoom, zoomState, zoomFilterValues],\n );\n}\n\nexport interface ZoomAreaProps {\n yAxisId?: number | string | undefined;\n}\n\nexport function useZoomArea() {\n const [showSelection, setShowSelection] = useState(false);\n const [state, setState] = useState<ZoomState>({});\n const { setSelectState, setZoomState, registerSelection } =\n useContext(context);\n\n const onMouseDown = useCallback(\n (e: any) => {\n if (!e?.activeLabel) return;\n\n setSelectState({ left: e.activeLabel });\n setShowSelection(true);\n },\n [setSelectState, setShowSelection],\n );\n\n const onMouseMove = useCallback(\n (e: any) => {\n if (!e?.activeLabel) return;\n\n setSelectState(area => {\n if (!area.left) {\n return area;\n }\n return { ...area, right: e.activeLabel };\n });\n },\n [setSelectState],\n );\n\n const doZoom = useCallback(() => {\n setSelectState(old => {\n const { left, right } = old;\n\n if (left === undefined || right === undefined || left === right) {\n // Either is undefined or both are same - zoom out\n setZoomState({});\n } else if (left < right) {\n setZoomState({ left, right });\n } else if (left > right) {\n setZoomState({ left: right, right: left });\n }\n\n return {};\n });\n setShowSelection(false);\n }, [setSelectState, setZoomState, setShowSelection]);\n\n const zoomProps = useMemo(\n () => ({\n onMouseDown,\n onMouseMove,\n onMouseUp: doZoom,\n }),\n [onMouseDown, onMouseMove, doZoom],\n );\n\n useEffect(() => {\n if (!showSelection) {\n return undefined;\n }\n return registerSelection(setState);\n }, [registerSelection, setState, showSelection]);\n\n const getZoomArea = useCallback(\n (props?: ZoomAreaProps) => (\n <Fragment key=\"zoom-area\">\n {showSelection && state.left && state.right ? (\n <ReferenceArea\n x1={state.left}\n x2={state.right}\n strokeOpacity={0.5}\n {...props}\n />\n ) : null}\n </Fragment>\n ),\n [showSelection, state.left, state.right],\n );\n\n return {\n zoomProps,\n getZoomArea,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"zoom.esm.js","sources":["../../src/charts/zoom.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 { throttle } from 'lodash';\nimport React, {\n PropsWithChildren,\n Dispatch,\n SetStateAction,\n Fragment,\n useContext,\n useState,\n useCallback,\n useMemo,\n useEffect,\n} from 'react';\nimport { ReferenceArea } from 'recharts';\n\nimport type { Epoch } from './types';\n\ninterface ZoomState {\n left?: number;\n right?: number;\n}\n\ninterface ZoomContext {\n registerSelection(setter: Dispatch<ZoomState>): void;\n setSelectState: Dispatch<SetStateAction<ZoomState>>;\n\n zoomState: ZoomState;\n setZoomState: Dispatch<SetStateAction<ZoomState>>;\n\n resetZoom: () => void;\n}\n\nconst context = React.createContext<ZoomContext>(undefined as any);\n\nexport function ZoomProvider({ children }: PropsWithChildren<{}>) {\n const [registeredSelectors, setRegisteredSelectors] = useState<\n Array<Dispatch<ZoomState>>\n >([]);\n const [selectState, setSelectState] = useState<ZoomState>({});\n const [zoomState, setZoomState] = useState<ZoomState>({});\n\n const registerSelection = useCallback(\n (selector: Dispatch<ZoomState>) => {\n setRegisteredSelectors(old => [...old, selector]);\n\n return () => {\n setRegisteredSelectors(old => old.filter(sel => sel === selector));\n };\n },\n [setRegisteredSelectors],\n );\n\n const callSelectors = useCallback(\n (state: ZoomState) => {\n registeredSelectors.forEach(selector => {\n selector(state);\n });\n },\n [registeredSelectors],\n );\n\n const throttledCallSelectors = useMemo(\n () => throttle(callSelectors, 200),\n [callSelectors],\n );\n\n useEffect(() => {\n throttledCallSelectors({\n left: selectState.left,\n right: selectState.right,\n });\n }, [selectState.left, selectState.right, throttledCallSelectors]);\n\n const resetZoom = useCallback(() => {\n setSelectState({});\n setZoomState({});\n }, [setSelectState, setZoomState]);\n\n const value = useMemo(\n (): ZoomContext => ({\n registerSelection,\n setSelectState,\n\n zoomState,\n setZoomState,\n\n resetZoom,\n }),\n [registerSelection, setSelectState, zoomState, setZoomState, resetZoom],\n );\n\n return <context.Provider value={value} children={children} />;\n}\n\nexport function useZoom() {\n const { zoomState, resetZoom } = useContext(context);\n\n const zoomFilterValues = useCallback(\n <T extends Epoch>(values: Array<T>): Array<T> => {\n const { left, right } = zoomState;\n return left === undefined || right === undefined\n ? values\n : values.filter(({ __epoch }) => __epoch > left && __epoch < right);\n },\n [zoomState],\n );\n\n return useMemo(\n () => ({\n resetZoom,\n zoomState,\n zoomFilterValues,\n }),\n [resetZoom, zoomState, zoomFilterValues],\n );\n}\n\nexport interface ZoomAreaProps {\n yAxisId?: number | string | undefined;\n}\n\nexport function useZoomArea() {\n const [showSelection, setShowSelection] = useState(false);\n const [state, setState] = useState<ZoomState>({});\n const { setSelectState, setZoomState, registerSelection } =\n useContext(context);\n\n const onMouseDown = useCallback(\n (e: any) => {\n if (!e?.activeLabel) return;\n\n setSelectState({ left: e.activeLabel });\n setShowSelection(true);\n },\n [setSelectState, setShowSelection],\n );\n\n const onMouseMove = useCallback(\n (e: any) => {\n if (!e?.activeLabel) return;\n\n setSelectState(area => {\n if (!area.left) {\n return area;\n }\n return { ...area, right: e.activeLabel };\n });\n },\n [setSelectState],\n );\n\n const doZoom = useCallback(() => {\n setSelectState(old => {\n const { left, right } = old;\n\n if (left === undefined || right === undefined || left === right) {\n // Either is undefined or both are same - zoom out\n setZoomState({});\n } else if (left < right) {\n setZoomState({ left, right });\n } else if (left > right) {\n setZoomState({ left: right, right: left });\n }\n\n return {};\n });\n setShowSelection(false);\n }, [setSelectState, setZoomState, setShowSelection]);\n\n const zoomProps = useMemo(\n () => ({\n onMouseDown,\n onMouseMove,\n onMouseUp: doZoom,\n }),\n [onMouseDown, onMouseMove, doZoom],\n );\n\n useEffect(() => {\n if (!showSelection) {\n return undefined;\n }\n return registerSelection(setState);\n }, [registerSelection, setState, showSelection]);\n\n const getZoomArea = useCallback(\n (props?: ZoomAreaProps) => (\n <Fragment key=\"zoom-area\">\n {showSelection && state.left && state.right ? (\n <ReferenceArea\n x1={state.left}\n x2={state.right}\n strokeOpacity={0.5}\n {...props}\n />\n ) : null}\n </Fragment>\n ),\n [showSelection, state.left, state.right],\n );\n\n return {\n zoomProps,\n getZoomArea,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button-switch.esm.js","sources":["../../src/components/button-switch.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { useCallback, MouseEvent } from 'react';\nimport ButtonGroup from '@material-ui/core/ButtonGroup';\nimport Button from '@material-ui/core/Button';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Zoom from '@material-ui/core/Zoom';\n\nexport interface SwitchValueDetails<T extends string> {\n value: T;\n tooltip?: string;\n text?: string | JSX.Element;\n}\n\nexport type SwitchValue<T extends string> = T | SwitchValueDetails<T>;\n\nexport interface ButtonSwitchPropsBase<T extends string> {\n values: ReadonlyArray<SwitchValue<T>>;\n vertical?: boolean;\n}\nexport interface ButtonSwitchPropsSingle<T extends string>\n extends ButtonSwitchPropsBase<T> {\n multi?: false;\n selection: T;\n onChange: (selected: T) => void;\n}\nexport interface ButtonSwitchPropsMulti<T extends string>\n extends ButtonSwitchPropsBase<T> {\n multi: true;\n selection: ReadonlyArray<T>;\n onChange: (selected: Array<T>) => void;\n}\n\nexport type ButtonSwitchProps<T extends string> =\n | ButtonSwitchPropsSingle<T>\n | ButtonSwitchPropsMulti<T>;\n\nfunction switchValue<T extends string>(value: SwitchValue<T>): T {\n return typeof value === 'object' ? value.value : value;\n}\n\nfunction switchText<T extends string>(\n value: SwitchValue<T>,\n): string | JSX.Element {\n return typeof value === 'object' ? value.text ?? value.value : value;\n}\n\nfunction findParent(tagName: string, elem: HTMLElement): HTMLElement {\n let node: HTMLElement | null = elem;\n while (node.tagName !== tagName) {\n node = node.parentElement;\n if (!node) {\n throw new Error(`Couldn't find ${tagName} parent`);\n }\n }\n return node;\n}\n\nexport function ButtonSwitch<T extends string>(props: ButtonSwitchProps<T>) {\n const { values, vertical = false } = props;\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLSpanElement>) => {\n const btn = findParent('BUTTON', ev.target as HTMLElement);\n const index = [...btn.parentElement!.children].findIndex(\n child => child === btn,\n );\n const value = switchValue(values[index]);\n\n if (props.multi) {\n props.onChange(\n props.selection.includes(value as T)\n ? props.selection.filter(val => val !== value)\n : [...props.selection, value as T],\n );\n } else {\n props.onChange(value as T);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [values, props.selection, props.multi, props.onChange],\n );\n\n const hasSelection = (value: T) => {\n if (props.multi) {\n return props.selection.includes(value);\n }\n return props.selection === value;\n };\n\n const tooltipify = (value: SwitchValue<T>, elem: JSX.Element) =>\n typeof value === 'object' && value.tooltip ? (\n <Tooltip\n key={value.value}\n TransitionComponent={Zoom}\n title={value.tooltip}\n arrow\n >\n {elem}\n </Tooltip>\n ) : (\n elem\n );\n\n return (\n <ButtonGroup\n disableElevation\n orientation={vertical ? 'vertical' : 'horizontal'}\n variant=\"outlined\"\n size=\"small\"\n >\n {values.map(value =>\n tooltipify(\n value,\n <Button\n key={switchValue(value)}\n color={hasSelection(switchValue(value)) ? 'primary' : 'default'}\n variant={\n hasSelection(switchValue(value)) ? 'contained' : 'outlined'\n }\n onClick={onClick}\n >\n {switchText(value)}\n </Button>,\n ),\n )}\n </ButtonGroup>\n );\n}\n"],"names":[],"mappings":";;;;;;AAmDA,SAAS,YAA8B,KAA0B,EAAA;AAC/D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAW,GAAA,KAAA,CAAM,KAAQ,GAAA,KAAA
|
|
1
|
+
{"version":3,"file":"button-switch.esm.js","sources":["../../src/components/button-switch.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { useCallback, MouseEvent } from 'react';\nimport ButtonGroup from '@material-ui/core/ButtonGroup';\nimport Button from '@material-ui/core/Button';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Zoom from '@material-ui/core/Zoom';\n\nexport interface SwitchValueDetails<T extends string> {\n value: T;\n tooltip?: string;\n text?: string | JSX.Element;\n}\n\nexport type SwitchValue<T extends string> = T | SwitchValueDetails<T>;\n\nexport interface ButtonSwitchPropsBase<T extends string> {\n values: ReadonlyArray<SwitchValue<T>>;\n vertical?: boolean;\n}\nexport interface ButtonSwitchPropsSingle<T extends string>\n extends ButtonSwitchPropsBase<T> {\n multi?: false;\n selection: T;\n onChange: (selected: T) => void;\n}\nexport interface ButtonSwitchPropsMulti<T extends string>\n extends ButtonSwitchPropsBase<T> {\n multi: true;\n selection: ReadonlyArray<T>;\n onChange: (selected: Array<T>) => void;\n}\n\nexport type ButtonSwitchProps<T extends string> =\n | ButtonSwitchPropsSingle<T>\n | ButtonSwitchPropsMulti<T>;\n\nfunction switchValue<T extends string>(value: SwitchValue<T>): T {\n return typeof value === 'object' ? value.value : value;\n}\n\nfunction switchText<T extends string>(\n value: SwitchValue<T>,\n): string | JSX.Element {\n return typeof value === 'object' ? value.text ?? value.value : value;\n}\n\nfunction findParent(tagName: string, elem: HTMLElement): HTMLElement {\n let node: HTMLElement | null = elem;\n while (node.tagName !== tagName) {\n node = node.parentElement;\n if (!node) {\n throw new Error(`Couldn't find ${tagName} parent`);\n }\n }\n return node;\n}\n\nexport function ButtonSwitch<T extends string>(props: ButtonSwitchProps<T>) {\n const { values, vertical = false } = props;\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLSpanElement>) => {\n const btn = findParent('BUTTON', ev.target as HTMLElement);\n const index = [...btn.parentElement!.children].findIndex(\n child => child === btn,\n );\n const value = switchValue(values[index]);\n\n if (props.multi) {\n props.onChange(\n props.selection.includes(value as T)\n ? props.selection.filter(val => val !== value)\n : [...props.selection, value as T],\n );\n } else {\n props.onChange(value as T);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [values, props.selection, props.multi, props.onChange],\n );\n\n const hasSelection = (value: T) => {\n if (props.multi) {\n return props.selection.includes(value);\n }\n return props.selection === value;\n };\n\n const tooltipify = (value: SwitchValue<T>, elem: JSX.Element) =>\n typeof value === 'object' && value.tooltip ? (\n <Tooltip\n key={value.value}\n TransitionComponent={Zoom}\n title={value.tooltip}\n arrow\n >\n {elem}\n </Tooltip>\n ) : (\n elem\n );\n\n return (\n <ButtonGroup\n disableElevation\n orientation={vertical ? 'vertical' : 'horizontal'}\n variant=\"outlined\"\n size=\"small\"\n >\n {values.map(value =>\n tooltipify(\n value,\n <Button\n key={switchValue(value)}\n color={hasSelection(switchValue(value)) ? 'primary' : 'default'}\n variant={\n hasSelection(switchValue(value)) ? 'contained' : 'outlined'\n }\n onClick={onClick}\n >\n {switchText(value)}\n </Button>,\n ),\n )}\n </ButtonGroup>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart-filters.esm.js","sources":["../../src/components/chart-filters.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { useCallback, useState, useEffect, useMemo } from 'react';\nimport Button from '@material-ui/core/Button';\nimport Card from '@material-ui/core/Card';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport CardContent from '@material-ui/core/CardContent';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormGroup from '@material-ui/core/FormGroup';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Grid from '@material-ui/core/Grid';\nimport Switch from '@material-ui/core/Switch';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ShowChartIcon from '@material-ui/icons/ShowChart';\nimport BarChartIcon from '@material-ui/icons/BarChart';\nimport MuiPickersUtilsProvider from '@material-ui/pickers/MuiPickersUtilsProvider';\nimport { KeyboardDatePicker } from '@material-ui/pickers/DatePicker';\nimport { DateTime } from 'luxon';\nimport LuxonUtils from '@date-io/luxon';\n\nimport {\n ChartType,\n ChartTypes,\n CicdConfiguration,\n CicdDefaults,\n FilterBranchType,\n FilterStatusType,\n statusTypes,\n} from '../apis/types';\nimport { ChartableStagesAnalysis } from '../charts/types';\nimport { ButtonSwitch, SwitchValue } from './button-switch';\nimport { Toggle } from './toggle';\nimport { DurationSlider } from './duration-slider';\nimport { Label } from './label';\n\nexport const useStyles = makeStyles(\n theme => ({\n rootCard: {\n padding: theme.spacing(0, 0, 0, 0),\n margin: theme.spacing(0, 0, 2, 0),\n },\n updateButton: {\n margin: theme.spacing(1, 0, 0, 0),\n },\n header: {\n margin: theme.spacing(0, 0, 0, 0),\n textTransform: 'uppercase',\n fontSize: 12,\n fontWeight: 'bold',\n },\n title: {\n margin: theme.spacing(3, 0, 1, 0),\n textTransform: 'uppercase',\n fontSize: 12,\n fontWeight: 'bold',\n '&:first-child': {\n margin: theme.spacing(1, 0, 1, 0),\n },\n },\n buttonDescription: {\n textTransform: 'uppercase',\n margin: theme.spacing(1, 0, 0, 1),\n },\n }),\n {\n name: 'CicdStatistics',\n },\n);\n\nexport type BranchSelection = FilterBranchType | 'all';\nexport type StatusSelection = FilterStatusType;\n\nexport interface ChartFilter {\n fromDate: Date;\n toDate: Date;\n branch: string;\n status: Array<string>;\n}\n\nexport function getDefaultChartFilter(\n cicdConfiguration: CicdConfiguration,\n): ChartFilter {\n const toDate = cicdConfiguration.defaults?.timeTo ?? new Date();\n return {\n fromDate:\n cicdConfiguration.defaults?.timeFrom ??\n DateTime.fromJSDate(toDate).minus({ months: 1 }).toJSDate(),\n toDate,\n branch: cicdConfiguration.defaults?.filterType ?? 'branch',\n status:\n cicdConfiguration.defaults?.filterStatus ??\n cicdConfiguration.availableStatuses.filter(\n status => status === 'succeeded' || status === 'failed',\n ),\n };\n}\n\nfunction isSameChartFilter(a: ChartFilter, b: ChartFilter): boolean {\n return (\n a.branch === b.branch &&\n [...a.status].sort().join(' ') === [...b.status].sort().join(' ') &&\n DateTime.fromJSDate(a.fromDate).hasSame(\n DateTime.fromJSDate(b.fromDate),\n 'day',\n ) &&\n DateTime.fromJSDate(a.toDate).hasSame(DateTime.fromJSDate(b.toDate), 'day')\n );\n}\n\nexport type ViewOptions = Pick<\n CicdDefaults,\n | 'lowercaseNames'\n | 'normalizeTimeRange'\n | 'collapsedLimit'\n | 'hideLimit'\n | 'chartTypes'\n>;\n\nexport function getDefaultViewOptions(\n cicdConfiguration: CicdConfiguration,\n): ViewOptions {\n return {\n lowercaseNames: cicdConfiguration.defaults?.lowercaseNames ?? false,\n normalizeTimeRange: cicdConfiguration.defaults?.normalizeTimeRange ?? true,\n collapsedLimit: 60 * 1000, // 1m\n hideLimit: 20 * 1000, // 20s\n chartTypes: {\n succeeded: ['duration'],\n failed: ['count'],\n enqueued: ['count'],\n scheduled: ['count'],\n running: ['count'],\n aborted: ['count'],\n stalled: ['count'],\n expired: ['count'],\n unknown: ['count'],\n },\n };\n}\n\nconst branchValues: Array<SwitchValue<BranchSelection>> = [\n 'master',\n 'branch',\n {\n value: 'all',\n tooltip:\n 'NOTE; If the build pipelines are very different between master and branch ' +\n 'builds, viewing them combined might not result in a very useful chart',\n },\n];\n\nconst chartTypeValues: Array<SwitchValue<ChartType>> = [\n { value: 'duration', text: <ShowChartIcon />, tooltip: 'Duration' },\n { value: 'count', text: <BarChartIcon />, tooltip: 'Count per day' },\n];\n\nexport interface ChartFiltersProps {\n analysis?: ChartableStagesAnalysis;\n\n cicdConfiguration: CicdConfiguration;\n initialFetchFilter: ChartFilter;\n currentFetchFilter?: ChartFilter;\n onChangeFetchFilter(filter: ChartFilter): void;\n updateFetchFilter(filter: ChartFilter): void;\n\n initialViewOptions: ViewOptions;\n onChangeViewOptions(filter: ViewOptions): void;\n}\n\ninterface InternalRef {\n first: boolean;\n}\n\nexport function ChartFilters(props: ChartFiltersProps) {\n const {\n analysis,\n cicdConfiguration,\n initialFetchFilter,\n currentFetchFilter,\n onChangeFetchFilter,\n updateFetchFilter,\n initialViewOptions,\n onChangeViewOptions,\n } = props;\n\n const classes = useStyles();\n\n const [internalRef] = useState<InternalRef>({ first: true });\n\n const [useNowAsToDate, setUseNowAsToDate] = useState(true);\n const [toDate, setToDate] = useState(initialFetchFilter.toDate);\n const [fromDate, setFromDate] = useState(initialFetchFilter.fromDate);\n\n const [branch, setBranch] = useState(initialFetchFilter.branch);\n\n const statusValues: ReadonlyArray<StatusSelection> =\n cicdConfiguration.availableStatuses;\n const [selectedStatus, setSelectedStatus] = useState(\n initialFetchFilter.status,\n );\n\n const [viewOptions, setViewOptions] = useState(initialViewOptions);\n\n const setLowercaseNames = useCallback(\n (lowercaseNames: boolean) => {\n setViewOptions(old => ({ ...old, lowercaseNames }));\n },\n [setViewOptions],\n );\n\n const setNormalizeTimeRange = useCallback(\n (normalizeTimeRange: boolean) => {\n setViewOptions(old => ({ ...old, normalizeTimeRange }));\n },\n [setViewOptions],\n );\n\n const setHideLimit = useCallback(\n (value: number) => {\n setViewOptions(old => ({ ...old, hideLimit: value }));\n },\n [setViewOptions],\n );\n\n const setCollapseLimit = useCallback(\n (value: number) => {\n setViewOptions(old => ({ ...old, collapsedLimit: value }));\n },\n [setViewOptions],\n );\n\n const setChartType = useCallback(\n (statusType: FilterStatusType, chartTypes: ChartTypes) => {\n setViewOptions(old => ({\n ...old,\n chartTypes: { ...old.chartTypes, [statusType]: chartTypes },\n }));\n },\n [setViewOptions],\n );\n const setChartTypeSpecific = useMemo(\n () =>\n Object.fromEntries(\n statusTypes.map(\n status =>\n [\n status,\n (chartTypes: ChartTypes) => setChartType(status, chartTypes),\n ] as const,\n ),\n ),\n [setChartType],\n );\n\n useEffect(() => {\n onChangeViewOptions(viewOptions);\n }, [onChangeViewOptions, viewOptions]);\n\n useEffect(() => {\n if (internalRef.first) {\n // Skip calling onChangeFetchFilter first time\n internalRef.first = false;\n return;\n }\n onChangeFetchFilter({\n toDate,\n fromDate,\n branch,\n status: selectedStatus,\n });\n }, [\n internalRef,\n toDate,\n fromDate,\n branch,\n selectedStatus,\n onChangeFetchFilter,\n ]);\n\n const toggleUseNowAsDate = useCallback(() => {\n setUseNowAsToDate(!useNowAsToDate);\n if (!DateTime.fromJSDate(toDate).hasSame(DateTime.now(), 'day')) {\n setToDate(new Date());\n }\n }, [useNowAsToDate, toDate]);\n\n const hasFetchFilterChanges = useMemo(\n () =>\n !currentFetchFilter ||\n !isSameChartFilter(\n {\n toDate,\n fromDate,\n branch,\n status: selectedStatus,\n },\n currentFetchFilter,\n ),\n [toDate, fromDate, branch, selectedStatus, currentFetchFilter],\n );\n\n const updateFilter = useCallback(() => {\n updateFetchFilter({\n toDate,\n fromDate,\n branch,\n status: selectedStatus,\n });\n }, [toDate, fromDate, branch, selectedStatus, updateFetchFilter]);\n\n const inrefferedStatuses = analysis?.statuses ?? selectedStatus;\n\n return (\n <MuiPickersUtilsProvider utils={LuxonUtils}>\n <Card className={classes.rootCard}>\n <CardHeader\n action={\n <Button\n size=\"small\"\n color=\"secondary\"\n variant=\"contained\"\n onClick={updateFilter}\n disabled={!hasFetchFilterChanges}\n >\n Update\n </Button>\n }\n title={\n <Typography variant=\"subtitle2\" className={classes.header}>\n Fetching options\n </Typography>\n }\n />\n <CardContent>\n <Typography\n variant=\"subtitle2\"\n className={`${classes.title} ${classes.title}`}\n >\n Date range\n </Typography>\n <KeyboardDatePicker\n autoOk\n variant=\"inline\"\n inputVariant=\"outlined\"\n label=\"From date\"\n format=\"yyyy-MM-dd\"\n value={fromDate}\n InputAdornmentProps={{ position: 'start' }}\n onChange={date => setFromDate(date?.toJSDate() ?? new Date())}\n />\n <br />\n <FormControl component=\"fieldset\">\n <FormGroup>\n <FormControlLabel\n control={\n <Switch\n checked={useNowAsToDate}\n onChange={toggleUseNowAsDate}\n />\n }\n label={<Label>To today</Label>}\n />\n {useNowAsToDate ? null : (\n <KeyboardDatePicker\n autoOk\n variant=\"inline\"\n inputVariant=\"outlined\"\n label=\"To date\"\n format=\"yyyy-MM-dd\"\n value={toDate}\n InputAdornmentProps={{ position: 'start' }}\n onChange={date => setToDate(date?.toJSDate() ?? new Date())}\n />\n )}\n </FormGroup>\n </FormControl>\n <Typography\n variant=\"subtitle2\"\n className={`${classes.title} ${classes.title}`}\n >\n Branch\n </Typography>\n <ButtonSwitch<string>\n values={branchValues}\n selection={branch}\n onChange={setBranch}\n />\n <Typography\n variant=\"subtitle2\"\n className={`${classes.title} ${classes.title}`}\n >\n Status\n </Typography>\n <ButtonSwitch<string>\n values={statusValues}\n multi\n vertical\n selection={selectedStatus}\n onChange={setSelectedStatus}\n />\n </CardContent>\n </Card>\n <Card className={classes.rootCard}>\n <CardHeader\n title={\n <Typography variant=\"subtitle2\" className={classes.header}>\n View options\n </Typography>\n }\n />\n <CardContent>\n <Toggle\n checked={viewOptions.lowercaseNames}\n setChecked={setLowercaseNames}\n >\n <Tooltip\n arrow\n title={\n 'Lowercasing names can reduce duplications ' +\n 'when stage names have changed casing'\n }\n >\n <Label>Lowercase names</Label>\n </Tooltip>\n </Toggle>\n <Toggle\n checked={viewOptions.normalizeTimeRange}\n setChecked={setNormalizeTimeRange}\n >\n <Tooltip\n arrow\n title={\n 'All charts will use the same x-axis. ' +\n 'This reduces confusion when stages have been altered over time ' +\n 'and only appear in a part of the time range.'\n }\n >\n <Label>Normalize time range</Label>\n </Tooltip>\n </Toggle>\n <DurationSlider\n header=\"Hide under peak\"\n value={viewOptions.hideLimit}\n setValue={setHideLimit}\n />\n <DurationSlider\n header=\"Collapse under peak\"\n value={viewOptions.collapsedLimit}\n setValue={setCollapseLimit}\n />\n <Typography\n variant=\"subtitle2\"\n className={`${classes.title} ${classes.title}`}\n >\n Chart styles\n </Typography>\n {inrefferedStatuses.map(status => (\n <Grid key={status} container spacing={0}>\n <Grid item>\n <ButtonSwitch<ChartType>\n values={chartTypeValues}\n selection={viewOptions.chartTypes[status as FilterStatusType]}\n onChange={setChartTypeSpecific[status]}\n multi\n />\n </Grid>\n <Grid item className={classes.buttonDescription}>\n <div>{status}</div>\n </Grid>\n </Grid>\n ))}\n </CardContent>\n </Card>\n </MuiPickersUtilsProvider>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart-filters.esm.js","sources":["../../src/components/chart-filters.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { useCallback, useState, useEffect, useMemo } from 'react';\nimport Button from '@material-ui/core/Button';\nimport Card from '@material-ui/core/Card';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport CardContent from '@material-ui/core/CardContent';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormGroup from '@material-ui/core/FormGroup';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Grid from '@material-ui/core/Grid';\nimport Switch from '@material-ui/core/Switch';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ShowChartIcon from '@material-ui/icons/ShowChart';\nimport BarChartIcon from '@material-ui/icons/BarChart';\nimport MuiPickersUtilsProvider from '@material-ui/pickers/MuiPickersUtilsProvider';\nimport { KeyboardDatePicker } from '@material-ui/pickers/DatePicker';\nimport { DateTime } from 'luxon';\nimport LuxonUtils from '@date-io/luxon';\n\nimport {\n ChartType,\n ChartTypes,\n CicdConfiguration,\n CicdDefaults,\n FilterBranchType,\n FilterStatusType,\n statusTypes,\n} from '../apis/types';\nimport { ChartableStagesAnalysis } from '../charts/types';\nimport { ButtonSwitch, SwitchValue } from './button-switch';\nimport { Toggle } from './toggle';\nimport { DurationSlider } from './duration-slider';\nimport { Label } from './label';\n\nexport const useStyles = makeStyles(\n theme => ({\n rootCard: {\n padding: theme.spacing(0, 0, 0, 0),\n margin: theme.spacing(0, 0, 2, 0),\n },\n updateButton: {\n margin: theme.spacing(1, 0, 0, 0),\n },\n header: {\n margin: theme.spacing(0, 0, 0, 0),\n textTransform: 'uppercase',\n fontSize: 12,\n fontWeight: 'bold',\n },\n title: {\n margin: theme.spacing(3, 0, 1, 0),\n textTransform: 'uppercase',\n fontSize: 12,\n fontWeight: 'bold',\n '&:first-child': {\n margin: theme.spacing(1, 0, 1, 0),\n },\n },\n buttonDescription: {\n textTransform: 'uppercase',\n margin: theme.spacing(1, 0, 0, 1),\n },\n }),\n {\n name: 'CicdStatistics',\n },\n);\n\nexport type BranchSelection = FilterBranchType | 'all';\nexport type StatusSelection = FilterStatusType;\n\nexport interface ChartFilter {\n fromDate: Date;\n toDate: Date;\n branch: string;\n status: Array<string>;\n}\n\nexport function getDefaultChartFilter(\n cicdConfiguration: CicdConfiguration,\n): ChartFilter {\n const toDate = cicdConfiguration.defaults?.timeTo ?? new Date();\n return {\n fromDate:\n cicdConfiguration.defaults?.timeFrom ??\n DateTime.fromJSDate(toDate).minus({ months: 1 }).toJSDate(),\n toDate,\n branch: cicdConfiguration.defaults?.filterType ?? 'branch',\n status:\n cicdConfiguration.defaults?.filterStatus ??\n cicdConfiguration.availableStatuses.filter(\n status => status === 'succeeded' || status === 'failed',\n ),\n };\n}\n\nfunction isSameChartFilter(a: ChartFilter, b: ChartFilter): boolean {\n return (\n a.branch === b.branch &&\n [...a.status].sort().join(' ') === [...b.status].sort().join(' ') &&\n DateTime.fromJSDate(a.fromDate).hasSame(\n DateTime.fromJSDate(b.fromDate),\n 'day',\n ) &&\n DateTime.fromJSDate(a.toDate).hasSame(DateTime.fromJSDate(b.toDate), 'day')\n );\n}\n\nexport type ViewOptions = Pick<\n CicdDefaults,\n | 'lowercaseNames'\n | 'normalizeTimeRange'\n | 'collapsedLimit'\n | 'hideLimit'\n | 'chartTypes'\n>;\n\nexport function getDefaultViewOptions(\n cicdConfiguration: CicdConfiguration,\n): ViewOptions {\n return {\n lowercaseNames: cicdConfiguration.defaults?.lowercaseNames ?? false,\n normalizeTimeRange: cicdConfiguration.defaults?.normalizeTimeRange ?? true,\n collapsedLimit: 60 * 1000, // 1m\n hideLimit: 20 * 1000, // 20s\n chartTypes: {\n succeeded: ['duration'],\n failed: ['count'],\n enqueued: ['count'],\n scheduled: ['count'],\n running: ['count'],\n aborted: ['count'],\n stalled: ['count'],\n expired: ['count'],\n unknown: ['count'],\n },\n };\n}\n\nconst branchValues: Array<SwitchValue<BranchSelection>> = [\n 'master',\n 'branch',\n {\n value: 'all',\n tooltip:\n 'NOTE; If the build pipelines are very different between master and branch ' +\n 'builds, viewing them combined might not result in a very useful chart',\n },\n];\n\nconst chartTypeValues: Array<SwitchValue<ChartType>> = [\n { value: 'duration', text: <ShowChartIcon />, tooltip: 'Duration' },\n { value: 'count', text: <BarChartIcon />, tooltip: 'Count per day' },\n];\n\nexport interface ChartFiltersProps {\n analysis?: ChartableStagesAnalysis;\n\n cicdConfiguration: CicdConfiguration;\n initialFetchFilter: ChartFilter;\n currentFetchFilter?: ChartFilter;\n onChangeFetchFilter(filter: ChartFilter): void;\n updateFetchFilter(filter: ChartFilter): void;\n\n initialViewOptions: ViewOptions;\n onChangeViewOptions(filter: ViewOptions): void;\n}\n\ninterface InternalRef {\n first: boolean;\n}\n\nexport function ChartFilters(props: ChartFiltersProps) {\n const {\n analysis,\n cicdConfiguration,\n initialFetchFilter,\n currentFetchFilter,\n onChangeFetchFilter,\n updateFetchFilter,\n initialViewOptions,\n onChangeViewOptions,\n } = props;\n\n const classes = useStyles();\n\n const [internalRef] = useState<InternalRef>({ first: true });\n\n const [useNowAsToDate, setUseNowAsToDate] = useState(true);\n const [toDate, setToDate] = useState(initialFetchFilter.toDate);\n const [fromDate, setFromDate] = useState(initialFetchFilter.fromDate);\n\n const [branch, setBranch] = useState(initialFetchFilter.branch);\n\n const statusValues: ReadonlyArray<StatusSelection> =\n cicdConfiguration.availableStatuses;\n const [selectedStatus, setSelectedStatus] = useState(\n initialFetchFilter.status,\n );\n\n const [viewOptions, setViewOptions] = useState(initialViewOptions);\n\n const setLowercaseNames = useCallback(\n (lowercaseNames: boolean) => {\n setViewOptions(old => ({ ...old, lowercaseNames }));\n },\n [setViewOptions],\n );\n\n const setNormalizeTimeRange = useCallback(\n (normalizeTimeRange: boolean) => {\n setViewOptions(old => ({ ...old, normalizeTimeRange }));\n },\n [setViewOptions],\n );\n\n const setHideLimit = useCallback(\n (value: number) => {\n setViewOptions(old => ({ ...old, hideLimit: value }));\n },\n [setViewOptions],\n );\n\n const setCollapseLimit = useCallback(\n (value: number) => {\n setViewOptions(old => ({ ...old, collapsedLimit: value }));\n },\n [setViewOptions],\n );\n\n const setChartType = useCallback(\n (statusType: FilterStatusType, chartTypes: ChartTypes) => {\n setViewOptions(old => ({\n ...old,\n chartTypes: { ...old.chartTypes, [statusType]: chartTypes },\n }));\n },\n [setViewOptions],\n );\n const setChartTypeSpecific = useMemo(\n () =>\n Object.fromEntries(\n statusTypes.map(\n status =>\n [\n status,\n (chartTypes: ChartTypes) => setChartType(status, chartTypes),\n ] as const,\n ),\n ),\n [setChartType],\n );\n\n useEffect(() => {\n onChangeViewOptions(viewOptions);\n }, [onChangeViewOptions, viewOptions]);\n\n useEffect(() => {\n if (internalRef.first) {\n // Skip calling onChangeFetchFilter first time\n internalRef.first = false;\n return;\n }\n onChangeFetchFilter({\n toDate,\n fromDate,\n branch,\n status: selectedStatus,\n });\n }, [\n internalRef,\n toDate,\n fromDate,\n branch,\n selectedStatus,\n onChangeFetchFilter,\n ]);\n\n const toggleUseNowAsDate = useCallback(() => {\n setUseNowAsToDate(!useNowAsToDate);\n if (!DateTime.fromJSDate(toDate).hasSame(DateTime.now(), 'day')) {\n setToDate(new Date());\n }\n }, [useNowAsToDate, toDate]);\n\n const hasFetchFilterChanges = useMemo(\n () =>\n !currentFetchFilter ||\n !isSameChartFilter(\n {\n toDate,\n fromDate,\n branch,\n status: selectedStatus,\n },\n currentFetchFilter,\n ),\n [toDate, fromDate, branch, selectedStatus, currentFetchFilter],\n );\n\n const updateFilter = useCallback(() => {\n updateFetchFilter({\n toDate,\n fromDate,\n branch,\n status: selectedStatus,\n });\n }, [toDate, fromDate, branch, selectedStatus, updateFetchFilter]);\n\n const inrefferedStatuses = analysis?.statuses ?? selectedStatus;\n\n return (\n <MuiPickersUtilsProvider utils={LuxonUtils}>\n <Card className={classes.rootCard}>\n <CardHeader\n action={\n <Button\n size=\"small\"\n color=\"secondary\"\n variant=\"contained\"\n onClick={updateFilter}\n disabled={!hasFetchFilterChanges}\n >\n Update\n </Button>\n }\n title={\n <Typography variant=\"subtitle2\" className={classes.header}>\n Fetching options\n </Typography>\n }\n />\n <CardContent>\n <Typography\n variant=\"subtitle2\"\n className={`${classes.title} ${classes.title}`}\n >\n Date range\n </Typography>\n <KeyboardDatePicker\n autoOk\n variant=\"inline\"\n inputVariant=\"outlined\"\n label=\"From date\"\n format=\"yyyy-MM-dd\"\n value={fromDate}\n InputAdornmentProps={{ position: 'start' }}\n onChange={date => setFromDate(date?.toJSDate() ?? new Date())}\n />\n <br />\n <FormControl component=\"fieldset\">\n <FormGroup>\n <FormControlLabel\n control={\n <Switch\n checked={useNowAsToDate}\n onChange={toggleUseNowAsDate}\n />\n }\n label={<Label>To today</Label>}\n />\n {useNowAsToDate ? null : (\n <KeyboardDatePicker\n autoOk\n variant=\"inline\"\n inputVariant=\"outlined\"\n label=\"To date\"\n format=\"yyyy-MM-dd\"\n value={toDate}\n InputAdornmentProps={{ position: 'start' }}\n onChange={date => setToDate(date?.toJSDate() ?? new Date())}\n />\n )}\n </FormGroup>\n </FormControl>\n <Typography\n variant=\"subtitle2\"\n className={`${classes.title} ${classes.title}`}\n >\n Branch\n </Typography>\n <ButtonSwitch<string>\n values={branchValues}\n selection={branch}\n onChange={setBranch}\n />\n <Typography\n variant=\"subtitle2\"\n className={`${classes.title} ${classes.title}`}\n >\n Status\n </Typography>\n <ButtonSwitch<string>\n values={statusValues}\n multi\n vertical\n selection={selectedStatus}\n onChange={setSelectedStatus}\n />\n </CardContent>\n </Card>\n <Card className={classes.rootCard}>\n <CardHeader\n title={\n <Typography variant=\"subtitle2\" className={classes.header}>\n View options\n </Typography>\n }\n />\n <CardContent>\n <Toggle\n checked={viewOptions.lowercaseNames}\n setChecked={setLowercaseNames}\n >\n <Tooltip\n arrow\n title={\n 'Lowercasing names can reduce duplications ' +\n 'when stage names have changed casing'\n }\n >\n <Label>Lowercase names</Label>\n </Tooltip>\n </Toggle>\n <Toggle\n checked={viewOptions.normalizeTimeRange}\n setChecked={setNormalizeTimeRange}\n >\n <Tooltip\n arrow\n title={\n 'All charts will use the same x-axis. ' +\n 'This reduces confusion when stages have been altered over time ' +\n 'and only appear in a part of the time range.'\n }\n >\n <Label>Normalize time range</Label>\n </Tooltip>\n </Toggle>\n <DurationSlider\n header=\"Hide under peak\"\n value={viewOptions.hideLimit}\n setValue={setHideLimit}\n />\n <DurationSlider\n header=\"Collapse under peak\"\n value={viewOptions.collapsedLimit}\n setValue={setCollapseLimit}\n />\n <Typography\n variant=\"subtitle2\"\n className={`${classes.title} ${classes.title}`}\n >\n Chart styles\n </Typography>\n {inrefferedStatuses.map(status => (\n <Grid key={status} container spacing={0}>\n <Grid item>\n <ButtonSwitch<ChartType>\n values={chartTypeValues}\n selection={viewOptions.chartTypes[status as FilterStatusType]}\n onChange={setChartTypeSpecific[status]}\n multi\n />\n </Grid>\n <Grid item className={classes.buttonDescription}>\n <div>{status}</div>\n </Grid>\n </Grid>\n ))}\n </CardContent>\n </Card>\n </MuiPickersUtilsProvider>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duration-slider.esm.js","sources":["../../src/components/duration-slider.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { useCallback, useMemo, useState } from 'react';\nimport Slider from '@material-ui/core/Slider';\nimport { debounce } from 'lodash';\n\nimport { formatDuration, formatDurationFromSeconds } from './utils';\nimport { Label } from './label';\n\nconst marks = [\n 0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 10,\n 20,\n 30,\n 60,\n 2 * 60,\n 3 * 60,\n 4 * 60,\n 5 * 60,\n 10 * 60,\n 15 * 60,\n 30 * 60,\n 45 * 60,\n 60 * 60,\n].map((value, index) => ({\n value: index,\n label: formatDurationFromSeconds(value),\n seconds: value,\n}));\n\nfunction findMarkIndex(seconds: number): number {\n if (marks[0].seconds > seconds) {\n return 0;\n } else if (marks[marks.length - 1].seconds < seconds) {\n return marks.length - 1;\n }\n for (let i = 0; i < marks.length - 1; ++i) {\n const a = marks[i];\n const b = marks[i + 1];\n if (seconds === a.seconds) {\n return i;\n } else if (seconds === b.seconds) {\n return i + 1;\n } else if (a.seconds < seconds && b.seconds > seconds) {\n return seconds - a.seconds < b.seconds - seconds ? i : i - 1;\n }\n }\n return 0; // Won't happen\n}\n\nfunction formatDurationFromIndex(index: number) {\n return formatDurationFromSeconds(marks[index].seconds);\n}\n\nexport interface DurationSliderProps {\n header: string;\n value: number;\n setValue: (value: number) => void;\n}\n\nexport function DurationSlider(props: DurationSliderProps) {\n const { header, value, setValue } = props;\n\n const [curValue, setCurValue] = useState(value);\n\n const debouncedSetValue = useMemo(() => debounce(setValue, 1000), [setValue]);\n\n const onChange = useCallback(\n (_: any, index: number | number[]) => {\n const millis = marks[index as number].seconds * 1000;\n setCurValue(millis);\n debouncedSetValue(millis);\n },\n [debouncedSetValue],\n );\n\n const indexValue = useMemo(() => findMarkIndex(curValue / 1000), [curValue]);\n\n return (\n <>\n <Label>\n {header} {formatDuration(curValue)}\n </Label>\n <Slider\n value={indexValue}\n min={0}\n step={1}\n max={marks.length - 1}\n marks\n getAriaValueText={formatDurationFromIndex}\n valueLabelFormat={formatDurationFromIndex}\n onChange={onChange}\n valueLabelDisplay=\"auto\"\n aria-labelledby=\"slider-hide-limit\"\n />\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;AAuBA,MAAM,KAAQ,GAAA;AAAA,EACZ,CAAA;AAAA,EACA,CAAA;AAAA,EACA,CAAA;AAAA,EACA,CAAA;AAAA,EACA,CAAA;AAAA,EACA,CAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,EAAA;AAAA,EACA,CAAI,GAAA,EAAA;AAAA,EACJ,CAAI,GAAA,EAAA;AAAA,EACJ,CAAI,GAAA,EAAA;AAAA,EACJ,CAAI,GAAA,EAAA;AAAA,EACJ,EAAK,GAAA,EAAA;AAAA,EACL,EAAK,GAAA,EAAA;AAAA,EACL,EAAK,GAAA,EAAA;AAAA,EACL,EAAK,GAAA,EAAA;AAAA,EACL,EAAK,GAAA
|
|
1
|
+
{"version":3,"file":"duration-slider.esm.js","sources":["../../src/components/duration-slider.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { useCallback, useMemo, useState } from 'react';\nimport Slider from '@material-ui/core/Slider';\nimport { debounce } from 'lodash';\n\nimport { formatDuration, formatDurationFromSeconds } from './utils';\nimport { Label } from './label';\n\nconst marks = [\n 0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 10,\n 20,\n 30,\n 60,\n 2 * 60,\n 3 * 60,\n 4 * 60,\n 5 * 60,\n 10 * 60,\n 15 * 60,\n 30 * 60,\n 45 * 60,\n 60 * 60,\n].map((value, index) => ({\n value: index,\n label: formatDurationFromSeconds(value),\n seconds: value,\n}));\n\nfunction findMarkIndex(seconds: number): number {\n if (marks[0].seconds > seconds) {\n return 0;\n } else if (marks[marks.length - 1].seconds < seconds) {\n return marks.length - 1;\n }\n for (let i = 0; i < marks.length - 1; ++i) {\n const a = marks[i];\n const b = marks[i + 1];\n if (seconds === a.seconds) {\n return i;\n } else if (seconds === b.seconds) {\n return i + 1;\n } else if (a.seconds < seconds && b.seconds > seconds) {\n return seconds - a.seconds < b.seconds - seconds ? i : i - 1;\n }\n }\n return 0; // Won't happen\n}\n\nfunction formatDurationFromIndex(index: number) {\n return formatDurationFromSeconds(marks[index].seconds);\n}\n\nexport interface DurationSliderProps {\n header: string;\n value: number;\n setValue: (value: number) => void;\n}\n\nexport function DurationSlider(props: DurationSliderProps) {\n const { header, value, setValue } = props;\n\n const [curValue, setCurValue] = useState(value);\n\n const debouncedSetValue = useMemo(() => debounce(setValue, 1000), [setValue]);\n\n const onChange = useCallback(\n (_: any, index: number | number[]) => {\n const millis = marks[index as number].seconds * 1000;\n setCurValue(millis);\n debouncedSetValue(millis);\n },\n [debouncedSetValue],\n );\n\n const indexValue = useMemo(() => findMarkIndex(curValue / 1000), [curValue]);\n\n return (\n <>\n <Label>\n {header} {formatDuration(curValue)}\n </Label>\n <Slider\n value={indexValue}\n min={0}\n step={1}\n max={marks.length - 1}\n marks\n getAriaValueText={formatDurationFromIndex}\n valueLabelFormat={formatDurationFromIndex}\n onChange={onChange}\n valueLabelDisplay=\"auto\"\n aria-labelledby=\"slider-hide-limit\"\n />\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.esm.js","sources":["../../src/components/label.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { PropsWithChildren } from 'react';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\n\nexport const useStyles = makeStyles(\n theme => ({\n label: {\n fontWeight: 'normal',\n margin: theme.spacing(0),\n },\n }),\n {\n name: 'CicdStatisticsLabel',\n },\n);\n\nexport function Label({ children }: PropsWithChildren<{}>) {\n const classes = useStyles();\n\n return (\n <Typography variant=\"subtitle2\" className={classes.label}>\n {children}\n </Typography>\n );\n}\n"],"names":[],"mappings":";;;;AAoBO,MAAM,SAAY,GAAA,UAAA;AAAA,EACvB,CAAU,KAAA,MAAA;AAAA,IACR,KAAO,EAAA;AAAA,MACL,UAAY,EAAA,QAAA;AAAA,MACZ,MAAA,EAAQ,KAAM,CAAA,OAAA,CAAQ,CAAC
|
|
1
|
+
{"version":3,"file":"label.esm.js","sources":["../../src/components/label.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { PropsWithChildren } from 'react';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\n\nexport const useStyles = makeStyles(\n theme => ({\n label: {\n fontWeight: 'normal',\n margin: theme.spacing(0),\n },\n }),\n {\n name: 'CicdStatisticsLabel',\n },\n);\n\nexport function Label({ children }: PropsWithChildren<{}>) {\n const classes = useStyles();\n\n return (\n <Typography variant=\"subtitle2\" className={classes.label}>\n {children}\n </Typography>\n );\n}\n"],"names":[],"mappings":";;;;AAoBO,MAAM,SAAY,GAAA,UAAA;AAAA,EACvB,CAAU,KAAA,MAAA;AAAA,IACR,KAAO,EAAA;AAAA,MACL,UAAY,EAAA,QAAA;AAAA,MACZ,MAAA,EAAQ,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA;AACzB,GACF,CAAA;AAAA,EACA;AAAA,IACE,IAAM,EAAA;AAAA;AAEV;AAEgB,SAAA,KAAA,CAAM,EAAE,QAAA,EAAmC,EAAA;AACzD,EAAA,MAAM,UAAU,SAAU,EAAA;AAE1B,EAAA,2CACG,UAAW,EAAA,EAAA,OAAA,EAAQ,aAAY,SAAW,EAAA,OAAA,CAAQ,SAChD,QACH,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.esm.js","sources":["../../src/components/progress.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { CSSProperties, DependencyList } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport Box from '@material-ui/core/Box';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport Timeline from '@material-ui/lab/Timeline';\nimport TimelineItem from '@material-ui/lab/TimelineItem';\nimport TimelineSeparator from '@material-ui/lab/TimelineSeparator';\nimport TimelineConnector from '@material-ui/lab/TimelineConnector';\nimport TimelineContent from '@material-ui/lab/TimelineContent';\nimport TimelineOppositeContent from '@material-ui/lab/TimelineOppositeContent';\nimport TimelineDot, { TimelineDotProps } from '@material-ui/lab/TimelineDot';\nimport Alert from '@material-ui/lab/Alert';\nimport { useApp } from '@backstage/core-plugin-api';\n\nconst stepProgressStyle: CSSProperties = {\n marginTop: 6,\n};\n\n// Matching react-use, only has loading/error/value\ntype AsyncState<T> =\n | {\n loading: boolean;\n error?: undefined;\n value?: undefined;\n }\n | {\n loading: true;\n error?: Error | undefined;\n value?: T;\n }\n | {\n loading: false;\n error: Error;\n value?: undefined;\n }\n | {\n loading: false;\n error?: undefined;\n value: T;\n };\n\nexport interface ProgressStep extends ProgessAsSingle {\n title: string;\n}\nexport interface ProgessAsSteps {\n steps: Array<ProgressStep>;\n}\nexport interface ProgessAsSingle<T = number> {\n progress?: T;\n progressBuffer?: T;\n}\n\nexport type ProgessState<T = number> =\n | ProgessAsSingle<T>\n | (T extends number ? ProgessAsSteps : { steps?: undefined });\n\nexport type ProgressAsLoading = ProgessState & {\n loading: true;\n error?: undefined;\n value?: undefined;\n};\nexport type ProgressAsError = ProgessState<undefined> & {\n loading?: false | undefined;\n error: Error;\n value?: undefined;\n};\nexport type ProgressAsValue<T> = ProgessState<undefined> & {\n loading?: false | undefined;\n error?: undefined;\n value: T;\n};\n\n/**\n * An AsyncState but with the addition of progress (decimal 0-1) to allow\n * rendering a progress bar while waiting.\n */\nexport type ProgressType<T> =\n | ProgressAsLoading\n | ProgressAsError\n | ProgressAsValue<T>;\n\nconst sentry = Symbol();\n\n/**\n * Casts an AsyncState or Progress into its non-succeeded sub types\n */\ntype Unsuccessful<S extends ProgressType<any> | AsyncState<any>> =\n S extends ProgressType<any>\n ? ProgressAsLoading | ProgressAsError\n : Omit<AsyncState<any>, 'value'>;\n\n/**\n * Similar to useAsync except it \"waits\" for a dependent (upstream) async state\n * to finish first, otherwise it forwards the dependent pending state.\n *\n * When/if the dependent state has settled successfully, the callback will be\n * invoked for a new layer of async state with the dependent (upstream) success\n * result as argument.\n */\nexport function useAsyncChain<S extends ProgressType<any> | AsyncState<any>, R>(\n parentState: S,\n fn: (value: NonNullable<S['value']>) => Promise<R>,\n deps: DependencyList,\n): Unsuccessful<S> | AsyncState<R> {\n const childState = useAsync(\n async () => (!parentState.value ? sentry : fn(parentState.value)),\n [!parentState.error, !parentState.loading, parentState.value, ...deps],\n );\n\n if (!parentState.value) {\n return parentState as Unsuccessful<S>;\n } else if (childState.value === sentry) {\n return { loading: true };\n }\n return childState as AsyncState<R>;\n}\n\nexport function renderFallbacks<T>(\n state: ProgressType<T> | AsyncState<T>,\n success: (value: T) => JSX.Element,\n): JSX.Element {\n if (state.loading) {\n return <ViewProgress state={state} />;\n } else if (state.error) {\n return <Alert severity=\"error\">{state.error.stack}</Alert>;\n }\n\n return success(state.value!);\n}\n\nexport function ViewProgress({\n state,\n}: {\n state: ProgressAsLoading | { loading: boolean };\n}) {\n const { Progress } = useApp().getComponents();\n\n const stateAsSingleProgress = state as ProgessAsSingle;\n const stateAsStepProgress = state as ProgessAsSteps;\n\n if (\n !stateAsSingleProgress.progress &&\n !stateAsSingleProgress.progressBuffer &&\n !stateAsStepProgress.steps\n ) {\n // Simple spinner\n return <Progress />;\n } else if (stateAsSingleProgress.progress !== undefined) {\n // Simple _single_ progress\n return (\n <Box sx={{ width: '100%' }}>\n <LinearProgress\n variant=\"buffer\"\n value={(stateAsSingleProgress.progress ?? 0) * 100}\n valueBuffer={(stateAsSingleProgress.progressBuffer ?? 0) * 100}\n />\n </Box>\n );\n }\n\n // Multi-step progresses\n\n return (\n <Box sx={{ width: '100%' }}>\n <Timeline>\n {stateAsStepProgress.steps.map((step, index) => (\n <TimelineItem key={index}>\n <TimelineOppositeContent>{step.title}</TimelineOppositeContent>\n <TimelineSeparator>\n <TimelineDot color={getDotColor(step)} />\n {index < stateAsStepProgress.steps.length - 1 ? (\n <TimelineConnector />\n ) : null}\n </TimelineSeparator>\n <TimelineContent>\n {!step.progress && !step.progressBuffer ? null : (\n <LinearProgress\n style={stepProgressStyle}\n variant=\"buffer\"\n value={(step.progress ?? 0) * 100}\n valueBuffer={(step.progressBuffer ?? 0) * 100}\n />\n )}\n </TimelineContent>\n </TimelineItem>\n ))}\n </Timeline>\n </Box>\n );\n}\n\nfunction getDotColor(step: ProgressStep): TimelineDotProps['color'] {\n const progress = step.progress ?? 0;\n\n if (progress >= 1) {\n return 'primary';\n } else if (progress > 0) {\n return 'secondary';\n }\n return 'grey';\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AA8BA,MAAM,iBAAmC,GAAA;AAAA,EACvC,SAAW,EAAA
|
|
1
|
+
{"version":3,"file":"progress.esm.js","sources":["../../src/components/progress.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { CSSProperties, DependencyList } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport Box from '@material-ui/core/Box';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport Timeline from '@material-ui/lab/Timeline';\nimport TimelineItem from '@material-ui/lab/TimelineItem';\nimport TimelineSeparator from '@material-ui/lab/TimelineSeparator';\nimport TimelineConnector from '@material-ui/lab/TimelineConnector';\nimport TimelineContent from '@material-ui/lab/TimelineContent';\nimport TimelineOppositeContent from '@material-ui/lab/TimelineOppositeContent';\nimport TimelineDot, { TimelineDotProps } from '@material-ui/lab/TimelineDot';\nimport Alert from '@material-ui/lab/Alert';\nimport { useApp } from '@backstage/core-plugin-api';\n\nconst stepProgressStyle: CSSProperties = {\n marginTop: 6,\n};\n\n// Matching react-use, only has loading/error/value\ntype AsyncState<T> =\n | {\n loading: boolean;\n error?: undefined;\n value?: undefined;\n }\n | {\n loading: true;\n error?: Error | undefined;\n value?: T;\n }\n | {\n loading: false;\n error: Error;\n value?: undefined;\n }\n | {\n loading: false;\n error?: undefined;\n value: T;\n };\n\nexport interface ProgressStep extends ProgessAsSingle {\n title: string;\n}\nexport interface ProgessAsSteps {\n steps: Array<ProgressStep>;\n}\nexport interface ProgessAsSingle<T = number> {\n progress?: T;\n progressBuffer?: T;\n}\n\nexport type ProgessState<T = number> =\n | ProgessAsSingle<T>\n | (T extends number ? ProgessAsSteps : { steps?: undefined });\n\nexport type ProgressAsLoading = ProgessState & {\n loading: true;\n error?: undefined;\n value?: undefined;\n};\nexport type ProgressAsError = ProgessState<undefined> & {\n loading?: false | undefined;\n error: Error;\n value?: undefined;\n};\nexport type ProgressAsValue<T> = ProgessState<undefined> & {\n loading?: false | undefined;\n error?: undefined;\n value: T;\n};\n\n/**\n * An AsyncState but with the addition of progress (decimal 0-1) to allow\n * rendering a progress bar while waiting.\n */\nexport type ProgressType<T> =\n | ProgressAsLoading\n | ProgressAsError\n | ProgressAsValue<T>;\n\nconst sentry = Symbol();\n\n/**\n * Casts an AsyncState or Progress into its non-succeeded sub types\n */\ntype Unsuccessful<S extends ProgressType<any> | AsyncState<any>> =\n S extends ProgressType<any>\n ? ProgressAsLoading | ProgressAsError\n : Omit<AsyncState<any>, 'value'>;\n\n/**\n * Similar to useAsync except it \"waits\" for a dependent (upstream) async state\n * to finish first, otherwise it forwards the dependent pending state.\n *\n * When/if the dependent state has settled successfully, the callback will be\n * invoked for a new layer of async state with the dependent (upstream) success\n * result as argument.\n */\nexport function useAsyncChain<S extends ProgressType<any> | AsyncState<any>, R>(\n parentState: S,\n fn: (value: NonNullable<S['value']>) => Promise<R>,\n deps: DependencyList,\n): Unsuccessful<S> | AsyncState<R> {\n const childState = useAsync(\n async () => (!parentState.value ? sentry : fn(parentState.value)),\n [!parentState.error, !parentState.loading, parentState.value, ...deps],\n );\n\n if (!parentState.value) {\n return parentState as Unsuccessful<S>;\n } else if (childState.value === sentry) {\n return { loading: true };\n }\n return childState as AsyncState<R>;\n}\n\nexport function renderFallbacks<T>(\n state: ProgressType<T> | AsyncState<T>,\n success: (value: T) => JSX.Element,\n): JSX.Element {\n if (state.loading) {\n return <ViewProgress state={state} />;\n } else if (state.error) {\n return <Alert severity=\"error\">{state.error.stack}</Alert>;\n }\n\n return success(state.value!);\n}\n\nexport function ViewProgress({\n state,\n}: {\n state: ProgressAsLoading | { loading: boolean };\n}) {\n const { Progress } = useApp().getComponents();\n\n const stateAsSingleProgress = state as ProgessAsSingle;\n const stateAsStepProgress = state as ProgessAsSteps;\n\n if (\n !stateAsSingleProgress.progress &&\n !stateAsSingleProgress.progressBuffer &&\n !stateAsStepProgress.steps\n ) {\n // Simple spinner\n return <Progress />;\n } else if (stateAsSingleProgress.progress !== undefined) {\n // Simple _single_ progress\n return (\n <Box sx={{ width: '100%' }}>\n <LinearProgress\n variant=\"buffer\"\n value={(stateAsSingleProgress.progress ?? 0) * 100}\n valueBuffer={(stateAsSingleProgress.progressBuffer ?? 0) * 100}\n />\n </Box>\n );\n }\n\n // Multi-step progresses\n\n return (\n <Box sx={{ width: '100%' }}>\n <Timeline>\n {stateAsStepProgress.steps.map((step, index) => (\n <TimelineItem key={index}>\n <TimelineOppositeContent>{step.title}</TimelineOppositeContent>\n <TimelineSeparator>\n <TimelineDot color={getDotColor(step)} />\n {index < stateAsStepProgress.steps.length - 1 ? (\n <TimelineConnector />\n ) : null}\n </TimelineSeparator>\n <TimelineContent>\n {!step.progress && !step.progressBuffer ? null : (\n <LinearProgress\n style={stepProgressStyle}\n variant=\"buffer\"\n value={(step.progress ?? 0) * 100}\n valueBuffer={(step.progressBuffer ?? 0) * 100}\n />\n )}\n </TimelineContent>\n </TimelineItem>\n ))}\n </Timeline>\n </Box>\n );\n}\n\nfunction getDotColor(step: ProgressStep): TimelineDotProps['color'] {\n const progress = step.progress ?? 0;\n\n if (progress >= 1) {\n return 'primary';\n } else if (progress > 0) {\n return 'secondary';\n }\n return 'grey';\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toggle.esm.js","sources":["../../src/components/toggle.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { useCallback, PropsWithChildren } from 'react';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Switch from '@material-ui/core/Switch';\n\nexport interface ToggleProps {\n checked: boolean;\n setChecked: (checked: boolean) => void;\n}\n\nexport function Toggle({\n checked,\n setChecked,\n children,\n}: PropsWithChildren<ToggleProps>) {\n const toggler = useCallback(() => {\n setChecked(!checked);\n }, [checked, setChecked]);\n\n return (\n <FormControlLabel\n control={<Switch checked={checked} onChange={toggler} />}\n label={children}\n />\n );\n}\n"],"names":[],"mappings":";;;;AAyBO,SAAS,MAAO,CAAA;AAAA,EACrB,OAAA;AAAA,EACA,UAAA;AAAA,EACA
|
|
1
|
+
{"version":3,"file":"toggle.esm.js","sources":["../../src/components/toggle.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { useCallback, PropsWithChildren } from 'react';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport Switch from '@material-ui/core/Switch';\n\nexport interface ToggleProps {\n checked: boolean;\n setChecked: (checked: boolean) => void;\n}\n\nexport function Toggle({\n checked,\n setChecked,\n children,\n}: PropsWithChildren<ToggleProps>) {\n const toggler = useCallback(() => {\n setChecked(!checked);\n }, [checked, setChecked]);\n\n return (\n <FormControlLabel\n control={<Switch checked={checked} onChange={toggler} />}\n label={children}\n />\n );\n}\n"],"names":[],"mappings":";;;;AAyBO,SAAS,MAAO,CAAA;AAAA,EACrB,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAmC,EAAA;AACjC,EAAM,MAAA,OAAA,GAAU,YAAY,MAAM;AAChC,IAAA,UAAA,CAAW,CAAC,OAAO,CAAA;AAAA,GAClB,EAAA,CAAC,OAAS,EAAA,UAAU,CAAC,CAAA;AAExB,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,OAAS,kBAAA,KAAA,CAAA,aAAA,CAAC,MAAO,EAAA,EAAA,OAAA,EAAkB,UAAU,OAAS,EAAA,CAAA;AAAA,MACtD,KAAO,EAAA;AAAA;AAAA,GACT;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.esm.js","sources":["../../src/components/utils.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { CSSProperties } from 'react';\nimport { DateTime, Duration } from 'luxon';\nimport humanizeDuration from 'humanize-duration';\nimport { capitalize } from 'lodash';\nimport Typography from '@material-ui/core/Typography';\n\nconst infoText: CSSProperties = { color: 'InfoText' };\n\n/**\n * Picks {num} elements from {arr} evenly, from the first to the last\n */\nexport function pickElements<T>(arr: ReadonlyArray<T>, num: number): Array<T> {\n if (arr.length <= num) {\n return [...arr];\n }\n\n if (num < 2) {\n return [arr[arr.length / 2]];\n }\n\n const step = arr.length / (num - 1);\n return [\n ...Array.from(Array(num - 1)).map(\n (_, index) => arr[Math.round(index * step)],\n ),\n arr[arr.length - 1],\n ];\n}\n\nfunction formatDateShort(milliseconds: number) {\n if ((milliseconds as any) === 'auto') {\n // When recharts gets confused (empty data)\n return '';\n }\n return DateTime.fromMillis(milliseconds).toLocaleString(DateTime.DATE_SHORT);\n}\nfunction formatDateTimeShort(milliseconds: number) {\n if ((milliseconds as any) === 'auto') {\n // When recharts gets confused (empty data)\n return '';\n }\n return DateTime.fromMillis(milliseconds).toLocaleString(\n DateTime.DATETIME_SHORT,\n );\n}\n\nexport function labelFormatter(epoch: number) {\n return (\n <Typography component=\"span\" style={infoText}>\n {formatDateTimeShort(epoch)}\n </Typography>\n );\n}\n\nexport function labelFormatterWithoutTime(epoch: number) {\n return (\n <Typography component=\"span\" style={infoText}>\n {formatDateShort(epoch)}\n </Typography>\n );\n}\n\nexport function tickFormatterX(epoch: number) {\n return formatDateShort(epoch);\n}\n\nexport function tickFormatterY(duration: number) {\n if (duration === 0) {\n return '0';\n } else if (duration < 500) {\n return `${duration} ms`;\n }\n return formatDuration(duration)\n .replace(/second.*/, 'sec')\n .replace(/minute.*/, 'min')\n .replace(/hour.*/, 'h')\n .replace(/day.*/, 'd')\n .replace(/month.*/, 'm')\n .replace(/year.*/, 'y');\n}\n\nexport function tooltipValueFormatter(\n durationOrCount: number,\n name: string,\n): [any, any] {\n return [\n // TODO(Rugvip): Types don't allow returning elements, but it was here before so presumably works\n <Typography component=\"span\" style={infoText}>\n {capitalize(name)}:{' '}\n {name.endsWith(' count')\n ? durationOrCount\n : formatDuration(durationOrCount)}\n </Typography>,\n null,\n ];\n}\n\nexport function formatDuration(millis: number) {\n let rest = Math.round(millis);\n const days = Math.floor(rest / (1000 * 60 * 60 * 24));\n rest -= days * (1000 * 60 * 60 * 24);\n const hours = Math.floor(rest / (1000 * 60 * 60));\n rest -= hours * (1000 * 60 * 60);\n const minutes = Math.floor(rest / (1000 * 60));\n rest -= minutes * (1000 * 60);\n const seconds = Math.floor(rest / 1000);\n rest -= seconds * 1000;\n const milliseconds = rest;\n\n if (!days && !hours && !minutes) {\n if (seconds < 1) {\n return `${milliseconds}ms`;\n } else if (seconds < 2) {\n return `${((milliseconds + seconds * 1000) / 1000).toFixed(1)}s`;\n }\n }\n\n const dur = Duration.fromObject({\n ...(days && { days }),\n ...(hours && { hours }),\n ...(minutes && !days && { minutes }),\n ...(seconds && !days && !hours && { seconds }),\n });\n\n return humanizeDuration(dur.toMillis(), { round: true });\n}\n\nexport function formatDurationFromSeconds(seconds: number) {\n return formatDuration(seconds * 1000);\n}\n"],"names":[],"mappings":";;;;;;AAsBA,MAAM,QAAA,GAA0B,EAAE,KAAA,EAAO,UAAW,EAAA
|
|
1
|
+
{"version":3,"file":"utils.esm.js","sources":["../../src/components/utils.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { CSSProperties } from 'react';\nimport { DateTime, Duration } from 'luxon';\nimport humanizeDuration from 'humanize-duration';\nimport { capitalize } from 'lodash';\nimport Typography from '@material-ui/core/Typography';\n\nconst infoText: CSSProperties = { color: 'InfoText' };\n\n/**\n * Picks {num} elements from {arr} evenly, from the first to the last\n */\nexport function pickElements<T>(arr: ReadonlyArray<T>, num: number): Array<T> {\n if (arr.length <= num) {\n return [...arr];\n }\n\n if (num < 2) {\n return [arr[arr.length / 2]];\n }\n\n const step = arr.length / (num - 1);\n return [\n ...Array.from(Array(num - 1)).map(\n (_, index) => arr[Math.round(index * step)],\n ),\n arr[arr.length - 1],\n ];\n}\n\nfunction formatDateShort(milliseconds: number) {\n if ((milliseconds as any) === 'auto') {\n // When recharts gets confused (empty data)\n return '';\n }\n return DateTime.fromMillis(milliseconds).toLocaleString(DateTime.DATE_SHORT);\n}\nfunction formatDateTimeShort(milliseconds: number) {\n if ((milliseconds as any) === 'auto') {\n // When recharts gets confused (empty data)\n return '';\n }\n return DateTime.fromMillis(milliseconds).toLocaleString(\n DateTime.DATETIME_SHORT,\n );\n}\n\nexport function labelFormatter(epoch: number) {\n return (\n <Typography component=\"span\" style={infoText}>\n {formatDateTimeShort(epoch)}\n </Typography>\n );\n}\n\nexport function labelFormatterWithoutTime(epoch: number) {\n return (\n <Typography component=\"span\" style={infoText}>\n {formatDateShort(epoch)}\n </Typography>\n );\n}\n\nexport function tickFormatterX(epoch: number) {\n return formatDateShort(epoch);\n}\n\nexport function tickFormatterY(duration: number) {\n if (duration === 0) {\n return '0';\n } else if (duration < 500) {\n return `${duration} ms`;\n }\n return formatDuration(duration)\n .replace(/second.*/, 'sec')\n .replace(/minute.*/, 'min')\n .replace(/hour.*/, 'h')\n .replace(/day.*/, 'd')\n .replace(/month.*/, 'm')\n .replace(/year.*/, 'y');\n}\n\nexport function tooltipValueFormatter(\n durationOrCount: number,\n name: string,\n): [any, any] {\n return [\n // TODO(Rugvip): Types don't allow returning elements, but it was here before so presumably works\n <Typography component=\"span\" style={infoText}>\n {capitalize(name)}:{' '}\n {name.endsWith(' count')\n ? durationOrCount\n : formatDuration(durationOrCount)}\n </Typography>,\n null,\n ];\n}\n\nexport function formatDuration(millis: number) {\n let rest = Math.round(millis);\n const days = Math.floor(rest / (1000 * 60 * 60 * 24));\n rest -= days * (1000 * 60 * 60 * 24);\n const hours = Math.floor(rest / (1000 * 60 * 60));\n rest -= hours * (1000 * 60 * 60);\n const minutes = Math.floor(rest / (1000 * 60));\n rest -= minutes * (1000 * 60);\n const seconds = Math.floor(rest / 1000);\n rest -= seconds * 1000;\n const milliseconds = rest;\n\n if (!days && !hours && !minutes) {\n if (seconds < 1) {\n return `${milliseconds}ms`;\n } else if (seconds < 2) {\n return `${((milliseconds + seconds * 1000) / 1000).toFixed(1)}s`;\n }\n }\n\n const dur = Duration.fromObject({\n ...(days && { days }),\n ...(hours && { hours }),\n ...(minutes && !days && { minutes }),\n ...(seconds && !days && !hours && { seconds }),\n });\n\n return humanizeDuration(dur.toMillis(), { round: true });\n}\n\nexport function formatDurationFromSeconds(seconds: number) {\n return formatDuration(seconds * 1000);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-page.esm.js","sources":["../src/entity-page.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { useCallback, useState, useMemo, useEffect } from 'react';\nimport Grid from '@material-ui/core/Grid';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Alert from '@material-ui/lab/Alert';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi, errorApiRef } from '@backstage/core-plugin-api';\nimport { DateTime } from 'luxon';\n\nimport {\n useCicdStatistics,\n UseCicdStatisticsOptions,\n} from './hooks/use-cicd-statistics';\nimport { useCicdConfiguration } from './hooks/use-cicd-configuration';\nimport { buildsToChartableStages } from './charts/logic/conversions';\nimport { ZoomProvider, useZoom } from './charts/zoom';\nimport { StageChart } from './charts/stage-chart';\nimport { StatusChart } from './charts/status-chart';\nimport {\n ChartFilter,\n ChartFilters,\n getDefaultChartFilter,\n getDefaultViewOptions,\n ViewOptions,\n} from './components/chart-filters';\nimport {\n CicdConfiguration,\n FilterStatusType,\n FilterBranchType,\n} from './apis/types';\nimport { cleanupBuildTree } from './utils/stage-names';\nimport { renderFallbacks, useAsyncChain } from './components/progress';\nimport { sortFilterStatusType } from './utils/api';\n\n/** @public */\nexport function EntityPageCicdCharts() {\n const state = useCicdConfiguration();\n\n return renderFallbacks(state, value => (\n <ZoomProvider>\n <CicdCharts cicdConfiguration={value} />\n </ZoomProvider>\n ));\n}\n\nconst useStyles = makeStyles(\n theme => ({\n pane: {\n padding: theme.spacing(1, 1, 1, 1),\n },\n }),\n {\n name: 'CicdStatisticsView',\n },\n);\n\nfunction startOfDay(date: Date) {\n return DateTime.fromJSDate(date).startOf('day').toJSDate();\n}\nfunction endOfDay(date: Date) {\n return DateTime.fromJSDate(date).endOf('day').toJSDate();\n}\nfunction cleanChartFilter(filter: ChartFilter): ChartFilter {\n return {\n ...filter,\n status: sortFilterStatusType(filter.status as FilterStatusType[]),\n };\n}\n\ninterface CicdChartsProps {\n cicdConfiguration: CicdConfiguration;\n}\n\nfunction CicdCharts(props: CicdChartsProps) {\n const { cicdConfiguration } = props;\n\n const errorApi = useApi(errorApiRef);\n const { entity } = useEntity();\n\n const classes = useStyles();\n\n const { resetZoom } = useZoom();\n\n const [chartFilter, setChartFilter] = useState(\n getDefaultChartFilter(cicdConfiguration),\n );\n const [fetchedChartData, setFetchedChartData] = useState({\n abortController: null as null | AbortController,\n chartFilter,\n });\n\n const [viewOptions, setViewOptions] = useState(\n getDefaultViewOptions(cicdConfiguration),\n );\n\n const fetchStatisticsOptions = useMemo((): UseCicdStatisticsOptions => {\n const abortController = new AbortController();\n fetchedChartData.abortController = abortController;\n return {\n abortController,\n entity,\n timeFrom: startOfDay(fetchedChartData.chartFilter.fromDate),\n timeTo: endOfDay(fetchedChartData.chartFilter.toDate),\n filterStatus: fetchedChartData.chartFilter.status as FilterStatusType[],\n filterType: fetchedChartData.chartFilter.branch as FilterBranchType,\n };\n }, [entity, fetchedChartData]);\n\n const statisticsState = useCicdStatistics(fetchStatisticsOptions);\n\n const updateFilter = useCallback(() => {\n // Abort previous fetch\n fetchedChartData.abortController?.abort();\n\n setFetchedChartData({ abortController: null, chartFilter });\n }, [fetchedChartData, setFetchedChartData, chartFilter]);\n\n const chartableStagesState = useAsyncChain(\n statisticsState,\n async value =>\n buildsToChartableStages(\n await cleanupBuildTree(value.builds, {\n formatStageName: cicdConfiguration.formatStageName,\n lowerCase: viewOptions.lowercaseNames,\n }),\n { normalizeTimeRange: viewOptions.normalizeTimeRange },\n ),\n [statisticsState, cicdConfiguration, viewOptions],\n );\n\n useEffect(() => {\n resetZoom();\n }, [resetZoom, statisticsState.value]);\n\n const onFilterChange = useCallback((filter: ChartFilter) => {\n setChartFilter(cleanChartFilter(filter));\n }, []);\n\n const onViewOptionsChange = useCallback(\n (options: ViewOptions) => {\n setViewOptions(options);\n },\n [setViewOptions],\n );\n\n useEffect(() => {\n if (\n !chartableStagesState.error ||\n chartableStagesState.error?.name === 'AbortError'\n ) {\n return;\n }\n errorApi.post(chartableStagesState.error);\n }, [errorApi, chartableStagesState.error]);\n\n return (\n <Grid container>\n <Grid item lg={2} className={classes.pane}>\n <ChartFilters\n analysis={chartableStagesState.value}\n cicdConfiguration={cicdConfiguration}\n initialFetchFilter={chartFilter}\n currentFetchFilter={fetchedChartData.chartFilter}\n onChangeFetchFilter={onFilterChange}\n updateFetchFilter={updateFilter}\n initialViewOptions={viewOptions}\n onChangeViewOptions={onViewOptionsChange}\n />\n </Grid>\n <Grid item xs={12} lg={10} className={classes.pane}>\n {renderFallbacks(chartableStagesState, chartableStages => (\n <>\n {chartableStages.stages.size > 0 ? null : (\n <Alert severity=\"info\">No data</Alert>\n )}\n {!statisticsState.value?.builds?.length ||\n !chartableStagesState.value?.daily?.values?.length ? null : (\n <StatusChart analysis={chartableStagesState.value} />\n )}\n <StageChart\n stage={chartableStages.total}\n defaultCollapsed={0}\n defaultHidden={viewOptions.hideLimit}\n chartTypes={viewOptions.chartTypes}\n />\n {[...chartableStages.stages.entries()].map(([name, stage]) => (\n <StageChart\n key={name}\n stage={stage}\n defaultCollapsed={viewOptions.collapsedLimit}\n defaultHidden={viewOptions.hideLimit}\n chartTypes={viewOptions.chartTypes}\n />\n ))}\n </>\n ))}\n </Grid>\n </Grid>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAkDO,SAAS,oBAAuB,GAAA;AACrC,EAAA,MAAM,QAAQ,oBAAqB,EAAA,CAAA;AAEnC,EAAO,OAAA,eAAA,CAAgB,KAAO,EAAA,CAAA,KAAA,qBAC3B,KAAA,CAAA,aAAA,CAAA,YAAA,EAAA,IAAA,sCACE,UAAW,EAAA,EAAA,iBAAA,EAAmB,KAAO,EAAA,CACxC,CACD,CAAA,CAAA;AACH,CAAA;AAEA,MAAM,SAAY,GAAA,UAAA;AAAA,EAChB,CAAU,KAAA,MAAA;AAAA,IACR,IAAM,EAAA;AAAA,MACJ,SAAS,KAAM,CAAA,OAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,KACnC;AAAA,GACF,CAAA;AAAA,EACA;AAAA,IACE,IAAM,EAAA,oBAAA;AAAA,GACR;AACF,CAAA,CAAA;AAEA,SAAS,WAAW,IAAY,EAAA;AAC9B,EAAA,OAAO,SAAS,UAAW,CAAA,IAAI,EAAE,OAAQ,CAAA,KAAK,EAAE,QAAS,EAAA,CAAA;AAC3D,CAAA;AACA,SAAS,SAAS,IAAY,EAAA;AAC5B,EAAA,OAAO,SAAS,UAAW,CAAA,IAAI,EAAE,KAAM,CAAA,KAAK,EAAE,QAAS,EAAA,CAAA;AACzD,CAAA;AACA,SAAS,iBAAiB,MAAkC,EAAA;AAC1D,EAAO,OAAA;AAAA,IACL,GAAG,MAAA;AAAA,IACH,MAAA,EAAQ,oBAAqB,CAAA,MAAA,CAAO,MAA4B,CAAA;AAAA,GAClE,CAAA;AACF,CAAA;AAMA,SAAS,WAAW,KAAwB,EAAA;AAC1C,EAAM,MAAA,EAAE,mBAAsB,GAAA,KAAA,CAAA;AAE9B,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA,CAAA;AACnC,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA,CAAA;AAE7B,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAE1B,EAAM,MAAA,EAAE,SAAU,EAAA,GAAI,OAAQ,EAAA,CAAA;AAE9B,EAAM,MAAA,CAAC,WAAa,EAAA,cAAc,CAAI,GAAA,QAAA;AAAA,IACpC,sBAAsB,iBAAiB,CAAA;AAAA,GACzC,CAAA;AACA,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,QAAS,CAAA;AAAA,IACvD,eAAiB,EAAA,IAAA;AAAA,IACjB,WAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAM,MAAA,CAAC,WAAa,EAAA,cAAc,CAAI,GAAA,QAAA;AAAA,IACpC,sBAAsB,iBAAiB,CAAA;AAAA,GACzC,CAAA;AAEA,EAAM,MAAA,sBAAA,GAAyB,QAAQ,MAAgC;AACrE,IAAM,MAAA,eAAA,GAAkB,IAAI,eAAgB,EAAA,CAAA;AAC5C,IAAA,gBAAA,CAAiB,eAAkB,GAAA,eAAA,CAAA;AACnC,IAAO,OAAA;AAAA,MACL,eAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAU,EAAA,UAAA,CAAW,gBAAiB,CAAA,WAAA,CAAY,QAAQ,CAAA;AAAA,MAC1D,MAAQ,EAAA,QAAA,CAAS,gBAAiB,CAAA,WAAA,CAAY,MAAM,CAAA;AAAA,MACpD,YAAA,EAAc,iBAAiB,WAAY,CAAA,MAAA;AAAA,MAC3C,UAAA,EAAY,iBAAiB,WAAY,CAAA,MAAA;AAAA,KAC3C,CAAA;AAAA,GACC,EAAA,CAAC,MAAQ,EAAA,gBAAgB,CAAC,CAAA,CAAA;AAE7B,EAAM,MAAA,eAAA,GAAkB,kBAAkB,sBAAsB,CAAA,CAAA;AAEhE,EAAM,MAAA,YAAA,GAAe,YAAY,MAAM;AAErC,IAAA,gBAAA,CAAiB,iBAAiB,KAAM,EAAA,CAAA;AAExC,IAAA,mBAAA,CAAoB,EAAE,eAAA,EAAiB,IAAM,EAAA,WAAA,EAAa,CAAA,CAAA;AAAA,GACzD,EAAA,CAAC,gBAAkB,EAAA,mBAAA,EAAqB,WAAW,CAAC,CAAA,CAAA;AAEvD,EAAA,MAAM,oBAAuB,GAAA,aAAA;AAAA,IAC3B,eAAA;AAAA,IACA,OAAM,KACJ,KAAA,uBAAA;AAAA,MACE,MAAM,gBAAiB,CAAA,KAAA,CAAM,MAAQ,EAAA;AAAA,QACnC,iBAAiB,iBAAkB,CAAA,eAAA;AAAA,QACnC,WAAW,WAAY,CAAA,cAAA;AAAA,OACxB,CAAA;AAAA,MACD,EAAE,kBAAoB,EAAA,WAAA,CAAY,kBAAmB,EAAA;AAAA,KACvD;AAAA,IACF,CAAC,eAAiB,EAAA,iBAAA,EAAmB,WAAW,CAAA;AAAA,GAClD,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAU,SAAA,EAAA,CAAA;AAAA,GACT,EAAA,CAAC,SAAW,EAAA,eAAA,CAAgB,KAAK,CAAC,CAAA,CAAA;AAErC,EAAM,MAAA,cAAA,GAAiB,WAAY,CAAA,CAAC,MAAwB,KAAA;AAC1D,IAAe,cAAA,CAAA,gBAAA,CAAiB,MAAM,CAAC,CAAA,CAAA;AAAA,GACzC,EAAG,EAAE,CAAA,CAAA;AAEL,EAAA,MAAM,mBAAsB,GAAA,WAAA;AAAA,IAC1B,CAAC,OAAyB,KAAA;AACxB,MAAA,cAAA,CAAe,OAAO,CAAA,CAAA;AAAA,KACxB;AAAA,IACA,CAAC,cAAc,CAAA;AAAA,GACjB,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IACE,CAAC,oBAAqB,CAAA,KAAA,IACtB,oBAAqB,CAAA,KAAA,EAAO,SAAS,YACrC,EAAA;AACA,MAAA,OAAA;AAAA,KACF;AACA,IAAS,QAAA,CAAA,IAAA,CAAK,qBAAqB,KAAK,CAAA,CAAA;AAAA,GACvC,EAAA,CAAC,QAAU,EAAA,oBAAA,CAAqB,KAAK,CAAC,CAAA,CAAA;AAEzC,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,CAAA,EAAG,SAAW,EAAA,OAAA,CAAQ,IACnC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,UAAU,oBAAqB,CAAA,KAAA;AAAA,MAC/B,iBAAA;AAAA,MACA,kBAAoB,EAAA,WAAA;AAAA,MACpB,oBAAoB,gBAAiB,CAAA,WAAA;AAAA,MACrC,mBAAqB,EAAA,cAAA;AAAA,MACrB,iBAAmB,EAAA,YAAA;AAAA,MACnB,kBAAoB,EAAA,WAAA;AAAA,MACpB,mBAAqB,EAAA,mBAAA;AAAA,KAAA;AAAA,GAEzB,mBACC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,IAAI,EAAI,EAAA,EAAA,EAAI,WAAW,OAAQ,CAAA,IAAA,EAAA,EAC3C,gBAAgB,oBAAsB,EAAA,CAAA,eAAA,+DAElC,eAAgB,CAAA,MAAA,CAAO,OAAO,CAAI,GAAA,IAAA,uCAChC,KAAM,EAAA,EAAA,QAAA,EAAS,UAAO,SAAO,CAAA,EAE/B,CAAC,eAAgB,CAAA,KAAA,EAAO,QAAQ,MACjC,IAAA,CAAC,qBAAqB,KAAO,EAAA,KAAA,EAAO,QAAQ,MAAS,GAAA,IAAA,uCAClD,WAAY,EAAA,EAAA,QAAA,EAAU,oBAAqB,CAAA,KAAA,EAAO,CAErD,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAO,eAAgB,CAAA,KAAA;AAAA,MACvB,gBAAkB,EAAA,CAAA;AAAA,MAClB,eAAe,WAAY,CAAA,SAAA;AAAA,MAC3B,YAAY,WAAY,CAAA,UAAA;AAAA,KAAA;AAAA,GAEzB,EAAA,CAAC,GAAG,eAAA,CAAgB,MAAO,CAAA,OAAA,EAAS,CAAA,CAAE,GAAI,CAAA,CAAC,CAAC,IAAA,EAAM,KAAK,CACtD,qBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,GAAK,EAAA,IAAA;AAAA,MACL,KAAA;AAAA,MACA,kBAAkB,WAAY,CAAA,cAAA;AAAA,MAC9B,eAAe,WAAY,CAAA,SAAA;AAAA,MAC3B,YAAY,WAAY,CAAA,UAAA;AAAA,KAAA;AAAA,GAE3B,CACH,CACD,CACH,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"entity-page.esm.js","sources":["../src/entity-page.tsx"],"sourcesContent":["/*\n * Copyright 2022 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, { useCallback, useState, useMemo, useEffect } from 'react';\nimport Grid from '@material-ui/core/Grid';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Alert from '@material-ui/lab/Alert';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useApi, errorApiRef } from '@backstage/core-plugin-api';\nimport { DateTime } from 'luxon';\n\nimport {\n useCicdStatistics,\n UseCicdStatisticsOptions,\n} from './hooks/use-cicd-statistics';\nimport { useCicdConfiguration } from './hooks/use-cicd-configuration';\nimport { buildsToChartableStages } from './charts/logic/conversions';\nimport { ZoomProvider, useZoom } from './charts/zoom';\nimport { StageChart } from './charts/stage-chart';\nimport { StatusChart } from './charts/status-chart';\nimport {\n ChartFilter,\n ChartFilters,\n getDefaultChartFilter,\n getDefaultViewOptions,\n ViewOptions,\n} from './components/chart-filters';\nimport {\n CicdConfiguration,\n FilterStatusType,\n FilterBranchType,\n} from './apis/types';\nimport { cleanupBuildTree } from './utils/stage-names';\nimport { renderFallbacks, useAsyncChain } from './components/progress';\nimport { sortFilterStatusType } from './utils/api';\n\n/** @public */\nexport function EntityPageCicdCharts() {\n const state = useCicdConfiguration();\n\n return renderFallbacks(state, value => (\n <ZoomProvider>\n <CicdCharts cicdConfiguration={value} />\n </ZoomProvider>\n ));\n}\n\nconst useStyles = makeStyles(\n theme => ({\n pane: {\n padding: theme.spacing(1, 1, 1, 1),\n },\n }),\n {\n name: 'CicdStatisticsView',\n },\n);\n\nfunction startOfDay(date: Date) {\n return DateTime.fromJSDate(date).startOf('day').toJSDate();\n}\nfunction endOfDay(date: Date) {\n return DateTime.fromJSDate(date).endOf('day').toJSDate();\n}\nfunction cleanChartFilter(filter: ChartFilter): ChartFilter {\n return {\n ...filter,\n status: sortFilterStatusType(filter.status as FilterStatusType[]),\n };\n}\n\ninterface CicdChartsProps {\n cicdConfiguration: CicdConfiguration;\n}\n\nfunction CicdCharts(props: CicdChartsProps) {\n const { cicdConfiguration } = props;\n\n const errorApi = useApi(errorApiRef);\n const { entity } = useEntity();\n\n const classes = useStyles();\n\n const { resetZoom } = useZoom();\n\n const [chartFilter, setChartFilter] = useState(\n getDefaultChartFilter(cicdConfiguration),\n );\n const [fetchedChartData, setFetchedChartData] = useState({\n abortController: null as null | AbortController,\n chartFilter,\n });\n\n const [viewOptions, setViewOptions] = useState(\n getDefaultViewOptions(cicdConfiguration),\n );\n\n const fetchStatisticsOptions = useMemo((): UseCicdStatisticsOptions => {\n const abortController = new AbortController();\n fetchedChartData.abortController = abortController;\n return {\n abortController,\n entity,\n timeFrom: startOfDay(fetchedChartData.chartFilter.fromDate),\n timeTo: endOfDay(fetchedChartData.chartFilter.toDate),\n filterStatus: fetchedChartData.chartFilter.status as FilterStatusType[],\n filterType: fetchedChartData.chartFilter.branch as FilterBranchType,\n };\n }, [entity, fetchedChartData]);\n\n const statisticsState = useCicdStatistics(fetchStatisticsOptions);\n\n const updateFilter = useCallback(() => {\n // Abort previous fetch\n fetchedChartData.abortController?.abort();\n\n setFetchedChartData({ abortController: null, chartFilter });\n }, [fetchedChartData, setFetchedChartData, chartFilter]);\n\n const chartableStagesState = useAsyncChain(\n statisticsState,\n async value =>\n buildsToChartableStages(\n await cleanupBuildTree(value.builds, {\n formatStageName: cicdConfiguration.formatStageName,\n lowerCase: viewOptions.lowercaseNames,\n }),\n { normalizeTimeRange: viewOptions.normalizeTimeRange },\n ),\n [statisticsState, cicdConfiguration, viewOptions],\n );\n\n useEffect(() => {\n resetZoom();\n }, [resetZoom, statisticsState.value]);\n\n const onFilterChange = useCallback((filter: ChartFilter) => {\n setChartFilter(cleanChartFilter(filter));\n }, []);\n\n const onViewOptionsChange = useCallback(\n (options: ViewOptions) => {\n setViewOptions(options);\n },\n [setViewOptions],\n );\n\n useEffect(() => {\n if (\n !chartableStagesState.error ||\n chartableStagesState.error?.name === 'AbortError'\n ) {\n return;\n }\n errorApi.post(chartableStagesState.error);\n }, [errorApi, chartableStagesState.error]);\n\n return (\n <Grid container>\n <Grid item lg={2} className={classes.pane}>\n <ChartFilters\n analysis={chartableStagesState.value}\n cicdConfiguration={cicdConfiguration}\n initialFetchFilter={chartFilter}\n currentFetchFilter={fetchedChartData.chartFilter}\n onChangeFetchFilter={onFilterChange}\n updateFetchFilter={updateFilter}\n initialViewOptions={viewOptions}\n onChangeViewOptions={onViewOptionsChange}\n />\n </Grid>\n <Grid item xs={12} lg={10} className={classes.pane}>\n {renderFallbacks(chartableStagesState, chartableStages => (\n <>\n {chartableStages.stages.size > 0 ? null : (\n <Alert severity=\"info\">No data</Alert>\n )}\n {!statisticsState.value?.builds?.length ||\n !chartableStagesState.value?.daily?.values?.length ? null : (\n <StatusChart analysis={chartableStagesState.value} />\n )}\n <StageChart\n stage={chartableStages.total}\n defaultCollapsed={0}\n defaultHidden={viewOptions.hideLimit}\n chartTypes={viewOptions.chartTypes}\n />\n {[...chartableStages.stages.entries()].map(([name, stage]) => (\n <StageChart\n key={name}\n stage={stage}\n defaultCollapsed={viewOptions.collapsedLimit}\n defaultHidden={viewOptions.hideLimit}\n chartTypes={viewOptions.chartTypes}\n />\n ))}\n </>\n ))}\n </Grid>\n </Grid>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-cicd-configuration.esm.js","sources":["../../src/hooks/use-cicd-configuration.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { useState, useEffect } from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nimport { CicdConfiguration, statusTypes } from '../apis';\nimport { ProgressType } from '../components/progress';\nimport { defaultFormatStageName } from '../utils/stage-names';\nimport { useCicdStatisticsApi } from './use-cicd-statistics-api';\n\nexport function useCicdConfiguration(): ProgressType<CicdConfiguration> {\n const cicdStatisticsApi = useCicdStatisticsApi();\n const { entity } = useEntity();\n\n const [state, setState] = useState<ProgressType<CicdConfiguration>>({\n loading: true,\n });\n\n useEffect(() => {\n if (!cicdStatisticsApi) {\n setState({ error: new Error('No CI/CD Statistics API installed') });\n return;\n }\n\n cicdStatisticsApi\n .getConfiguration({ entity })\n .then(configuration => {\n const {\n availableStatuses = statusTypes,\n formatStageName = defaultFormatStageName,\n defaults = {},\n } = configuration;\n setState({\n value: {\n availableStatuses,\n formatStageName,\n defaults,\n },\n });\n })\n .catch(error => {\n setState({ error });\n });\n }, [cicdStatisticsApi, entity]);\n\n return state;\n}\n"],"names":[],"mappings":";;;;;;;AAwBO,SAAS,oBAAwD,GAAA;AACtE,EAAA,MAAM,oBAAoB,oBAAqB,EAAA
|
|
1
|
+
{"version":3,"file":"use-cicd-configuration.esm.js","sources":["../../src/hooks/use-cicd-configuration.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { useState, useEffect } from 'react';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nimport { CicdConfiguration, statusTypes } from '../apis';\nimport { ProgressType } from '../components/progress';\nimport { defaultFormatStageName } from '../utils/stage-names';\nimport { useCicdStatisticsApi } from './use-cicd-statistics-api';\n\nexport function useCicdConfiguration(): ProgressType<CicdConfiguration> {\n const cicdStatisticsApi = useCicdStatisticsApi();\n const { entity } = useEntity();\n\n const [state, setState] = useState<ProgressType<CicdConfiguration>>({\n loading: true,\n });\n\n useEffect(() => {\n if (!cicdStatisticsApi) {\n setState({ error: new Error('No CI/CD Statistics API installed') });\n return;\n }\n\n cicdStatisticsApi\n .getConfiguration({ entity })\n .then(configuration => {\n const {\n availableStatuses = statusTypes,\n formatStageName = defaultFormatStageName,\n defaults = {},\n } = configuration;\n setState({\n value: {\n availableStatuses,\n formatStageName,\n defaults,\n },\n });\n })\n .catch(error => {\n setState({ error });\n });\n }, [cicdStatisticsApi, entity]);\n\n return state;\n}\n"],"names":[],"mappings":";;;;;;;AAwBO,SAAS,oBAAwD,GAAA;AACtE,EAAA,MAAM,oBAAoB,oBAAqB,EAAA;AAC/C,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAE7B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAA0C,CAAA;AAAA,IAClE,OAAS,EAAA;AAAA,GACV,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,iBAAmB,EAAA;AACtB,MAAA,QAAA,CAAS,EAAE,KAAO,EAAA,IAAI,KAAM,CAAA,mCAAmC,GAAG,CAAA;AAClE,MAAA;AAAA;AAGF,IAAA,iBAAA,CACG,iBAAiB,EAAE,MAAA,EAAQ,CAAA,CAC3B,KAAK,CAAiB,aAAA,KAAA;AACrB,MAAM,MAAA;AAAA,QACJ,iBAAoB,GAAA,WAAA;AAAA,QACpB,eAAkB,GAAA,sBAAA;AAAA,QAClB,WAAW;AAAC,OACV,GAAA,aAAA;AACJ,MAAS,QAAA,CAAA;AAAA,QACP,KAAO,EAAA;AAAA,UACL,iBAAA;AAAA,UACA,eAAA;AAAA,UACA;AAAA;AACF,OACD,CAAA;AAAA,KACF,CACA,CAAA,KAAA,CAAM,CAAS,KAAA,KAAA;AACd,MAAS,QAAA,CAAA,EAAE,OAAO,CAAA;AAAA,KACnB,CAAA;AAAA,GACF,EAAA,CAAC,iBAAmB,EAAA,MAAM,CAAC,CAAA;AAE9B,EAAO,OAAA,KAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-cicd-statistics-api.esm.js","sources":["../../src/hooks/use-cicd-statistics-api.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { useApi } from '@backstage/core-plugin-api';\n\nimport { cicdStatisticsApiRef } from '../apis';\n\nexport function useCicdStatisticsApi() {\n try {\n return useApi(cicdStatisticsApiRef);\n } catch (err) {\n return undefined;\n }\n}\n"],"names":[],"mappings":";;;AAoBO,SAAS,oBAAuB,GAAA;AACrC,EAAI,IAAA;AACF,IAAA,OAAO,OAAO,oBAAoB,CAAA
|
|
1
|
+
{"version":3,"file":"use-cicd-statistics-api.esm.js","sources":["../../src/hooks/use-cicd-statistics-api.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { useApi } from '@backstage/core-plugin-api';\n\nimport { cicdStatisticsApiRef } from '../apis';\n\nexport function useCicdStatisticsApi() {\n try {\n return useApi(cicdStatisticsApiRef);\n } catch (err) {\n return undefined;\n }\n}\n"],"names":[],"mappings":";;;AAoBO,SAAS,oBAAuB,GAAA;AACrC,EAAI,IAAA;AACF,IAAA,OAAO,OAAO,oBAAoB,CAAA;AAAA,WAC3B,GAAK,EAAA;AACZ,IAAO,OAAA,KAAA,CAAA;AAAA;AAEX;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-cicd-statistics.esm.js","sources":["../../src/hooks/use-cicd-statistics.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { useState, useEffect } from 'react';\nimport { throttle } from 'lodash';\nimport { Entity } from '@backstage/catalog-model';\n\nimport {\n CicdState,\n FetchBuildsOptions,\n AbortError,\n FilterStatusType,\n FilterBranchType,\n UpdateProgress,\n} from '../apis';\nimport { ProgressType } from '../components/progress';\nimport { useCicdStatisticsApi } from './use-cicd-statistics-api';\n\nexport interface UseCicdStatisticsOptions {\n entity: Entity;\n abortController: AbortController;\n timeFrom: Date;\n timeTo: Date;\n filterStatus: Array<FilterStatusType | 'all'>;\n filterType: FilterBranchType | 'all';\n}\n\nexport function useCicdStatistics(\n options: UseCicdStatisticsOptions,\n): ProgressType<CicdState> {\n const {\n entity,\n abortController,\n timeFrom,\n timeTo,\n filterStatus,\n filterType,\n } = options;\n\n const [state, setState] = useState<ProgressType<CicdState>>({\n loading: true,\n });\n\n const cicdStatisticsApi = useCicdStatisticsApi();\n\n useEffect(() => {\n if (!cicdStatisticsApi) {\n setState({ error: new Error('No CI/CD Statistics API installed') });\n return () => {};\n }\n\n let mounted = true;\n let completed = false; // successfully or failed\n\n const updateProgressImpl: UpdateProgress = (_count, _total?, _started?) => {\n if (!mounted || completed) {\n return;\n }\n\n if (Array.isArray(_count)) {\n // Multi-progress\n setState({\n loading: true,\n steps: _count.map(step => ({\n title: step.title,\n progress: !step.total ? 0 : step.completed / step.total,\n progressBuffer: !step.total ? 0 : (step.started ?? 0) / step.total,\n })),\n });\n } else {\n // Single-progress\n const count = _count;\n const total = _total as number;\n const started = (_started as number) ?? 0;\n setState({\n loading: true,\n progress: !total ? 0 : count / total,\n progressBuffer: !total ? 0 : started / total,\n });\n }\n };\n\n const updateProgress = throttle(\n updateProgressImpl,\n 200,\n // throttle doesn't handle types of multi-signature functions\n ) as any as UpdateProgress;\n\n const fetchOptions: FetchBuildsOptions = {\n entity,\n updateProgress,\n abortSignal: abortController.signal,\n timeFrom,\n timeTo,\n filterStatus,\n filterType,\n };\n\n (async () => {\n return cicdStatisticsApi.fetchBuilds(fetchOptions);\n })()\n .then(builds => {\n completed = true;\n if (mounted) {\n setState({\n value: builds,\n });\n }\n })\n .catch(err => {\n completed = true;\n if (mounted) {\n setState({\n error: abortController.signal.aborted ? new AbortError() : err,\n });\n }\n });\n\n return () => {\n mounted = false;\n abortController.abort();\n };\n }, [\n abortController,\n entity,\n timeFrom,\n timeTo,\n filterStatus,\n filterType,\n cicdStatisticsApi,\n ]);\n\n return state;\n}\n"],"names":[],"mappings":";;;;;;AAwCO,SAAS,kBACd,OACyB,EAAA;AACzB,EAAM,MAAA;AAAA,IACJ,MAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA
|
|
1
|
+
{"version":3,"file":"use-cicd-statistics.esm.js","sources":["../../src/hooks/use-cicd-statistics.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { useState, useEffect } from 'react';\nimport { throttle } from 'lodash';\nimport { Entity } from '@backstage/catalog-model';\n\nimport {\n CicdState,\n FetchBuildsOptions,\n AbortError,\n FilterStatusType,\n FilterBranchType,\n UpdateProgress,\n} from '../apis';\nimport { ProgressType } from '../components/progress';\nimport { useCicdStatisticsApi } from './use-cicd-statistics-api';\n\nexport interface UseCicdStatisticsOptions {\n entity: Entity;\n abortController: AbortController;\n timeFrom: Date;\n timeTo: Date;\n filterStatus: Array<FilterStatusType | 'all'>;\n filterType: FilterBranchType | 'all';\n}\n\nexport function useCicdStatistics(\n options: UseCicdStatisticsOptions,\n): ProgressType<CicdState> {\n const {\n entity,\n abortController,\n timeFrom,\n timeTo,\n filterStatus,\n filterType,\n } = options;\n\n const [state, setState] = useState<ProgressType<CicdState>>({\n loading: true,\n });\n\n const cicdStatisticsApi = useCicdStatisticsApi();\n\n useEffect(() => {\n if (!cicdStatisticsApi) {\n setState({ error: new Error('No CI/CD Statistics API installed') });\n return () => {};\n }\n\n let mounted = true;\n let completed = false; // successfully or failed\n\n const updateProgressImpl: UpdateProgress = (_count, _total?, _started?) => {\n if (!mounted || completed) {\n return;\n }\n\n if (Array.isArray(_count)) {\n // Multi-progress\n setState({\n loading: true,\n steps: _count.map(step => ({\n title: step.title,\n progress: !step.total ? 0 : step.completed / step.total,\n progressBuffer: !step.total ? 0 : (step.started ?? 0) / step.total,\n })),\n });\n } else {\n // Single-progress\n const count = _count;\n const total = _total as number;\n const started = (_started as number) ?? 0;\n setState({\n loading: true,\n progress: !total ? 0 : count / total,\n progressBuffer: !total ? 0 : started / total,\n });\n }\n };\n\n const updateProgress = throttle(\n updateProgressImpl,\n 200,\n // throttle doesn't handle types of multi-signature functions\n ) as any as UpdateProgress;\n\n const fetchOptions: FetchBuildsOptions = {\n entity,\n updateProgress,\n abortSignal: abortController.signal,\n timeFrom,\n timeTo,\n filterStatus,\n filterType,\n };\n\n (async () => {\n return cicdStatisticsApi.fetchBuilds(fetchOptions);\n })()\n .then(builds => {\n completed = true;\n if (mounted) {\n setState({\n value: builds,\n });\n }\n })\n .catch(err => {\n completed = true;\n if (mounted) {\n setState({\n error: abortController.signal.aborted ? new AbortError() : err,\n });\n }\n });\n\n return () => {\n mounted = false;\n abortController.abort();\n };\n }, [\n abortController,\n entity,\n timeFrom,\n timeTo,\n filterStatus,\n filterType,\n cicdStatisticsApi,\n ]);\n\n return state;\n}\n"],"names":[],"mappings":"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"}
|
package/dist/plugin.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2022 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 createPlugin,\n createRoutableExtension,\n createRouteRef,\n} from '@backstage/core-plugin-api';\n\nexport type { EntityPageCicdCharts } from './entity-page';\n\n/** @public */\nexport const rootCatalogCicdStatsRouteRef = createRouteRef({\n id: 'cicd-statistics',\n});\n\n/** @public */\nexport const cicdStatisticsPlugin = createPlugin({\n id: 'cicd-statistics',\n routes: {\n entityContent: rootCatalogCicdStatsRouteRef,\n },\n});\n\n/** @public */\nexport const EntityCicdStatisticsContent = cicdStatisticsPlugin.provide(\n createRoutableExtension({\n component: () => import('./entity-page').then(m => m.EntityPageCicdCharts),\n mountPoint: rootCatalogCicdStatsRouteRef,\n name: 'EntityCicdStatisticsContent',\n }),\n);\n"],"names":[],"mappings":";;AAyBO,MAAM,+BAA+B,cAAe,CAAA;AAAA,EACzD,EAAI,EAAA
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2022 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 createPlugin,\n createRoutableExtension,\n createRouteRef,\n} from '@backstage/core-plugin-api';\n\nexport type { EntityPageCicdCharts } from './entity-page';\n\n/** @public */\nexport const rootCatalogCicdStatsRouteRef = createRouteRef({\n id: 'cicd-statistics',\n});\n\n/** @public */\nexport const cicdStatisticsPlugin = createPlugin({\n id: 'cicd-statistics',\n routes: {\n entityContent: rootCatalogCicdStatsRouteRef,\n },\n});\n\n/** @public */\nexport const EntityCicdStatisticsContent = cicdStatisticsPlugin.provide(\n createRoutableExtension({\n component: () => import('./entity-page').then(m => m.EntityPageCicdCharts),\n mountPoint: rootCatalogCicdStatsRouteRef,\n name: 'EntityCicdStatisticsContent',\n }),\n);\n"],"names":[],"mappings":";;AAyBO,MAAM,+BAA+B,cAAe,CAAA;AAAA,EACzD,EAAI,EAAA;AACN,CAAC;AAGM,MAAM,uBAAuB,YAAa,CAAA;AAAA,EAC/C,EAAI,EAAA,iBAAA;AAAA,EACJ,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA;AAAA;AAEnB,CAAC;AAGM,MAAM,8BAA8B,oBAAqB,CAAA,OAAA;AAAA,EAC9D,uBAAwB,CAAA;AAAA,IACtB,SAAA,EAAW,MAAM,OAAO,sBAAe,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,oBAAoB,CAAA;AAAA,IACzE,UAAY,EAAA,4BAAA;AAAA,IACZ,IAAM,EAAA;AAAA,GACP;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.esm.js","sources":["../../src/utils/api.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { FilterStatusType, statusTypes } from '../apis/types';\n\nexport function sortFilterStatusType<T extends FilterStatusType>(\n statuses: ReadonlyArray<T>,\n): Array<T> {\n const statusSet = new Set<T>(statuses);\n\n const sorted = (['all', ...statusTypes] as Array<T>).filter((status: T) => {\n if (statusSet.has(status)) {\n statusSet.delete(status);\n return true;\n }\n return false;\n });\n\n return [...sorted, ...statusSet];\n}\n"],"names":[],"mappings":";;AAkBO,SAAS,qBACd,QACU,EAAA;AACV,EAAM,MAAA,SAAA,GAAY,IAAI,GAAA,CAAO,QAAQ,CAAA
|
|
1
|
+
{"version":3,"file":"api.esm.js","sources":["../../src/utils/api.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { FilterStatusType, statusTypes } from '../apis/types';\n\nexport function sortFilterStatusType<T extends FilterStatusType>(\n statuses: ReadonlyArray<T>,\n): Array<T> {\n const statusSet = new Set<T>(statuses);\n\n const sorted = (['all', ...statusTypes] as Array<T>).filter((status: T) => {\n if (statusSet.has(status)) {\n statusSet.delete(status);\n return true;\n }\n return false;\n });\n\n return [...sorted, ...statusSet];\n}\n"],"names":[],"mappings":";;AAkBO,SAAS,qBACd,QACU,EAAA;AACV,EAAM,MAAA,SAAA,GAAY,IAAI,GAAA,CAAO,QAAQ,CAAA;AAErC,EAAM,MAAA,MAAA,GAAU,CAAC,KAAO,EAAA,GAAG,WAAW,CAAe,CAAA,MAAA,CAAO,CAAC,MAAc,KAAA;AACzE,IAAI,IAAA,SAAA,CAAU,GAAI,CAAA,MAAM,CAAG,EAAA;AACzB,MAAA,SAAA,CAAU,OAAO,MAAM,CAAA;AACvB,MAAO,OAAA,IAAA;AAAA;AAET,IAAO,OAAA,KAAA;AAAA,GACR,CAAA;AAED,EAAA,OAAO,CAAC,GAAG,MAAQ,EAAA,GAAG,SAAS,CAAA;AACjC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stage-names.esm.js","sources":["../../src/utils/stage-names.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { map } from 'already';\n\nimport { Build, Stage } from '../apis/types';\n\nexport function defaultFormatStageName(\n parentNames: Array<string>,\n stageName: string,\n): string {\n let name = stageName;\n\n // Cut off parent names (if they are prefixed to the stage name)\n parentNames.forEach(parentName => {\n if (name.startsWith(parentName)) {\n const newName = name\n .slice(parentName.length)\n // Remove things like ' - '\n .replace(/^[^\\w\\d]+/g, '');\n if (newName) {\n name = newName;\n }\n }\n });\n\n // Cut off anything after colon in what looks like pulling docker images\n return name.replace(/((pulling|(running)) [^:/]*\\/.*?):.*/g, '$1');\n}\n\nexport interface CleanupBuildTreeOptions {\n formatStageName: typeof defaultFormatStageName;\n lowerCase: boolean;\n}\n\nexport async function cleanupBuildTree(\n builds: Build[],\n opts: CleanupBuildTreeOptions,\n): Promise<Build[]> {\n const { formatStageName, lowerCase } = opts;\n\n const recurseStage = (stage: Stage, parentNames: Array<string>): Stage => {\n const name = formatStageName(\n parentNames,\n lowerCase ? stage.name.toLocaleLowerCase('en-US') : stage.name,\n );\n const ancestry = [...parentNames, name];\n\n return {\n ...stage,\n name,\n stages: stage.stages?.map(subStage => recurseStage(subStage, ancestry)),\n };\n };\n\n return map(builds, { chunk: 'idle' }, build => ({\n ...build,\n stages: build.stages.map(stage => recurseStage(stage, [])),\n }));\n}\n"],"names":[],"mappings":";;AAoBgB,SAAA,sBAAA,CACd,aACA,SACQ,EAAA;AACR,EAAA,IAAI,IAAO,GAAA,SAAA
|
|
1
|
+
{"version":3,"file":"stage-names.esm.js","sources":["../../src/utils/stage-names.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { map } from 'already';\n\nimport { Build, Stage } from '../apis/types';\n\nexport function defaultFormatStageName(\n parentNames: Array<string>,\n stageName: string,\n): string {\n let name = stageName;\n\n // Cut off parent names (if they are prefixed to the stage name)\n parentNames.forEach(parentName => {\n if (name.startsWith(parentName)) {\n const newName = name\n .slice(parentName.length)\n // Remove things like ' - '\n .replace(/^[^\\w\\d]+/g, '');\n if (newName) {\n name = newName;\n }\n }\n });\n\n // Cut off anything after colon in what looks like pulling docker images\n return name.replace(/((pulling|(running)) [^:/]*\\/.*?):.*/g, '$1');\n}\n\nexport interface CleanupBuildTreeOptions {\n formatStageName: typeof defaultFormatStageName;\n lowerCase: boolean;\n}\n\nexport async function cleanupBuildTree(\n builds: Build[],\n opts: CleanupBuildTreeOptions,\n): Promise<Build[]> {\n const { formatStageName, lowerCase } = opts;\n\n const recurseStage = (stage: Stage, parentNames: Array<string>): Stage => {\n const name = formatStageName(\n parentNames,\n lowerCase ? stage.name.toLocaleLowerCase('en-US') : stage.name,\n );\n const ancestry = [...parentNames, name];\n\n return {\n ...stage,\n name,\n stages: stage.stages?.map(subStage => recurseStage(subStage, ancestry)),\n };\n };\n\n return map(builds, { chunk: 'idle' }, build => ({\n ...build,\n stages: build.stages.map(stage => recurseStage(stage, [])),\n }));\n}\n"],"names":[],"mappings":";;AAoBgB,SAAA,sBAAA,CACd,aACA,SACQ,EAAA;AACR,EAAA,IAAI,IAAO,GAAA,SAAA;AAGX,EAAA,WAAA,CAAY,QAAQ,CAAc,UAAA,KAAA;AAChC,IAAI,IAAA,IAAA,CAAK,UAAW,CAAA,UAAU,CAAG,EAAA;AAC/B,MAAM,MAAA,OAAA,GAAU,KACb,KAAM,CAAA,UAAA,CAAW,MAAM,CAEvB,CAAA,OAAA,CAAQ,cAAc,EAAE,CAAA;AAC3B,MAAA,IAAI,OAAS,EAAA;AACX,QAAO,IAAA,GAAA,OAAA;AAAA;AACT;AACF,GACD,CAAA;AAGD,EAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,uCAAA,EAAyC,IAAI,CAAA;AACnE;AAOsB,eAAA,gBAAA,CACpB,QACA,IACkB,EAAA;AAClB,EAAM,MAAA,EAAE,eAAiB,EAAA,SAAA,EAAc,GAAA,IAAA;AAEvC,EAAM,MAAA,YAAA,GAAe,CAAC,KAAA,EAAc,WAAsC,KAAA;AACxE,IAAA,MAAM,IAAO,GAAA,eAAA;AAAA,MACX,WAAA;AAAA,MACA,YAAY,KAAM,CAAA,IAAA,CAAK,iBAAkB,CAAA,OAAO,IAAI,KAAM,CAAA;AAAA,KAC5D;AACA,IAAA,MAAM,QAAW,GAAA,CAAC,GAAG,WAAA,EAAa,IAAI,CAAA;AAEtC,IAAO,OAAA;AAAA,MACL,GAAG,KAAA;AAAA,MACH,IAAA;AAAA,MACA,MAAA,EAAQ,MAAM,MAAQ,EAAA,GAAA,CAAI,cAAY,YAAa,CAAA,QAAA,EAAU,QAAQ,CAAC;AAAA,KACxE;AAAA,GACF;AAEA,EAAA,OAAO,IAAI,MAAQ,EAAA,EAAE,KAAO,EAAA,MAAA,IAAU,CAAU,KAAA,MAAA;AAAA,IAC9C,GAAG,KAAA;AAAA,IACH,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA,CAAI,WAAS,YAAa,CAAA,KAAA,EAAO,EAAE,CAAC;AAAA,GACzD,CAAA,CAAA;AACJ;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage-community/plugin-cicd-statistics",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A frontend plugin visualizing CI/CD pipeline statistics (build time)",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "frontend-plugin",
|
|
@@ -19,12 +19,23 @@
|
|
|
19
19
|
"default": "./dist/index.esm.js"
|
|
20
20
|
},
|
|
21
21
|
"./alpha": {
|
|
22
|
+
"backstage": "@backstage/FrontendPlugin",
|
|
22
23
|
"import": "./dist/alpha.esm.js",
|
|
23
24
|
"types": "./dist/alpha.d.ts",
|
|
24
25
|
"default": "./dist/alpha.esm.js"
|
|
25
26
|
},
|
|
26
27
|
"./package.json": "./package.json"
|
|
27
28
|
},
|
|
29
|
+
"typesVersions": {
|
|
30
|
+
"*": {
|
|
31
|
+
"index": [
|
|
32
|
+
"dist/index.d.ts"
|
|
33
|
+
],
|
|
34
|
+
"alpha": [
|
|
35
|
+
"dist/alpha.d.ts"
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
},
|
|
28
39
|
"keywords": [
|
|
29
40
|
"backstage"
|
|
30
41
|
],
|
|
@@ -39,8 +50,7 @@
|
|
|
39
50
|
"main": "./dist/index.esm.js",
|
|
40
51
|
"types": "./dist/index.d.ts",
|
|
41
52
|
"files": [
|
|
42
|
-
"dist"
|
|
43
|
-
"alpha"
|
|
53
|
+
"dist"
|
|
44
54
|
],
|
|
45
55
|
"scripts": {
|
|
46
56
|
"build": "backstage-cli package build",
|
|
@@ -52,11 +62,11 @@
|
|
|
52
62
|
"test": "backstage-cli package test"
|
|
53
63
|
},
|
|
54
64
|
"dependencies": {
|
|
55
|
-
"@backstage/catalog-model": "^1.
|
|
56
|
-
"@backstage/core-compat-api": "^0.
|
|
57
|
-
"@backstage/core-plugin-api": "^1.
|
|
58
|
-
"@backstage/frontend-plugin-api": "^0.
|
|
59
|
-
"@backstage/plugin-catalog-react": "^1.
|
|
65
|
+
"@backstage/catalog-model": "^1.7.2",
|
|
66
|
+
"@backstage/core-compat-api": "^0.3.4",
|
|
67
|
+
"@backstage/core-plugin-api": "^1.10.2",
|
|
68
|
+
"@backstage/frontend-plugin-api": "^0.9.3",
|
|
69
|
+
"@backstage/plugin-catalog-react": "^1.15.0",
|
|
60
70
|
"@date-io/luxon": "^1.3.13",
|
|
61
71
|
"@material-ui/core": "^4.12.2",
|
|
62
72
|
"@material-ui/icons": "^4.9.1",
|
|
@@ -70,7 +80,7 @@
|
|
|
70
80
|
"recharts": "^2.5.0"
|
|
71
81
|
},
|
|
72
82
|
"devDependencies": {
|
|
73
|
-
"@backstage/cli": "^0.
|
|
83
|
+
"@backstage/cli": "^0.29.4",
|
|
74
84
|
"@testing-library/dom": "^10.0.0",
|
|
75
85
|
"@testing-library/jest-dom": "^6.0.0",
|
|
76
86
|
"@testing-library/react": "^15.0.0",
|