@backstage-community/plugin-cost-insights 0.27.0 → 0.28.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.
Files changed (134) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/alerts/ProjectGrowthAlert.esm.js.map +1 -1
  3. package/dist/alerts/UnlabeledDataflowAlert.esm.js.map +1 -1
  4. package/dist/alpha/plugin.esm.js +1 -1
  5. package/dist/alpha/plugin.esm.js.map +1 -1
  6. package/dist/alpha/router.esm.js.map +1 -1
  7. package/dist/alpha.d.ts +31 -10
  8. package/dist/api/CostInsightsApi.esm.js.map +1 -1
  9. package/dist/components/ActionItems/ActionItemCard.esm.js.map +1 -1
  10. package/dist/components/ActionItems/ActionItems.esm.js.map +1 -1
  11. package/dist/components/AlertInsights/AlertDialog.esm.js.map +1 -1
  12. package/dist/components/AlertInsights/AlertInsights.esm.js.map +1 -1
  13. package/dist/components/AlertInsights/AlertInsightsHeader.esm.js.map +1 -1
  14. package/dist/components/AlertInsights/AlertInsightsSection.esm.js.map +1 -1
  15. package/dist/components/AlertInsights/AlertInsightsSectionHeader.esm.js.map +1 -1
  16. package/dist/components/AlertInsights/AlertStatusSummary.esm.js.map +1 -1
  17. package/dist/components/AlertInsights/AlertStatusSummaryButton.esm.js.map +1 -1
  18. package/dist/components/AlertInstructionsLayout/AlertInstructionsLayout.esm.js.map +1 -1
  19. package/dist/components/BarChart/BarChart.esm.js.map +1 -1
  20. package/dist/components/BarChart/BarChartLabel.esm.js.map +1 -1
  21. package/dist/components/BarChart/BarChartLegend.esm.js.map +1 -1
  22. package/dist/components/BarChart/BarChartStepper.esm.js.map +1 -1
  23. package/dist/components/BarChart/BarChartStepperButton.esm.js.map +1 -1
  24. package/dist/components/BarChart/BarChartSteps.esm.js.map +1 -1
  25. package/dist/components/BarChart/BarChartTick.esm.js.map +1 -1
  26. package/dist/components/BarChart/BarChartTooltip.esm.js.map +1 -1
  27. package/dist/components/BarChart/BarChartTooltipItem.esm.js.map +1 -1
  28. package/dist/components/CopyUrlToClipboard/CopyUrlToClipboard.esm.js.map +1 -1
  29. package/dist/components/CostGrowth/CostGrowth.esm.js.map +1 -1
  30. package/dist/components/CostGrowth/CostGrowthIndicator.esm.js.map +1 -1
  31. package/dist/components/CostInsightsHeader/CostInsightsHeader.esm.js.map +1 -1
  32. package/dist/components/CostInsightsLayout/CostInsightsLayout.esm.js.map +1 -1
  33. package/dist/components/CostInsightsNavigation/CostInsightsNavigation.esm.js.map +1 -1
  34. package/dist/components/CostInsightsPage/CostInsightsPage.esm.js.map +1 -1
  35. package/dist/components/CostInsightsPage/CostInsightsPageRoot.esm.js.map +1 -1
  36. package/dist/components/CostInsightsPage/CostInsightsThemeProvider.esm.js.map +1 -1
  37. package/dist/components/CostInsightsPage/index.esm.js +5 -1
  38. package/dist/components/CostInsightsPage/index.esm.js.map +1 -1
  39. package/dist/components/CostInsightsPage/selector.esm.js +1 -1
  40. package/dist/components/CostInsightsPage/selector.esm.js.map +1 -1
  41. package/dist/components/CostInsightsTabs/CostInsightsTabs.esm.js.map +1 -1
  42. package/dist/components/CostInsightsTabs/selector.esm.js.map +1 -1
  43. package/dist/components/CostOverviewCard/CostOverviewBreakdownChart.esm.js.map +1 -1
  44. package/dist/components/CostOverviewCard/CostOverviewCard.esm.js.map +1 -1
  45. package/dist/components/CostOverviewCard/CostOverviewChart.esm.js +1 -1
  46. package/dist/components/CostOverviewCard/CostOverviewChart.esm.js.map +1 -1
  47. package/dist/components/CostOverviewCard/CostOverviewHeader.esm.js.map +1 -1
  48. package/dist/components/CostOverviewCard/CostOverviewLegend.esm.js.map +1 -1
  49. package/dist/components/CostOverviewCard/selector.esm.js.map +1 -1
  50. package/dist/components/CurrencySelect/CurrencySelect.esm.js.map +1 -1
  51. package/dist/components/EntityCosts/EntityCosts.esm.js.map +1 -1
  52. package/dist/components/EntityCosts/index.esm.js +5 -1
  53. package/dist/components/EntityCosts/index.esm.js.map +1 -1
  54. package/dist/components/LabelDataflowInstructionsPage/LabelDataflowInstructionsPage.esm.js.map +1 -1
  55. package/dist/components/LabelDataflowInstructionsPage/index.esm.js +5 -1
  56. package/dist/components/LabelDataflowInstructionsPage/index.esm.js.map +1 -1
  57. package/dist/components/LegendItem/LegendItem.esm.js.map +1 -1
  58. package/dist/components/MetricSelect/MetricSelect.esm.js.map +1 -1
  59. package/dist/components/PeriodSelect/DateRangePicker.esm.js.map +1 -1
  60. package/dist/components/ProductInsights/ProductInsights.esm.js.map +1 -1
  61. package/dist/components/ProductInsightsCard/ProductEntityDialog.esm.js.map +1 -1
  62. package/dist/components/ProductInsightsCard/ProductEntityTable.esm.js.map +1 -1
  63. package/dist/components/ProductInsightsCard/ProductInsightsCard.esm.js.map +1 -1
  64. package/dist/components/ProductInsightsCard/ProductInsightsCardList.esm.js.map +1 -1
  65. package/dist/components/ProductInsightsCard/ProductInsightsChart.esm.js.map +1 -1
  66. package/dist/components/ProjectGrowthAlertCard/ProjectGrowthAlertCard.esm.js.map +1 -1
  67. package/dist/components/ProjectGrowthAlertCard/ProjectGrowthAlertChart.esm.js.map +1 -1
  68. package/dist/components/ProjectGrowthInstructionsPage/ProjectGrowthInstructionsPage.esm.js +0 -1
  69. package/dist/components/ProjectGrowthInstructionsPage/ProjectGrowthInstructionsPage.esm.js.map +1 -1
  70. package/dist/components/ProjectGrowthInstructionsPage/index.esm.js +5 -1
  71. package/dist/components/ProjectGrowthInstructionsPage/index.esm.js.map +1 -1
  72. package/dist/components/ProjectSelect/ProjectSelect.esm.js.map +1 -1
  73. package/dist/components/UnlabeledDataflowAlertCard/UnlabeledDataflowAlertCard.esm.js.map +1 -1
  74. package/dist/components/WhyCostsMatter/WhyCostsMatter.esm.js.map +1 -1
  75. package/dist/example/alerts/KubernetesMigrationAlert.esm.js.map +1 -1
  76. package/dist/example/client.esm.js +1 -1
  77. package/dist/example/client.esm.js.map +1 -1
  78. package/dist/example/components/KubernetesMigrationAlertCard/KubernetesMigrationAlertCard.esm.js.map +1 -1
  79. package/dist/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChart.esm.js.map +1 -1
  80. package/dist/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChartLegend.esm.js.map +1 -1
  81. package/dist/example/forms/KubernetesMigrationDismissForm.esm.js.map +1 -1
  82. package/dist/forms/AlertAcceptForm.esm.js.map +1 -1
  83. package/dist/forms/AlertDismissForm.esm.js.map +1 -1
  84. package/dist/forms/AlertSnoozeForm.esm.js.map +1 -1
  85. package/dist/hooks/useConfig.esm.js +2 -2
  86. package/dist/hooks/useConfig.esm.js.map +1 -1
  87. package/dist/hooks/useCurrency.esm.js +1 -1
  88. package/dist/hooks/useCurrency.esm.js.map +1 -1
  89. package/dist/hooks/useFilters.esm.js +1 -1
  90. package/dist/hooks/useFilters.esm.js.map +1 -1
  91. package/dist/hooks/useGroups.esm.js +1 -1
  92. package/dist/hooks/useGroups.esm.js.map +1 -1
  93. package/dist/hooks/useLastCompleteBillingDate.esm.js +1 -1
  94. package/dist/hooks/useLastCompleteBillingDate.esm.js.map +1 -1
  95. package/dist/hooks/useLoading.esm.js +1 -1
  96. package/dist/hooks/useLoading.esm.js.map +1 -1
  97. package/dist/hooks/useScroll.esm.js +1 -1
  98. package/dist/hooks/useScroll.esm.js.map +1 -1
  99. package/dist/index.d.ts +0 -1
  100. package/dist/plugin.esm.js +1 -1
  101. package/dist/plugin.esm.js.map +1 -1
  102. package/dist/routes.esm.js.map +1 -1
  103. package/dist/testUtils/filters.esm.js.map +1 -1
  104. package/dist/testUtils/loading.esm.js.map +1 -1
  105. package/dist/testUtils/mockData.esm.js.map +1 -1
  106. package/dist/testUtils/products.esm.js.map +1 -1
  107. package/dist/testUtils/providers.esm.js.map +1 -1
  108. package/dist/testUtils/testUtils.esm.js.map +1 -1
  109. package/dist/types/Alert.esm.js.map +1 -1
  110. package/dist/types/ChangeStatistic.esm.js.map +1 -1
  111. package/dist/types/CurrencyType.esm.js.map +1 -1
  112. package/dist/types/DateFormat.esm.js.map +1 -1
  113. package/dist/types/Duration.esm.js.map +1 -1
  114. package/dist/types/Icon.esm.js.map +1 -1
  115. package/dist/utils/alerts.esm.js.map +1 -1
  116. package/dist/utils/assert.esm.js.map +1 -1
  117. package/dist/utils/change.esm.js.map +1 -1
  118. package/dist/utils/charts.esm.js.map +1 -1
  119. package/dist/utils/config.esm.js.map +1 -1
  120. package/dist/utils/currency.esm.js.map +1 -1
  121. package/dist/utils/duration.esm.js.map +1 -1
  122. package/dist/utils/filters.esm.js.map +1 -1
  123. package/dist/utils/formatters.esm.js.map +1 -1
  124. package/dist/utils/grammar.esm.js.map +1 -1
  125. package/dist/utils/graphs.esm.js +1 -1
  126. package/dist/utils/graphs.esm.js.map +1 -1
  127. package/dist/utils/history.esm.js.map +1 -1
  128. package/dist/utils/loading.esm.js.map +1 -1
  129. package/dist/utils/navigation.esm.js.map +1 -1
  130. package/dist/utils/scroll.esm.js.map +1 -1
  131. package/dist/utils/sort.esm.js.map +1 -1
  132. package/dist/utils/styles.esm.js.map +1 -1
  133. package/dist/utils/sum.esm.js.map +1 -1
  134. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"charts.esm.js","sources":["../../src/utils/charts.ts"],"sourcesContent":["/*\n * Copyright 2020 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 DateAggregation,\n Trendline,\n} from '@backstage-community/plugin-cost-insights-common';\nimport { ChartData } from '../types';\n\nexport function trendFrom(trendline: Trendline, date: number): number {\n return trendline.slope * (date / 1000) + trendline.intercept;\n}\n\nexport function groupByDate(\n acc: Record<string, number>,\n entry: DateAggregation,\n): Record<string, number> {\n return { ...acc, [entry.date]: entry.amount };\n}\n\nexport function toMaxCost(acc: ChartData, entry: ChartData): ChartData {\n return acc.dailyCost > entry.dailyCost ? acc : entry;\n}\n\nexport function toDataMax(metric: string, data: ChartData[]): number {\n return (\n (data.reduce(toMaxCost).dailyCost / Math.abs(data[0].trend)) *\n data[0][metric]\n );\n}\n"],"names":[],"mappings":"AAsBgB,SAAA,SAAA,CAAU,WAAsB,IAAsB,EAAA;AACpE,EAAA,OAAO,SAAU,CAAA,KAAA,IAAS,IAAO,GAAA,GAAA,CAAA,GAAQ,SAAU,CAAA,SAAA;AACrD;AAEgB,SAAA,WAAA,CACd,KACA,KACwB,EAAA;AACxB,EAAO,OAAA,EAAE,GAAG,GAAK,EAAA,CAAC,MAAM,IAAI,GAAG,MAAM,MAAO,EAAA;AAC9C;;;;"}
