@spotify/backstage-plugin-soundcheck 0.14.4 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +48 -0
- package/config.d.ts +14 -0
- package/dist/alpha.d.ts +17 -17
- package/dist/api.esm.js +1 -1
- package/dist/components/Badges/LevelBadge.esm.js +1 -1
- package/dist/components/Badges/StatusBadge.esm.js +2 -0
- package/dist/components/CampaignCreatePage/CampaignCreatePage.esm.js +1 -1
- package/dist/components/CampaignForm/CampaignForm.esm.js +1 -1
- package/dist/components/CampaignForm/hooks/useCampaignForm.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/CampaignInsightsPage.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/CampaignStatusHistoryTile.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/CampaignStatusTile.esm.js +1 -1
- package/dist/components/CampaignInsightsPage/DaysRemainingTile.esm.js +1 -1
- package/dist/components/CampaignsPage/EditCampaignView.esm.js +1 -1
- package/dist/components/CertificationAccordion/CertificationAccordion.esm.js +1 -1
- package/dist/components/CertificationSidebar/CertificationSidebar.esm.js +1 -1
- package/dist/components/CertificationSidebar/CertificationSummary.esm.js +1 -1
- package/dist/components/CertificationSidebar/Check.esm.js +1 -1
- package/dist/components/CertificationSidebar/LevelSummary.esm.js +1 -1
- package/dist/components/CertificationSidebar/StatusDetails.esm.js +2 -0
- package/dist/components/CertificationsPage/CertificationTab.esm.js +1 -1
- package/dist/components/CertificationsPage/CertificationTabs.esm.js +1 -1
- package/dist/components/CertificationsPage/CertificationsPage.esm.js +1 -1
- package/dist/components/CertificationsPage/Playlist/PlaylistContext.esm.js +1 -1
- package/dist/components/CertificationsPage/Playlist/PlaylistProgress.esm.js +1 -1
- package/dist/components/Charts/LineChart/LineChartPlaceholder.esm.js +1 -1
- package/dist/components/CheckCard/CheckCard.esm.js +1 -1
- package/dist/components/CheckCard/CheckHistoryChart.esm.js +1 -1
- package/dist/components/CheckCreatePage/CheckCreatePage.esm.js +1 -1
- package/dist/components/CheckDetails/CheckDetails.esm.js +1 -1
- package/dist/components/CheckDetails/ResultStateBox.esm.js +1 -1
- package/dist/components/CheckForm/FormFields/RuleInput/Conditions/ValueListInput.esm.js +1 -1
- package/dist/components/CheckForm/FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js +1 -1
- package/dist/components/CheckForm/useCheckForm.esm.js +1 -1
- package/dist/components/CheckForm/utils/checkFormUtils.esm.js +1 -1
- package/dist/components/CheckPage/CheckEditPage.esm.js +2 -0
- package/dist/components/CheckPage/CheckEditView.esm.js +1 -1
- package/dist/components/CheckPage/CheckEntitiesTable/CheckEntitiesTable.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/BigQuery/BigQueryConfigurator.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/BigQuery/QueryFactDetailsComponent.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/BigQuery/css/prism-dark-sql.css.esm.js +260 -0
- package/dist/components/CollectorPage/Configurators/BigQuery/utils.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/BigQuery/validation.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/Common/CollectorOption.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Common/CollectorSchedulingOptions.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/Common/FactCollectionConfig.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Common/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Configurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/DataDog/DataDogConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/DataDog/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Github/GithubConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Github/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Gitlab/GitlabConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Gitlab/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Jira/JiraConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Jira/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Kubernetes/KubernetesConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Kubernetes/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/NewRelic/NewRelicConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/NewRelic/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/PagerDuty/PagerDutyConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/PagerDuty/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/ExistsFactDetailsComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/FactDetailsComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/JsonFactDetailsComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/RegexFactDetailsComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/ScmConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/validation.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SonarQube/SonarQubeConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SonarQube/utils.esm.js +1 -1
- package/dist/components/CollectorsPage/CollectorListPage/CollectorLogo.esm.js +1 -1
- package/dist/components/CollectorsPage/CollectorListPage/CollectorSummaryCard.esm.js +1 -1
- package/dist/components/EntitySoundcheckCard/Card.esm.js +1 -1
- package/dist/components/Filter/EntityAutocompletePicker.esm.js +1 -1
- package/dist/components/Filter/FilterComponent.esm.js +1 -1
- package/dist/components/Filter/FilterPreviewTable/EntityTableColumns.esm.js +1 -1
- package/dist/components/Filter/FilterPreviewTable/FilterPreviewTable.esm.js +1 -1
- package/dist/components/Filter/types.esm.js +1 -1
- package/dist/components/Filter/utils.esm.js +1 -1
- package/dist/components/FormControlledSelect/FormControlledSelect.esm.js +2 -0
- package/dist/components/FormFilterSection/FormFilterSection.esm.js +1 -1
- package/dist/components/Frequency/FrequencyComponent.esm.js +1 -1
- package/dist/components/Frequency/util.esm.js +1 -1
- package/dist/components/LevelCard/LevelCard.esm.js +1 -1
- package/dist/components/LevelCard/LevelTooltip.esm.js +1 -1
- package/dist/components/LevelUpParty/LevelUpParty.esm.js +1 -1
- package/dist/components/OverviewPage/OverviewPageContent.esm.js +1 -1
- package/dist/components/OverviewPage/OverviewPageHeader.esm.js +1 -1
- package/dist/components/OverviewTable/Cell/TrackBadgeCell.esm.js +2 -0
- package/dist/components/OverviewTable/Cell/cellRenderer.esm.js +1 -1
- package/dist/components/OverviewTable/ResultsTable.esm.js +1 -1
- package/dist/components/OverviewTable/ResultsTableRow.esm.js +1 -1
- package/dist/components/OverviewTable/resultsTableUtils.esm.js +1 -1
- package/dist/components/PassRateGrid/PassRateMetadata.esm.js +1 -1
- package/dist/components/PassRateTable/PassRateTable.esm.js +2 -2
- package/dist/components/RefetchingIndicator/RefetchingIndicator.esm.js +1 -1
- package/dist/components/Router.esm.js +1 -1
- package/dist/components/RoutingPage/RoutingPage.esm.js +1 -1
- package/dist/components/SoundcheckHeader/SoundcheckHeader.esm.js +1 -1
- package/dist/components/SummaryCard/SummaryCard.esm.js +1 -1
- package/dist/components/TechHealth/Filters/FacetFilter.esm.js +1 -1
- package/dist/components/TechHealth/Filters/useFacetOptions.esm.js +1 -1
- package/dist/components/TechHealth/TechHealth.esm.js +1 -1
- package/dist/components/TechHealthSummary/SummaryAggregationsProvider.esm.js +1 -1
- package/dist/components/TechHealthTabs/CampaignResultsTab/CampaignResultsTab.esm.js +1 -1
- package/dist/components/TechHealthTabs/CheckResultsTab/CheckResultsTab.esm.js +1 -1
- package/dist/components/TechHealthTabs/EntityResultsTab/EntityResultsTab.esm.js +1 -1
- package/dist/components/TechHealthTabs/GroupResultsTab/GroupResultsTab.esm.js +1 -1
- package/dist/components/TechHealthTabs/TrackResultsTab/TrackResultsTab.esm.js +1 -1
- package/dist/components/TrackCreatePage/TrackCreatePage.esm.js +1 -1
- package/dist/components/TrackEditPage/TrackEditPage.esm.js +1 -1
- package/dist/components/TrackEditPage/TrackEditView.esm.js +1 -1
- package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackBadgeTypeSelect/TrackBadgeTypeSelect.esm.js +2 -0
- package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackDetailsStep.esm.js +1 -1
- package/dist/components/TrackForm/utils/useTrackForm.esm.js +1 -1
- package/dist/components/TrackPage/TrackEntitiesTable/TrackEntitiesTable.esm.js +1 -1
- package/dist/components/TrackPage/TrackHistoryChart.esm.js +1 -1
- package/dist/components/TrackPage/TrackLevelsChart.esm.js +1 -1
- package/dist/graphql/generated/index.esm.js +141 -109
- package/dist/hooks/aggregations/useCheckStatusHistories.esm.js +2 -0
- package/dist/hooks/aggregations/useCheckStatuses.esm.js +2 -0
- package/dist/hooks/certifications/useProgramOverviewForOwner.esm.js +1 -1
- package/dist/hooks/checks/useUpdateCheck.esm.js +1 -1
- package/dist/hooks/facets/useFacetFilters.esm.js +1 -1
- package/dist/hooks/facets/useFacetsForOwner.esm.js +1 -1
- package/dist/hooks/graphqlKeys.esm.js +1 -1
- package/dist/hooks/groups/useAllGroups.esm.js +1 -1
- package/dist/hooks/groups/useUsersGroupClaims.esm.js +1 -1
- package/dist/hooks/tracks/useCreateTrack.esm.js +1 -1
- package/dist/hooks/tracks/useDeleteTrack.esm.js +1 -1
- package/dist/hooks/tracks/useUpdateTrack.esm.js +1 -1
- package/dist/images/bigquery-rgb.svg +15 -0
- package/dist/images/bigquery-white.svg +15 -0
- package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +2 -0
- package/dist/utils/export.esm.js +3 -3
- package/dist/utils/getGroupFilterFromConfig.esm.js +2 -0
- package/package.json +25 -21
- package/dist/components/CampaignDetailsPage/CampaignDetailRow.esm.js +0 -2
- package/dist/components/CampaignDetailsPage/CampaignDetails.esm.js +0 -2
- package/dist/components/CheckPage/CheckDetailsView.esm.js +0 -2
- package/dist/components/CheckPage/CheckPage.esm.js +0 -2
- package/dist/components/CollectorPage/Configurators/SCM/FactCollectionConfig.esm.js +0 -2
- package/dist/components/Filter/FilterPreviewTable/EntityKindsFilter.esm.js +0 -2
- package/dist/components/Filter/FilterPreviewTable/EntitySystemsFilter.esm.js +0 -2
- package/dist/components/Filter/FilterPreviewTable/EntityTableToolbar.esm.js +0 -2
- package/dist/components/Filter/FilterPreviewTable/EntityTagFilter.esm.js +0 -2
- package/dist/components/OverviewPage/CampaignBanner/CampaignArea.esm.js +0 -2
- package/dist/components/OverviewPage/CampaignBanner/CampaignBanner.esm.js +0 -2
- package/dist/components/OverviewPage/CampaignBanner/useCampaignBannerStyles.esm.js +0 -2
- package/dist/components/OverviewPage/CampaignBanner/utils.esm.js +0 -2
- package/dist/components/OverviewTable/Cell/HighestLevelBadge.esm.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{MarkdownContent as E}from"@backstage/core-components";import{useEntity as y}from"@backstage/plugin-catalog-react";import{makeStyles as k,Box as v,Typography as m}from"@material-ui/core";import t from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import{useCheckDetails as S}from"../../hooks/checks/useCheckDetails.esm.js";import{useGetChecks as x}from"../../hooks/checks/useGetChecks.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{AlertPanel as C}from"../AlertPanel/AlertPanel.esm.js";import{RelativeTime as B}from"../RelativeTime/RelativeTime.esm.js";import{ResultStateBox as N}from"./ResultStateBox.esm.js";import{CheckDetailsSkeleton as z}from"./skeletons/CheckDetailsSkeleton.esm.js";const s=k(e=>({root:{padding:`${e.spacing(3)}px ${e.spacing(5)}px`},title:{fontWeight:"normal",fontSize:e.typography.h5.fontSize},description:{padding:`${e.spacing(3)}px 0`},subtitle:{fontWeight:"normal",fontSize:e.typography.h6.fontSize},topBar:{display:"flex",justifyContent:"space-between",marginBottom:e.spacing(2)}})),D=({programId:e,checkId:r})=>{const i=s(),{entity:p}=y(),{data:
|
|
1
|
+
import{MarkdownContent as E}from"@backstage/core-components";import{useEntity as y}from"@backstage/plugin-catalog-react";import{makeStyles as k,Box as v,Typography as m}from"@material-ui/core";import t from"react";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@spotify/backstage-plugin-soundcheck-common";import{useCheckDetails as S}from"../../hooks/checks/useCheckDetails.esm.js";import{useGetChecks as x}from"../../hooks/checks/useGetChecks.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{AlertPanel as C}from"../AlertPanel/AlertPanel.esm.js";import{RelativeTime as B}from"../RelativeTime/RelativeTime.esm.js";import{ResultStateBox as N}from"./ResultStateBox.esm.js";import{CheckDetailsSkeleton as z}from"./skeletons/CheckDetailsSkeleton.esm.js";const s=k(e=>({root:{padding:`${e.spacing(3)}px ${e.spacing(5)}px`},title:{fontWeight:"normal",fontSize:e.typography.h5.fontSize},description:{padding:`${e.spacing(3)}px 0`},subtitle:{fontWeight:"normal",fontSize:e.typography.h6.fontSize},topBar:{display:"flex",justifyContent:"space-between",marginBottom:e.spacing(2)}})),D=({programId:e,checkId:r})=>{const i=s(),{entity:p}=y(),{data:o,isLoading:l,isError:c}=S(p,e,r),{data:d}=x({ids:[r??""],first:1}),f=d?.edges?.[0]?.node;if(c)return t.createElement(v,{padding:2},t.createElement(C,{severity:"error",title:"Error loading check details"}));if(l||!e||!r)return t.createElement(z,null);if(!o)return null;const{name:a,description:u,result:g,timestamp:n,notes:h}=o;return t.createElement("div",{className:i.root,"data-testid":"check-details-view"},t.createElement("div",{className:i.topBar},t.createElement(m,{variant:"h2",className:i.title},a),n?t.createElement(B,{timestamp:n,description:"Last updated"}):null),t.createElement(N,{name:a,state:g,notes:h,templateRef:f?.templateRef??void 0}),t.createElement("div",{className:i.description,"data-testid":"soundcheck-check-details-description"},t.createElement(m,{variant:"h3",className:i.subtitle},"Description"),t.createElement(E,{content:u})))};export{D as CheckDetails,s as useStyles};
|
|
2
2
|
//# sourceMappingURL=CheckDetails.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{MarkdownContent as
|
|
1
|
+
import{MarkdownContent as d}from"@backstage/core-components";import{useApi as g,configApiRef as f}from"@backstage/core-plugin-api";import{makeStyles as u,Paper as k,Typography as C,Box as h,Button as x}from"@material-ui/core";import t,{useState as E}from"react";import{ResultState as e}from"../../graphql/generated/index.esm.js";import{CheckIcon as R}from"../CheckIcon/CheckIcon.esm.js";import{FixMeDialog as b}from"./FixMeDialog.esm.js";const w=u(a=>({markdownContent:{"& :last-child":{marginBottom:0},"& pre":{background:`${a.palette.background.paper} !important`}},root:{padding:a.spacing(2),display:"flex",gap:a.spacing(1.5)},iconContainer:{marginTop:1},passed:{},failed:{},warning:{},notReported:{},notApplicable:{},error:{},icon:{}}),{name:"CheckResultStateBox"}),y={[e.Passed]:"Check passed",[e.Failed]:"Check did not pass",[e.Warning]:"Check produced warning(s)",[e.NotReported]:"Check not reported",[e.NotApplicable]:"Check not applicable",[e.Error]:"Check encountered an error."},N={[e.Passed]:"passed",[e.Failed]:"failed",[e.Warning]:"warning",[e.NotReported]:"notReported",[e.NotApplicable]:"notApplicable",[e.Error]:"error"},A=({name:a,state:n,notes:i,templateRef:l})=>{const o=w(),[c,r]=E(!1),p=g(f).getOptionalStringArray("soundcheck.flags")?.includes("enable-fix-me"),s=()=>{r(!0)},m=()=>{r(!1)};return t.createElement(k,{variant:"outlined",className:`${o.root} ${o[N[n]]}`},t.createElement("div",{className:o.iconContainer},t.createElement(R,{className:o.icon,result:n})),t.createElement("div",{style:{width:"100%"}},t.createElement(C,{variant:"subtitle1"},y[n]),i?t.createElement(d,{className:o.markdownContent,content:i}):null,p&&n===e.Failed&&l&&t.createElement(h,{display:"flex",flexDirection:"column",alignItems:"flex-end",mt:2,width:"100%"},t.createElement(x,{color:"primary",variant:"contained",onClick:s},"Fix"),t.createElement(b,{title:`Fix ${a}`,open:c,setOpen:r,onClose:m,templateRef:l}))))};export{A as ResultStateBox};
|
|
2
2
|
//# sourceMappingURL=ResultStateBox.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as C,Box as p,Typography as k,TextField as
|
|
1
|
+
import{makeStyles as C,Box as p,Typography as k,TextField as x,IconButton as v,Button as d,Divider as y}from"@material-ui/core";import B from"@material-ui/icons/Add";import S from"@material-ui/icons/Delete";import e,{useContext as E,useCallback as r}from"react";import{SoundcheckDialog as V}from"../../../../SoundcheckDialog/SoundcheckDialog.esm.js";import{ValueListContext as f}from"./ValueListContext.esm.js";const h=C(t=>({dialogButton:{padding:t.spacing(1,1.5)}})),I=()=>{const{values:t,updateValues:n,updateOpen:i,onSave:o}=E(f),u=r((a,l)=>{const s=[...t];s[a]=l,n(s)},[n,t]),c=r(a=>{const l=[...t];l.splice(a,1),n(l)},[n,t]),m=r(()=>{const a=[...t,""];n(a)},[n,t]),g=r(()=>{o(t.filter(a=>!!a)),i(!1)},[o,i,t]);return e.createElement(p,{minWidth:640,paddingLeft:2,paddingRight:2,"data-testid":"rule-value-list-input"},e.createElement(k,{component:"div",variant:"subtitle2"},"Rule Value"),t.map((a,l)=>e.createElement(p,{display:"flex",marginBottom:1,alignItems:"center",key:l},e.createElement(x,{value:a,onChange:s=>u(l,s.currentTarget.value),variant:"outlined",margin:"dense",fullWidth:!0}),e.createElement(v,{onClick:()=>c(l),size:"small"},e.createElement(S,null)))),e.createElement(p,{marginTop:1,marginBottom:2},e.createElement(d,{onClick:m,startIcon:e.createElement(B,null),size:"small",variant:"outlined"},"Add")),e.createElement(y,null),e.createElement(p,{marginTop:2,display:"flex",gridGap:8,justifyContent:"flex-end"},e.createElement(d,{onClick:()=>i(!1),variant:"text"},"Cancel"),e.createElement(d,{onClick:g,variant:"contained",color:"primary"},"Save")))},L=({values:t=Array(5).fill(""),onSave:n,iconButton:i})=>{const{updateOpen:o,updateValues:u,updateOnSave:c}=E(f),m=r(()=>{const a=[...t.map(l=>String(l)),"","",""];o(!0),u(a),c(()=>n||(()=>{}))},[n,c,o,u,t]),g=h();return i?e.createElement(v,{"aria-label":"edit list",onClick:m,size:"small"},i):e.createElement(d,{className:g.dialogButton,onClick:m},"List")},T=()=>{const{open:t,updateOpen:n}=E(f);return e.createElement(V,{open:t,handleClose:()=>n(!1),title:"Input Value List",fullScreen:!1},e.createElement(I,null))};export{T as ValueListInputDialog,L as ValueListInputDialogButton};
|
|
2
2
|
//# sourceMappingURL=ValueListInput.esm.js.map
|
package/dist/components/CheckForm/FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as b,ButtonGroup as g,Button as k}from"@material-ui/core";import n,{useState as E}from"react";import{useFormContext as f,Controller as y}from"react-hook-form";import{ExpressionType as a,ExpressionTypeReadableMap as C}from"../../../types/ExpressionType.esm.js";import"../../../../Frequency/types.esm.js";import"../../../../Frequency/util.esm.js";import"../../../../Frequency/FrequencyComponent.esm.js";import"../../../types/Path.esm.js";const x=b(e=>({button:{backgroundColor:e.palette.background.paper,padding:e.spacing(.5,1.5)},selectedButton:{backgroundColor:e.palette.action.
|
|
1
|
+
import{makeStyles as b,ButtonGroup as g,Button as k}from"@material-ui/core";import n,{useState as E}from"react";import{useFormContext as f,Controller as y}from"react-hook-form";import{ExpressionType as a,ExpressionTypeReadableMap as C}from"../../../types/ExpressionType.esm.js";import"../../../../Frequency/types.esm.js";import"../../../../Frequency/util.esm.js";import"../../../../Frequency/FrequencyComponent.esm.js";import"../../../types/Path.esm.js";const x=b(e=>({button:{backgroundColor:e.palette.background.paper,padding:e.spacing(.5,1.5)},selectedButton:{backgroundColor:e.palette.action.hover}})),B=({name:e,disabled:l})=>{const o=x(),{control:p,getValues:m}=f(),s=`${e}`,c=m(s),[i,u]=E(c||a.AllOf),d=r=>{u(r)};return n.createElement(y,{control:p,name:e,render:({field:{onChange:r}})=>n.createElement(g,{color:"primary"},Object.values(a).map(t=>n.createElement(k,{key:t,className:i===t?`${o.selectedButton} ${o.button}`:`${o.button}`,onClick:()=>{d(t),r(t)},disabled:l},C[t])))})};export{B as ExpressionTypeToggle};
|
|
2
2
|
//# sourceMappingURL=ExpressionTypeToggle.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{zodResolver as n}from"@hookform/resolvers/zod";import{useForm as a}from"react-hook-form";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as c}from"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import{useLoggedInUser as u}from"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as f}from"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{mapCheckerToFormValues as l,mapToCheckerInput as d,DEFAULT_FORM_VALUES as h}from"./utils/checkFormUtils.esm.js";import{checkFormSchema as C}from"./utils/validation.esm.js";const S=m=>{const{selectedItem:e}=c(),{userEntityRef:t}=u();let o=h;e&&(o=l(e)),t&&!o.detailsStep.ownerEntityRef&&(o.detailsStep.ownerEntityRef=t);const i=a({defaultValues:o,mode:"onChange",resolver:n(C)}),{showModal:s}=f();return{formMethods:i,onSubmit:async r=>{if(!await s({title:"Save Check",message:`Are you sure you want to save check: ${r.detailsStep.name}?`,error:!1}))return;const p=d(r,e);m(p)}}};export{S as useCheckForm};
|
|
1
|
+
import{zodResolver as n}from"@hookform/resolvers/zod";import{useForm as a}from"react-hook-form";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as c}from"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"react";import{useLoggedInUser as u}from"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as f}from"../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import{mapCheckerToFormValues as l,mapToCheckerInput as d,DEFAULT_FORM_VALUES as h}from"./utils/checkFormUtils.esm.js";import{checkFormSchema as C}from"./utils/validation.esm.js";const S=m=>{const{selectedItem:e}=c(),{userEntityRef:t}=u();let o=h;e&&(o=l(e)),t&&!o.detailsStep.ownerEntityRef&&(o.detailsStep.ownerEntityRef=t);const i=a({defaultValues:o,mode:"onChange",resolver:n(C)}),{showModal:s}=f();return{formMethods:i,onSubmit:async r=>{if(!await s({title:"Save Check",message:`Are you sure you want to save check: ${r.detailsStep.name}?`,error:!1}))return;const p=d(r,e);m(p)}}};export{S as useCheckForm};
|
|
2
2
|
//# sourceMappingURL=useCheckForm.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{FrequencySchema as
|
|
1
|
+
import{FrequencySchema as S}from"@spotify/backstage-plugin-soundcheck-common";import{isObject as k}from"lodash";import{v4 as T}from"uuid";import{mapInputFilterToFormFilters as R,mapFiltersToCatalogFilter as y}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as A}from"../../Filter/types.esm.js";import{TimeUnit as g}from"../../Frequency/types.esm.js";import{isTimeUnit as C}from"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import{ExpressionType as p}from"../types/ExpressionType.esm.js";import{defaultSchedule as O}from"../types/Schedule.esm.js";import"../types/Path.esm.js";import{CHECK_NAME_MAX_LENGTH as P}from"./validation.esm.js";const x=e=>{if(k(e)&&"frequency"in e){const r=S.safeParse(e.frequency);if(r.success){const t=r.data;if("cron"in t)return{enabled:!0,frequency:{type:"cron",unit:g.Hours,value:1,cron:t.cron}};const s=Object.keys(t);if(s.length){const o=s[0];if(C(o))return{enabled:!0,frequency:{type:"HumanDuration",unit:o,value:t[o]??1,cron:""}}}}}return{enabled:!1,frequency:{type:"HumanDuration",unit:g.Hours,value:1,cron:""}}},v=(e,r)=>{const{enabled:t,frequency:s}=e;if(t){const{cron:o,type:n,unit:a,value:l}=s;return n==="HumanDuration"?{frequency:{[a]:l},filter:y(r)}:{frequency:{cron:o}}}},h=e=>{if(Array.isArray(e))return e.map(r=>h(r));if(typeof e=="string"){if(e==="true")return!0;if(e==="false")return!1;const r=Number(e);if(!isNaN(r))return r}return e},f=e=>{if(!e)return{};if(e.expressionType){const r={[e.expressionType]:e.conditions?.map(t=>({factRef:t.factRef,path:t.path,operator:t.operatorPrefix?`${t.operatorPrefix}:${t.operator}`:t.operator,value:h(t.value)}))};return e.expressions&&e.expressions.forEach(t=>{r[e.expressionType]?.push(f(t))}),r}if(e.expressions)return e.expressions.map(f);if(e.conditions&&e.conditions.length===1){const r=e.conditions[0];return{factRef:r.factRef,path:r.path,operator:r.operatorPrefix?`${r.operatorPrefix}:${r.operator}`:r.operator,value:h(r.value)}}return{}},w=e=>{if(e?.match(/.:./)){const r=e.split(":");if(["all","any","none"].includes(r[0]))return{operator:r[1],operatorPrefix:r[0]}}return{}},m=(e,r=!0)=>{if(!e)return{conditions:[]};const t=Object.keys(e);let s=t.includes("all")||r&&!t.includes("any")?p.AllOf:p.AnyOf;if(t.includes("not")&&(s=p.Not),t.includes(s)||r){const a=e[s]||[e],l=[],u=[];return a.forEach(i=>{const d=Object.keys(i);if(d.includes("all")||d.includes("any")||d.includes("not"))u.push(m(i,!1));else{const{operator:E,operatorPrefix:b}=w(i.operator);l.push({factRef:i.factRef,path:i.path,operator:E??i.operator,value:i.value,operatorPrefix:b})}}),{expressions:u.length>0?u:void 0,conditions:l,expressionType:s}}const{operator:o,operatorPrefix:n}=w(e.operator);return{expressionType:p.AllOf,conditions:[{factRef:e.factRef,path:e.path,operator:o??e.operator,value:e.value,operatorPrefix:n}]}},M=e=>({detailsStep:{name:e.name??"",description:e.description??"",ownerEntityRef:e.ownerEntityRef??""},rulesStep:{pathResolver:e.pathResolver??"jsonpath",expressions:m(e.rule),passedMessage:e.passedMessage??void 0,failedMessage:e.failedMessage??void 0,warning:e.warning??!1},filtersStep:{filter:R(e.filter)},scheduleStep:{schedule:x(e.schedule)}}),F=(e,r)=>{const{detailsStep:t,rulesStep:s,filtersStep:o,scheduleStep:n}=e;return{id:r?r.id:T(),ownerEntityRef:t.ownerEntityRef??void 0,name:t.name,description:t.description,pathResolver:s.pathResolver,passedMessage:s.passedMessage??void 0,failedMessage:s.failedMessage??void 0,rule:f(s.expressions),warning:s.warning??!1,filter:o.filter?y(o.filter):void 0,schedule:v(n.schedule,o.filter)}},c=(e,r="$")=>{const t=[];if(e.type==="object"&&e.properties){const s=e.properties;for(const o in s)if(s.hasOwnProperty(o)){const n=`${r}.${o}`;t.push(n);const a=s[o];t.push(...c(a,n))}}if(e.type==="array"&&e.items){const s=`${r}[*]`;t.push(s);const o=Array.isArray(e.items)?e.items:[e.items];for(const n of o)t.push(...c(n,s))}if(e.oneOf){const s=Array.isArray(e.oneOf)?e.oneOf:[e.oneOf];for(const o of s)t.push(...c(o,r))}if(e.allOf){const s=Array.isArray(e.allOf)?e.allOf:[e.allOf];for(const o of s)t.push(...c(o,r))}return[...new Set(t)]},q={detailsStep:{name:"",description:"",ownerEntityRef:""},rulesStep:{pathResolver:"jsonpath",expressions:{expressionType:p.AllOf,expressions:void 0,conditions:[{factRef:"",path:"",operator:"",operatorPrefix:"",value:"",conditions:[]}]},warning:!1},filtersStep:{filter:A()},scheduleStep:{schedule:O()}},N={details:{name:{name:"Check name",helperText:`Max ${P} characters`,placeholder:"Name your check (e.g., 'Code Coverage\u2019)"},description:{name:"Check description",placeholder:"Describe your check clearly so others understand its purpose. e.g., 'Ensure code coverage meets the minimum threshold.'"},owner:{name:"Check owner",selectLabel:"Assign an owner"}},rulesStep:{rules:{name:"Check rules",description:"Define the rules the check will verify."},messages:{name:"Pass/Fail messages (Optional)",description:"Add the messages for check success and failure.",passMessagePlaceholder:"Enter pass message...",failMessagePlaceholder:"Enter fail message...",passedTabName:"Passed Message",failedTabName:"Failed Message"},warnings:{name:"Enable warnings",description:"Enable to classify failures as warnings, so they don\u2019t impact certification.",label:"Warning"}},filter:{description:'Setting the filters below will limit the scope of the Check so that only those Entities that match the filter will be monitored by the Check. As an example, choosing a "Kind" of "Component" will make this Check only apply to Entities whose Kind is indeed set to "Component". This would exclude Entities like Groups, Users, APIs, etc. from being impacted by the Check.'},schedule:{description:"Checks are automatically triggered whenever a dependent fact is updated. When collectors are scheduled, there is generally no need to schedule checks.",checkboxLabel:"Schedule check"}};export{N as CHECK_FIELDS,q as DEFAULT_FORM_VALUES,c as generateJsonPaths,M as mapCheckerToFormValues,f as mapExpressionToRule,x as mapInputScheduleToSchedule,m as mapRuleToExpression,v as mapScheduleToInputSchedule,F as mapToCheckerInput};
|
|
2
2
|
//# sourceMappingURL=checkFormUtils.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{usePermission as p}from"@backstage/plugin-permission-react";import{soundcheckCheckUpdatePermission as c}from"@spotify/backstage-plugin-soundcheck-common";import e from"react";import{useParams as d}from"react-router-dom";import"../../contexts/TrackFormContext.esm.js";import{CheckFormProvider as l}from"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import{useGetChecks as f}from"../../hooks/checks/useGetChecks.esm.js";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{LoadingIndicator as h}from"../LoadingIndicator/LoadingIndicator.esm.js";import{PageWarningMessage as u}from"../PageWarningMessage/PageWarningMessage.esm.js";import{CheckEditView as g}from"./CheckEditView.esm.js";const k=()=>{const{checkId:o}=d(),{data:m,isLoading:n}=f({ids:[o??""],first:1}),r=m?.edges?.[0]?.node,{loading:s,allowed:a}=p({permission:c,resourceRef:o}),t=s||n,i=a&&r?.isEditable;return e.createElement(e.Fragment,null,e.createElement(u,{entityName:"check",entityId:o,showCannotEdit:!t&&!i,showNotFound:!t&&!r}),t&&e.createElement(h,null),e.createElement(l,null,!t&&!!r&&i&&e.createElement(g,{check:r})))};export{k as CheckEditPage};
|
|
2
|
+
//# sourceMappingURL=CheckEditPage.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import d,{useEffect as
|
|
1
|
+
import d,{useEffect as i}from"react";import"../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as c}from"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import"../../contexts/UserProvider.esm.js";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../api.esm.js";import"../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../hooks/useSoundcheckAlert.esm.js";import"../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as u}from"../../hooks/useNavigateBack.esm.js";import{useUpdateCheck as h}from"../../hooks/checks/useUpdateCheck.esm.js";import{checksPageRouteRef as f}from"../../routes.esm.js";import{CheckForm as l}from"../CheckForm/CheckForm.esm.js";import"../CheckForm/Steps/CheckDetailsStep.esm.js";import"../CheckForm/Steps/CheckRulesStep.esm.js";import"../SoundcheckHeader/SoundcheckHeader.esm.js";import"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as g}from"../SoundcheckHeader/useHeader.esm.js";const C=({check:t})=>{const{selectedItem:m,setSelectedItem:o}=c(),{setIsLoading:e}=c(),{mutateAsync:s,isLoading:r}=h();i(()=>{e(r)},[e,r]),i(()=>{o(t)},[t,o]);const[p,a]=u(f),n=async k=>{await s(k,{onSuccess:a})};return g({title:"Edit a Check",description:"Make changes to your check\u2019s facts, rules and other details.",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/checks"}),m&&d.createElement(l,{onClose:p,onSave:n})};export{C as CheckEditView};
|
|
2
2
|
//# sourceMappingURL=CheckEditView.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{stringifyEntityRef as
|
|
1
|
+
import{stringifyEntityRef as R}from"@backstage/catalog-model";import{Table as v}from"@backstage/core-components";import{makeStyles as x}from"@material-ui/core";import z from"lodash";import p,{useState as L,useEffect as B,useCallback as d}from"react";import{CheckEntityField as n,Direction as f}from"../../../graphql/generated/index.esm.js";import{useEntitiesByRefs as T}from"../../../hooks/catalog/useEntitiesByRefs.esm.js";import{useCheckEntities as D}from"../../../hooks/entities/useCheckEntities.esm.js";import{toResultState as m}from"../utils.esm.js";import{columnFactories as r}from"./columns.esm.js";import{toCheckEntityRow as N}from"./utils.esm.js";const O=10,P=["kind","metadata.name","metadata.namespace","relations","spec.lifecycle","spec.type"],F=[r.createStateColumn(),r.createNameColumn(),r.createSystemColumn(),r.createOwnerColumn(),r.createSpecTypeColumn(),r.createSpecLifecycleColumn()],A=[n.State,n.Name,n.System,n.Owner,n.Type,n.Lifecycle],$=x({tableContainer:{display:"flex",flexDirection:"column",width:"100%",overflowX:"auto","& table":{boxSizing:"border-box","& th:first-child, & td:first-child":{paddingLeft:"6px"},"& th:last-child, & td:last-child":{paddingRight:"6px !important"}}}}),Q=({checkId:g,trackId:u,filter:s,states:c})=>{const h=$(),[e,l]=L({orderBy:void 0,filter:s,states:c?.map(m).filter(t=>t!==void 0),pageInfo:{page:0,pageSize:O,direction:"forward",cursor:null}});B(()=>{l(t=>({...t,pageInfo:{...t.pageInfo,page:0,cursor:null},filter:s,states:c?.map(m).filter(i=>i!==void 0)}))},[s,c]);const{data:a,isLoading:y}=D({checkId:g,trackId:u,orderBy:e.orderBy,filter:e.filter,states:e.states?.length?e.states:void 0,[e.pageInfo.direction==="forward"?"first":"last"]:e.pageInfo.pageSize,[e.pageInfo.direction==="forward"?"after":"before"]:e.pageInfo.cursor}),C=d((t,i)=>{let o;t===-1?o=void 0:o={field:A[t],direction:i==="asc"?f.Asc:f.Desc},l({...e,orderBy:o,pageInfo:{...e.pageInfo,page:0,cursor:null}})},[e]),I=d((t,i)=>{const o=t>e.pageInfo.page?"forward":"backward",b=o==="forward"?a?.checkEntities.pageInfo.endCursor??null:a?.checkEntities.pageInfo.startCursor??null;l({...e,pageInfo:{page:t,pageSize:i,direction:o,cursor:b}})},[a,e]),k=a?.checkEntities.edges.map(t=>t.node.entityRef)??[],{data:S,isLoading:w}=T({entityRefs:k,fields:P}),E=z.compact(a?.checkEntities.edges.map(t=>{const i=S?.items.find(o=>!!o&&R(o)===t.node.entityRef);return i?N({checkDetails:t.node,entity:i}):void 0}))??[];return p.createElement("div",{className:h.tableContainer},p.createElement(v,{title:"Entities",style:{width:"100%",border:"none",margin:0},columns:F,data:E,options:{paging:!0,showFirstLastPageButtons:!1,paginationPosition:"bottom",emptyRowsWhenPaging:!0,pageSizeOptions:[10,25,50],pageSize:e.pageInfo.pageSize,search:!1,showTitle:!0,padding:"dense"},onOrderChange:C,onPageChange:I,page:e.pageInfo.page,totalCount:a?.checkEntities.totalCount??0,isLoading:y||w,components:{Toolbar:()=>null}}))};export{Q as CheckEntitiesTable};
|
|
2
2
|
//# sourceMappingURL=CheckEntitiesTable.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{zodResolver as b}from"@hookform/resolvers/zod";import{makeStyles as v,Paper as B}from"@material-ui/core";import o,{useCallback as S}from"react";import{useForm as F,FormProvider as Q}from"react-hook-form";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as h}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as E}from"../../../../hooks/useNavigateBack.esm.js";import{useUpdateCollectorConfig as q}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as w}from"../../../../routes.esm.js";import{FooterButtons as k}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as M}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as N}from"../Common/FactCollectionConfig.esm.js";import{collectorHeaderContent as P,confirmationModalContent as R}from"../Common/utils.esm.js";import{QueryFactDetailsComponent as T}from"./QueryFactDetailsComponent.esm.js";import{mapConfigToBigQueryCollectorConfig as x,defaultBigQueryConfig as D,queryCollectorConfig as H,mapBigQueryCollectorConfigToConfig as I}from"./utils.esm.js";import{bigQueryCollectorFormSchema as V}from"./validation.esm.js";const z=v(t=>({spacer:{height:t.spacing(8),width:"100%"},section:{marginBottom:t.spacing(2)}})),A=({disabled:t,selectedCollector:e})=>{const c=S(async(r,...i)=>{const C={enabled:!1,collectors:[]},y={query:r.query.enabled?r.query:C};return b(V)(y,...i)},[]),a=F({defaultValues:e?x(e.config):D(),mode:"onChange",resolver:c}),{formState:{isValid:s},handleSubmit:m}=a,n=z(),f=!s,{mutateAsync:p}=q(),[u,d]=E(w),{showModal:g}=h(),l=async r=>{if(!await g(R(e)))return;const i=I(r);await p({collectorId:e.id,config:i})&&d()};return M(P(e)),o.createElement(o.Fragment,null,o.createElement(B,{className:n.section},o.createElement(Q,{...a},o.createElement("form",{onSubmit:m(l)},o.createElement(N,{name:"query",label:"Query",description:"Collects data from BigQuery.",disabled:t,FactDetailsComponent:T,multipleCollectors:{enable:!0,defaultConfig:H()}})))),o.createElement("div",{className:n.section},o.createElement(k,{onCancel:u,saveButtonText:"Save",isLoading:!1,onSave:m(l),disableSave:f})))};export{A as BigQueryConfigurator};
|
|
2
|
+
//# sourceMappingURL=BigQueryConfigurator.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as f,Box as x,Grid as n,Typography as m,TextField as d,FormHelperText as T,Tooltip as b,IconButton as E}from"@material-ui/core";import N from"@material-ui/icons/Add";import C from"@material-ui/icons/Remove";import v from"classnames";import{highlight as F,languages as I}from"prismjs";import"prismjs/components/prism-sql";import e from"react";import{useFormContext as S,useFieldArray as q,Controller as p}from"react-hook-form";import $ from"react-simple-code-editor";import{FormControlledSelect as h}from"../../../FormControlledSelect/FormControlledSelect.esm.js";import{FormFieldLabel as D}from"../../../FormFieldLabel/FormFieldLabel.esm.js";import*as L from"./css/prism-dark-sql.css.esm.js";import{DATA_TYPES as _,FOREIGN_KEY_OPTIONS as k,DEFAULT_SCHEMA_ITEM as H}from"./utils.esm.js";const P=f(r=>({...L,root:{paddingTop:r.spacing(1)},textInput:{marginTop:0,width:"580px"},queryCaption:{width:"580px",display:"block"},queryInput:{marginTop:0,width:"580px",minHeight:"100px",maxHeight:"300px",overflowY:"scroll",outline:`1px solid ${r.palette.action.disabled}`,borderRadius:"6px",display:"grid","&:hover":{outlineColor:r.palette.textContrast}},queryInputError:{outlineColor:r.palette.error.main,"&:hover":{outlineColor:r.palette.error.main}},queryTextarea:{outline:"none"},caption:{margin:r.spacing(2,0)},nameInput:{marginTop:0,display:"inline"},selectInput:{marginTop:0,width:"150px"},helperText:{marginLeft:0}})),w=({name:r,disabled:o})=>{const a=P(),{control:l}=S(),{fields:u,insert:g,remove:y}=q({control:l,name:`${r}.schema`});return e.createElement(x,null,e.createElement(n,{container:!0,spacing:1,direction:"column",className:a.root},e.createElement(n,{item:!0},e.createElement(m,{variant:"subtitle2"},"Fact Name"),e.createElement(p,{name:`${r}.factName`,control:l,render:({field:i,fieldState:{error:t}})=>e.createElement(d,{...i,type:"text",variant:"outlined",margin:"dense",placeholder:"Fact Name",className:a.textInput,disabled:o,error:!!t,helperText:t?.message??"Fact name must be unique",FormHelperTextProps:{className:a.helperText}})})),e.createElement(n,{item:!0},e.createElement(m,{variant:"subtitle2"},"GCP Project ID (Optional)"),e.createElement(p,{name:`${r}.projectId`,control:l,render:({field:i,fieldState:{error:t}})=>e.createElement(d,{...i,type:"text",variant:"outlined",margin:"dense",placeholder:"Project ID",className:a.textInput,disabled:o,error:!!t,helperText:t?.message??"Google Cloud project ID",FormHelperTextProps:{className:a.helperText}})})),e.createElement(n,{item:!0},e.createElement(D,{title:"SQL Query (GoogleSQL)",docLink:"https://cloud.google.com/bigquery/docs/introduction-sql"}),e.createElement(m,{variant:"caption",className:a.queryCaption},"The query can be parameterized, supported named parameters are @entity_refs and @entity_names (the values will be resolved automatically)"),e.createElement(p,{name:`${r}.query`,control:l,render:({field:i,fieldState:{error:t}})=>e.createElement(e.Fragment,null,e.createElement("div",{className:v(a.queryInput,t?a.queryInputError:void 0)},e.createElement($,{...i,highlight:c=>F(c,I.sql,"sql"),onValueChange:i.onChange,padding:10,disabled:o,placeholder:"Example: SELECT * FROM [bigquery-data:catalog.entities] WHERE entity_ref IN UNNEST(@entity_refs)",textareaClassName:a.queryTextarea})),e.createElement(T,{className:a.helperText,error:!!t},t?.message??"Consider updating the collector's batch size to schedule the query for multiple entities at once"))}))),e.createElement("div",{className:a.caption},e.createElement(m,{variant:"subtitle1"},"Output Schema"),e.createElement(m,{variant:"caption"},"List the columns returned by the query")),e.createElement(n,{container:!0,spacing:0,direction:"column"},u.map((i,t)=>e.createElement(n,{item:!0,container:!0,alignItems:"center",spacing:2,key:i.id},e.createElement(n,{item:!0},e.createElement(m,{variant:"subtitle2"},"Column Name"),e.createElement(p,{name:`${r}.schema.${t}.name`,control:l,render:({field:c,fieldState:{error:s}})=>e.createElement(d,{...c,type:"text",variant:"outlined",margin:"dense",placeholder:"Column Name",className:a.nameInput,disabled:o,error:!!s,helperText:s?.message??" ",FormHelperTextProps:{className:a.helperText}})})),e.createElement(n,{item:!0},e.createElement(m,{variant:"subtitle2"},"Data Type"),e.createElement(p,{name:`${r}.schema.${t}.type`,control:l,render:({field:c,fieldState:{error:s}})=>e.createElement(h,{...c,control:l,placeholder:"Data Type",options:_,disabled:o,helperText:s?.message??" "})})),e.createElement(n,{item:!0},e.createElement(b,{placement:"top",title:"Select a value if the column is a foreign key that references a catalog entity field"},e.createElement(m,{variant:"subtitle2"},"Foreign Key")),e.createElement(p,{name:`${r}.schema.${t}.foreignKey`,control:l,render:({field:c,fieldState:{error:s}})=>e.createElement(h,{...c,control:l,placeholder:"Foreign Key",options:k,disabled:o,helperText:s?.message??" "})})),e.createElement(n,{item:!0},e.createElement(E,{onClick:()=>y(t),disabled:o||u.length===1},e.createElement(C,{fontSize:"small"})),e.createElement(E,{onClick:()=>g(t+1,H),disabled:o},e.createElement(N,{fontSize:"small"})))))))};export{w as QueryFactDetailsComponent};
|
|
2
|
+
//# sourceMappingURL=QueryFactDetailsComponent.esm.js.map
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import e from"../../../../../node_modules_dist/style-inject/dist/style-inject.es.esm.js";var n=`/**
|
|
2
|
+
* prism.js Dark theme for JavaScript, CSS and HTML
|
|
3
|
+
* Based on the slides of the talk \u201C/Reg(exp){2}lained/\u201D
|
|
4
|
+
* @author Lea Verou
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
code[class*='language-sql'],
|
|
8
|
+
pre[class*='language-sql'] {
|
|
9
|
+
color: white;
|
|
10
|
+
background: none;
|
|
11
|
+
text-shadow: 0 -0.1em 0.2em black;
|
|
12
|
+
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
|
13
|
+
font-size: 1em;
|
|
14
|
+
text-align: left;
|
|
15
|
+
white-space: pre;
|
|
16
|
+
word-spacing: normal;
|
|
17
|
+
word-break: normal;
|
|
18
|
+
word-wrap: normal;
|
|
19
|
+
line-height: 1.5;
|
|
20
|
+
|
|
21
|
+
-moz-tab-size: 4;
|
|
22
|
+
-o-tab-size: 4;
|
|
23
|
+
tab-size: 4;
|
|
24
|
+
|
|
25
|
+
-webkit-hyphens: none;
|
|
26
|
+
-moz-hyphens: none;
|
|
27
|
+
-ms-hyphens: none;
|
|
28
|
+
hyphens: none;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@media print {
|
|
32
|
+
code[class*='language-sql'],
|
|
33
|
+
pre[class*='language-sql'] {
|
|
34
|
+
text-shadow: none;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
pre[class*='language-sql'],
|
|
39
|
+
:not(pre) > code[class*='language-sql'] {
|
|
40
|
+
background: hsl(30, 20%, 25%);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* Code blocks */
|
|
44
|
+
pre[class*='language-sql'] {
|
|
45
|
+
padding: 1em;
|
|
46
|
+
margin: 0.5em 0;
|
|
47
|
+
overflow: auto;
|
|
48
|
+
border: 0.3em solid hsl(30, 20%, 40%);
|
|
49
|
+
border-radius: 0.5em;
|
|
50
|
+
box-shadow: 1px 1px 0.5em black inset;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* Inline code */
|
|
54
|
+
:not(pre) > code[class*='language-sql'] {
|
|
55
|
+
padding: 0.15em 0.2em 0.05em;
|
|
56
|
+
border-radius: 0.3em;
|
|
57
|
+
border: 0.13em solid hsl(30, 20%, 40%);
|
|
58
|
+
box-shadow: 1px 1px 0.3em -0.1em black inset;
|
|
59
|
+
white-space: normal;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.token.comment,
|
|
63
|
+
.token.prolog,
|
|
64
|
+
.token.doctype,
|
|
65
|
+
.token.cdata {
|
|
66
|
+
color: hsl(30, 20%, 50%);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.token.punctuation {
|
|
70
|
+
opacity: 0.7;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.token.namespace {
|
|
74
|
+
opacity: 0.7;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.token.property,
|
|
78
|
+
.token.tag,
|
|
79
|
+
.token.boolean,
|
|
80
|
+
.token.number,
|
|
81
|
+
.token.constant,
|
|
82
|
+
.token.symbol {
|
|
83
|
+
color: hsl(350, 40%, 70%);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.token.selector,
|
|
87
|
+
.token.attr-name,
|
|
88
|
+
.token.string,
|
|
89
|
+
.token.char,
|
|
90
|
+
.token.builtin,
|
|
91
|
+
.token.inserted {
|
|
92
|
+
color: hsl(75, 70%, 60%);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.token.operator,
|
|
96
|
+
.token.entity,
|
|
97
|
+
.token.url,
|
|
98
|
+
.language-css .token.string,
|
|
99
|
+
.style .token.string,
|
|
100
|
+
.token.variable {
|
|
101
|
+
color: hsl(40, 90%, 60%);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.token.atrule,
|
|
105
|
+
.token.attr-value,
|
|
106
|
+
.token.keyword {
|
|
107
|
+
color: hsl(350, 40%, 70%);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.token.regex,
|
|
111
|
+
.token.important {
|
|
112
|
+
color: #e90;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.token.important,
|
|
116
|
+
.token.bold {
|
|
117
|
+
font-weight: bold;
|
|
118
|
+
}
|
|
119
|
+
.token.italic {
|
|
120
|
+
font-style: italic;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.token.entity {
|
|
124
|
+
cursor: help;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.token.deleted {
|
|
128
|
+
color: red;
|
|
129
|
+
}
|
|
130
|
+
`,o=`/**
|
|
131
|
+
* prism.js Dark theme for JavaScript, CSS and HTML
|
|
132
|
+
* Based on the slides of the talk \u201C/Reg(exp){2}lained/\u201D
|
|
133
|
+
* @author Lea Verou
|
|
134
|
+
*/
|
|
135
|
+
|
|
136
|
+
code[class*='language-sql'],
|
|
137
|
+
pre[class*='language-sql'] {
|
|
138
|
+
color: white;
|
|
139
|
+
background: none;
|
|
140
|
+
text-shadow: 0 -0.1em 0.2em black;
|
|
141
|
+
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
|
142
|
+
font-size: 1em;
|
|
143
|
+
text-align: left;
|
|
144
|
+
white-space: pre;
|
|
145
|
+
word-spacing: normal;
|
|
146
|
+
word-break: normal;
|
|
147
|
+
word-wrap: normal;
|
|
148
|
+
line-height: 1.5;
|
|
149
|
+
|
|
150
|
+
-moz-tab-size: 4;
|
|
151
|
+
-o-tab-size: 4;
|
|
152
|
+
tab-size: 4;
|
|
153
|
+
|
|
154
|
+
-webkit-hyphens: none;
|
|
155
|
+
-moz-hyphens: none;
|
|
156
|
+
-ms-hyphens: none;
|
|
157
|
+
hyphens: none;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
@media print {
|
|
161
|
+
code[class*='language-sql'],
|
|
162
|
+
pre[class*='language-sql'] {
|
|
163
|
+
text-shadow: none;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
pre[class*='language-sql'],
|
|
168
|
+
:not(pre) > code[class*='language-sql'] {
|
|
169
|
+
background: hsl(30, 20%, 25%);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/* Code blocks */
|
|
173
|
+
pre[class*='language-sql'] {
|
|
174
|
+
padding: 1em;
|
|
175
|
+
margin: 0.5em 0;
|
|
176
|
+
overflow: auto;
|
|
177
|
+
border: 0.3em solid hsl(30, 20%, 40%);
|
|
178
|
+
border-radius: 0.5em;
|
|
179
|
+
box-shadow: 1px 1px 0.5em black inset;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/* Inline code */
|
|
183
|
+
:not(pre) > code[class*='language-sql'] {
|
|
184
|
+
padding: 0.15em 0.2em 0.05em;
|
|
185
|
+
border-radius: 0.3em;
|
|
186
|
+
border: 0.13em solid hsl(30, 20%, 40%);
|
|
187
|
+
box-shadow: 1px 1px 0.3em -0.1em black inset;
|
|
188
|
+
white-space: normal;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.token.comment,
|
|
192
|
+
.token.prolog,
|
|
193
|
+
.token.doctype,
|
|
194
|
+
.token.cdata {
|
|
195
|
+
color: hsl(30, 20%, 50%);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.token.punctuation {
|
|
199
|
+
opacity: 0.7;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.token.namespace {
|
|
203
|
+
opacity: 0.7;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.token.property,
|
|
207
|
+
.token.tag,
|
|
208
|
+
.token.boolean,
|
|
209
|
+
.token.number,
|
|
210
|
+
.token.constant,
|
|
211
|
+
.token.symbol {
|
|
212
|
+
color: hsl(350, 40%, 70%);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.token.selector,
|
|
216
|
+
.token.attr-name,
|
|
217
|
+
.token.string,
|
|
218
|
+
.token.char,
|
|
219
|
+
.token.builtin,
|
|
220
|
+
.token.inserted {
|
|
221
|
+
color: hsl(75, 70%, 60%);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.token.operator,
|
|
225
|
+
.token.entity,
|
|
226
|
+
.token.url,
|
|
227
|
+
.language-css .token.string,
|
|
228
|
+
.style .token.string,
|
|
229
|
+
.token.variable {
|
|
230
|
+
color: hsl(40, 90%, 60%);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
.token.atrule,
|
|
234
|
+
.token.attr-value,
|
|
235
|
+
.token.keyword {
|
|
236
|
+
color: hsl(350, 40%, 70%);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.token.regex,
|
|
240
|
+
.token.important {
|
|
241
|
+
color: #e90;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.token.important,
|
|
245
|
+
.token.bold {
|
|
246
|
+
font-weight: bold;
|
|
247
|
+
}
|
|
248
|
+
.token.italic {
|
|
249
|
+
font-style: italic;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.token.entity {
|
|
253
|
+
cursor: help;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.token.deleted {
|
|
257
|
+
color: red;
|
|
258
|
+
}
|
|
259
|
+
`;e(n);export{n as default,o as stylesheet};
|
|
260
|
+
//# sourceMappingURL=prism-dark-sql.css.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{asArray as u}from"@spotify/backstage-plugin-soundcheck-common";import{defaultBaseCollectorOption as p}from"../Common/CollectorOption.esm.js";import{mapBackendConfigToFormIntegrationConfig as g,mapFormIntegrationConfigToBackendConfig as E}from"../Common/utils.esm.js";const i="query",C=[{value:"string",label:"STRING"},{value:"number",label:"NUMBER"},{value:"integer",label:"INTEGER"},{value:"boolean",label:"BOOLEAN"},{value:"object",label:"OBJECT"}],r="no",c="entity_ref",f="entity_name",d=[{value:r,label:"no"},{value:c,label:"Entity(entity_ref)"},{value:f,label:"Entity(metadata.name)"}],s={name:"",type:"string",foreignKey:r};function T(t){return t.isEntityRef?c:t.isEntityName?f:r}const m=(t,n)=>({...p(),factDetails:{factName:t??"",query:n??"",schema:[s]}}),y=()=>({query:{enabled:!1,collectors:[m(i)]}});function b(t){const{query:n}=t;if(n.enabled){const o={},l=[];return o.collects=l,n.collectors.forEach(e=>{l.push(E({factType:i,configOption:e,additionalParams:{factName:e.factDetails.factName,projectId:e.factDetails.projectId?.length?e.factDetails.projectId:void 0,query:e.factDetails.query,schema:e.factDetails.schema?.length?e.factDetails.schema.map(a=>({name:a.name,type:a.type,isEntityRef:a.foreignKey===c?!0:void 0,isEntityName:a.foreignKey===f?!0:void 0})):void 0}}))}),o}return{collects:[]}}function N(t){const n=y();if(t){const o=t.collects;if(o){const l=u(o).filter(e=>e.type===i);l.length&&(n.query={enabled:!0,collectors:l.map(e=>({...g({parentConfig:t,factTypeConfig:e}),factDetails:{factName:e.factName,projectId:e.projectId,query:e.query.trim(),schema:e.schema?.map(a=>({name:a.name,type:a.type,foreignKey:T(a)}))}}))})}}return n}export{C as DATA_TYPES,s as DEFAULT_SCHEMA_ITEM,d as FOREIGN_KEY_OPTIONS,i as QUERY_COLLECTOR_TYPE,y as defaultBigQueryConfig,b as mapBigQueryCollectorConfigToConfig,N as mapConfigToBigQueryCollectorConfig,m as queryCollectorConfig};
|
|
2
|
+
//# sourceMappingURL=utils.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{validNameRegex as c}from"@spotify/backstage-plugin-soundcheck-common";import{z as e}from"zod";import{FIELD_IS_REQUIRED_MSG as a}from"../../../../utils/validation.esm.js";import{BaseCollectorSchema as d}from"../Common/CollectorOption.esm.js";const l="Fact name is not unique",r="The field contains forbidden characters",i="Max 100 characters",g=d.extend({factDetails:e.strictObject({factName:e.string().min(1,a).max(100,i).regex(c,r),projectId:e.string().optional(),query:e.string().min(1,a),schema:e.array(e.strictObject({name:e.string().min(1,a).max(100,i).regex(c,r),type:e.string().min(1,a).max(100,i).regex(c,r).optional(),foreignKey:e.string().optional()})).optional()})}).strict(),p=e.strictObject({enabled:e.boolean(),collectors:e.array(g).superRefine((s,f)=>{const n=s.map(t=>t.factDetails.factName),m=n.filter((t,o)=>n.indexOf(t)!==o);m.length&&s.forEach((t,o)=>{m.includes(t.factDetails.factName)&&f.addIssue({code:e.ZodIssueCode.custom,message:l,path:[o,"factDetails","factName"]})})})}),_=e.strictObject({query:p});export{l as FACT_NAME_IS_NOT_UNIQUE_MSG,r as INVALID_CHARACTERS_MSG,i as MAX_100_CHARACTERS_MSG,_ as bigQueryCollectorFormSchema};
|
|
2
|
+
//# sourceMappingURL=validation.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{z as
|
|
1
|
+
import{z as t}from"zod";import{FrequencySchema as o,FiltersSchema as l,CacheConfigSchema as c}from"../../../../utils/validation.esm.js";import{mapToCacheConfig as n,defaultCacheConfig as m}from"../../../CacheConfig/utils.esm.js";import"../../../CacheConfig/CacheConfigComponent.esm.js";import{mapCatalogFilterToFilters as f}from"../../../Filter/utils.esm.js";import"../../../Filter/FilterComponent.esm.js";import{emptyFilters as p}from"../../../Filter/types.esm.js";import"../../../Frequency/types.esm.js";import{mapHumanDurationOrCronToFrequency as i,defaultFrequency as h}from"../../../Frequency/util.esm.js";import"../../../Frequency/FrequencyComponent.esm.js";const a=(e={})=>({filters:e?.filter&&typeof e.filter=="object"?f(e.filter):{...p(),selectedKinds:["Component"]},frequency:e?.frequency?i(e.frequency):h(),cacheConfig:e?.cache?n(e.cache):m(),batchSize:e?.batchSize,initialDelay:e?.initialDelay?i(e.initialDelay):void 0}),u=(e={})=>({enabled:!1,...a(e)}),r=t.object({frequency:o,filters:l,cacheConfig:c,initialDelay:o.optional(),batchSize:t.number().min(1,"Batch size should be at least 1").optional().nullable()}),C=r.extend({enabled:t.boolean()}).strict();export{r as BaseCollectorSchema,C as CollectorOptionSchema,a as defaultBaseCollectorOption,u as defaultCollectorOption};
|
|
2
2
|
//# sourceMappingURL=CollectorOption.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{makeStyles as T,Box as n,Typography as s,Divider as b,Button as D,TextField as S}from"@material-ui/core";import e,{useCallback as h}from"react";import{useFormContext as B,Controller as d}from"react-hook-form";import{validateFrequency as g}from"../../../../utils/frequency.esm.js";import{FormFieldLabel as p}from"../../../FormFieldLabel/FormFieldLabel.esm.js";import"../../../Frequency/types.esm.js";import{defaultInitialDelay as F}from"../../../Frequency/util.esm.js";import{FrequencyComponent as v}from"../../../Frequency/FrequencyComponent.esm.js";const $=T(a=>({root:{borderTop:`1px solid ${a.palette.divider}`},divider:{marginTop:a.spacing(3),marginBottom:a.spacing(3)}})),x=({name:a,disabled:i})=>{const u=$(),{control:c,setValue:o,watch:f}=B(),E=h(()=>{o(`${a}.initialDelay`,F())},[a,o]),y=h(()=>{o(`${a}.initialDelay`,void 0)},[a,o]),m=f(`${a}.initialDelay`);return e.createElement(e.Fragment,null,e.createElement(n,{marginBottom:2},e.createElement(p,{title:"Schedule For Automatic Collection"}),e.createElement(s,{variant:"caption"},"Checks that depend on this fact are automatically updated when the facts are collected.")),e.createElement(d,{name:`${a}.frequency`,control:c,rules:{validate:g},render:({field:t,fieldState:{error:r}})=>e.createElement(v,{disabled:i,value:t.value,onChange:t.onChange,errors:r})}),e.createElement(b,{className:u.divider}),e.createElement(n,{marginBottom:2,marginTop:2},e.createElement(p,{title:"Initial Delay (Optional)"}),e.createElement(s,{variant:"caption"},"The collection will start after the initial delay when soundcheck starts up."),m&&e.createElement(n,{marginTop:2,marginBottom:3},e.createElement(d,{name:`${a}.initialDelay`,control:c,rules:{validate:t=>t?g(t):!0},render:({field:t,fieldState:{error:r}})=>e.createElement(v,{disabled:i,value:t.value,onChange:t.onChange,errors:r,intervalTitle:"Start after a set interval",intervalDescription:"Collection will start when soundcheck starts up after the set interval.",intervalLabel:"After",cronTitle:"Start on a cron schedule",cronDescription:"Set a specific start schedule using a cron expression."})})),e.createElement(n,{marginTop:2},e.createElement(D,{variant:"outlined",size:"small",onClick:m?y:E},m?"Remove":"Add"," Initial Delay"))),e.createElement(n,{marginTop:3,paddingTop:2,paddingBottom:2,className:u.root},e.createElement(p,{title:"Batch Size (Optional)"}),e.createElement(s,{variant:"caption"},"Modifies the batch size that the collector uses. In general this option should not be changed and can affect rate limits."),e.createElement(n,{marginTop:1},e.createElement(d,{name:`${a}.batchSize`,control:c,render:({field:t,fieldState:r})=>e.createElement(S,{...t,onChange:l=>{if(l.target.value){const C=parseInt(l.target.value,10)??null;t.onChange({...l,target:{...l.target,value:C}})}else t.onChange({...l,target:{...l.target,value:null}})},placeholder:"Default: 1",value:t.value??void 0,type:"number",variant:"outlined",margin:"dense",disabled:i,error:!!r.error,helperText:r.error?.message})}))))};export{x as CollectorSchedulingOptions};
|
|
2
|
+
//# sourceMappingURL=CollectorSchedulingOptions.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as
|
|
1
|
+
import{makeStyles as G,FormControlLabel as R,Switch as L,Box as O,Typography as $,Divider as P,Tabs as V,Tab as d,Grid as g,Button as y}from"@material-ui/core";import W from"@material-ui/icons/Add";import Z from"@material-ui/icons/Remove";import e,{useState as j}from"react";import{useFormContext as q,useFieldArray as H,useWatch as J,Controller as C}from"react-hook-form";import{validateCacheConfig as K}from"../../../../utils/collectors.esm.js";import"lodash";import"../../../Frequency/types.esm.js";import"../../../Frequency/util.esm.js";import"../../../Frequency/FrequencyComponent.esm.js";import{CacheConfigComponent as M}from"../../../CacheConfig/CacheConfigComponent.esm.js";import"@backstage/catalog-model";import"@spotify/backstage-plugin-soundcheck-common";import{FilterComponent as Q}from"../../../Filter/FilterComponent.esm.js";import{CollectorSchedulingOptions as U}from"./CollectorSchedulingOptions.esm.js";const X=G(t=>({root:{padding:t.spacing(1.5,6)},tabsContainer:{marginRight:16},tab:{height:"64px",textAlign:"left"},contentContainer:{width:"100%",padding:t.spacing(1)},divider:{marginTop:t.spacing(1),marginBottom:t.spacing(1)},switchTrack:{backgroundColor:`${t.palette.primary.main} !important`},buttonsContainer:{marginTop:t.spacing(1),marginBottom:t.spacing(2)}})),u="FactDetails",f="Schedule",F="Filters",k="Caching",Y=({name:t,label:h,description:x,disabled:i,FactDetailsComponent:s,multipleCollectors:c})=>{const{control:m,formState:N}=q(),E=N.errors?.[t],{fields:S,insert:D,remove:T}=H({control:m,name:c?.enable?`${t}.collectors`:t}),p=c?.enable?S:[{id:t}],v=s?u:f,[n,b]=j(Array(p.length).fill(v)),w=(l,a,r)=>{b([...n.slice(0,r),a,...n.slice(r+1)])},A=l=>{D(l+1,c?.defaultConfig),b([...n.slice(0,l+1),v,...n.slice(l+1)])},B=l=>{T(l),b([...n.slice(0,l),...n.slice(l+1)])},z=J({control:m,name:`${t}.enabled`}),o=X();return e.createElement("div",{className:o.root},e.createElement(C,{name:`${t}.enabled`,control:m,render:({field:l})=>e.createElement(R,{control:e.createElement(L,{...l,checked:l.value,"data-testid":`${t}-switch`,classes:{track:l.value?o.switchTrack:void 0},disabled:i}),label:e.createElement(O,{display:"flex",flexDirection:"column"},e.createElement($,{variant:"body1",component:"span"},e.createElement("b",null,`${h}`)),e.createElement($,{variant:"caption",color:"textSecondary",component:"p"},`${x}`))})}),z&&e.createElement("div",null,p.map((l,a)=>e.createElement("div",{key:l.id},a!==0&&e.createElement(P,{className:o.divider}),e.createElement(V,{orientation:"horizontal",variant:"scrollable",value:n[a],onChange:(r,I)=>w(r,I,a),className:o.tabsContainer},s&&e.createElement(d,{label:"Fact Details",value:u,className:o.tab}),e.createElement(d,{label:"Schedule",value:f,className:o.tab}),e.createElement(d,{label:"Filters",value:F,className:o.tab}),e.createElement(d,{label:"Caching",value:k,className:o.tab})),e.createElement("div",{className:o.contentContainer},n[a]===u&&s&&e.createElement(s,{name:c?.enable?`${t}.collectors.${a}.factDetails`:`${t}.factDetails`,disabled:i}),n[a]===f&&e.createElement(e.Fragment,null,e.createElement(U,{name:c?.enable?`${t}.collectors.${a}`:t})),n[a]===F&&e.createElement(C,{name:c?.enable?`${t}.collectors.${a}.filters`:`${t}.filters`,control:m,render:({field:r})=>e.createElement(Q,{disabled:i,value:r.value,onChange:r.onChange})}),n[a]===k&&e.createElement(C,{name:c?.enable?`${t}.collectors.${a}.cacheConfig`:`${t}.cacheConfig`,control:m,rules:{validate:K},render:({field:r})=>e.createElement(M,{disabled:i,value:r.value,onChange:r.onChange,errors:c?.enable?E?.collectors?.[a]?.cacheConfig:E?.cacheConfig})})),c?.enable&&e.createElement(g,{container:!0,spacing:1,className:o.buttonsContainer},p.length>1&&e.createElement(g,{item:!0},e.createElement(y,{startIcon:e.createElement(Z,null),onClick:()=>B(a),disabled:i,variant:"outlined",size:"small",color:"secondary"},"Remove")),e.createElement(g,{item:!0},e.createElement(y,{startIcon:e.createElement(W,null),onClick:()=>A(a),disabled:i,variant:"outlined",size:"small",color:"primary"},"Add ",h)))))))};export{Y as FactCollectionConfig};
|
|
2
2
|
//# sourceMappingURL=FactCollectionConfig.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const
|
|
1
|
+
import{mapToCacheConfig as n,mapCacheConfigToHumanDurationOrBoolean as r}from"../../../CacheConfig/utils.esm.js";import"../../../CacheConfig/CacheConfigComponent.esm.js";import{mapCatalogFilterToFilters as c,mapFiltersToCatalogFilter as l}from"../../../Filter/utils.esm.js";import"../../../Filter/FilterComponent.esm.js";import"../../../Frequency/types.esm.js";import{mapHumanDurationOrCronToFrequency as a,mapFrequencyToHumanDurationOrCron as e}from"../../../Frequency/util.esm.js";import"../../../Frequency/FrequencyComponent.esm.js";const p=i=>({title:i.name??i.id,description:i.description,docLink:`https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/${i.id}`}),f=i=>({title:"Update Integration",message:`Are you sure you want to update the ${i.name} integration?`,error:!1}),m=({configOption:i,factType:o,additionalParams:t={}})=>({type:o,frequency:e(i.frequency),filter:l(i.filters),cache:r(i.cacheConfig),batchSize:i.batchSize??void 0,initialDelay:i.initialDelay?e(i.initialDelay):void 0,...t}),g=({parentConfig:i,factTypeConfig:o})=>{const t=o.initialDelay??i.initialDelay;return{frequency:a(o.frequency??i.frequency),filters:c(o.filter??i.filter),cacheConfig:n(o.cache??i.cache),batchSize:o.batchSize??i.batchSize,initialDelay:t?a(t):void 0}};export{p as collectorHeaderContent,f as confirmationModalContent,g as mapBackendConfigToFormIntegrationConfig,m as mapFormIntegrationConfigToBackendConfig};
|
|
2
2
|
//# sourceMappingURL=utils.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import t from"react";import{DataDogConfigurator as e}from"./DataDog/DataDogConfigurator.esm.js";import{GithubConfigurator as
|
|
1
|
+
import t from"react";import{BigQueryConfigurator as i}from"./BigQuery/BigQueryConfigurator.esm.js";import{DataDogConfigurator as e}from"./DataDog/DataDogConfigurator.esm.js";import{GithubConfigurator as m}from"./Github/GithubConfigurator.esm.js";import{GitlabConfigurator as a}from"./Gitlab/GitlabConfigurator.esm.js";import{JiraConfigurator as f}from"./Jira/JiraConfigurator.esm.js";import{KubernetesConfigurator as u}from"./Kubernetes/KubernetesConfigurator.esm.js";import{NewRelicConfigurator as n}from"./NewRelic/NewRelicConfigurator.esm.js";import{PagerDutyConfigurator as g}from"./PagerDuty/PagerDutyConfigurator.esm.js";import{ScmConfigurator as p}from"./SCM/ScmConfigurator.esm.js";import{SonarQubeConfigurator as C}from"./SonarQube/SonarQubeConfigurator.esm.js";const c={github:m,gitlab:a,scm:p,pagerduty:g,datadog:e,kubernetes:u,jira:f,sonarqube:C,newrelic:n,bigquery:i},l=({selectedCollector:r})=>{const o=c[r?.id];return t.createElement(o,{selectedCollector:r})};export{l as Configurator};
|
|
2
2
|
//# sourceMappingURL=Configurator.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as v,Paper as C,Divider as D}from"@material-ui/core";import e from"react";import{useForm as b,FormProvider as S}from"react-hook-form";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as E}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as h}from"../../../../hooks/useNavigateBack.esm.js";import{useUpdateCollectorConfig as y}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as F}from"../../../../routes.esm.js";import{FooterButtons as L}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as k}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as l}from"../Common/FactCollectionConfig.esm.js";import{collectorHeaderContent as w,confirmationModalContent as B}from"../Common/utils.esm.js";import{mapConfigToDataDogCollectorConfig as O,defaultDataDogConfig as j,mapDataDogCollectorConfigToConfig as x}from"./utils.esm.js";const M=v(o=>({spacer:{height:o.spacing(8),width:"100%"},section:{marginBottom:o.spacing(2)}})),N=({disabled:o,selectedCollector:t})=>{const i=b({defaultValues:t?O(t.config):j(),mode:"onChange"}),{formState:{errors:r},handleSubmit:a}=i,n=M(),c=!!r.serviceDefinition||!!r.serviceLevelObjective,{mutateAsync:s}=y(),[f,d]=h(F),{showModal:p}=E(),m=async g=>{if(!await p(B(t)))return;const u=x(g);await s({collectorId:t.id,config:u})&&d()};return k(w(t)),e.createElement(e.Fragment,null,e.createElement(C,{className:n.section},e.createElement(S,{...i},e.createElement("form",{onSubmit:a(m)},e.createElement(l,{name:"serviceDefinition",label:"Service Definition",description:"Collects details about Datadog service linked to an entity.",disabled:o}),e.createElement(D,null),e.createElement(l,{name:"serviceLevelObjective",label:"Service Level Objective",description:"Collects details about SLOs configured for a Datadog service linked to an entity.",disabled:o})))),e.createElement("div",{className:n.section},e.createElement(L,{onCancel:f,saveButtonText:"Save",isLoading:!1,onSave:a(m),disableSave:c})))};export{N as DataDogConfigurator};
|
|
1
|
+
import{makeStyles as v,Paper as C,Divider as D}from"@material-ui/core";import e from"react";import{useForm as b,FormProvider as S}from"react-hook-form";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as E}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as h}from"../../../../hooks/useNavigateBack.esm.js";import{useUpdateCollectorConfig as y}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as F}from"../../../../routes.esm.js";import{FooterButtons as L}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as k}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as l}from"../Common/FactCollectionConfig.esm.js";import{collectorHeaderContent as w,confirmationModalContent as B}from"../Common/utils.esm.js";import{mapConfigToDataDogCollectorConfig as O,defaultDataDogConfig as j,mapDataDogCollectorConfigToConfig as x}from"./utils.esm.js";const M=v(o=>({spacer:{height:o.spacing(8),width:"100%"},section:{marginBottom:o.spacing(2)}})),N=({disabled:o,selectedCollector:t})=>{const i=b({defaultValues:t?O(t.config):j(),mode:"onChange"}),{formState:{errors:r},handleSubmit:a}=i,n=M(),c=!!r.serviceDefinition||!!r.serviceLevelObjective,{mutateAsync:s}=y(),[f,d]=h(F),{showModal:p}=E(),m=async g=>{if(!await p(B(t)))return;const u=x(g);await s({collectorId:t.id,config:u})&&d()};return k(w(t)),e.createElement(e.Fragment,null,e.createElement(C,{className:n.section},e.createElement(S,{...i},e.createElement("form",{onSubmit:a(m)},e.createElement(l,{name:"serviceDefinition",label:"Service Definition",description:"Collects details about Datadog service linked to an entity.",disabled:o}),e.createElement(D,null),e.createElement(l,{name:"serviceLevelObjective",label:"Service Level Objective",description:"Collects details about SLOs configured for a Datadog service linked to an entity.",disabled:o})))),e.createElement("div",{className:n.section},e.createElement(L,{onCancel:f,saveButtonText:"Save",isLoading:!1,onSave:a(m),disableSave:c})))};export{N as DataDogConfigurator};
|
|
2
2
|
//# sourceMappingURL=DataDogConfigurator.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{asArray as
|
|
1
|
+
import{asArray as C}from"@spotify/backstage-plugin-soundcheck-common";import{defaultCollectorOption as a}from"../Common/CollectorOption.esm.js";import{mapBackendConfigToFormIntegrationConfig as g,mapFormIntegrationConfigToBackendConfig as l}from"../Common/utils.esm.js";const c="service-definition",f="service-level-objective",s=()=>({serviceDefinition:a(),serviceLevelObjective:a()});function p(t){const{serviceDefinition:e,serviceLevelObjective:o}=t;if(e.enabled||o.enabled){const n={},i=[];return n.collects=i,e.enabled&&i.push(l({factType:c,configOption:e})),o.enabled&&i.push(l({factType:f,configOption:o})),n}return{collects:[]}}function v(t){const e=s();if(t){const o=t.collects;if(o)for(const n of C(o)){const i=n.type,r={...g({factTypeConfig:n,parentConfig:t}),enabled:!0};i===c&&(e.serviceDefinition=r),i===f&&(e.serviceLevelObjective=r)}}return e}export{c as SERVICE_DEFINITION_COLLECTOR_TYPE,f as SERVICE_LEVEL_OBJECTIVE_COLLECTOR_TYPE,s as defaultDataDogConfig,v as mapConfigToDataDogCollectorConfig,p as mapDataDogCollectorConfigToConfig};
|
|
2
2
|
//# sourceMappingURL=utils.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as
|
|
1
|
+
import{makeStyles as C,Paper as h,Divider as a}from"@material-ui/core";import e from"react";import{useForm as y,FormProvider as E}from"react-hook-form";import"@backstage/catalog-model";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../../api.esm.js";import"../../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"@spotify/backstage-plugin-soundcheck-common";import"../../../../hooks/useSoundcheckAlert.esm.js";import{useConfirmationModal as v}from"../../../../hooks/useConfirmationModal.esm.js";import{useNavigateBack as S}from"../../../../hooks/useNavigateBack.esm.js";import{useUpdateCollectorConfig as B}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as R}from"../../../../routes.esm.js";import{FooterButtons as P}from"../../../FooterButtons/FooterButtons.esm.js";import"../../../SoundcheckHeader/SoundcheckHeader.esm.js";import"../../../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{useHeader as F}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as i}from"../Common/FactCollectionConfig.esm.js";import{collectorHeaderContent as w,confirmationModalContent as D}from"../Common/utils.esm.js";import{mapConfigToGithubCollectorConfig as G,defaultGithubConfig as L,mapGithubCollectorConfigToConfig as N}from"./utils.esm.js";const M=C(o=>({spacer:{height:o.spacing(8),width:"100%"},section:{marginBottom:o.spacing(2)},form:{marginBottom:o.spacing(2)}})),T=({disabled:o,selectedCollector:t})=>{const n=y({defaultValues:t?G(t.config):L(),mode:"onChange"}),{formState:{errors:r},handleSubmit:l}=n,m=M(),c=!!r.branchProtections||!!r.branchRules||!!r.repositoryDetails||!!r.repositoryLanguages,{mutateAsync:p}=B(),[f,u]=S(R),{showModal:d}=v(),s=async g=>{if(!await d(D(t)))return;const b=N(g);await p({collectorId:t.id,config:b})&&u()};return F(w(t)),e.createElement(e.Fragment,null,e.createElement(h,{className:m.form},e.createElement(E,{...n},e.createElement("form",{onSubmit:l(s)},e.createElement(i,{name:"branchProtections",label:"Branch Protections",description:"Collects branch protection information from an entity's repository.",disabled:o}),e.createElement(a,null),e.createElement(i,{name:"branchRules",label:"Branch Rules",description:"Collects branch rules information from an entity's repository.",disabled:o}),e.createElement(a,null),e.createElement(i,{name:"repositoryDetails",label:"Repository Details",description:"Collects details about an entity's repository.",disabled:o}),e.createElement(a,null),e.createElement(i,{name:"repositoryLanguages",label:"Repository Languages",description:"Collects details about the languages used in an entity's repository.",disabled:o})))),e.createElement("div",{className:m.section},e.createElement(P,{onCancel:f,saveButtonText:"Save",isLoading:!1,onSave:l(s),disableSave:c})))};export{T as GithubConfigurator};
|
|
2
2
|
//# sourceMappingURL=GithubConfigurator.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{asArray as
|
|
1
|
+
import{asArray as u}from"@spotify/backstage-plugin-soundcheck-common";import{defaultCollectorOption as s}from"../Common/CollectorOption.esm.js";import{mapBackendConfigToFormIntegrationConfig as d,mapFormIntegrationConfigToBackendConfig as c}from"../Common/utils.esm.js";const l="BranchProtections",f="BranchRules",p="RepositoryDetails",g="RepositoryLanguages",C=o=>({branchProtections:s(o),branchRules:s(o),repositoryDetails:s(o),repositoryLanguages:s(o)});function T(o){const{branchProtections:a,branchRules:n,repositoryDetails:r,repositoryLanguages:t}=o;if(a.enabled||n.enabled||r.enabled||t.enabled){const e={},i=[];return e.collects=i,a.enabled&&i.push(c({factType:l,configOption:a,additionalParams:{factName:"branch_protections"}})),n.enabled&&i.push(c({factType:f,configOption:n,additionalParams:{factName:"branch_rules"}})),r.enabled&&i.push(c({factType:p,configOption:r,additionalParams:{factName:"repository_details"}})),t.enabled&&i.push(c({factType:g,configOption:t,additionalParams:{factName:"repository_languages"}})),e}return{collects:[]}}function b(o){const a=C(o);if(o){const n=o.collects;if(n)for(const r of u(n)){const t=r.type,e={...d({parentConfig:o,factTypeConfig:r}),enabled:!0};t===l&&(a.branchProtections=e),t===f&&(a.branchRules=e),t===p&&(a.repositoryDetails=e),t===g&&(a.repositoryLanguages=e)}}return a}export{l as BRANCH_PROTECTIONS_COLLECTOR_TYPE,f as BRANCH_RULES_COLLECTOR_TYPE,p as REPOSITORY_DETAILS_COLLECTOR_TYPE,g as REPOSITORY_LANGUAGES_COLLECTOR_TYPE,C as defaultGithubConfig,b as mapConfigToGithubCollectorConfig,T as mapGithubCollectorConfigToConfig};
|
|
2
2
|
//# sourceMappingURL=utils.esm.js.map
|