1
+ {"version":3,"file":"charts.esm.js","sources":["../../src/utils/charts.ts"],"sourcesContent":["/*\n * Copyright 2020 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 DateAggregation,\n Trendline,\n} from '@backstage-community/plugin-cost-insights-common';\nimport { ChartData } from '../types';\n\nexport function trendFrom(trendline: Trendline, date: number): number {\n return trendline.slope * (date / 1000) + trendline.intercept;\n}\n\nexport function groupByDate(\n acc: Record<string, number>,\n entry: DateAggregation,\n): Record<string, number> {\n return { ...acc, [entry.date]: entry.amount };\n}\n\nexport function toMaxCost(acc: ChartData, entry: ChartData): ChartData {\n return acc.dailyCost > entry.dailyCost ? acc : entry;\n}\n\nexport function toDataMax(metric: string, data: ChartData[]): number {\n return (\n (data.reduce(toMaxCost).dailyCost / Math.abs(data[0].trend)) *\n data[0][metric]\n );\n}\n"],"names":[],"mappings":"AAsBO,SAAS,SAAA,CAAU,WAAsB,IAAA,EAAsB;AACpE,EAAA,OAAO,SAAA,CAAU,KAAA,IAAS,IAAA,GAAO,GAAA,CAAA,GAAQ,SAAA,CAAU,SAAA;AACrD;AAEO,SAAS,WAAA,CACd,KACA,KAAA,EACwB;AACxB,EAAA,OAAO,EAAE,GAAG,GAAA,EAAK,CAAC,MAAM,IAAI,GAAG,MAAM,MAAA,EAAO;AAC9C;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.esm.js","sources":["../../src/utils/config.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { Currency } from '../types';\nimport { Metric } from '@backstage-community/plugin-cost-insights-common';\n\nexport function validateMetrics(metrics: Metric[]) {\n const defaults = metrics.filter(metric => metric.default);\n if (defaults.length > 1) {\n throw new Error(\n `Only one default metric can be set at a time. Found ${defaults.length}`,\n );\n }\n}\n\nexport function validateCurrencies(currencies: Currency[]) {\n const withoutKinds = currencies.filter(currency => currency.kind === null);\n if (withoutKinds.length > 1) {\n throw new Error(\n `Only one currency can be without kind. Found ${withoutKinds.length}`,\n );\n }\n}\n"],"names":[],"mappings":"AAmBO,SAAS,gBAAgB,OAAmB,EAAA;AACjD,EAAA,MAAM,QAAW,GAAA,OAAA,CAAQ,MAAO,CAAA,CAAA,MAAA,KAAU,OAAO,OAAO,CAAA;AACxD,EAAI,IAAA,QAAA,CAAS,SAAS,CAAG,EAAA;AACvB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,oDAAA,EAAuD,SAAS,MAAM,CAAA;AAAA,KACxE;AAAA;AAEJ;AAEO,SAAS,mBAAmB,UAAwB,EAAA;AACzD,EAAA,MAAM,eAAe,UAAW,CAAA,MAAA,CAAO,CAAY,QAAA,KAAA,QAAA,CAAS,SAAS,IAAI,CAAA;AACzE,EAAI,IAAA,YAAA,CAAa,SAAS,CAAG,EAAA;AAC3B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,6CAAA,EAAgD,aAAa,MAAM,CAAA;AAAA,KACrE;AAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"config.esm.js","sources":["../../src/utils/config.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { Currency } from '../types';\nimport { Metric } from '@backstage-community/plugin-cost-insights-common';\n\nexport function validateMetrics(metrics: Metric[]) {\n const defaults = metrics.filter(metric => metric.default);\n if (defaults.length > 1) {\n throw new Error(\n `Only one default metric can be set at a time. Found ${defaults.length}`,\n );\n }\n}\n\nexport function validateCurrencies(currencies: Currency[]) {\n const withoutKinds = currencies.filter(currency => currency.kind === null);\n if (withoutKinds.length > 1) {\n throw new Error(\n `Only one currency can be without kind. Found ${withoutKinds.length}`,\n );\n }\n}\n"],"names":[],"mappings":"AAmBO,SAAS,gBAAgB,OAAA,EAAmB;AACjD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,CAAA,MAAA,KAAU,OAAO,OAAO,CAAA;AACxD,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,oDAAA,EAAuD,SAAS,MAAM,CAAA;AAAA,KACxE;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,UAAA,EAAwB;AACzD,EAAA,MAAM,eAAe,UAAA,CAAW,MAAA,CAAO,CAAA,QAAA,KAAY,QAAA,CAAS,SAAS,IAAI,CAAA;AACzE,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,6CAAA,EAAgD,aAAa,MAAM,CAAA;AAAA,KACrE;AAAA,EACF;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"currency.esm.js","sources":["../../src/utils/currency.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { Currency, CurrencyType, Duration } from '../types';\nimport { assertNever } from './assert';\n\nexport const rateOf = (\n cost: number,\n duration: Duration,\n customDays?: number,\n) => {\n switch (duration) {\n case Duration.P30D:\n return cost / 12;\n case Duration.P7D:\n case Duration.P90D:\n case Duration.P3M:\n return cost / 4;\n case Duration.CUSTOM:\n // For custom durations, calculate rate based on number of days\n // Assuming cost is annual, calculate proportional rate\n if (customDays) {\n // Annual cost divided by days in year, multiplied by custom period days\n return (cost / 365) * customDays;\n }\n // Fallback: return the cost as-is (rate of 1)\n return cost;\n default:\n return assertNever(duration);\n }\n};\n\nexport const defaultCurrencies: Currency[] = [\n {\n kind: null,\n label: 'Engineers 🛠',\n unit: 'engineer',\n },\n {\n kind: CurrencyType.USD,\n label: 'US Dollars 💵',\n unit: 'dollar',\n prefix: '$',\n rate: 1,\n },\n {\n kind: CurrencyType.CarbonOffsetTons,\n label: 'Carbon Offset Tons ♻️⚖️s',\n unit: 'carbon offset ton',\n rate: 3.5,\n },\n {\n kind: CurrencyType.Beers,\n label: 'Beers 🍺',\n unit: 'beer',\n rate: 4.5,\n },\n {\n kind: CurrencyType.IceCream,\n label: 'Pints of Ice Cream 🍦',\n unit: 'ice cream pint',\n rate: 5.5,\n },\n];\n\nexport const createCurrencyFormat = (\n currency: string = 'USD',\n locale: string = 'en-US',\n) =>\n new Intl.NumberFormat(locale, {\n currency,\n style: 'currency',\n });\n"],"names":[],"mappings":";;;;;AAkBO,MAAM,MAAS,GAAA,CACpB,IACA,EAAA,QAAA,EACA,UACG,KAAA;AACH,EAAA,QAAQ,QAAU;AAAA,IAChB,KAAK,QAAS,CAAA,IAAA;AACZ,MAAA,OAAO,IAAO,GAAA,EAAA;AAAA,IAChB,KAAK,QAAS,CAAA,GAAA;AAAA,IACd,KAAK,QAAS,CAAA,IAAA;AAAA,IACd,KAAK,QAAS,CAAA,GAAA;AACZ,MAAA,OAAO,IAAO,GAAA,CAAA;AAAA,IAChB,KAAK,QAAS,CAAA,MAAA;AAGZ,MAAA,IAAI,UAAY,EAAA;AAEd,QAAA,OAAQ,OAAO,GAAO,GAAA,UAAA;AAAA;AAGxB,MAAO,OAAA,IAAA;AAAA,IACT;AACE,MAAA,OAAO,YAAY,QAAQ,CAAA;AAAA;AAEjC;AAEO,MAAM,iBAAgC,GAAA;AAAA,EAC3C;AAAA,IACE,IAAM,EAAA,IAAA;AAAA,IACN,KAAO,EAAA,qBAAA;AAAA,IACP,IAAM,EAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAM,YAAa,CAAA,GAAA;AAAA,IACnB,KAAO,EAAA,sBAAA;AAAA,IACP,IAAM,EAAA,QAAA;AAAA,IACN,MAAQ,EAAA,GAAA;AAAA,IACR,IAAM,EAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAM,YAAa,CAAA,gBAAA;AAAA,IACnB,KAAO,EAAA,8CAAA;AAAA,IACP,IAAM,EAAA,mBAAA;AAAA,IACN,IAAM,EAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAM,YAAa,CAAA,KAAA;AAAA,IACnB,KAAO,EAAA,iBAAA;AAAA,IACP,IAAM,EAAA,MAAA;AAAA,IACN,IAAM,EAAA;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAM,YAAa,CAAA,QAAA;AAAA,IACnB,KAAO,EAAA,8BAAA;AAAA,IACP,IAAM,EAAA,gBAAA;AAAA,IACN,IAAM,EAAA;AAAA;AAEV;AAEa,MAAA,oBAAA,GAAuB,CAClC,QAAmB,GAAA,KAAA,EACnB,SAAiB,OAEjB,KAAA,IAAI,IAAK,CAAA,YAAA,CAAa,MAAQ,EAAA;AAAA,EAC5B,QAAA;AAAA,EACA,KAAO,EAAA;AACT,CAAC;;;;"}
1
+ {"version":3,"file":"currency.esm.js","sources":["../../src/utils/currency.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { Currency, CurrencyType, Duration } from '../types';\nimport { assertNever } from './assert';\n\nexport const rateOf = (\n cost: number,\n duration: Duration,\n customDays?: number,\n) => {\n switch (duration) {\n case Duration.P30D:\n return cost / 12;\n case Duration.P7D:\n case Duration.P90D:\n case Duration.P3M:\n return cost / 4;\n case Duration.CUSTOM:\n // For custom durations, calculate rate based on number of days\n // Assuming cost is annual, calculate proportional rate\n if (customDays) {\n // Annual cost divided by days in year, multiplied by custom period days\n return (cost / 365) * customDays;\n }\n // Fallback: return the cost as-is (rate of 1)\n return cost;\n default:\n return assertNever(duration);\n }\n};\n\nexport const defaultCurrencies: Currency[] = [\n {\n kind: null,\n label: 'Engineers 🛠',\n unit: 'engineer',\n },\n {\n kind: CurrencyType.USD,\n label: 'US Dollars 💵',\n unit: 'dollar',\n prefix: '$',\n rate: 1,\n },\n {\n kind: CurrencyType.CarbonOffsetTons,\n label: 'Carbon Offset Tons ♻️⚖️s',\n unit: 'carbon offset ton',\n rate: 3.5,\n },\n {\n kind: CurrencyType.Beers,\n label: 'Beers 🍺',\n unit: 'beer',\n rate: 4.5,\n },\n {\n kind: CurrencyType.IceCream,\n label: 'Pints of Ice Cream 🍦',\n unit: 'ice cream pint',\n rate: 5.5,\n },\n];\n\nexport const createCurrencyFormat = (\n currency: string = 'USD',\n locale: string = 'en-US',\n) =>\n new Intl.NumberFormat(locale, {\n currency,\n style: 'currency',\n });\n"],"names":[],"mappings":";;;;;AAkBO,MAAM,MAAA,GAAS,CACpB,IAAA,EACA,QAAA,EACA,UAAA,KACG;AACH,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,QAAA,CAAS,IAAA;AACZ,MAAA,OAAO,IAAA,GAAO,EAAA;AAAA,IAChB,KAAK,QAAA,CAAS,GAAA;AAAA,IACd,KAAK,QAAA,CAAS,IAAA;AAAA,IACd,KAAK,QAAA,CAAS,GAAA;AACZ,MAAA,OAAO,IAAA,GAAO,CAAA;AAAA,IAChB,KAAK,QAAA,CAAS,MAAA;AAGZ,MAAA,IAAI,UAAA,EAAY;AAEd,QAAA,OAAQ,OAAO,GAAA,GAAO,UAAA;AAAA,MACxB;AAEA,MAAA,OAAO,IAAA;AAAA,IACT;AACE,MAAA,OAAO,YAAY,QAAQ,CAAA;AAAA;AAEjC;AAEO,MAAM,iBAAA,GAAgC;AAAA,EAC3C;AAAA,IACE,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO,qBAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAM,YAAA,CAAa,GAAA;AAAA,IACnB,KAAA,EAAO,sBAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,GAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAM,YAAA,CAAa,gBAAA;AAAA,IACnB,KAAA,EAAO,8CAAA;AAAA,IACP,IAAA,EAAM,mBAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAM,YAAA,CAAa,KAAA;AAAA,IACnB,KAAA,EAAO,iBAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,MAAM,YAAA,CAAa,QAAA;AAAA,IACnB,KAAA,EAAO,8BAAA;AAAA,IACP,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM;AAAA;AAEV;AAEO,MAAM,oBAAA,GAAuB,CAClC,QAAA,GAAmB,KAAA,EACnB,SAAiB,OAAA,KAEjB,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,EAC5B,QAAA;AAAA,EACA,KAAA,EAAO;AACT,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"duration.esm.js","sources":["../../src/utils/duration.ts"],"sourcesContent":["/*\n * Copyright 2020 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, Duration as LuxonDuration } from 'luxon';\nimport { Duration, DEFAULT_DATE_FORMAT } from '../types';\nimport { assertNever } from './assert';\n\nexport const DEFAULT_DURATION = Duration.P30D;\n\n/**\n * Derive the start date of a given period, assuming two repeating intervals.\n *\n * @param duration - see comment on Duration enum\n * @param inclusiveEndDate - from CostInsightsApi.getLastCompleteBillingDate\n * @param customDateRange - optional custom date range for Duration.CUSTOM\n * @param comparisonMode - if true, creates comparison period for custom ranges (default: false)\n */\nexport function inclusiveStartDateOf(\n duration: Duration,\n inclusiveEndDate: string,\n customDateRange?: { start: string; end: string },\n comparisonMode: boolean = false,\n): string {\n if (duration === Duration.CUSTOM && customDateRange) {\n if (comparisonMode) {\n // For comparison mode, calculate a comparison period of equal length before the selected range\n const startDate = DateTime.fromISO(customDateRange.start);\n const endDate = DateTime.fromISO(customDateRange.end);\n // Include both start and end dates (add 1 day for inclusive calculation)\n const daysDiff = Math.round(endDate.diff(startDate, 'days').days) + 1;\n // Return start of comparison period (twice the range length before the end)\n return startDate.minus({ days: daysDiff }).toFormat(DEFAULT_DATE_FORMAT);\n }\n // For non-comparison mode, return the start date as-is\n return customDateRange.start;\n }\n\n switch (duration) {\n case Duration.P7D:\n case Duration.P30D:\n case Duration.P90D:\n return DateTime.fromISO(inclusiveEndDate)\n .minus(\n LuxonDuration.fromISO(duration).plus(LuxonDuration.fromISO(duration)),\n )\n .toFormat(DEFAULT_DATE_FORMAT);\n case Duration.P3M:\n return DateTime.fromISO(inclusiveEndDate)\n .startOf('quarter')\n .minus(\n LuxonDuration.fromISO(duration).plus(LuxonDuration.fromISO(duration)),\n )\n .toFormat(DEFAULT_DATE_FORMAT);\n case Duration.CUSTOM:\n throw new Error('CUSTOM duration requires customDateRange parameter');\n default:\n return assertNever(duration);\n }\n}\n\nexport function exclusiveEndDateOf(\n duration: Duration,\n inclusiveEndDate: string,\n customDateRange?: { start: string; end: string },\n): string {\n if (duration === Duration.CUSTOM && customDateRange) {\n // For custom ranges, add 1 day to the end date for exclusive end\n return DateTime.fromISO(customDateRange.end)\n .plus({ days: 1 })\n .toFormat(DEFAULT_DATE_FORMAT);\n }\n\n switch (duration) {\n case Duration.P7D:\n case Duration.P30D:\n case Duration.P90D:\n return DateTime.fromISO(inclusiveEndDate)\n .plus({ days: 1 })\n .toFormat(DEFAULT_DATE_FORMAT);\n case Duration.P3M:\n return DateTime.fromISO(quarterEndDate(inclusiveEndDate))\n .plus({ days: 1 })\n .toFormat(DEFAULT_DATE_FORMAT);\n case Duration.CUSTOM:\n throw new Error('CUSTOM duration requires customDateRange parameter');\n default:\n return assertNever(duration);\n }\n}\n\nexport function inclusiveEndDateOf(\n duration: Duration,\n inclusiveEndDate: string,\n customDateRange?: { start: string; end: string },\n): string {\n return DateTime.fromISO(\n exclusiveEndDateOf(duration, inclusiveEndDate, customDateRange),\n )\n .minus({ days: 1 })\n .toFormat(DEFAULT_DATE_FORMAT);\n}\n\n// https://en.wikipedia.org/wiki/ISO_8601#Repeating_intervals\nexport function intervalsOf(\n duration: Duration,\n inclusiveEndDate: string,\n repeating: number = 2,\n customDateRange?: { start: string; end: string },\n comparisonMode: boolean = false,\n) {\n if (duration === Duration.CUSTOM && customDateRange) {\n const startDate = DateTime.fromISO(customDateRange.start);\n const endDate = DateTime.fromISO(customDateRange.end);\n // Add 1 to include both start and end dates\n const totalDays = Math.round(endDate.diff(startDate, 'days').days) + 1;\n\n if (comparisonMode) {\n // For comparison mode, split the range in half to create two comparison periods\n const intervalDays = Math.floor(totalDays / 2);\n return `R${repeating}/P${intervalDays}D/${exclusiveEndDateOf(\n duration,\n inclusiveEndDate,\n customDateRange,\n )}`;\n }\n\n // For non-comparison mode, use the full date range as a single interval\n return `R${repeating}/P${totalDays}D/${exclusiveEndDateOf(\n duration,\n inclusiveEndDate,\n customDateRange,\n )}`;\n }\n\n return `R${repeating}/${duration}/${exclusiveEndDateOf(\n duration,\n inclusiveEndDate,\n )}`;\n}\n\nexport function quarterEndDate(inclusiveEndDate: string): string {\n const endDate = DateTime.fromISO(inclusiveEndDate);\n const endOfQuarter = endDate.endOf('quarter').toFormat(DEFAULT_DATE_FORMAT);\n if (endOfQuarter === inclusiveEndDate) {\n return endDate.toFormat(DEFAULT_DATE_FORMAT);\n }\n return endDate\n .startOf('quarter')\n .minus({ days: 1 })\n .toFormat(DEFAULT_DATE_FORMAT);\n}\n"],"names":["LuxonDuration"],"mappings":";;;;;;AAoBO,MAAM,mBAAmB,QAAS,CAAA;AAUlC,SAAS,oBACd,CAAA,QAAA,EACA,gBACA,EAAA,eAAA,EACA,iBAA0B,KAClB,EAAA;AACR,EAAI,IAAA,QAAA,KAAa,QAAS,CAAA,MAAA,IAAU,eAAiB,EAAA;AACnD,IAAA,IAAI,cAAgB,EAAA;AAElB,MAAA,MAAM,SAAY,GAAA,QAAA,CAAS,OAAQ,CAAA,eAAA,CAAgB,KAAK,CAAA;AACxD,MAAA,MAAM,OAAU,GAAA,QAAA,CAAS,OAAQ,CAAA,eAAA,CAAgB,GAAG,CAAA;AAEpD,MAAM,MAAA,QAAA,GAAW,KAAK,KAAM,CAAA,OAAA,CAAQ,KAAK,SAAW,EAAA,MAAM,CAAE,CAAA,IAAI,CAAI,GAAA,CAAA;AAEpE,MAAO,OAAA,SAAA,CAAU,MAAM,EAAE,IAAA,EAAM,UAAU,CAAA,CAAE,SAAS,mBAAmB,CAAA;AAAA;AAGzE,IAAA,OAAO,eAAgB,CAAA,KAAA;AAAA;AAGzB,EAAA,QAAQ,QAAU;AAAA,IAChB,KAAK,QAAS,CAAA,GAAA;AAAA,IACd,KAAK,QAAS,CAAA,IAAA;AAAA,IACd,KAAK,QAAS,CAAA,IAAA;AACZ,MAAO,OAAA,QAAA,CAAS,OAAQ,CAAA,gBAAgB,CACrC,CAAA,KAAA;AAAA,QACCA,UAAA,CAAc,QAAQ,QAAQ,CAAA,CAAE,KAAKA,UAAc,CAAA,OAAA,CAAQ,QAAQ,CAAC;AAAA,OACtE,CACC,SAAS,mBAAmB,CAAA;AAAA,IACjC,KAAK,QAAS,CAAA,GAAA;AACZ,MAAA,OAAO,SAAS,OAAQ,CAAA,gBAAgB,CACrC,CAAA,OAAA,CAAQ,SAAS,CACjB,CAAA,KAAA;AAAA,QACCA,UAAA,CAAc,QAAQ,QAAQ,CAAA,CAAE,KAAKA,UAAc,CAAA,OAAA,CAAQ,QAAQ,CAAC;AAAA,OACtE,CACC,SAAS,mBAAmB,CAAA;AAAA,IACjC,KAAK,QAAS,CAAA,MAAA;AACZ,MAAM,MAAA,IAAI,MAAM,oDAAoD,CAAA;AAAA,IACtE;AACE,MAAA,OAAO,YAAY,QAAQ,CAAA;AAAA;AAEjC;AAEgB,SAAA,kBAAA,CACd,QACA,EAAA,gBAAA,EACA,eACQ,EAAA;AACR,EAAI,IAAA,QAAA,KAAa,QAAS,CAAA,MAAA,IAAU,eAAiB,EAAA;AAEnD,IAAA,OAAO,QAAS,CAAA,OAAA,CAAQ,eAAgB,CAAA,GAAG,CACxC,CAAA,IAAA,CAAK,EAAE,IAAA,EAAM,CAAE,EAAC,CAChB,CAAA,QAAA,CAAS,mBAAmB,CAAA;AAAA;AAGjC,EAAA,QAAQ,QAAU;AAAA,IAChB,KAAK,QAAS,CAAA,GAAA;AAAA,IACd,KAAK,QAAS,CAAA,IAAA;AAAA,IACd,KAAK,QAAS,CAAA,IAAA;AACZ,MAAO,OAAA,QAAA,CAAS,OAAQ,CAAA,gBAAgB,CACrC,CAAA,IAAA,CAAK,EAAE,IAAA,EAAM,CAAE,EAAC,CAChB,CAAA,QAAA,CAAS,mBAAmB,CAAA;AAAA,IACjC,KAAK,QAAS,CAAA,GAAA;AACZ,MAAA,OAAO,QAAS,CAAA,OAAA,CAAQ,cAAe,CAAA,gBAAgB,CAAC,CAAA,CACrD,IAAK,CAAA,EAAE,IAAM,EAAA,CAAA,EAAG,CAAA,CAChB,SAAS,mBAAmB,CAAA;AAAA,IACjC,KAAK,QAAS,CAAA,MAAA;AACZ,MAAM,MAAA,IAAI,MAAM,oDAAoD,CAAA;AAAA,IACtE;AACE,MAAA,OAAO,YAAY,QAAQ,CAAA;AAAA;AAEjC;AAEgB,SAAA,kBAAA,CACd,QACA,EAAA,gBAAA,EACA,eACQ,EAAA;AACR,EAAA,OAAO,QAAS,CAAA,OAAA;AAAA,IACd,kBAAA,CAAmB,QAAU,EAAA,gBAAA,EAAkB,eAAe;AAAA,GAChE,CACG,MAAM,EAAE,IAAA,EAAM,GAAG,CAAA,CACjB,SAAS,mBAAmB,CAAA;AACjC;AAGO,SAAS,YACd,QACA,EAAA,gBAAA,EACA,YAAoB,CACpB,EAAA,eAAA,EACA,iBAA0B,KAC1B,EAAA;AACA,EAAI,IAAA,QAAA,KAAa,QAAS,CAAA,MAAA,IAAU,eAAiB,EAAA;AACnD,IAAA,MAAM,SAAY,GAAA,QAAA,CAAS,OAAQ,CAAA,eAAA,CAAgB,KAAK,CAAA;AACxD,IAAA,MAAM,OAAU,GAAA,QAAA,CAAS,OAAQ,CAAA,eAAA,CAAgB,GAAG,CAAA;AAEpD,IAAM,MAAA,SAAA,GAAY,KAAK,KAAM,CAAA,OAAA,CAAQ,KAAK,SAAW,EAAA,MAAM,CAAE,CAAA,IAAI,CAAI,GAAA,CAAA;AAErE,IAAA,IAAI,cAAgB,EAAA;AAElB,MAAA,MAAM,YAAe,GAAA,IAAA,CAAK,KAAM,CAAA,SAAA,GAAY,CAAC,CAAA;AAC7C,MAAA,OAAO,CAAI,CAAA,EAAA,SAAS,CAAK,EAAA,EAAA,YAAY,CAAK,EAAA,EAAA,kBAAA;AAAA,QACxC,QAAA;AAAA,QACA,gBAAA;AAAA,QACA;AAAA,OACD,CAAA,CAAA;AAAA;AAIH,IAAA,OAAO,CAAI,CAAA,EAAA,SAAS,CAAK,EAAA,EAAA,SAAS,CAAK,EAAA,EAAA,kBAAA;AAAA,MACrC,QAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACD,CAAA,CAAA;AAAA;AAGH,EAAA,OAAO,CAAI,CAAA,EAAA,SAAS,CAAI,CAAA,EAAA,QAAQ,CAAI,CAAA,EAAA,kBAAA;AAAA,IAClC,QAAA;AAAA,IACA;AAAA,GACD,CAAA,CAAA;AACH;AAEO,SAAS,eAAe,gBAAkC,EAAA;AAC/D,EAAM,MAAA,OAAA,GAAU,QAAS,CAAA,OAAA,CAAQ,gBAAgB,CAAA;AACjD,EAAA,MAAM,eAAe,OAAQ,CAAA,KAAA,CAAM,SAAS,CAAA,CAAE,SAAS,mBAAmB,CAAA;AAC1E,EAAA,IAAI,iBAAiB,gBAAkB,EAAA;AACrC,IAAO,OAAA,OAAA,CAAQ,SAAS,mBAAmB,CAAA;AAAA;AAE7C,EAAO,OAAA,OAAA,CACJ,OAAQ,CAAA,SAAS,CACjB,CAAA,KAAA,CAAM,EAAE,IAAA,EAAM,CAAE,EAAC,CACjB,CAAA,QAAA,CAAS,mBAAmB,CAAA;AACjC;;;;"}
1
+ {"version":3,"file":"duration.esm.js","sources":["../../src/utils/duration.ts"],"sourcesContent":["/*\n * Copyright 2020 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, Duration as LuxonDuration } from 'luxon';\nimport { Duration, DEFAULT_DATE_FORMAT } from '../types';\nimport { assertNever } from './assert';\n\nexport const DEFAULT_DURATION = Duration.P30D;\n\n/**\n * Derive the start date of a given period, assuming two repeating intervals.\n *\n * @param duration - see comment on Duration enum\n * @param inclusiveEndDate - from CostInsightsApi.getLastCompleteBillingDate\n * @param customDateRange - optional custom date range for Duration.CUSTOM\n * @param comparisonMode - if true, creates comparison period for custom ranges (default: false)\n */\nexport function inclusiveStartDateOf(\n duration: Duration,\n inclusiveEndDate: string,\n customDateRange?: { start: string; end: string },\n comparisonMode: boolean = false,\n): string {\n if (duration === Duration.CUSTOM && customDateRange) {\n if (comparisonMode) {\n // For comparison mode, calculate a comparison period of equal length before the selected range\n const startDate = DateTime.fromISO(customDateRange.start);\n const endDate = DateTime.fromISO(customDateRange.end);\n // Include both start and end dates (add 1 day for inclusive calculation)\n const daysDiff = Math.round(endDate.diff(startDate, 'days').days) + 1;\n // Return start of comparison period (twice the range length before the end)\n return startDate.minus({ days: daysDiff }).toFormat(DEFAULT_DATE_FORMAT);\n }\n // For non-comparison mode, return the start date as-is\n return customDateRange.start;\n }\n\n switch (duration) {\n case Duration.P7D:\n case Duration.P30D:\n case Duration.P90D:\n return DateTime.fromISO(inclusiveEndDate)\n .minus(\n LuxonDuration.fromISO(duration).plus(LuxonDuration.fromISO(duration)),\n )\n .toFormat(DEFAULT_DATE_FORMAT);\n case Duration.P3M:\n return DateTime.fromISO(inclusiveEndDate)\n .startOf('quarter')\n .minus(\n LuxonDuration.fromISO(duration).plus(LuxonDuration.fromISO(duration)),\n )\n .toFormat(DEFAULT_DATE_FORMAT);\n case Duration.CUSTOM:\n throw new Error('CUSTOM duration requires customDateRange parameter');\n default:\n return assertNever(duration);\n }\n}\n\nexport function exclusiveEndDateOf(\n duration: Duration,\n inclusiveEndDate: string,\n customDateRange?: { start: string; end: string },\n): string {\n if (duration === Duration.CUSTOM && customDateRange) {\n // For custom ranges, add 1 day to the end date for exclusive end\n return DateTime.fromISO(customDateRange.end)\n .plus({ days: 1 })\n .toFormat(DEFAULT_DATE_FORMAT);\n }\n\n switch (duration) {\n case Duration.P7D:\n case Duration.P30D:\n case Duration.P90D:\n return DateTime.fromISO(inclusiveEndDate)\n .plus({ days: 1 })\n .toFormat(DEFAULT_DATE_FORMAT);\n case Duration.P3M:\n return DateTime.fromISO(quarterEndDate(inclusiveEndDate))\n .plus({ days: 1 })\n .toFormat(DEFAULT_DATE_FORMAT);\n case Duration.CUSTOM:\n throw new Error('CUSTOM duration requires customDateRange parameter');\n default:\n return assertNever(duration);\n }\n}\n\nexport function inclusiveEndDateOf(\n duration: Duration,\n inclusiveEndDate: string,\n customDateRange?: { start: string; end: string },\n): string {\n return DateTime.fromISO(\n exclusiveEndDateOf(duration, inclusiveEndDate, customDateRange),\n )\n .minus({ days: 1 })\n .toFormat(DEFAULT_DATE_FORMAT);\n}\n\n// https://en.wikipedia.org/wiki/ISO_8601#Repeating_intervals\nexport function intervalsOf(\n duration: Duration,\n inclusiveEndDate: string,\n repeating: number = 2,\n customDateRange?: { start: string; end: string },\n comparisonMode: boolean = false,\n) {\n if (duration === Duration.CUSTOM && customDateRange) {\n const startDate = DateTime.fromISO(customDateRange.start);\n const endDate = DateTime.fromISO(customDateRange.end);\n // Add 1 to include both start and end dates\n const totalDays = Math.round(endDate.diff(startDate, 'days').days) + 1;\n\n if (comparisonMode) {\n // For comparison mode, split the range in half to create two comparison periods\n const intervalDays = Math.floor(totalDays / 2);\n return `R${repeating}/P${intervalDays}D/${exclusiveEndDateOf(\n duration,\n inclusiveEndDate,\n customDateRange,\n )}`;\n }\n\n // For non-comparison mode, use the full date range as a single interval\n return `R${repeating}/P${totalDays}D/${exclusiveEndDateOf(\n duration,\n inclusiveEndDate,\n customDateRange,\n )}`;\n }\n\n return `R${repeating}/${duration}/${exclusiveEndDateOf(\n duration,\n inclusiveEndDate,\n )}`;\n}\n\nexport function quarterEndDate(inclusiveEndDate: string): string {\n const endDate = DateTime.fromISO(inclusiveEndDate);\n const endOfQuarter = endDate.endOf('quarter').toFormat(DEFAULT_DATE_FORMAT);\n if (endOfQuarter === inclusiveEndDate) {\n return endDate.toFormat(DEFAULT_DATE_FORMAT);\n }\n return endDate\n .startOf('quarter')\n .minus({ days: 1 })\n .toFormat(DEFAULT_DATE_FORMAT);\n}\n"],"names":["LuxonDuration"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"filters.esm.js","sources":["../../src/utils/filters.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { Duration, PageFilters } from '../types';\nimport { Group } from '@backstage-community/plugin-cost-insights-common';\n\nexport function getDefaultPageFilters(groups: Group[]): PageFilters {\n return {\n group: groups.length ? groups[0].id : null,\n project: null,\n duration: Duration.P90D,\n metric: null,\n };\n}\n"],"names":[],"mappings":";;;AAmBO,SAAS,sBAAsB,MAA8B,EAAA;AAClE,EAAO,OAAA;AAAA,IACL,OAAO,MAAO,CAAA,MAAA,GAAS,MAAO,CAAA,CAAC,EAAE,EAAK,GAAA,IAAA;AAAA,IACtC,OAAS,EAAA,IAAA;AAAA,IACT,UAAU,QAAS,CAAA,IAAA;AAAA,IACnB,MAAQ,EAAA;AAAA,GACV;AACF;;;;"}
1
+ {"version":3,"file":"filters.esm.js","sources":["../../src/utils/filters.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { Duration, PageFilters } from '../types';\nimport { Group } from '@backstage-community/plugin-cost-insights-common';\n\nexport function getDefaultPageFilters(groups: Group[]): PageFilters {\n return {\n group: groups.length ? groups[0].id : null,\n project: null,\n duration: Duration.P90D,\n metric: null,\n };\n}\n"],"names":[],"mappings":";;;AAmBO,SAAS,sBAAsB,MAAA,EAA8B;AAClE,EAAA,OAAO;AAAA,IACL,OAAO,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,CAAC,EAAE,EAAA,GAAK,IAAA;AAAA,IACtC,OAAA,EAAS,IAAA;AAAA,IACT,UAAU,QAAA,CAAS,IAAA;AAAA,IACnB,MAAA,EAAQ;AAAA,GACV;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"formatters.esm.js","sources":["../../src/utils/formatters.ts"],"sourcesContent":["/*\n * Copyright 2020 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, Duration as LuxonDuration } from 'luxon';\nimport pluralize from 'pluralize';\nimport { Duration } from '../types';\nimport { ChangeStatistic } from '@backstage-community/plugin-cost-insights-common';\nimport { inclusiveEndDateOf, inclusiveStartDateOf } from './duration';\nimport { notEmpty } from './assert';\n\nexport type Period = {\n periodStart: string;\n periodEnd: string;\n};\n\nexport const currencyFormatter = (currency: Intl.NumberFormat) => {\n const options = currency.resolvedOptions();\n\n return new Intl.NumberFormat(options.locale, {\n style: 'currency',\n currency: options.currency,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n });\n};\n\nexport const lengthyCurrencyFormatter = (currency: Intl.NumberFormat) => {\n const options = currency.resolvedOptions();\n\n return new Intl.NumberFormat(options.locale, {\n style: 'currency',\n currency: options.currency,\n minimumFractionDigits: 0,\n minimumSignificantDigits: 2,\n maximumSignificantDigits: 2,\n });\n};\n\nexport const numberFormatter = new Intl.NumberFormat('en-US', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n});\n\nexport const monthFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: 'UTC',\n month: 'long',\n year: 'numeric',\n});\n\nexport const dateFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: 'UTC',\n day: 'numeric',\n month: 'short',\n});\n\nexport const monthOf = (date: string): string => {\n return monthFormatter.format(Date.parse(date));\n};\n\nexport const quarterOf = (date: string): string => {\n // Supports formatting yyyy-LL-dd and yyyy-'Q'q returned in alerts\n const d = DateTime.fromISO(date).isValid\n ? DateTime.fromISO(date)\n : DateTime.fromFormat(date, \"yyyy-'Q'q\");\n return d.toFormat(\"'Q'q yyyy\");\n};\n\nexport function formatCurrency(amount: number, currency?: string): string {\n const n = Math.round(amount);\n const numString = numberFormatter.format(n);\n\n return currency ? `${numString} ${pluralize(currency, n)}` : numString;\n}\n\nexport function formatChange(\n change: ChangeStatistic,\n options?: { absolute: boolean },\n): string {\n if (notEmpty(change.ratio)) {\n return formatPercent(\n options?.absolute ? Math.abs(change.ratio) : change.ratio,\n );\n }\n if (options?.absolute) {\n return '∞';\n }\n return change.amount >= 0 ? '∞' : '-∞';\n}\n\nexport function formatPercent(n: number): string {\n // Number.toFixed shows scientific notation for extreme numbers\n if (isNaN(n) || Math.abs(n) < 0.01) {\n return '0%';\n }\n\n if (Math.abs(n) > 10) {\n return `>${n < 0 ? '-' : ''}1000%`;\n }\n\n return `${(n * 100).toFixed(0)}%`;\n}\n\nexport function formatLastTwoLookaheadQuarters(inclusiveEndDate: string) {\n const start = DateTime.fromISO(\n inclusiveStartDateOf(Duration.P3M, inclusiveEndDate),\n ).toFormat(\"'Q'q yyyy\");\n const end = DateTime.fromISO(\n inclusiveEndDateOf(Duration.P3M, inclusiveEndDate),\n ).toFormat(\"'Q'q yyyy\");\n return `${start} vs ${end}`;\n}\n\nconst formatRelativePeriod = (\n duration: Duration,\n date: string,\n isEndDate: boolean,\n customDays?: number,\n): string => {\n // For custom durations, we already know the days, so skip validation\n if (duration === Duration.CUSTOM && customDays !== undefined) {\n return isEndDate ? `Last ${customDays} Days` : `First ${customDays} Days`;\n }\n\n const periodStart = isEndDate ? inclusiveStartDateOf(duration, date) : date;\n const periodEnd = isEndDate ? date : inclusiveEndDateOf(duration, date);\n const days = customDays ?? LuxonDuration.fromISO(duration).days;\n if (![periodStart, periodEnd].includes(date)) {\n throw new Error(`Invalid relative date ${date} for duration ${duration}`);\n }\n return date === periodStart ? `First ${days} Days` : `Last ${days} Days`;\n};\n\nexport function formatPeriod(\n duration: Duration,\n date: string,\n isEndDate: boolean,\n customDateRange?: { start: string; end: string },\n comparisonMode: boolean = false,\n) {\n switch (duration) {\n case Duration.P3M:\n return quarterOf(\n isEndDate\n ? inclusiveEndDateOf(duration, date, customDateRange)\n : inclusiveStartDateOf(duration, date, customDateRange),\n );\n case Duration.CUSTOM:\n // For custom durations in non-comparison mode, display the full date range\n if (customDateRange && !comparisonMode) {\n const startDate = DateTime.fromISO(customDateRange.start);\n const endDate = DateTime.fromISO(customDateRange.end);\n return `${startDate.toFormat('MMM dd')} - ${endDate.toFormat(\n 'MMM dd, yyyy',\n )}`;\n }\n // For comparison mode, display as \"First X Days\" vs \"Last X Days\"\n if (customDateRange && comparisonMode) {\n const startDate = DateTime.fromISO(customDateRange.start);\n const endDate = DateTime.fromISO(customDateRange.end);\n const totalDays = Math.round(endDate.diff(startDate, 'days').days) + 1;\n const firstPeriodDays = Math.floor(totalDays / 2);\n const lastPeriodDays = totalDays - firstPeriodDays;\n const periodDays = isEndDate ? lastPeriodDays : firstPeriodDays;\n return formatRelativePeriod(duration, date, isEndDate, periodDays);\n }\n return DateTime.fromISO(date).toFormat('MMM dd, yyyy');\n default:\n return formatRelativePeriod(duration, date, isEndDate);\n }\n}\n"],"names":["LuxonDuration"],"mappings":"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"}
1
+ {"version":3,"file":"formatters.esm.js","sources":["../../src/utils/formatters.ts"],"sourcesContent":["/*\n * Copyright 2020 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, Duration as LuxonDuration } from 'luxon';\nimport pluralize from 'pluralize';\nimport { Duration } from '../types';\nimport { ChangeStatistic } from '@backstage-community/plugin-cost-insights-common';\nimport { inclusiveEndDateOf, inclusiveStartDateOf } from './duration';\nimport { notEmpty } from './assert';\n\nexport type Period = {\n periodStart: string;\n periodEnd: string;\n};\n\nexport const currencyFormatter = (currency: Intl.NumberFormat) => {\n const options = currency.resolvedOptions();\n\n return new Intl.NumberFormat(options.locale, {\n style: 'currency',\n currency: options.currency,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n });\n};\n\nexport const lengthyCurrencyFormatter = (currency: Intl.NumberFormat) => {\n const options = currency.resolvedOptions();\n\n return new Intl.NumberFormat(options.locale, {\n style: 'currency',\n currency: options.currency,\n minimumFractionDigits: 0,\n minimumSignificantDigits: 2,\n maximumSignificantDigits: 2,\n });\n};\n\nexport const numberFormatter = new Intl.NumberFormat('en-US', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n});\n\nexport const monthFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: 'UTC',\n month: 'long',\n year: 'numeric',\n});\n\nexport const dateFormatter = new Intl.DateTimeFormat('en-US', {\n timeZone: 'UTC',\n day: 'numeric',\n month: 'short',\n});\n\nexport const monthOf = (date: string): string => {\n return monthFormatter.format(Date.parse(date));\n};\n\nexport const quarterOf = (date: string): string => {\n // Supports formatting yyyy-LL-dd and yyyy-'Q'q returned in alerts\n const d = DateTime.fromISO(date).isValid\n ? DateTime.fromISO(date)\n : DateTime.fromFormat(date, \"yyyy-'Q'q\");\n return d.toFormat(\"'Q'q yyyy\");\n};\n\nexport function formatCurrency(amount: number, currency?: string): string {\n const n = Math.round(amount);\n const numString = numberFormatter.format(n);\n\n return currency ? `${numString} ${pluralize(currency, n)}` : numString;\n}\n\nexport function formatChange(\n change: ChangeStatistic,\n options?: { absolute: boolean },\n): string {\n if (notEmpty(change.ratio)) {\n return formatPercent(\n options?.absolute ? Math.abs(change.ratio) : change.ratio,\n );\n }\n if (options?.absolute) {\n return '∞';\n }\n return change.amount >= 0 ? '∞' : '-∞';\n}\n\nexport function formatPercent(n: number): string {\n // Number.toFixed shows scientific notation for extreme numbers\n if (isNaN(n) || Math.abs(n) < 0.01) {\n return '0%';\n }\n\n if (Math.abs(n) > 10) {\n return `>${n < 0 ? '-' : ''}1000%`;\n }\n\n return `${(n * 100).toFixed(0)}%`;\n}\n\nexport function formatLastTwoLookaheadQuarters(inclusiveEndDate: string) {\n const start = DateTime.fromISO(\n inclusiveStartDateOf(Duration.P3M, inclusiveEndDate),\n ).toFormat(\"'Q'q yyyy\");\n const end = DateTime.fromISO(\n inclusiveEndDateOf(Duration.P3M, inclusiveEndDate),\n ).toFormat(\"'Q'q yyyy\");\n return `${start} vs ${end}`;\n}\n\nconst formatRelativePeriod = (\n duration: Duration,\n date: string,\n isEndDate: boolean,\n customDays?: number,\n): string => {\n // For custom durations, we already know the days, so skip validation\n if (duration === Duration.CUSTOM && customDays !== undefined) {\n return isEndDate ? `Last ${customDays} Days` : `First ${customDays} Days`;\n }\n\n const periodStart = isEndDate ? inclusiveStartDateOf(duration, date) : date;\n const periodEnd = isEndDate ? date : inclusiveEndDateOf(duration, date);\n const days = customDays ?? LuxonDuration.fromISO(duration).days;\n if (![periodStart, periodEnd].includes(date)) {\n throw new Error(`Invalid relative date ${date} for duration ${duration}`);\n }\n return date === periodStart ? `First ${days} Days` : `Last ${days} Days`;\n};\n\nexport function formatPeriod(\n duration: Duration,\n date: string,\n isEndDate: boolean,\n customDateRange?: { start: string; end: string },\n comparisonMode: boolean = false,\n) {\n switch (duration) {\n case Duration.P3M:\n return quarterOf(\n isEndDate\n ? inclusiveEndDateOf(duration, date, customDateRange)\n : inclusiveStartDateOf(duration, date, customDateRange),\n );\n case Duration.CUSTOM:\n // For custom durations in non-comparison mode, display the full date range\n if (customDateRange && !comparisonMode) {\n const startDate = DateTime.fromISO(customDateRange.start);\n const endDate = DateTime.fromISO(customDateRange.end);\n return `${startDate.toFormat('MMM dd')} - ${endDate.toFormat(\n 'MMM dd, yyyy',\n )}`;\n }\n // For comparison mode, display as \"First X Days\" vs \"Last X Days\"\n if (customDateRange && comparisonMode) {\n const startDate = DateTime.fromISO(customDateRange.start);\n const endDate = DateTime.fromISO(customDateRange.end);\n const totalDays = Math.round(endDate.diff(startDate, 'days').days) + 1;\n const firstPeriodDays = Math.floor(totalDays / 2);\n const lastPeriodDays = totalDays - firstPeriodDays;\n const periodDays = isEndDate ? lastPeriodDays : firstPeriodDays;\n return formatRelativePeriod(duration, date, isEndDate, periodDays);\n }\n return DateTime.fromISO(date).toFormat('MMM dd, yyyy');\n default:\n return formatRelativePeriod(duration, date, isEndDate);\n }\n}\n"],"names":["LuxonDuration"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"grammar.esm.js","sources":["../../src/utils/grammar.ts"],"sourcesContent":["/*\n * Copyright 2020 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\nconst vowels = {\n a: 'A',\n e: 'E',\n i: 'I',\n o: 'O',\n u: 'U',\n};\n\nexport const indefiniteArticleOf = (\n articles: [string, string],\n word: string,\n) => {\n const firstChar = word.charAt(0).toLocaleLowerCase('en-US');\n return firstChar in vowels\n ? `${articles[1]} ${word}`\n : `${articles[0]} ${word}`;\n};\n"],"names":[],"mappings":"AAgBA,MAAM,MAAS,GAAA;AAAA,EACb,CAAG,EAAA,GAAA;AAAA,EACH,CAAG,EAAA,GAAA;AAAA,EACH,CAAG,EAAA,GAAA;AAAA,EACH,CAAG,EAAA,GAAA;AAAA,EACH,CAAG,EAAA;AACL,CAAA;AAEa,MAAA,mBAAA,GAAsB,CACjC,QAAA,EACA,IACG,KAAA;AACH,EAAA,MAAM,YAAY,IAAK,CAAA,MAAA,CAAO,CAAC,CAAA,CAAE,kBAAkB,OAAO,CAAA;AAC1D,EAAA,OAAO,SAAa,IAAA,MAAA,GAChB,CAAG,EAAA,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GACtB,CAAG,EAAA,QAAA,CAAS,CAAC,CAAC,IAAI,IAAI,CAAA,CAAA;AAC5B;;;;"}
1
+ {"version":3,"file":"grammar.esm.js","sources":["../../src/utils/grammar.ts"],"sourcesContent":["/*\n * Copyright 2020 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\nconst vowels = {\n a: 'A',\n e: 'E',\n i: 'I',\n o: 'O',\n u: 'U',\n};\n\nexport const indefiniteArticleOf = (\n articles: [string, string],\n word: string,\n) => {\n const firstChar = word.charAt(0).toLocaleLowerCase('en-US');\n return firstChar in vowels\n ? `${articles[1]} ${word}`\n : `${articles[0]} ${word}`;\n};\n"],"names":[],"mappings":"AAgBA,MAAM,MAAA,GAAS;AAAA,EACb,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG,GAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAEO,MAAM,mBAAA,GAAsB,CACjC,QAAA,EACA,IAAA,KACG;AACH,EAAA,MAAM,YAAY,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,kBAAkB,OAAO,CAAA;AAC1D,EAAA,OAAO,SAAA,IAAa,MAAA,GAChB,CAAA,EAAG,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GACtB,CAAA,EAAG,QAAA,CAAS,CAAC,CAAC,IAAI,IAAI,CAAA,CAAA;AAC5B;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { DataKey } from '../types/Alert.esm.js';
2
- import { lengthyCurrencyFormatter, currencyFormatter, dateFormatter } from './formatters.esm.js';
2
+ import { dateFormatter, lengthyCurrencyFormatter, currencyFormatter } from './formatters.esm.js';
3
3
 
4
4
  const formatGraphValue = (baseCurrency) => (value, _index, format) => {
5
5
  if (format === "number") {
@@ -1 +1 @@
1
- {"version":3,"file":"graphs.esm.js","sources":["../../src/utils/graphs.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { TooltipProps } from 'recharts';\nimport { Payload } from 'recharts/types/component/DefaultTooltipContent';\nimport { AlertCost, DataKey, ResourceData } from '../types';\nimport { Entity } from '@backstage-community/plugin-cost-insights-common';\nimport {\n currencyFormatter,\n dateFormatter,\n lengthyCurrencyFormatter,\n} from './formatters';\n\nexport const formatGraphValue =\n (baseCurrency: Intl.NumberFormat) =>\n (value: number, _index: number, format?: string) => {\n if (format === 'number') {\n return value.toLocaleString();\n }\n\n if (value < 1) {\n return lengthyCurrencyFormatter(baseCurrency).format(value);\n }\n\n return currencyFormatter(baseCurrency).format(value);\n };\n\nexport const overviewGraphTickFormatter = (millis: string | number) =>\n typeof millis === 'number' ? dateFormatter.format(millis) : millis;\n\nexport const tooltipItemOf =\n (baseCurrency: Intl.NumberFormat) => (payload: Payload<string, string>) => {\n const value =\n payload.value && !isNaN(Number(payload.value))\n ? baseCurrency.format(Number(payload.value))\n : payload.value;\n const fill = payload.color as string;\n\n switch (payload.dataKey) {\n case DataKey.Current:\n case DataKey.Previous:\n return {\n label: payload.name,\n value: value,\n fill: fill,\n };\n default:\n return null;\n }\n };\n\nexport const resourceOf = (entity: Entity | AlertCost): ResourceData => ({\n name: entity.id,\n previous: entity.aggregation[0],\n current: entity.aggregation[1],\n});\n\nexport const titleOf = (label?: string | number) => {\n return label ? String(label) : 'Unlabeled';\n};\n\nexport const isInvalid = ({ label, payload }: TooltipProps<string, string>) => {\n // null labels are empty strings, which are valid\n return label === undefined || !payload || !payload.length;\n};\n\nexport const isLabeled = (data?: Record<'activeLabel', string | undefined>) => {\n return data?.activeLabel && data?.activeLabel !== '';\n};\n\nexport const isUnlabeled = (\n data?: Record<'activeLabel', string | undefined>,\n) => {\n return data?.activeLabel === '';\n};\n"],"names":[],"mappings":";;;AA0BO,MAAM,mBACX,CAAC,YAAA,KACD,CAAC,KAAA,EAAe,QAAgB,MAAoB,KAAA;AAClD,EAAA,IAAI,WAAW,QAAU,EAAA;AACvB,IAAA,OAAO,MAAM,cAAe,EAAA;AAAA;AAG9B,EAAA,IAAI,QAAQ,CAAG,EAAA;AACb,IAAA,OAAO,wBAAyB,CAAA,YAAY,CAAE,CAAA,MAAA,CAAO,KAAK,CAAA;AAAA;AAG5D,EAAA,OAAO,iBAAkB,CAAA,YAAY,CAAE,CAAA,MAAA,CAAO,KAAK,CAAA;AACrD;AAEW,MAAA,0BAAA,GAA6B,CAAC,MACzC,KAAA,OAAO,WAAW,QAAW,GAAA,aAAA,CAAc,MAAO,CAAA,MAAM,CAAI,GAAA;AAEvD,MAAM,aACX,GAAA,CAAC,YAAoC,KAAA,CAAC,OAAqC,KAAA;AACzE,EAAA,MAAM,QACJ,OAAQ,CAAA,KAAA,IAAS,CAAC,KAAA,CAAM,OAAO,OAAQ,CAAA,KAAK,CAAC,CAAA,GACzC,aAAa,MAAO,CAAA,MAAA,CAAO,QAAQ,KAAK,CAAC,IACzC,OAAQ,CAAA,KAAA;AACd,EAAA,MAAM,OAAO,OAAQ,CAAA,KAAA;AAErB,EAAA,QAAQ,QAAQ,OAAS;AAAA,IACvB,KAAK,OAAQ,CAAA,OAAA;AAAA,IACb,KAAK,OAAQ,CAAA,QAAA;AACX,MAAO,OAAA;AAAA,QACL,OAAO,OAAQ,CAAA,IAAA;AAAA,QACf,KAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACE,MAAO,OAAA,IAAA;AAAA;AAEb;AAEW,MAAA,UAAA,GAAa,CAAC,MAA8C,MAAA;AAAA,EACvE,MAAM,MAAO,CAAA,EAAA;AAAA,EACb,QAAA,EAAU,MAAO,CAAA,WAAA,CAAY,CAAC,CAAA;AAAA,EAC9B,OAAA,EAAS,MAAO,CAAA,WAAA,CAAY,CAAC;AAC/B,CAAA;AAEa,MAAA,OAAA,GAAU,CAAC,KAA4B,KAAA;AAClD,EAAO,OAAA,KAAA,GAAQ,MAAO,CAAA,KAAK,CAAI,GAAA,WAAA;AACjC;AAEO,MAAM,SAAY,GAAA,CAAC,EAAE,KAAA,EAAO,SAA4C,KAAA;AAE7E,EAAA,OAAO,KAAU,KAAA,KAAA,CAAA,IAAa,CAAC,OAAA,IAAW,CAAC,OAAQ,CAAA,MAAA;AACrD;AAEa,MAAA,SAAA,GAAY,CAAC,IAAqD,KAAA;AAC7E,EAAO,OAAA,IAAA,EAAM,WAAe,IAAA,IAAA,EAAM,WAAgB,KAAA,EAAA;AACpD;AAEa,MAAA,WAAA,GAAc,CACzB,IACG,KAAA;AACH,EAAA,OAAO,MAAM,WAAgB,KAAA,EAAA;AAC/B;;;;"}
1
+ {"version":3,"file":"graphs.esm.js","sources":["../../src/utils/graphs.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { TooltipProps } from 'recharts';\nimport { Payload } from 'recharts/types/component/DefaultTooltipContent';\nimport { AlertCost, DataKey, ResourceData } from '../types';\nimport { Entity } from '@backstage-community/plugin-cost-insights-common';\nimport {\n currencyFormatter,\n dateFormatter,\n lengthyCurrencyFormatter,\n} from './formatters';\n\nexport const formatGraphValue =\n (baseCurrency: Intl.NumberFormat) =>\n (value: number, _index: number, format?: string) => {\n if (format === 'number') {\n return value.toLocaleString();\n }\n\n if (value < 1) {\n return lengthyCurrencyFormatter(baseCurrency).format(value);\n }\n\n return currencyFormatter(baseCurrency).format(value);\n };\n\nexport const overviewGraphTickFormatter = (millis: string | number) =>\n typeof millis === 'number' ? dateFormatter.format(millis) : millis;\n\nexport const tooltipItemOf =\n (baseCurrency: Intl.NumberFormat) => (payload: Payload<string, string>) => {\n const value =\n payload.value && !isNaN(Number(payload.value))\n ? baseCurrency.format(Number(payload.value))\n : payload.value;\n const fill = payload.color as string;\n\n switch (payload.dataKey) {\n case DataKey.Current:\n case DataKey.Previous:\n return {\n label: payload.name,\n value: value,\n fill: fill,\n };\n default:\n return null;\n }\n };\n\nexport const resourceOf = (entity: Entity | AlertCost): ResourceData => ({\n name: entity.id,\n previous: entity.aggregation[0],\n current: entity.aggregation[1],\n});\n\nexport const titleOf = (label?: string | number) => {\n return label ? String(label) : 'Unlabeled';\n};\n\nexport const isInvalid = ({ label, payload }: TooltipProps<string, string>) => {\n // null labels are empty strings, which are valid\n return label === undefined || !payload || !payload.length;\n};\n\nexport const isLabeled = (data?: Record<'activeLabel', string | undefined>) => {\n return data?.activeLabel && data?.activeLabel !== '';\n};\n\nexport const isUnlabeled = (\n data?: Record<'activeLabel', string | undefined>,\n) => {\n return data?.activeLabel === '';\n};\n"],"names":[],"mappings":";;;AA0BO,MAAM,mBACX,CAAC,YAAA,KACD,CAAC,KAAA,EAAe,QAAgB,MAAA,KAAoB;AAClD,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,OAAO,MAAM,cAAA,EAAe;AAAA,EAC9B;AAEA,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,wBAAA,CAAyB,YAAY,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,iBAAA,CAAkB,YAAY,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACrD;AAEK,MAAM,0BAAA,GAA6B,CAAC,MAAA,KACzC,OAAO,WAAW,QAAA,GAAW,aAAA,CAAc,MAAA,CAAO,MAAM,CAAA,GAAI;AAEvD,MAAM,aAAA,GACX,CAAC,YAAA,KAAoC,CAAC,OAAA,KAAqC;AACzE,EAAA,MAAM,QACJ,OAAA,CAAQ,KAAA,IAAS,CAAC,KAAA,CAAM,OAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,GACzC,aAAa,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAK,CAAC,IACzC,OAAA,CAAQ,KAAA;AACd,EAAA,MAAM,OAAO,OAAA,CAAQ,KAAA;AAErB,EAAA,QAAQ,QAAQ,OAAA;AAAS,IACvB,KAAK,OAAA,CAAQ,OAAA;AAAA,IACb,KAAK,OAAA,CAAQ,QAAA;AACX,MAAA,OAAO;AAAA,QACL,OAAO,OAAA,CAAQ,IAAA;AAAA,QACf,KAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAEK,MAAM,UAAA,GAAa,CAAC,MAAA,MAA8C;AAAA,EACvE,MAAM,MAAA,CAAO,EAAA;AAAA,EACb,QAAA,EAAU,MAAA,CAAO,WAAA,CAAY,CAAC,CAAA;AAAA,EAC9B,OAAA,EAAS,MAAA,CAAO,WAAA,CAAY,CAAC;AAC/B,CAAA;AAEO,MAAM,OAAA,GAAU,CAAC,KAAA,KAA4B;AAClD,EAAA,OAAO,KAAA,GAAQ,MAAA,CAAO,KAAK,CAAA,GAAI,WAAA;AACjC;AAEO,MAAM,SAAA,GAAY,CAAC,EAAE,KAAA,EAAO,SAAQ,KAAoC;AAE7E,EAAA,OAAO,KAAA,KAAU,MAAA,IAAa,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,MAAA;AACrD;AAEO,MAAM,SAAA,GAAY,CAAC,IAAA,KAAqD;AAC7E,EAAA,OAAO,IAAA,EAAM,WAAA,IAAe,IAAA,EAAM,WAAA,KAAgB,EAAA;AACpD;AAEO,MAAM,WAAA,GAAc,CACzB,IAAA,KACG;AACH,EAAA,OAAO,MAAM,WAAA,KAAgB,EAAA;AAC/B;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"history.esm.js","sources":["../../src/utils/history.ts"],"sourcesContent":["/*\n * Copyright 2020 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 qs from 'qs';\nimport * as yup from 'yup';\nimport { Duration, PageFilters } from '../types';\nimport { Group } from '@backstage-community/plugin-cost-insights-common';\nimport { getDefaultPageFilters } from '../utils/filters';\nimport { ConfigContextProps } from '../hooks/useConfig';\n\nconst schema = yup\n .object()\n .shape({\n group: yup.string().nullable(),\n project: yup.string().nullable(),\n })\n .required();\n\nexport const stringify = (queryParams: Partial<PageFilters>) =>\n qs.stringify(queryParams, { strictNullHandling: true });\n\nexport const parse = (queryString: string): Partial<PageFilters> =>\n qs.parse(queryString, { ignoreQueryPrefix: true, strictNullHandling: true });\n\nexport const validate = (queryString: string): Promise<PageFilters> => {\n return schema.validate(parse(queryString), {\n stripUnknown: true,\n strict: true,\n }) as Promise<PageFilters>;\n};\n\nexport const getInitialPageState = (\n groups: Group[],\n queryParams: Partial<PageFilters> = {},\n) => {\n return {\n ...getDefaultPageFilters(groups),\n ...(queryParams.project ? { project: queryParams.project } : {}),\n ...(queryParams.group ? { group: queryParams.group } : {}),\n };\n};\n\nexport const getInitialProductState = (config: ConfigContextProps) =>\n config.products.map(product => ({\n productType: product.kind,\n duration: Duration.P30D,\n }));\n"],"names":[],"mappings":";;;;;;AAuBA,MAAM,MAAS,GAAA,GAAA,CACZ,MAAO,EAAA,CACP,KAAM,CAAA;AAAA,EACL,KAAO,EAAA,GAAA,CAAI,MAAO,EAAA,CAAE,QAAS,EAAA;AAAA,EAC7B,OAAS,EAAA,GAAA,CAAI,MAAO,EAAA,CAAE,QAAS;AACjC,CAAC,EACA,QAAS,EAAA;AAEC,MAAA,SAAA,GAAY,CAAC,WACxB,KAAA,EAAA,CAAG,UAAU,WAAa,EAAA,EAAE,kBAAoB,EAAA,IAAA,EAAM;AAE3C,MAAA,KAAA,GAAQ,CAAC,WAAA,KACpB,EAAG,CAAA,KAAA,CAAM,WAAa,EAAA,EAAE,iBAAmB,EAAA,IAAA,EAAM,kBAAoB,EAAA,IAAA,EAAM;AAEhE,MAAA,QAAA,GAAW,CAAC,WAA8C,KAAA;AACrE,EAAA,OAAO,MAAO,CAAA,QAAA,CAAS,KAAM,CAAA,WAAW,CAAG,EAAA;AAAA,IACzC,YAAc,EAAA,IAAA;AAAA,IACd,MAAQ,EAAA;AAAA,GACT,CAAA;AACH;AAEO,MAAM,mBAAsB,GAAA,CACjC,MACA,EAAA,WAAA,GAAoC,EACjC,KAAA;AACH,EAAO,OAAA;AAAA,IACL,GAAG,sBAAsB,MAAM,CAAA;AAAA,IAC/B,GAAI,YAAY,OAAU,GAAA,EAAE,SAAS,WAAY,CAAA,OAAA,KAAY,EAAC;AAAA,IAC9D,GAAI,YAAY,KAAQ,GAAA,EAAE,OAAO,WAAY,CAAA,KAAA,KAAU;AAAC,GAC1D;AACF;AAEO,MAAM,yBAAyB,CAAC,MAAA,KACrC,MAAO,CAAA,QAAA,CAAS,IAAI,CAAY,OAAA,MAAA;AAAA,EAC9B,aAAa,OAAQ,CAAA,IAAA;AAAA,EACrB,UAAU,QAAS,CAAA;AACrB,CAAE,CAAA;;;;"}
1
+ {"version":3,"file":"history.esm.js","sources":["../../src/utils/history.ts"],"sourcesContent":["/*\n * Copyright 2020 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 qs from 'qs';\nimport * as yup from 'yup';\nimport { Duration, PageFilters } from '../types';\nimport { Group } from '@backstage-community/plugin-cost-insights-common';\nimport { getDefaultPageFilters } from '../utils/filters';\nimport { ConfigContextProps } from '../hooks/useConfig';\n\nconst schema = yup\n .object()\n .shape({\n group: yup.string().nullable(),\n project: yup.string().nullable(),\n })\n .required();\n\nexport const stringify = (queryParams: Partial<PageFilters>) =>\n qs.stringify(queryParams, { strictNullHandling: true });\n\nexport const parse = (queryString: string): Partial<PageFilters> =>\n qs.parse(queryString, { ignoreQueryPrefix: true, strictNullHandling: true });\n\nexport const validate = (queryString: string): Promise<PageFilters> => {\n return schema.validate(parse(queryString), {\n stripUnknown: true,\n strict: true,\n }) as Promise<PageFilters>;\n};\n\nexport const getInitialPageState = (\n groups: Group[],\n queryParams: Partial<PageFilters> = {},\n) => {\n return {\n ...getDefaultPageFilters(groups),\n ...(queryParams.project ? { project: queryParams.project } : {}),\n ...(queryParams.group ? { group: queryParams.group } : {}),\n };\n};\n\nexport const getInitialProductState = (config: ConfigContextProps) =>\n config.products.map(product => ({\n productType: product.kind,\n duration: Duration.P30D,\n }));\n"],"names":[],"mappings":";;;;;;AAuBA,MAAM,MAAA,GAAS,GAAA,CACZ,MAAA,EAAO,CACP,KAAA,CAAM;AAAA,EACL,KAAA,EAAO,GAAA,CAAI,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,OAAA,EAAS,GAAA,CAAI,MAAA,EAAO,CAAE,QAAA;AACxB,CAAC,EACA,QAAA,EAAS;AAEL,MAAM,SAAA,GAAY,CAAC,WAAA,KACxB,EAAA,CAAG,UAAU,WAAA,EAAa,EAAE,kBAAA,EAAoB,IAAA,EAAM;AAEjD,MAAM,KAAA,GAAQ,CAAC,WAAA,KACpB,EAAA,CAAG,KAAA,CAAM,WAAA,EAAa,EAAE,iBAAA,EAAmB,IAAA,EAAM,kBAAA,EAAoB,IAAA,EAAM;AAEtE,MAAM,QAAA,GAAW,CAAC,WAAA,KAA8C;AACrE,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,WAAW,CAAA,EAAG;AAAA,IACzC,YAAA,EAAc,IAAA;AAAA,IACd,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAEO,MAAM,mBAAA,GAAsB,CACjC,MAAA,EACA,WAAA,GAAoC,EAAC,KAClC;AACH,EAAA,OAAO;AAAA,IACL,GAAG,sBAAsB,MAAM,CAAA;AAAA,IAC/B,GAAI,YAAY,OAAA,GAAU,EAAE,SAAS,WAAA,CAAY,OAAA,KAAY,EAAC;AAAA,IAC9D,GAAI,YAAY,KAAA,GAAQ,EAAE,OAAO,WAAA,CAAY,KAAA,KAAU;AAAC,GAC1D;AACF;AAEO,MAAM,yBAAyB,CAAC,MAAA,KACrC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,OAAA,MAAY;AAAA,EAC9B,aAAa,OAAA,CAAQ,IAAA;AAAA,EACrB,UAAU,QAAA,CAAS;AACrB,CAAA,CAAE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"loading.esm.js","sources":["../../src/utils/loading.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { Duration, Loading } from '../types';\nimport {\n Entity,\n Maybe,\n Product,\n} from '@backstage-community/plugin-cost-insights-common';\nimport { DEFAULT_DURATION } from './duration';\n\nexport type ProductState = {\n product: Product;\n entity: Maybe<Entity>;\n duration: Duration;\n};\n\nexport enum DefaultLoadingAction {\n UserGroups = 'user-groups',\n LastCompleteBillingDate = 'billing-date',\n CostInsightsInitial = 'cost-insights-initial',\n CostInsightsPage = 'cost-insights-page',\n CostInsightsProducts = 'cost-insights-products',\n CostInsightsAlerts = 'cost-insights-alerts',\n}\n\nexport const INITIAL_LOADING_ACTIONS = [\n DefaultLoadingAction.UserGroups,\n DefaultLoadingAction.CostInsightsInitial,\n DefaultLoadingAction.CostInsightsProducts,\n];\n\nexport const getDefaultState = (loadingActions: string[]): Loading => {\n return loadingActions.reduce(\n (defaultState, action) => ({ ...defaultState, [action]: true }),\n {},\n );\n};\n\nexport const getResetState = (loadingActions: string[]): Loading => {\n return loadingActions.reduce(\n (defaultState, action) => ({ ...defaultState, [action]: false }),\n {},\n );\n};\n\nexport const getResetStateWithoutInitial = (\n loadingActions: string[],\n): Loading => {\n return loadingActions.reduce((defaultState, action) => {\n const loadingActionState = (INITIAL_LOADING_ACTIONS as string[]).includes(\n action,\n )\n ? false\n : true;\n return { ...defaultState, [action]: loadingActionState };\n }, {});\n};\n\nexport const settledResponseOf = (\n responses: PromiseSettledResult<Entity | any>[],\n): Array<Maybe<Entity>> => {\n return responses.map(response =>\n response.status === 'fulfilled' ? response.value : null,\n );\n};\n\nexport const initialStatesOf = (\n products: Product[],\n responses: Array<Maybe<Entity>>,\n): ProductState[] => {\n return products.map((product, index) => ({\n entity: responses[index],\n product: product,\n duration: DEFAULT_DURATION,\n }));\n};\n"],"names":["DefaultLoadingAction"],"mappings":";;AA8BY,IAAA,oBAAA,qBAAAA,qBAAL,KAAA;AACL,EAAAA,sBAAA,YAAa,CAAA,GAAA,aAAA;AACb,EAAAA,sBAAA,yBAA0B,CAAA,GAAA,cAAA;AAC1B,EAAAA,sBAAA,qBAAsB,CAAA,GAAA,uBAAA;AACtB,EAAAA,sBAAA,kBAAmB,CAAA,GAAA,oBAAA;AACnB,EAAAA,sBAAA,sBAAuB,CAAA,GAAA,wBAAA;AACvB,EAAAA,sBAAA,oBAAqB,CAAA,GAAA,sBAAA;AANX,EAAAA,OAAAA,qBAAAA;AAAA,CAAA,EAAA,oBAAA,IAAA,EAAA;AASL,MAAM,uBAA0B,GAAA;AAAA,EACrC,aAAA;AAAA,EACA,uBAAA;AAAA,EACA,wBAAA;AACF;AAEa,MAAA,eAAA,GAAkB,CAAC,cAAsC,KAAA;AACpE,EAAA,OAAO,cAAe,CAAA,MAAA;AAAA,IACpB,CAAC,cAAc,MAAY,MAAA,EAAE,GAAG,YAAc,EAAA,CAAC,MAAM,GAAG,IAAK,EAAA,CAAA;AAAA,IAC7D;AAAC,GACH;AACF;AAEa,MAAA,aAAA,GAAgB,CAAC,cAAsC,KAAA;AAClE,EAAA,OAAO,cAAe,CAAA,MAAA;AAAA,IACpB,CAAC,cAAc,MAAY,MAAA,EAAE,GAAG,YAAc,EAAA,CAAC,MAAM,GAAG,KAAM,EAAA,CAAA;AAAA,IAC9D;AAAC,GACH;AACF;AAEa,MAAA,2BAAA,GAA8B,CACzC,cACY,KAAA;AACZ,EAAA,OAAO,cAAe,CAAA,MAAA,CAAO,CAAC,YAAA,EAAc,MAAW,KAAA;AACrD,IAAA,MAAM,qBAAsB,uBAAqC,CAAA,QAAA;AAAA,MAC/D;AAAA,QAEE,KACA,GAAA,IAAA;AACJ,IAAA,OAAO,EAAE,GAAG,YAAA,EAAc,CAAC,MAAM,GAAG,kBAAmB,EAAA;AAAA,GACzD,EAAG,EAAE,CAAA;AACP;AAEa,MAAA,iBAAA,GAAoB,CAC/B,SACyB,KAAA;AACzB,EAAA,OAAO,SAAU,CAAA,GAAA;AAAA,IAAI,CACnB,QAAA,KAAA,QAAA,CAAS,MAAW,KAAA,WAAA,GAAc,SAAS,KAAQ,GAAA;AAAA,GACrD;AACF;AAEa,MAAA,eAAA,GAAkB,CAC7B,QAAA,EACA,SACmB,KAAA;AACnB,EAAA,OAAO,QAAS,CAAA,GAAA,CAAI,CAAC,OAAA,EAAS,KAAW,MAAA;AAAA,IACvC,MAAA,EAAQ,UAAU,KAAK,CAAA;AAAA,IACvB,OAAA;AAAA,IACA,QAAU,EAAA;AAAA,GACV,CAAA,CAAA;AACJ;;;;"}
1
+ {"version":3,"file":"loading.esm.js","sources":["../../src/utils/loading.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { Duration, Loading } from '../types';\nimport {\n Entity,\n Maybe,\n Product,\n} from '@backstage-community/plugin-cost-insights-common';\nimport { DEFAULT_DURATION } from './duration';\n\nexport type ProductState = {\n product: Product;\n entity: Maybe<Entity>;\n duration: Duration;\n};\n\nexport enum DefaultLoadingAction {\n UserGroups = 'user-groups',\n LastCompleteBillingDate = 'billing-date',\n CostInsightsInitial = 'cost-insights-initial',\n CostInsightsPage = 'cost-insights-page',\n CostInsightsProducts = 'cost-insights-products',\n CostInsightsAlerts = 'cost-insights-alerts',\n}\n\nexport const INITIAL_LOADING_ACTIONS = [\n DefaultLoadingAction.UserGroups,\n DefaultLoadingAction.CostInsightsInitial,\n DefaultLoadingAction.CostInsightsProducts,\n];\n\nexport const getDefaultState = (loadingActions: string[]): Loading => {\n return loadingActions.reduce(\n (defaultState, action) => ({ ...defaultState, [action]: true }),\n {},\n );\n};\n\nexport const getResetState = (loadingActions: string[]): Loading => {\n return loadingActions.reduce(\n (defaultState, action) => ({ ...defaultState, [action]: false }),\n {},\n );\n};\n\nexport const getResetStateWithoutInitial = (\n loadingActions: string[],\n): Loading => {\n return loadingActions.reduce((defaultState, action) => {\n const loadingActionState = (INITIAL_LOADING_ACTIONS as string[]).includes(\n action,\n )\n ? false\n : true;\n return { ...defaultState, [action]: loadingActionState };\n }, {});\n};\n\nexport const settledResponseOf = (\n responses: PromiseSettledResult<Entity | any>[],\n): Array<Maybe<Entity>> => {\n return responses.map(response =>\n response.status === 'fulfilled' ? response.value : null,\n );\n};\n\nexport const initialStatesOf = (\n products: Product[],\n responses: Array<Maybe<Entity>>,\n): ProductState[] => {\n return products.map((product, index) => ({\n entity: responses[index],\n product: product,\n duration: DEFAULT_DURATION,\n }));\n};\n"],"names":["DefaultLoadingAction"],"mappings":";;AA8BO,IAAK,oBAAA,qBAAAA,qBAAAA,KAAL;AACL,EAAAA,sBAAA,YAAA,CAAA,GAAa,aAAA;AACb,EAAAA,sBAAA,yBAAA,CAAA,GAA0B,cAAA;AAC1B,EAAAA,sBAAA,qBAAA,CAAA,GAAsB,uBAAA;AACtB,EAAAA,sBAAA,kBAAA,CAAA,GAAmB,oBAAA;AACnB,EAAAA,sBAAA,sBAAA,CAAA,GAAuB,wBAAA;AACvB,EAAAA,sBAAA,oBAAA,CAAA,GAAqB,sBAAA;AANX,EAAA,OAAAA,qBAAAA;AAAA,CAAA,EAAA,oBAAA,IAAA,EAAA;AASL,MAAM,uBAAA,GAA0B;AAAA,EACrC,aAAA;AAAA,EACA,uBAAA;AAAA,EACA,wBAAA;AACF;AAEO,MAAM,eAAA,GAAkB,CAAC,cAAA,KAAsC;AACpE,EAAA,OAAO,cAAA,CAAe,MAAA;AAAA,IACpB,CAAC,cAAc,MAAA,MAAY,EAAE,GAAG,YAAA,EAAc,CAAC,MAAM,GAAG,IAAA,EAAK,CAAA;AAAA,IAC7D;AAAC,GACH;AACF;AAEO,MAAM,aAAA,GAAgB,CAAC,cAAA,KAAsC;AAClE,EAAA,OAAO,cAAA,CAAe,MAAA;AAAA,IACpB,CAAC,cAAc,MAAA,MAAY,EAAE,GAAG,YAAA,EAAc,CAAC,MAAM,GAAG,KAAA,EAAM,CAAA;AAAA,IAC9D;AAAC,GACH;AACF;AAEO,MAAM,2BAAA,GAA8B,CACzC,cAAA,KACY;AACZ,EAAA,OAAO,cAAA,CAAe,MAAA,CAAO,CAAC,YAAA,EAAc,MAAA,KAAW;AACrD,IAAA,MAAM,qBAAsB,uBAAA,CAAqC,QAAA;AAAA,MAC/D;AAAA,QAEE,KAAA,GACA,IAAA;AACJ,IAAA,OAAO,EAAE,GAAG,YAAA,EAAc,CAAC,MAAM,GAAG,kBAAA,EAAmB;AAAA,EACzD,CAAA,EAAG,EAAE,CAAA;AACP;AAEO,MAAM,iBAAA,GAAoB,CAC/B,SAAA,KACyB;AACzB,EAAA,OAAO,SAAA,CAAU,GAAA;AAAA,IAAI,CAAA,QAAA,KACnB,QAAA,CAAS,MAAA,KAAW,WAAA,GAAc,SAAS,KAAA,GAAQ;AAAA,GACrD;AACF;AAEO,MAAM,eAAA,GAAkB,CAC7B,QAAA,EACA,SAAA,KACmB;AACnB,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,MAAW;AAAA,IACvC,MAAA,EAAQ,UAAU,KAAK,CAAA;AAAA,IACvB,OAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ,CAAE,CAAA;AACJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"navigation.esm.js","sources":["../../src/utils/navigation.tsx"],"sourcesContent":["/*\n * Copyright 2020 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 MoneyIcon from '@material-ui/icons/MonetizationOn';\nimport ActionIcon from '@material-ui/icons/Whatshot';\nimport Settings from '@material-ui/icons/Settings';\nimport AccountTree from '@material-ui/icons/AccountTree';\nimport Storage from '@material-ui/icons/Storage';\nimport Search from '@material-ui/icons/Search';\nimport CloudQueue from '@material-ui/icons/CloudQueue';\nimport School from '@material-ui/icons/School';\nimport ViewHeadline from '@material-ui/icons/ViewHeadline';\nimport { IconType } from '../types';\n\nexport enum DefaultNavigation {\n CostOverviewCard = 'cost-overview-card',\n AlertInsightsHeader = 'alert-insights-header',\n}\n\nexport type NavigationItem = {\n navigation: string;\n icon: JSX.Element;\n title: string;\n};\n\nexport const getDefaultNavigationItems = (alerts: number): NavigationItem[] => {\n const items = [\n {\n navigation: DefaultNavigation.CostOverviewCard,\n icon: <MoneyIcon />,\n title: 'Cost Overview',\n },\n ];\n if (alerts > 0) {\n items.push({\n navigation: DefaultNavigation.AlertInsightsHeader,\n icon: <ActionIcon />,\n title: 'Action Items',\n });\n }\n return items;\n};\n\nexport function getIcon(icon?: string): JSX.Element {\n switch (icon) {\n case IconType.Compute:\n return <Settings />;\n case IconType.Data:\n return <AccountTree />;\n case IconType.Database:\n return <ViewHeadline />;\n case IconType.Storage:\n return <Storage />;\n case IconType.Search:\n return <Search />;\n case IconType.ML:\n return <School />;\n default:\n return <CloudQueue />;\n }\n}\n"],"names":["DefaultNavigation"],"mappings":";;;;;;;;;;;;;AA0BY,IAAA,iBAAA,qBAAAA,kBAAL,KAAA;AACL,EAAAA,mBAAA,kBAAmB,CAAA,GAAA,oBAAA;AACnB,EAAAA,mBAAA,qBAAsB,CAAA,GAAA,uBAAA;AAFZ,EAAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AAWC,MAAA,yBAAA,GAA4B,CAAC,MAAqC,KAAA;AAC7E,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ;AAAA,MACE,UAAY,EAAA,oBAAA;AAAA,MACZ,IAAA,sBAAO,SAAU,EAAA,EAAA,CAAA;AAAA,MACjB,KAAO,EAAA;AAAA;AACT,GACF;AACA,EAAA,IAAI,SAAS,CAAG,EAAA;AACd,IAAA,KAAA,CAAM,IAAK,CAAA;AAAA,MACT,UAAY,EAAA,uBAAA;AAAA,MACZ,IAAA,sBAAO,UAAW,EAAA,EAAA,CAAA;AAAA,MAClB,KAAO,EAAA;AAAA,KACR,CAAA;AAAA;AAEH,EAAO,OAAA,KAAA;AACT;AAEO,SAAS,QAAQ,IAA4B,EAAA;AAClD,EAAA,QAAQ,IAAM;AAAA,IACZ,KAAK,QAAS,CAAA,OAAA;AACZ,MAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA,IACnB,KAAK,QAAS,CAAA,IAAA;AACZ,MAAA,2BAAQ,WAAY,EAAA,EAAA,CAAA;AAAA,IACtB,KAAK,QAAS,CAAA,QAAA;AACZ,MAAA,2BAAQ,YAAa,EAAA,EAAA,CAAA;AAAA,IACvB,KAAK,QAAS,CAAA,OAAA;AACZ,MAAA,2BAAQ,OAAQ,EAAA,EAAA,CAAA;AAAA,IAClB,KAAK,QAAS,CAAA,MAAA;AACZ,MAAA,2BAAQ,MAAO,EAAA,EAAA,CAAA;AAAA,IACjB,KAAK,QAAS,CAAA,EAAA;AACZ,MAAA,2BAAQ,MAAO,EAAA,EAAA,CAAA;AAAA,IACjB;AACE,MAAA,2BAAQ,UAAW,EAAA,EAAA,CAAA;AAAA;AAEzB;;;;"}
1
+ {"version":3,"file":"navigation.esm.js","sources":["../../src/utils/navigation.tsx"],"sourcesContent":["/*\n * Copyright 2020 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 MoneyIcon from '@material-ui/icons/MonetizationOn';\nimport ActionIcon from '@material-ui/icons/Whatshot';\nimport Settings from '@material-ui/icons/Settings';\nimport AccountTree from '@material-ui/icons/AccountTree';\nimport Storage from '@material-ui/icons/Storage';\nimport Search from '@material-ui/icons/Search';\nimport CloudQueue from '@material-ui/icons/CloudQueue';\nimport School from '@material-ui/icons/School';\nimport ViewHeadline from '@material-ui/icons/ViewHeadline';\nimport { IconType } from '../types';\n\nexport enum DefaultNavigation {\n CostOverviewCard = 'cost-overview-card',\n AlertInsightsHeader = 'alert-insights-header',\n}\n\nexport type NavigationItem = {\n navigation: string;\n icon: JSX.Element;\n title: string;\n};\n\nexport const getDefaultNavigationItems = (alerts: number): NavigationItem[] => {\n const items = [\n {\n navigation: DefaultNavigation.CostOverviewCard,\n icon: <MoneyIcon />,\n title: 'Cost Overview',\n },\n ];\n if (alerts > 0) {\n items.push({\n navigation: DefaultNavigation.AlertInsightsHeader,\n icon: <ActionIcon />,\n title: 'Action Items',\n });\n }\n return items;\n};\n\nexport function getIcon(icon?: string): JSX.Element {\n switch (icon) {\n case IconType.Compute:\n return <Settings />;\n case IconType.Data:\n return <AccountTree />;\n case IconType.Database:\n return <ViewHeadline />;\n case IconType.Storage:\n return <Storage />;\n case IconType.Search:\n return <Search />;\n case IconType.ML:\n return <School />;\n default:\n return <CloudQueue />;\n }\n}\n"],"names":["DefaultNavigation"],"mappings":";;;;;;;;;;;;;AA0BO,IAAK,iBAAA,qBAAAA,kBAAAA,KAAL;AACL,EAAAA,mBAAA,kBAAA,CAAA,GAAmB,oBAAA;AACnB,EAAAA,mBAAA,qBAAA,CAAA,GAAsB,uBAAA;AAFZ,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AAWL,MAAM,yBAAA,GAA4B,CAAC,MAAA,KAAqC;AAC7E,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ;AAAA,MACE,UAAA,EAAY,oBAAA;AAAA,MACZ,IAAA,sBAAO,SAAA,EAAA,EAAU,CAAA;AAAA,MACjB,KAAA,EAAO;AAAA;AACT,GACF;AACA,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,UAAA,EAAY,uBAAA;AAAA,MACZ,IAAA,sBAAO,UAAA,EAAA,EAAW,CAAA;AAAA,MAClB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,QAAQ,IAAA,EAA4B;AAClD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,QAAA,CAAS,OAAA;AACZ,MAAA,2BAAQ,QAAA,EAAA,EAAS,CAAA;AAAA,IACnB,KAAK,QAAA,CAAS,IAAA;AACZ,MAAA,2BAAQ,WAAA,EAAA,EAAY,CAAA;AAAA,IACtB,KAAK,QAAA,CAAS,QAAA;AACZ,MAAA,2BAAQ,YAAA,EAAA,EAAa,CAAA;AAAA,IACvB,KAAK,QAAA,CAAS,OAAA;AACZ,MAAA,2BAAQ,OAAA,EAAA,EAAQ,CAAA;AAAA,IAClB,KAAK,QAAA,CAAS,MAAA;AACZ,MAAA,2BAAQ,MAAA,EAAA,EAAO,CAAA;AAAA,IACjB,KAAK,QAAA,CAAS,EAAA;AACZ,MAAA,2BAAQ,MAAA,EAAA,EAAO,CAAA;AAAA,IACjB;AACE,MAAA,2BAAQ,UAAA,EAAA,EAAW,CAAA;AAAA;AAEzB;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"scroll.esm.js","sources":["../../src/utils/scroll.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useEffect, useRef } from 'react';\nimport { ScrollTo, useScroll } from '../hooks/useScroll';\n\n/*\n Utility component use in conjunction with useScroll that allows scrollable components to control behavior and offset.\n 1. ScrollAnchor must be a direct child of a scrollable component.\n 2. ScrollAnchor's parent position must be relative. \n 3. ScrollAnchor's id must be unique.\n*/\n\nexport interface ScrollAnchorProps extends ScrollIntoViewOptions {\n id: ScrollTo;\n top?: number;\n left?: number;\n}\n\nexport const ScrollAnchor = ({\n id,\n left = 0,\n top = -20,\n block = 'start',\n inline = 'nearest',\n behavior = 'smooth',\n}: ScrollAnchorProps) => {\n const divRef = useRef<HTMLDivElement>(null);\n const [scroll, setScroll] = useScroll();\n\n useEffect(() => {\n function scrollIntoView() {\n if (divRef.current && scroll === id) {\n divRef.current.scrollIntoView({\n block,\n inline,\n behavior,\n });\n setScroll(null);\n }\n }\n\n scrollIntoView();\n }, [scroll, setScroll, id, behavior, block, inline]);\n\n return (\n <div\n ref={divRef}\n style={{ position: 'absolute', height: 0, width: 0, top, left }}\n data-testid={`scroll-test-${id}`}\n />\n );\n};\n"],"names":[],"mappings":";;;;AA+BO,MAAM,eAAe,CAAC;AAAA,EAC3B,EAAA;AAAA,EACA,IAAO,GAAA,CAAA;AAAA,EACP,GAAM,GAAA,CAAA,EAAA;AAAA,EACN,KAAQ,GAAA,OAAA;AAAA,EACR,MAAS,GAAA,SAAA;AAAA,EACT,QAAW,GAAA;AACb,CAAyB,KAAA;AACvB,EAAM,MAAA,MAAA,GAAS,OAAuB,IAAI,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAU,EAAA;AAEtC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAS,cAAiB,GAAA;AACxB,MAAI,IAAA,MAAA,CAAO,OAAW,IAAA,MAAA,KAAW,EAAI,EAAA;AACnC,QAAA,MAAA,CAAO,QAAQ,cAAe,CAAA;AAAA,UAC5B,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,SAAA,CAAU,IAAI,CAAA;AAAA;AAChB;AAGF,IAAe,cAAA,EAAA;AAAA,GACjB,EAAG,CAAC,MAAQ,EAAA,SAAA,EAAW,IAAI,QAAU,EAAA,KAAA,EAAO,MAAM,CAAC,CAAA;AAEnD,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAK,EAAA,MAAA;AAAA,MACL,KAAA,EAAO,EAAE,QAAU,EAAA,UAAA,EAAY,QAAQ,CAAG,EAAA,KAAA,EAAO,CAAG,EAAA,GAAA,EAAK,IAAK,EAAA;AAAA,MAC9D,aAAA,EAAa,eAAe,EAAE,CAAA;AAAA;AAAA,GAChC;AAEJ;;;;"}
1
+ {"version":3,"file":"scroll.esm.js","sources":["../../src/utils/scroll.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useEffect, useRef } from 'react';\nimport { ScrollTo, useScroll } from '../hooks/useScroll';\n\n/*\n Utility component use in conjunction with useScroll that allows scrollable components to control behavior and offset.\n 1. ScrollAnchor must be a direct child of a scrollable component.\n 2. ScrollAnchor's parent position must be relative. \n 3. ScrollAnchor's id must be unique.\n*/\n\nexport interface ScrollAnchorProps extends ScrollIntoViewOptions {\n id: ScrollTo;\n top?: number;\n left?: number;\n}\n\nexport const ScrollAnchor = ({\n id,\n left = 0,\n top = -20,\n block = 'start',\n inline = 'nearest',\n behavior = 'smooth',\n}: ScrollAnchorProps) => {\n const divRef = useRef<HTMLDivElement>(null);\n const [scroll, setScroll] = useScroll();\n\n useEffect(() => {\n function scrollIntoView() {\n if (divRef.current && scroll === id) {\n divRef.current.scrollIntoView({\n block,\n inline,\n behavior,\n });\n setScroll(null);\n }\n }\n\n scrollIntoView();\n }, [scroll, setScroll, id, behavior, block, inline]);\n\n return (\n <div\n ref={divRef}\n style={{ position: 'absolute', height: 0, width: 0, top, left }}\n data-testid={`scroll-test-${id}`}\n />\n );\n};\n"],"names":[],"mappings":";;;;AA+BO,MAAM,eAAe,CAAC;AAAA,EAC3B,EAAA;AAAA,EACA,IAAA,GAAO,CAAA;AAAA,EACP,GAAA,GAAM,GAAA;AAAA,EACN,KAAA,GAAQ,OAAA;AAAA,EACR,MAAA,GAAS,SAAA;AAAA,EACT,QAAA,GAAW;AACb,CAAA,KAAyB;AACvB,EAAA,MAAM,MAAA,GAAS,OAAuB,IAAI,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAA,EAAU;AAEtC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAS,cAAA,GAAiB;AACxB,MAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,KAAW,EAAA,EAAI;AACnC,QAAA,MAAA,CAAO,QAAQ,cAAA,CAAe;AAAA,UAC5B,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,cAAA,EAAe;AAAA,EACjB,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAA,EAAW,IAAI,QAAA,EAAU,KAAA,EAAO,MAAM,CAAC,CAAA;AAEnD,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,QAAQ,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,IAAA,EAAK;AAAA,MAC9D,aAAA,EAAa,eAAe,EAAE,CAAA;AAAA;AAAA,GAChC;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"sort.esm.js","sources":["../../src/utils/sort.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { ResourceData } from '../types';\nimport { DateAggregation } from '@backstage-community/plugin-cost-insights-common';\nimport { ProductState } from './loading';\n\nexport const aggregationSort = (\n a: DateAggregation,\n b: DateAggregation,\n): number => a.date.localeCompare(b.date);\n\nexport const resourceSort = (a: ResourceData, b: ResourceData) =>\n b.previous + b.current - (a.previous + a.current);\n\nexport function totalAggregationSort(a: ProductState, b: ProductState): number {\n const [prevA, currA] = a.entity?.aggregation ?? [0, 0];\n const [prevB, currB] = b.entity?.aggregation ?? [0, 0];\n return prevB + currB - (prevA + currA);\n}\n"],"names":[],"mappings":"AAmBa,MAAA,eAAA,GAAkB,CAC7B,CACA,EAAA,CAAA,KACW,EAAE,IAAK,CAAA,aAAA,CAAc,EAAE,IAAI;AAE3B,MAAA,YAAA,GAAe,CAAC,CAAA,EAAiB,CAC5C,KAAA,CAAA,CAAE,WAAW,CAAE,CAAA,OAAA,IAAW,CAAE,CAAA,QAAA,GAAW,CAAE,CAAA,OAAA;AAE3B,SAAA,oBAAA,CAAqB,GAAiB,CAAyB,EAAA;AAC7E,EAAM,MAAA,CAAC,OAAO,KAAK,CAAA,GAAI,EAAE,MAAQ,EAAA,WAAA,IAAe,CAAC,CAAA,EAAG,CAAC,CAAA;AACrD,EAAM,MAAA,CAAC,OAAO,KAAK,CAAA,GAAI,EAAE,MAAQ,EAAA,WAAA,IAAe,CAAC,CAAA,EAAG,CAAC,CAAA;AACrD,EAAO,OAAA,KAAA,GAAQ,SAAS,KAAQ,GAAA,KAAA,CAAA;AAClC;;;;"}
1
+ {"version":3,"file":"sort.esm.js","sources":["../../src/utils/sort.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { ResourceData } from '../types';\nimport { DateAggregation } from '@backstage-community/plugin-cost-insights-common';\nimport { ProductState } from './loading';\n\nexport const aggregationSort = (\n a: DateAggregation,\n b: DateAggregation,\n): number => a.date.localeCompare(b.date);\n\nexport const resourceSort = (a: ResourceData, b: ResourceData) =>\n b.previous + b.current - (a.previous + a.current);\n\nexport function totalAggregationSort(a: ProductState, b: ProductState): number {\n const [prevA, currA] = a.entity?.aggregation ?? [0, 0];\n const [prevB, currB] = b.entity?.aggregation ?? [0, 0];\n return prevB + currB - (prevA + currA);\n}\n"],"names":[],"mappings":"AAmBO,MAAM,eAAA,GAAkB,CAC7B,CAAA,EACA,CAAA,KACW,EAAE,IAAA,CAAK,aAAA,CAAc,EAAE,IAAI;AAEjC,MAAM,YAAA,GAAe,CAAC,CAAA,EAAiB,CAAA,KAC5C,CAAA,CAAE,WAAW,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,OAAA;AAEpC,SAAS,oBAAA,CAAqB,GAAiB,CAAA,EAAyB;AAC7E,EAAA,MAAM,CAAC,OAAO,KAAK,CAAA,GAAI,EAAE,MAAA,EAAQ,WAAA,IAAe,CAAC,CAAA,EAAG,CAAC,CAAA;AACrD,EAAA,MAAM,CAAC,OAAO,KAAK,CAAA,GAAI,EAAE,MAAA,EAAQ,WAAA,IAAe,CAAC,CAAA,EAAG,CAAC,CAAA;AACrD,EAAA,OAAO,KAAA,GAAQ,SAAS,KAAA,GAAQ,KAAA,CAAA;AAClC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"styles.esm.js","sources":["../../src/utils/styles.ts"],"sourcesContent":["/*\n * Copyright 2020 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 emphasize,\n lighten,\n darken,\n getLuminance,\n} from '@material-ui/core/styles/colorManipulator';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport { CostInsightsTheme, CostInsightsThemeOptions } from '../types';\n\nexport const costInsightsLightTheme = {\n palette: {\n blue: '#509AF5',\n lightBlue: '#9BF0E1',\n darkBlue: '#4101F5',\n magenta: '#DC148C',\n yellow: '#FFC864',\n tooltip: {\n background: '#171717',\n color: '#DDD',\n },\n navigationText: '#b5b5b5',\n alertBackground: 'rgba(219, 219, 219, 0.13)',\n dataViz: [\n '#509BF5',\n '#4B917D',\n '#FF6437',\n '#F573A0',\n '#F59B23',\n '#B49BC8',\n '#C39687',\n '#A0C3D2',\n '#FFC864',\n '#BABABA',\n ],\n },\n} as CostInsightsThemeOptions;\n\n// Higher tonal values from light theme (Google recommends 600 -> 200)\n// https://material.io/design/color/the-color-system.html#tools-for-picking-colors\nexport const costInsightsDarkTheme = {\n palette: {\n blue: '#77b8f9',\n lightBlue: '#d8f9f4',\n darkBlue: '#b595fd',\n magenta: '#ee93cd',\n yellow: '#fff2da',\n tooltip: {\n background: '#EEE',\n color: '#424242',\n },\n navigationText: '#b5b5b5',\n alertBackground: 'rgba(32, 32, 32, 0.13)',\n dataViz: [\n '#8accff',\n '#7bc2ac',\n '#ff9664',\n '#ffa5d1',\n '#ffcc57',\n '#e6ccfb',\n '#f7c7b7',\n '#d2f6ff',\n '#fffb94',\n '#ececec',\n ],\n },\n} as CostInsightsThemeOptions;\n\n// The opposite of Material UI's emphasize function - darken darks, lighten lights\nexport function brighten(color: string, coefficient = 0.2) {\n return getLuminance(color) > 0.5\n ? lighten(color, coefficient)\n : darken(color, coefficient);\n}\n\nexport const useCostOverviewStyles = (theme: CostInsightsTheme) => ({\n axis: {\n fill: theme.palette.text.primary,\n },\n container: {\n height: 450,\n width: 1200,\n },\n cartesianGrid: {\n stroke: theme.palette.textVerySubtle,\n },\n chart: {\n margin: {\n right: 30,\n top: 16,\n },\n },\n yAxis: {\n width: 75,\n },\n});\n\nexport const useOverviewTabsStyles = makeStyles<CostInsightsTheme>(\n (theme: CostInsightsTheme) => ({\n default: {\n padding: theme.spacing(2),\n fontWeight: theme.typography.fontWeightBold,\n color: theme.palette.text.secondary,\n textTransform: 'uppercase',\n },\n selected: {\n color: theme.palette.text.primary,\n },\n }),\n);\n\nexport const useBarChartStyles = (theme: CostInsightsTheme) => ({\n axis: {\n fill: theme.palette.text.primary,\n },\n barChart: {\n margin: {\n left: 16,\n right: 16,\n },\n },\n cartesianGrid: {\n stroke: theme.palette.textVerySubtle,\n },\n cursor: {\n fill: theme.palette.textVerySubtle,\n fillOpacity: 0.3,\n },\n container: {\n height: 400,\n width: 1200,\n },\n infoIcon: {\n marginLeft: 2,\n fontSize: '1.25em',\n },\n xAxis: {\n height: 50,\n },\n});\n\nexport const useBarChartLayoutStyles = makeStyles(theme =>\n createStyles({\n wrapper: {\n display: 'flex',\n flexDirection: 'column',\n },\n legend: {\n paddingBottom: theme.spacing(2),\n },\n }),\n);\n\nexport const useBarChartStepperButtonStyles = makeStyles<CostInsightsTheme>(\n (theme: CostInsightsTheme) =>\n createStyles({\n root: {\n ...theme.typography.button,\n boxSizing: 'border-box',\n transition: theme.transitions.create(\n ['background-color', 'box-shadow', 'border'],\n {\n duration: theme.transitions.duration.short,\n },\n ),\n borderRadius: '50%',\n padding: 0,\n width: 40,\n height: 40,\n boxShadow: theme.shadows[6],\n '&:active': {\n boxShadow: theme.shadows[12],\n },\n color: theme.palette.text.primary,\n backgroundColor: lighten(theme.palette.background.default, 0.1),\n '&:hover': {\n backgroundColor: lighten(theme.palette.background.default, 0.2),\n textDecoration: 'none',\n },\n },\n }),\n);\n\nexport const useBarChartLabelStyles = makeStyles(theme =>\n createStyles({\n foreignObject: {\n textAlign: 'center',\n },\n label: {\n fontWeight: theme.typography.fontWeightBold,\n display: 'block',\n textDecoration: 'none',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n infoIcon: {\n marginLeft: 2,\n fontSize: '1.25em',\n },\n button: {\n textTransform: 'none',\n fontWeight: theme.typography.fontWeightBold,\n fontSize: theme.typography.fontSize,\n },\n }),\n);\n\nexport const useCostInsightsStyles = makeStyles(theme => ({\n h6Subtle: {\n ...theme.typography.h6,\n fontWeight: 'normal',\n color: theme.palette.textSubtle,\n },\n}));\n\nexport const useCostInsightsTabsStyles = makeStyles<Theme>(theme => ({\n tabs: {\n borderBottom: `1px solid ${theme.palette.textVerySubtle}`,\n backgroundColor: brighten(theme.palette.background.default),\n padding: theme.spacing(0, 4),\n },\n tab: {\n minHeight: 68,\n minWidth: 180,\n padding: theme.spacing(1, 4),\n '&:hover': {\n color: 'inherit',\n backgroundColor: 'inherit',\n },\n },\n indicator: {\n backgroundColor: theme.palette.navigation.indicator,\n height: 4,\n },\n tabLabel: {\n display: 'flex',\n alignItems: 'center',\n },\n tabLabelText: {\n fontSize: theme.typography.fontSize,\n fontWeight: theme.typography.fontWeightBold,\n },\n menuItem: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n minWidth: 180,\n padding: theme.spacing(2, 2),\n },\n menuItemSelected: {\n backgroundColor: lighten(theme.palette.background.default, 0.3),\n },\n}));\n\nexport const useAlertCardActionHeaderStyles = makeStyles(theme =>\n createStyles({\n root: {\n paddingBottom: theme.spacing(2),\n borderRadius: 'unset',\n },\n title: {\n fontSize: theme.typography.fontSize,\n fontWeight: theme.typography.fontWeightBold,\n lineHeight: 1.5,\n },\n action: {\n margin: 0,\n },\n }),\n);\n\nexport const useCostGrowthStyles = makeStyles(theme =>\n createStyles({\n excess: {\n color: theme.palette.status.error,\n },\n savings: {\n color: theme.palette.status.ok,\n },\n indicator: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n },\n }),\n);\n\nexport const useCostGrowthLegendStyles = makeStyles(theme => ({\n h5: {\n ...theme.typography.h5,\n fontWeight: 500,\n padding: 0,\n },\n marker: {\n display: 'inherit',\n marginRight: theme.spacing(1),\n },\n helpIcon: {\n display: 'inherit',\n },\n title: {\n ...theme.typography.overline,\n fontWeight: 500,\n lineHeight: 0,\n marginRight: theme.spacing(1),\n color: theme.palette.textSubtle,\n },\n tooltip: {\n display: 'block',\n padding: theme.spacing(1),\n backgroundColor: theme.palette.navigation.background,\n },\n tooltipText: {\n color: theme.palette.background.default,\n fontSize: theme.typography.fontSize,\n lineHeight: 1.5,\n },\n}));\n\nexport const useBarChartStepperStyles = makeStyles(theme =>\n createStyles({\n paper: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-around',\n alignItems: 'center',\n background: 'transparent',\n padding: 8,\n },\n step: {\n backgroundColor: theme.palette.action.disabled,\n borderRadius: '50%',\n width: 9,\n height: 9,\n margin: '0 2px',\n },\n stepActive: {\n backgroundColor: theme.palette.primary.main,\n },\n steps: {\n display: 'flex',\n flexDirection: 'row',\n },\n backButton: {\n position: 'absolute',\n left: 0,\n top: 'calc(50% - 60px)',\n zIndex: 100,\n },\n nextButton: {\n position: 'absolute',\n right: 0,\n top: 'calc(50% - 60px)',\n zIndex: 100,\n },\n }),\n);\n\nexport const useNavigationStyles = makeStyles<CostInsightsTheme>(\n (theme: CostInsightsTheme) =>\n createStyles({\n menuList: {\n borderRadius: theme.shape.borderRadius,\n backgroundColor: theme.palette.navigation.background,\n minWidth: 250,\n },\n menuItem: {\n background: 'transparent',\n border: 0,\n textTransform: 'none',\n width: '100%',\n minHeight: theme.spacing(6),\n margin: theme.spacing(0.5, 2, 0.5, 0),\n },\n listItemIcon: {\n minWidth: 40,\n },\n navigationIcon: {\n fill: theme.palette.navigationText,\n },\n title: {\n whiteSpace: 'nowrap',\n lineHeight: 1,\n color: theme.palette.navigationText,\n fontWeight: theme.typography.fontWeightBold,\n },\n }),\n);\n\nexport const useTooltipStyles = makeStyles<CostInsightsTheme>(\n (theme: CostInsightsTheme) =>\n createStyles({\n tooltip: {\n backgroundColor: theme.palette.tooltip.background,\n borderRadius: theme.shape.borderRadius,\n boxShadow: theme.shadows[1],\n color: theme.palette.tooltip.color,\n fontSize: theme.typography.fontSize,\n minWidth: 300,\n },\n maxWidth: {\n maxWidth: 300,\n },\n actions: {\n padding: theme.spacing(2),\n },\n header: {\n padding: theme.spacing(2),\n },\n content: {\n padding: theme.spacing(2),\n },\n lensIcon: {\n fontSize: `.75rem`,\n },\n divider: {\n backgroundColor: emphasize(theme.palette.divider, 1),\n },\n truncate: {\n maxWidth: 200,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n subtitle: {\n fontStyle: 'italic',\n },\n }),\n);\n\nexport const useAlertInsightsSectionStyles = makeStyles(theme =>\n createStyles({\n button: {\n backgroundColor: theme.palette.textVerySubtle,\n color: theme.palette.text.primary,\n },\n }),\n);\n\nexport const useSelectStyles = makeStyles(theme =>\n createStyles({\n select: {\n minWidth: 200,\n textAlign: 'start',\n backgroundColor: theme.palette.background.paper,\n },\n menuItem: {\n minWidth: 200,\n padding: theme.spacing(2),\n '&.compact': {\n padding: theme.spacing(1, 2),\n },\n },\n }),\n);\n\nexport const useActionItemCardStyles = makeStyles<CostInsightsTheme>(\n (theme: CostInsightsTheme) =>\n createStyles({\n card: {\n boxShadow: 'none',\n },\n avatar: {\n backgroundColor: theme.palette.textVerySubtle,\n color: theme.palette.text.primary,\n },\n root: {\n minHeight: 80,\n paddingBottom: theme.spacing(2),\n borderRadius: theme.shape.borderRadius,\n },\n activeRoot: {\n cursor: 'pointer',\n transition: theme.transitions.create('background', {\n duration: theme.transitions.duration.short,\n }),\n '&:hover': {\n background: theme.palette.alertBackground,\n },\n },\n action: {\n margin: 0,\n },\n title: {\n fontSize: theme.typography.fontSize,\n fontWeight: theme.typography.fontWeightBold,\n },\n }),\n);\n\nexport const useProductInsightsCardStyles = makeStyles(theme =>\n createStyles({\n root: {\n padding: theme.spacing(2, 2, 2, 2.5), // restore backstage default padding\n },\n action: {\n margin: 0, // unset negative margins\n },\n }),\n);\n\nexport const useProductInsightsChartStyles = makeStyles(theme =>\n createStyles({\n indicator: {\n fontWeight: theme.typography.fontWeightBold,\n fontSize: '1.25rem',\n },\n actions: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n }),\n);\n\nexport const useBackdropStyles = makeStyles(theme =>\n createStyles({\n root: {\n zIndex: theme.zIndex.modal,\n },\n }),\n);\n\nexport const useSubtleTypographyStyles = makeStyles(theme =>\n createStyles({\n root: {\n color: theme.palette.textSubtle,\n },\n }),\n);\n\nexport const useEntityDialogStyles = makeStyles(theme =>\n createStyles({\n dialogContent: {\n padding: 0,\n },\n dialogTitle: {\n padding: 0,\n },\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n zIndex: 100,\n },\n row: {\n fontSize: theme.typography.fontSize * 1.25,\n },\n rowTotal: {\n fontWeight: theme.typography.fontWeightBold,\n },\n colFirst: {\n paddingLeft: theme.spacing(2),\n },\n colLast: {\n paddingRight: theme.spacing(2),\n },\n column: {\n fontWeight: theme.typography.fontWeightBold,\n },\n growth: {\n display: 'flex',\n flexDirection: 'row',\n alignContent: 'center',\n justifyContent: 'flex-end',\n },\n }),\n);\n\nexport const useAlertDialogStyles = makeStyles(theme =>\n createStyles({\n content: {\n padding: theme.spacing(0, 5, 2, 5),\n },\n actions: {\n padding: theme.spacing(2, 5),\n },\n radio: {\n margin: theme.spacing(-0.5, 0, -0.5, 0),\n },\n icon: {\n color: theme.palette.primary.dark,\n margin: theme.spacing(2.5, 2.5, 0, 0),\n padding: 0,\n },\n }),\n);\n\nexport const useAlertStatusSummaryButtonStyles = makeStyles(() => ({\n icon: {\n transform: 'transform 5s',\n },\n clicked: {\n transform: 'rotate(180deg)',\n },\n}));\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"styles.esm.js","sources":["../../src/utils/styles.ts"],"sourcesContent":["/*\n * Copyright 2020 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 emphasize,\n lighten,\n darken,\n getLuminance,\n} from '@material-ui/core/styles/colorManipulator';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport { CostInsightsTheme, CostInsightsThemeOptions } from '../types';\n\nexport const costInsightsLightTheme = {\n palette: {\n blue: '#509AF5',\n lightBlue: '#9BF0E1',\n darkBlue: '#4101F5',\n magenta: '#DC148C',\n yellow: '#FFC864',\n tooltip: {\n background: '#171717',\n color: '#DDD',\n },\n navigationText: '#b5b5b5',\n alertBackground: 'rgba(219, 219, 219, 0.13)',\n dataViz: [\n '#509BF5',\n '#4B917D',\n '#FF6437',\n '#F573A0',\n '#F59B23',\n '#B49BC8',\n '#C39687',\n '#A0C3D2',\n '#FFC864',\n '#BABABA',\n ],\n },\n} as CostInsightsThemeOptions;\n\n// Higher tonal values from light theme (Google recommends 600 -> 200)\n// https://material.io/design/color/the-color-system.html#tools-for-picking-colors\nexport const costInsightsDarkTheme = {\n palette: {\n blue: '#77b8f9',\n lightBlue: '#d8f9f4',\n darkBlue: '#b595fd',\n magenta: '#ee93cd',\n yellow: '#fff2da',\n tooltip: {\n background: '#EEE',\n color: '#424242',\n },\n navigationText: '#b5b5b5',\n alertBackground: 'rgba(32, 32, 32, 0.13)',\n dataViz: [\n '#8accff',\n '#7bc2ac',\n '#ff9664',\n '#ffa5d1',\n '#ffcc57',\n '#e6ccfb',\n '#f7c7b7',\n '#d2f6ff',\n '#fffb94',\n '#ececec',\n ],\n },\n} as CostInsightsThemeOptions;\n\n// The opposite of Material UI's emphasize function - darken darks, lighten lights\nexport function brighten(color: string, coefficient = 0.2) {\n return getLuminance(color) > 0.5\n ? lighten(color, coefficient)\n : darken(color, coefficient);\n}\n\nexport const useCostOverviewStyles = (theme: CostInsightsTheme) => ({\n axis: {\n fill: theme.palette.text.primary,\n },\n container: {\n height: 450,\n width: 1200,\n },\n cartesianGrid: {\n stroke: theme.palette.textVerySubtle,\n },\n chart: {\n margin: {\n right: 30,\n top: 16,\n },\n },\n yAxis: {\n width: 75,\n },\n});\n\nexport const useOverviewTabsStyles = makeStyles<CostInsightsTheme>(\n (theme: CostInsightsTheme) => ({\n default: {\n padding: theme.spacing(2),\n fontWeight: theme.typography.fontWeightBold,\n color: theme.palette.text.secondary,\n textTransform: 'uppercase',\n },\n selected: {\n color: theme.palette.text.primary,\n },\n }),\n);\n\nexport const useBarChartStyles = (theme: CostInsightsTheme) => ({\n axis: {\n fill: theme.palette.text.primary,\n },\n barChart: {\n margin: {\n left: 16,\n right: 16,\n },\n },\n cartesianGrid: {\n stroke: theme.palette.textVerySubtle,\n },\n cursor: {\n fill: theme.palette.textVerySubtle,\n fillOpacity: 0.3,\n },\n container: {\n height: 400,\n width: 1200,\n },\n infoIcon: {\n marginLeft: 2,\n fontSize: '1.25em',\n },\n xAxis: {\n height: 50,\n },\n});\n\nexport const useBarChartLayoutStyles = makeStyles(theme =>\n createStyles({\n wrapper: {\n display: 'flex',\n flexDirection: 'column',\n },\n legend: {\n paddingBottom: theme.spacing(2),\n },\n }),\n);\n\nexport const useBarChartStepperButtonStyles = makeStyles<CostInsightsTheme>(\n (theme: CostInsightsTheme) =>\n createStyles({\n root: {\n ...theme.typography.button,\n boxSizing: 'border-box',\n transition: theme.transitions.create(\n ['background-color', 'box-shadow', 'border'],\n {\n duration: theme.transitions.duration.short,\n },\n ),\n borderRadius: '50%',\n padding: 0,\n width: 40,\n height: 40,\n boxShadow: theme.shadows[6],\n '&:active': {\n boxShadow: theme.shadows[12],\n },\n color: theme.palette.text.primary,\n backgroundColor: lighten(theme.palette.background.default, 0.1),\n '&:hover': {\n backgroundColor: lighten(theme.palette.background.default, 0.2),\n textDecoration: 'none',\n },\n },\n }),\n);\n\nexport const useBarChartLabelStyles = makeStyles(theme =>\n createStyles({\n foreignObject: {\n textAlign: 'center',\n },\n label: {\n fontWeight: theme.typography.fontWeightBold,\n display: 'block',\n textDecoration: 'none',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n infoIcon: {\n marginLeft: 2,\n fontSize: '1.25em',\n },\n button: {\n textTransform: 'none',\n fontWeight: theme.typography.fontWeightBold,\n fontSize: theme.typography.fontSize,\n },\n }),\n);\n\nexport const useCostInsightsStyles = makeStyles(theme => ({\n h6Subtle: {\n ...theme.typography.h6,\n fontWeight: 'normal',\n color: theme.palette.textSubtle,\n },\n}));\n\nexport const useCostInsightsTabsStyles = makeStyles<Theme>(theme => ({\n tabs: {\n borderBottom: `1px solid ${theme.palette.textVerySubtle}`,\n backgroundColor: brighten(theme.palette.background.default),\n padding: theme.spacing(0, 4),\n },\n tab: {\n minHeight: 68,\n minWidth: 180,\n padding: theme.spacing(1, 4),\n '&:hover': {\n color: 'inherit',\n backgroundColor: 'inherit',\n },\n },\n indicator: {\n backgroundColor: theme.palette.navigation.indicator,\n height: 4,\n },\n tabLabel: {\n display: 'flex',\n alignItems: 'center',\n },\n tabLabelText: {\n fontSize: theme.typography.fontSize,\n fontWeight: theme.typography.fontWeightBold,\n },\n menuItem: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n minWidth: 180,\n padding: theme.spacing(2, 2),\n },\n menuItemSelected: {\n backgroundColor: lighten(theme.palette.background.default, 0.3),\n },\n}));\n\nexport const useAlertCardActionHeaderStyles = makeStyles(theme =>\n createStyles({\n root: {\n paddingBottom: theme.spacing(2),\n borderRadius: 'unset',\n },\n title: {\n fontSize: theme.typography.fontSize,\n fontWeight: theme.typography.fontWeightBold,\n lineHeight: 1.5,\n },\n action: {\n margin: 0,\n },\n }),\n);\n\nexport const useCostGrowthStyles = makeStyles(theme =>\n createStyles({\n excess: {\n color: theme.palette.status.error,\n },\n savings: {\n color: theme.palette.status.ok,\n },\n indicator: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n },\n }),\n);\n\nexport const useCostGrowthLegendStyles = makeStyles(theme => ({\n h5: {\n ...theme.typography.h5,\n fontWeight: 500,\n padding: 0,\n },\n marker: {\n display: 'inherit',\n marginRight: theme.spacing(1),\n },\n helpIcon: {\n display: 'inherit',\n },\n title: {\n ...theme.typography.overline,\n fontWeight: 500,\n lineHeight: 0,\n marginRight: theme.spacing(1),\n color: theme.palette.textSubtle,\n },\n tooltip: {\n display: 'block',\n padding: theme.spacing(1),\n backgroundColor: theme.palette.navigation.background,\n },\n tooltipText: {\n color: theme.palette.background.default,\n fontSize: theme.typography.fontSize,\n lineHeight: 1.5,\n },\n}));\n\nexport const useBarChartStepperStyles = makeStyles(theme =>\n createStyles({\n paper: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'space-around',\n alignItems: 'center',\n background: 'transparent',\n padding: 8,\n },\n step: {\n backgroundColor: theme.palette.action.disabled,\n borderRadius: '50%',\n width: 9,\n height: 9,\n margin: '0 2px',\n },\n stepActive: {\n backgroundColor: theme.palette.primary.main,\n },\n steps: {\n display: 'flex',\n flexDirection: 'row',\n },\n backButton: {\n position: 'absolute',\n left: 0,\n top: 'calc(50% - 60px)',\n zIndex: 100,\n },\n nextButton: {\n position: 'absolute',\n right: 0,\n top: 'calc(50% - 60px)',\n zIndex: 100,\n },\n }),\n);\n\nexport const useNavigationStyles = makeStyles<CostInsightsTheme>(\n (theme: CostInsightsTheme) =>\n createStyles({\n menuList: {\n borderRadius: theme.shape.borderRadius,\n backgroundColor: theme.palette.navigation.background,\n minWidth: 250,\n },\n menuItem: {\n background: 'transparent',\n border: 0,\n textTransform: 'none',\n width: '100%',\n minHeight: theme.spacing(6),\n margin: theme.spacing(0.5, 2, 0.5, 0),\n },\n listItemIcon: {\n minWidth: 40,\n },\n navigationIcon: {\n fill: theme.palette.navigationText,\n },\n title: {\n whiteSpace: 'nowrap',\n lineHeight: 1,\n color: theme.palette.navigationText,\n fontWeight: theme.typography.fontWeightBold,\n },\n }),\n);\n\nexport const useTooltipStyles = makeStyles<CostInsightsTheme>(\n (theme: CostInsightsTheme) =>\n createStyles({\n tooltip: {\n backgroundColor: theme.palette.tooltip.background,\n borderRadius: theme.shape.borderRadius,\n boxShadow: theme.shadows[1],\n color: theme.palette.tooltip.color,\n fontSize: theme.typography.fontSize,\n minWidth: 300,\n },\n maxWidth: {\n maxWidth: 300,\n },\n actions: {\n padding: theme.spacing(2),\n },\n header: {\n padding: theme.spacing(2),\n },\n content: {\n padding: theme.spacing(2),\n },\n lensIcon: {\n fontSize: `.75rem`,\n },\n divider: {\n backgroundColor: emphasize(theme.palette.divider, 1),\n },\n truncate: {\n maxWidth: 200,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n subtitle: {\n fontStyle: 'italic',\n },\n }),\n);\n\nexport const useAlertInsightsSectionStyles = makeStyles(theme =>\n createStyles({\n button: {\n backgroundColor: theme.palette.textVerySubtle,\n color: theme.palette.text.primary,\n },\n }),\n);\n\nexport const useSelectStyles = makeStyles(theme =>\n createStyles({\n select: {\n minWidth: 200,\n textAlign: 'start',\n backgroundColor: theme.palette.background.paper,\n },\n menuItem: {\n minWidth: 200,\n padding: theme.spacing(2),\n '&.compact': {\n padding: theme.spacing(1, 2),\n },\n },\n }),\n);\n\nexport const useActionItemCardStyles = makeStyles<CostInsightsTheme>(\n (theme: CostInsightsTheme) =>\n createStyles({\n card: {\n boxShadow: 'none',\n },\n avatar: {\n backgroundColor: theme.palette.textVerySubtle,\n color: theme.palette.text.primary,\n },\n root: {\n minHeight: 80,\n paddingBottom: theme.spacing(2),\n borderRadius: theme.shape.borderRadius,\n },\n activeRoot: {\n cursor: 'pointer',\n transition: theme.transitions.create('background', {\n duration: theme.transitions.duration.short,\n }),\n '&:hover': {\n background: theme.palette.alertBackground,\n },\n },\n action: {\n margin: 0,\n },\n title: {\n fontSize: theme.typography.fontSize,\n fontWeight: theme.typography.fontWeightBold,\n },\n }),\n);\n\nexport const useProductInsightsCardStyles = makeStyles(theme =>\n createStyles({\n root: {\n padding: theme.spacing(2, 2, 2, 2.5), // restore backstage default padding\n },\n action: {\n margin: 0, // unset negative margins\n },\n }),\n);\n\nexport const useProductInsightsChartStyles = makeStyles(theme =>\n createStyles({\n indicator: {\n fontWeight: theme.typography.fontWeightBold,\n fontSize: '1.25rem',\n },\n actions: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n }),\n);\n\nexport const useBackdropStyles = makeStyles(theme =>\n createStyles({\n root: {\n zIndex: theme.zIndex.modal,\n },\n }),\n);\n\nexport const useSubtleTypographyStyles = makeStyles(theme =>\n createStyles({\n root: {\n color: theme.palette.textSubtle,\n },\n }),\n);\n\nexport const useEntityDialogStyles = makeStyles(theme =>\n createStyles({\n dialogContent: {\n padding: 0,\n },\n dialogTitle: {\n padding: 0,\n },\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n zIndex: 100,\n },\n row: {\n fontSize: theme.typography.fontSize * 1.25,\n },\n rowTotal: {\n fontWeight: theme.typography.fontWeightBold,\n },\n colFirst: {\n paddingLeft: theme.spacing(2),\n },\n colLast: {\n paddingRight: theme.spacing(2),\n },\n column: {\n fontWeight: theme.typography.fontWeightBold,\n },\n growth: {\n display: 'flex',\n flexDirection: 'row',\n alignContent: 'center',\n justifyContent: 'flex-end',\n },\n }),\n);\n\nexport const useAlertDialogStyles = makeStyles(theme =>\n createStyles({\n content: {\n padding: theme.spacing(0, 5, 2, 5),\n },\n actions: {\n padding: theme.spacing(2, 5),\n },\n radio: {\n margin: theme.spacing(-0.5, 0, -0.5, 0),\n },\n icon: {\n color: theme.palette.primary.dark,\n margin: theme.spacing(2.5, 2.5, 0, 0),\n padding: 0,\n },\n }),\n);\n\nexport const useAlertStatusSummaryButtonStyles = makeStyles(() => ({\n icon: {\n transform: 'transform 5s',\n },\n clicked: {\n transform: 'rotate(180deg)',\n },\n}));\n"],"names":[],"mappings":";;;AAyBO,MAAM,sBAAA,GAAyB;AAAA,EACpC,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,QAAA,EAAU,SAAA;AAAA,IACV,OAAA,EAAS,SAAA;AAAA,IACT,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,UAAA,EAAY,SAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACT;AAAA,IACA,cAAA,EAAgB,SAAA;AAAA,IAChB,eAAA,EAAiB,2BAAA;AAAA,IACjB,OAAA,EAAS;AAAA,MACP,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AACF;AAEJ;AAIO,MAAM,qBAAA,GAAwB;AAAA,EACnC,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,QAAA,EAAU,SAAA;AAAA,IACV,OAAA,EAAS,SAAA;AAAA,IACT,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,UAAA,EAAY,MAAA;AAAA,MACZ,KAAA,EAAO;AAAA,KACT;AAAA,IACA,cAAA,EAAgB,SAAA;AAAA,IAChB,eAAA,EAAiB,wBAAA;AAAA,IACjB,OAAA,EAAS;AAAA,MACP,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AACF;AAEJ;AAGO,SAAS,QAAA,CAAS,KAAA,EAAe,WAAA,GAAc,GAAA,EAAK;AACzD,EAAA,OAAO,YAAA,CAAa,KAAK,CAAA,GAAI,GAAA,GACzB,OAAA,CAAQ,OAAO,WAAW,CAAA,GAC1B,MAAA,CAAO,KAAA,EAAO,WAAW,CAAA;AAC/B;AAEO,MAAM,qBAAA,GAAwB,CAAC,KAAA,MAA8B;AAAA,EAClE,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,GAC3B;AAAA,EACA,SAAA,EAAW;AAAA,IACT,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO;AAAA,GACT;AAAA,EACA,aAAA,EAAe;AAAA,IACb,MAAA,EAAQ,MAAM,OAAA,CAAQ;AAAA,GACxB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,EAAA;AAAA,MACP,GAAA,EAAK;AAAA;AACP,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAO;AAAA;AAEX,CAAA;AAEO,MAAM,qBAAA,GAAwB,UAAA;AAAA,EACnC,CAAC,KAAA,MAA8B;AAAA,IAC7B,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MACxB,UAAA,EAAY,MAAM,UAAA,CAAW,cAAA;AAAA,MAC7B,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,SAAA;AAAA,MAC1B,aAAA,EAAe;AAAA,KACjB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAAA;AAC5B,GACF;AACF;AAEO,MAAM,iBAAA,GAAoB,CAAC,KAAA,MAA8B;AAAA,EAC9D,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,GAC3B;AAAA,EACA,QAAA,EAAU;AAAA,IACR,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,EAAA;AAAA,MACN,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,aAAA,EAAe;AAAA,IACb,MAAA,EAAQ,MAAM,OAAA,CAAQ;AAAA,GACxB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,MAAM,OAAA,CAAQ,cAAA;AAAA,IACpB,WAAA,EAAa;AAAA,GACf;AAAA,EACA,SAAA,EAAW;AAAA,IACT,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO;AAAA,GACT;AAAA,EACA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY,CAAA;AAAA,IACZ,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ;AAAA;AAEZ,CAAA;AAEO,MAAM,uBAAA,GAA0B,UAAA;AAAA,EAAW,WAChD,YAAA,CAAa;AAAA,IACX,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe;AAAA,KACjB;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA;AAChC,GACD;AACH;AAEO,MAAM,8BAAA,GAAiC,UAAA;AAAA,EAC5C,CAAC,UACC,YAAA,CAAa;AAAA,IACX,IAAA,EAAM;AAAA,MACJ,GAAG,MAAM,UAAA,CAAW,MAAA;AAAA,MACpB,SAAA,EAAW,YAAA;AAAA,MACX,UAAA,EAAY,MAAM,WAAA,CAAY,MAAA;AAAA,QAC5B,CAAC,kBAAA,EAAoB,YAAA,EAAc,QAAQ,CAAA;AAAA,QAC3C;AAAA,UACE,QAAA,EAAU,KAAA,CAAM,WAAA,CAAY,QAAA,CAAS;AAAA;AACvC,OACF;AAAA,MACA,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAS,CAAA;AAAA,MACT,KAAA,EAAO,EAAA;AAAA,MACP,MAAA,EAAQ,EAAA;AAAA,MACR,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC1B,UAAA,EAAY;AAAA,QACV,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,EAAE;AAAA,OAC7B;AAAA,MACA,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAA;AAAA,MAC1B,iBAAiB,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,SAAS,GAAG,CAAA;AAAA,MAC9D,SAAA,EAAW;AAAA,QACT,iBAAiB,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,SAAS,GAAG,CAAA;AAAA,QAC9D,cAAA,EAAgB;AAAA;AAClB;AACF,GACD;AACL;AAEO,MAAM,sBAAA,GAAyB,UAAA;AAAA,EAAW,WAC/C,YAAA,CAAa;AAAA,IACX,aAAA,EAAe;AAAA,MACb,SAAA,EAAW;AAAA,KACb;AAAA,IACA,KAAA,EAAO;AAAA,MACL,UAAA,EAAY,MAAM,UAAA,CAAW,cAAA;AAAA,MAC7B,OAAA,EAAS,OAAA;AAAA,MACT,cAAA,EAAgB,MAAA;AAAA,MAChB,QAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAc,UAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACd;AAAA,IACA,QAAA,EAAU;AAAA,MACR,UAAA,EAAY,CAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,aAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAY,MAAM,UAAA,CAAW,cAAA;AAAA,MAC7B,QAAA,EAAU,MAAM,UAAA,CAAW;AAAA;AAC7B,GACD;AACH;AAEO,MAAM,qBAAA,GAAwB,WAAW,CAAA,KAAA,MAAU;AAAA,EACxD,QAAA,EAAU;AAAA,IACR,GAAG,MAAM,UAAA,CAAW,EAAA;AAAA,IACpB,UAAA,EAAY,QAAA;AAAA,IACZ,KAAA,EAAO,MAAM,OAAA,CAAQ;AAAA;AAEzB,CAAA,CAAE;AAEK,MAAM,yBAAA,GAA4B,WAAkB,CAAA,KAAA,MAAU;AAAA,EACnE,IAAA,EAAM;AAAA,IACJ,YAAA,EAAc,CAAA,UAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,CAAA;AAAA,IACvD,eAAA,EAAiB,QAAA,CAAS,KAAA,CAAM,OAAA,CAAQ,WAAW,OAAO,CAAA;AAAA,IAC1D,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAC;AAAA,GAC7B;AAAA,EACA,GAAA,EAAK;AAAA,IACH,SAAA,EAAW,EAAA;AAAA,IACX,QAAA,EAAU,GAAA;AAAA,IACV,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAAA,IAC3B,SAAA,EAAW;AAAA,MACT,KAAA,EAAO,SAAA;AAAA,MACP,eAAA,EAAiB;AAAA;AACnB,GACF;AAAA,EACA,SAAA,EAAW;AAAA,IACT,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,SAAA;AAAA,IAC1C,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,QAAA,EAAU,MAAM,UAAA,CAAW,QAAA;AAAA,IAC3B,UAAA,EAAY,MAAM,UAAA,CAAW;AAAA,GAC/B;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,cAAA,EAAgB,eAAA;AAAA,IAChB,UAAA,EAAY,QAAA;AAAA,IACZ,QAAA,EAAU,GAAA;AAAA,IACV,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAC;AAAA,GAC7B;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,iBAAiB,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,SAAS,GAAG;AAAA;AAElE,CAAA,CAAE;AAE4C,UAAA;AAAA,EAAW,WACvD,YAAA,CAAa;AAAA,IACX,IAAA,EAAM;AAAA,MACJ,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC9B,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,KAAA,EAAO;AAAA,MACL,QAAA,EAAU,MAAM,UAAA,CAAW,QAAA;AAAA,MAC3B,UAAA,EAAY,MAAM,UAAA,CAAW,cAAA;AAAA,MAC7B,UAAA,EAAY;AAAA,KACd;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ;AAAA;AACV,GACD;AACH;AAEO,MAAM,mBAAA,GAAsB,UAAA;AAAA,EAAW,WAC5C,YAAA,CAAa;AAAA,IACX,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO;AAAA,KAC9B;AAAA,IACA,OAAA,EAAS;AAAA,MACP,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO;AAAA,KAC9B;AAAA,IACA,SAAA,EAAW;AAAA,MACT,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,KAAA;AAAA,MACf,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB;AAAA;AAClB,GACD;AACH;AAEO,MAAM,yBAAA,GAA4B,WAAW,CAAA,KAAA,MAAU;AAAA,EAC5D,EAAA,EAAI;AAAA,IACF,GAAG,MAAM,UAAA,CAAW,EAAA;AAAA,IACpB,UAAA,EAAY,GAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACX;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,SAAA;AAAA,IACT,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,GAC9B;AAAA,EACA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS;AAAA,GACX;AAAA,EACA,KAAA,EAAO;AAAA,IACL,GAAG,MAAM,UAAA,CAAW,QAAA;AAAA,IACpB,UAAA,EAAY,GAAA;AAAA,IACZ,UAAA,EAAY,CAAA;AAAA,IACZ,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC5B,KAAA,EAAO,MAAM,OAAA,CAAQ;AAAA,GACvB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,OAAA;AAAA,IACT,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,IACxB,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW;AAAA,GAC5C;AAAA,EACA,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,OAAA;AAAA,IAChC,QAAA,EAAU,MAAM,UAAA,CAAW,QAAA;AAAA,IAC3B,UAAA,EAAY;AAAA;AAEhB,CAAA,CAAE;AAEK,MAAM,wBAAA,GAA2B,UAAA;AAAA,EAAW,WACjD,YAAA,CAAa;AAAA,IACX,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,KAAA;AAAA,MACf,cAAA,EAAgB,cAAA;AAAA,MAChB,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY,aAAA;AAAA,MACZ,OAAA,EAAS;AAAA,KACX;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,QAAA;AAAA,MACtC,YAAA,EAAc,KAAA;AAAA,MACd,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,UAAA,EAAY;AAAA,MACV,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ;AAAA,KACzC;AAAA,IACA,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe;AAAA,KACjB;AAAA,IACA,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,IAAA,EAAM,CAAA;AAAA,MACN,GAAA,EAAK,kBAAA;AAAA,MACL,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,CAAA;AAAA,MACP,GAAA,EAAK,kBAAA;AAAA,MACL,MAAA,EAAQ;AAAA;AACV,GACD;AACH;AAEO,MAAM,mBAAA,GAAsB,UAAA;AAAA,EACjC,CAAC,UACC,YAAA,CAAa;AAAA,IACX,QAAA,EAAU;AAAA,MACR,YAAA,EAAc,MAAM,KAAA,CAAM,YAAA;AAAA,MAC1B,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,UAAA;AAAA,MAC1C,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,UAAA,EAAY,aAAA;AAAA,MACZ,MAAA,EAAQ,CAAA;AAAA,MACR,aAAA,EAAe,MAAA;AAAA,MACf,KAAA,EAAO,MAAA;AAAA,MACP,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC1B,QAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,CAAA,EAAG,KAAK,CAAC;AAAA,KACtC;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM,MAAM,OAAA,CAAQ;AAAA,KACtB;AAAA,IACA,KAAA,EAAO;AAAA,MACL,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY,CAAA;AAAA,MACZ,KAAA,EAAO,MAAM,OAAA,CAAQ,cAAA;AAAA,MACrB,UAAA,EAAY,MAAM,UAAA,CAAW;AAAA;AAC/B,GACD;AACL;AAEO,MAAM,gBAAA,GAAmB,UAAA;AAAA,EAC9B,CAAC,UACC,YAAA,CAAa;AAAA,IACX,OAAA,EAAS;AAAA,MACP,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,UAAA;AAAA,MACvC,YAAA,EAAc,MAAM,KAAA,CAAM,YAAA;AAAA,MAC1B,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC1B,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,KAAA;AAAA,MAC7B,QAAA,EAAU,MAAM,UAAA,CAAW,QAAA;AAAA,MAC3B,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,KAC1B;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,KAC1B;AAAA,IACA,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,KAC1B;AAAA,IACA,QAAA,EAAU;AAAA,MACR,QAAA,EAAU,CAAA,MAAA;AAAA,KACZ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,eAAA,EAAiB,SAAA,CAAU,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAC;AAAA,KACrD;AAAA,IACA,QAAA,EAAU;AAAA,MACR,QAAA,EAAU,GAAA;AAAA,MACV,UAAA,EAAY,QAAA;AAAA,MACZ,QAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,SAAA,EAAW;AAAA;AACb,GACD;AACL;AAEO,MAAM,6BAAA,GAAgC,UAAA;AAAA,EAAW,WACtD,YAAA,CAAa;AAAA,IACX,MAAA,EAAQ;AAAA,MACN,eAAA,EAAiB,MAAM,OAAA,CAAQ,cAAA;AAAA,MAC/B,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAAA;AAC5B,GACD;AACH;AAEO,MAAM,eAAA,GAAkB,UAAA;AAAA,EAAW,WACxC,YAAA,CAAa;AAAA,IACX,MAAA,EAAQ;AAAA,MACN,QAAA,EAAU,GAAA;AAAA,MACV,SAAA,EAAW,OAAA;AAAA,MACX,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW;AAAA,KAC5C;AAAA,IACA,QAAA,EAAU;AAAA,MACR,QAAA,EAAU,GAAA;AAAA,MACV,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MACxB,WAAA,EAAa;AAAA,QACX,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAC;AAAA;AAC7B;AACF,GACD;AACH;AAEO,MAAM,uBAAA,GAA0B,UAAA;AAAA,EACrC,CAAC,UACC,YAAA,CAAa;AAAA,IACX,IAAA,EAAM;AAAA,MACJ,SAAA,EAAW;AAAA,KACb;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,eAAA,EAAiB,MAAM,OAAA,CAAQ,cAAA;AAAA,MAC/B,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,KAC5B;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,SAAA,EAAW,EAAA;AAAA,MACX,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC9B,YAAA,EAAc,MAAM,KAAA,CAAM;AAAA,KAC5B;AAAA,IACA,UAAA,EAAY;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,UAAA,EAAY,KAAA,CAAM,WAAA,CAAY,MAAA,CAAO,YAAA,EAAc;AAAA,QACjD,QAAA,EAAU,KAAA,CAAM,WAAA,CAAY,QAAA,CAAS;AAAA,OACtC,CAAA;AAAA,MACD,SAAA,EAAW;AAAA,QACT,UAAA,EAAY,MAAM,OAAA,CAAQ;AAAA;AAC5B,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,KAAA,EAAO;AAAA,MACL,QAAA,EAAU,MAAM,UAAA,CAAW,QAAA;AAAA,MAC3B,UAAA,EAAY,MAAM,UAAA,CAAW;AAAA;AAC/B,GACD;AACL;AAEO,MAAM,4BAAA,GAA+B,UAAA;AAAA,EAAW,WACrD,YAAA,CAAa;AAAA,IACX,IAAA,EAAM;AAAA,MACJ,SAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,GAAG;AAAA;AAAA,KACrC;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ;AAAA;AAAA;AACV,GACD;AACH;AAEO,MAAM,6BAAA,GAAgC,UAAA;AAAA,EAAW,WACtD,YAAA,CAAa;AAAA,IACX,SAAA,EAAW;AAAA,MACT,UAAA,EAAY,MAAM,UAAA,CAAW,cAAA;AAAA,MAC7B,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,MAAA;AAAA,MACT,cAAA,EAAgB,eAAA;AAAA,MAChB,UAAA,EAAY;AAAA;AACd,GACD;AACH;AAEO,MAAM,iBAAA,GAAoB,UAAA;AAAA,EAAW,WAC1C,YAAA,CAAa;AAAA,IACX,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,MAAM,MAAA,CAAO;AAAA;AACvB,GACD;AACH;AAEO,MAAM,yBAAA,GAA4B,UAAA;AAAA,EAAW,WAClD,YAAA,CAAa;AAAA,IACX,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,MAAM,OAAA,CAAQ;AAAA;AACvB,GACD;AACH;AAEO,MAAM,qBAAA,GAAwB,UAAA;AAAA,EAAW,WAC9C,YAAA,CAAa;AAAA,IACX,aAAA,EAAe;AAAA,MACb,OAAA,EAAS;AAAA,KACX;AAAA,IACA,WAAA,EAAa;AAAA,MACX,OAAA,EAAS;AAAA,KACX;AAAA,IACA,WAAA,EAAa;AAAA,MACX,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MACtB,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MACpB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,MAC7B,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,GAAA,EAAK;AAAA,MACH,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,QAAA,GAAW;AAAA,KACxC;AAAA,IACA,QAAA,EAAU;AAAA,MACR,UAAA,EAAY,MAAM,UAAA,CAAW;AAAA,KAC/B;AAAA,IACA,QAAA,EAAU;AAAA,MACR,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,KAC9B;AAAA,IACA,OAAA,EAAS;AAAA,MACP,YAAA,EAAc,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,KAC/B;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,UAAA,EAAY,MAAM,UAAA,CAAW;AAAA,KAC/B;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,KAAA;AAAA,MACf,YAAA,EAAc,QAAA;AAAA,MACd,cAAA,EAAgB;AAAA;AAClB,GACD;AACH;AAEO,MAAM,oBAAA,GAAuB,UAAA;AAAA,EAAW,WAC7C,YAAA,CAAa;AAAA,IACX,OAAA,EAAS;AAAA,MACP,SAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAAA,KACnC;AAAA,IACA,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,EAAG,CAAC;AAAA,KAC7B;AAAA,IACA,KAAA,EAAO;AAAA,MACL,QAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,CAAA,EAAG,MAAM,CAAC;AAAA,KACxC;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAA;AAAA,MAC7B,QAAQ,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,MACpC,OAAA,EAAS;AAAA;AACX,GACD;AACH;AAEO,MAAM,iCAAA,GAAoC,WAAW,OAAO;AAAA,EACjE,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,SAAA,EAAW;AAAA;AAEf,CAAA,CAAE;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"sum.esm.js","sources":["../../src/utils/sum.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { DateAggregation } from '@backstage-community/plugin-cost-insights-common';\n\nexport const aggregationSum = (aggregation: DateAggregation[]) =>\n aggregation.reduce((total, curAgg) => total + curAgg.amount, 0);\n"],"names":[],"mappings":"AAkBa,MAAA,cAAA,GAAiB,CAAC,WAAA,KAC7B,WAAY,CAAA,MAAA,CAAO,CAAC,KAAA,EAAO,MAAW,KAAA,KAAA,GAAQ,MAAO,CAAA,MAAA,EAAQ,CAAC;;;;"}
1
+ {"version":3,"file":"sum.esm.js","sources":["../../src/utils/sum.ts"],"sourcesContent":["/*\n * Copyright 2020 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 { DateAggregation } from '@backstage-community/plugin-cost-insights-common';\n\nexport const aggregationSum = (aggregation: DateAggregation[]) =>\n aggregation.reduce((total, curAgg) => total + curAgg.amount, 0);\n"],"names":[],"mappings":"AAkBO,MAAM,cAAA,GAAiB,CAAC,WAAA,KAC7B,WAAA,CAAY,MAAA,CAAO,CAAC,KAAA,EAAO,MAAA,KAAW,KAAA,GAAQ,MAAA,CAAO,MAAA,EAAQ,CAAC;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-cost-insights",
3
- "version": "0.27.0",
3
+ "version": "0.28.0",
4
4
  "description": "A Backstage plugin that helps you keep track of your cloud spend",
5
5
  "backstage": {
6
6
  "role": "frontend-plugin",
@@ -67,15 +67,15 @@
67
67
  "test": "backstage-cli package test"
68
68
  },
69
69
  "dependencies": {
70
- "@backstage-community/plugin-cost-insights-common": "^0.12.0",
71
- "@backstage/catalog-model": "^1.7.6",
70
+ "@backstage-community/plugin-cost-insights-common": "^0.13.0",
71
+ "@backstage/catalog-model": "^1.7.7",
72
72
  "@backstage/config": "^1.3.6",
73
- "@backstage/core-compat-api": "^0.5.7",
74
- "@backstage/core-components": "^0.18.6",
75
- "@backstage/core-plugin-api": "^1.12.2",
76
- "@backstage/frontend-plugin-api": "^0.13.4",
77
- "@backstage/plugin-catalog-react": "^1.21.6",
78
- "@backstage/theme": "^0.7.1",
73
+ "@backstage/core-compat-api": "^0.5.9",
74
+ "@backstage/core-components": "^0.18.8",
75
+ "@backstage/core-plugin-api": "^1.12.4",
76
+ "@backstage/frontend-plugin-api": "^0.15.1",
77
+ "@backstage/plugin-catalog-react": "^2.1.0",
78
+ "@backstage/theme": "^0.7.2",
79
79
  "@date-io/luxon": "1.x",
80
80
  "@material-ui/core": "^4.12.2",
81
81
  "@material-ui/icons": "^4.9.1",
@@ -95,10 +95,10 @@
95
95
  "yup": "^1.0.0"
96
96
  },
97
97
  "devDependencies": {
98
- "@backstage/cli": "^0.35.3",
99
- "@backstage/core-app-api": "^1.19.4",
100
- "@backstage/dev-utils": "^1.1.19",
101
- "@backstage/test-utils": "^1.7.14",
98
+ "@backstage/cli": "^0.36.0",
99
+ "@backstage/core-app-api": "^1.19.6",
100
+ "@backstage/dev-utils": "^1.1.21",
101
+ "@backstage/test-utils": "^1.7.16",
102
102
  "@testing-library/dom": "^10.0.0",
103
103
  "@testing-library/jest-dom": "^6.0.0",
104
104
  "@testing-library/react": "^15.0.0",