@spotify/backstage-plugin-soundcheck 0.16.0 → 0.16.1
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 +37 -0
- package/dist/alpha.d.ts +60 -45
- package/dist/api.esm.js +1 -1
- package/dist/components/Badges/CampaignBadge.esm.js +1 -1
- package/dist/components/Badges/NoLevelBadge.esm.js +1 -1
- package/dist/components/Badges/PlaylistBadge.esm.js +1 -1
- package/dist/components/CampaignForm/Steps/CampaignDetailsStep/CampaignOwnerField.esm.js +1 -1
- package/dist/components/CertificationSidebar/CertificationSidebar.esm.js +1 -1
- package/dist/components/CertificationSidebar/Check.esm.js +1 -1
- package/dist/components/CertificationSidebar/CheckResultInputPopup.esm.js +2 -0
- package/dist/components/CertificationSidebar/CheckResultSummaryList.esm.js +1 -1
- package/dist/components/CertificationSidebar/ExemptionJustificationDialog.esm.js +2 -0
- package/dist/components/CertificationsPage/CertificationTabs.esm.js +1 -1
- package/dist/components/CertificationsPage/CertificationsPage.esm.js +1 -1
- package/dist/components/CheckDetails/CheckDetails.esm.js +1 -1
- package/dist/components/CheckDetails/FactTable.esm.js +1 -1
- package/dist/components/CheckDetails/JustificationDetails.esm.js +2 -0
- package/dist/components/CheckDetails/ResultStateBox.esm.js +1 -1
- package/dist/components/CheckDryRun/CheckDryRun.esm.js +1 -1
- package/dist/components/CheckForm/FormFields/CheckPathResolverInput.esm.js +1 -1
- package/dist/components/CheckForm/FormFields/CheckScheduleSection/ScheduleSection.esm.js +1 -1
- package/dist/components/CheckForm/FormFields/CheckTypeInput/CheckTypeInput.esm.js +2 -0
- package/dist/components/CheckForm/FormFields/TeamDetailsInput/TeamDetailsInput.esm.js +1 -1
- package/dist/components/CheckForm/Steps/CheckDetailsStep.esm.js +1 -1
- package/dist/components/CheckForm/Steps/CheckReviewStep.esm.js +1 -1
- package/dist/components/CheckForm/Steps/CheckRulesStep.esm.js +1 -1
- package/dist/components/CheckForm/useCheckForm.esm.js +1 -1
- package/dist/components/CheckForm/utils/checkFormUtils.esm.js +2 -2
- package/dist/components/CheckForm/utils/validation.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/AzureDevOps/NumberOfWorkItemsComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/BigQuery/QueryFactDetailsComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Github/CodeScanningAlertsFactDetails.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/Github/DependabotAlertsFactDetails.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/Github/GithubConfigurator.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Github/SecretScanningAlertsFactDetails.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/Github/SecurityAdvisoriesFactDetails.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/Github/types.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/Github/utils.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/Github/validation.esm.js +2 -0
- package/dist/components/CollectorPage/Configurators/HTTP/HttpRequestComponent.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/HTTP/HttpStatusesInput.esm.js +1 -1
- package/dist/components/CollectorPage/Configurators/SCM/utils.esm.js +1 -1
- package/dist/components/EntityChip/EntityChip.esm.js +1 -1
- package/dist/components/FactExplorer/FactExplorer.esm.js +1 -1
- package/dist/components/Filter/EntityAutocompletePicker.esm.js +1 -1
- package/dist/components/FormControlledAutocomplete/FormControlledMultipleAutocomplete.esm.js +2 -0
- package/dist/components/FormControlledSelect/FormControlledSelect.esm.js +1 -1
- package/dist/components/GroupSelector/GroupSelector.esm.js +1 -1
- package/dist/components/OrgHealth/OrgHealthPage.esm.js +2 -0
- package/dist/components/OverviewPage/OverviewPageHeader.esm.js +1 -1
- package/dist/components/RoutingPage/RoutingPage.esm.js +1 -1
- package/dist/components/RuleResult/BranchResultComponent.esm.js +1 -1
- package/dist/components/TechHealth/Filters/FacetFilter.esm.js +1 -1
- package/dist/components/TechHealth/Filters/FilterProvider.esm.js +1 -1
- package/dist/components/TechHealthTabs/PassRateTabHeader.esm.js +1 -1
- package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackBadgeTypeSelect/TrackBadgeTypeSelect.esm.js +1 -1
- package/dist/components/TrackForm/Steps/TrackDetailsStep/TrackOwnerSelect/TrackOwnerSelect.esm.js +1 -1
- package/dist/components/TracksPage/TracksPage.esm.js +1 -1
- package/dist/graphql/generated/index.esm.js +93 -54
- package/dist/hooks/certifications/useCertificationDetailsForTrack.esm.js +1 -1
- package/dist/hooks/checks/useSetManualResult.esm.js +2 -0
- package/dist/hooks/exemptions/useDeleteExemption.esm.js +2 -0
- package/dist/hooks/exemptions/useGetExemption.esm.js +2 -0
- package/dist/hooks/exemptions/useSetEntityExempt.esm.js +2 -0
- package/dist/hooks/facets/useFacetFilters.esm.js +1 -1
- package/dist/hooks/graphqlKeys.esm.js +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/utils/export.esm.js +3 -3
- package/package.json +21 -21
- package/dist/components/CheckDetails/ExemptionDetails.esm.js +0 -2
- package/dist/components/CheckDryRun/checkDryRunUtils.esm.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{stringifyEntityRef as
|
|
1
|
+
import{stringifyEntityRef as x}from"@backstage/catalog-model";import{EntityListProvider as k}from"@backstage/plugin-catalog-react";import{makeStyles as v,Typography as h}from"@material-ui/core";import{isEqual as S,pickBy as F}from"lodash";import t,{useMemo as b}from"react";import{useFormContext as p}from"react-hook-form";import"../../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as w}from"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"../../../contexts/UserProvider.esm.js";import{CheckDryRun as T}from"../../CheckDryRun/CheckDryRun.esm.js";import"../../SoundcheckDialog/SoundcheckDialog.esm.js";import"../../CheckDryRun/CheckDryRunDetails.esm.js";import{CheckDryRunProvider as C}from"../../CheckDryRun/CheckDryRunContext.esm.js";import{mapToCheckerInput as D}from"../utils/checkFormUtils.esm.js";import{ExpandableSection as R}from"../../ExpandableSection/ExpandableSection.esm.js";import{FilterPreviewTable as A}from"../../Filter/FilterPreviewTable/FilterPreviewTable.esm.js";import{emptyFilters as n,emptyKeyValueFilters as c}from"../../Filter/types.esm.js";import{FormattedPreview as V}from"../../FormattedPreview/FormattedPreview.esm.js";const I=v(e=>({container:{display:"flex",flexDirection:"column",gap:e.spacing(2)},preview:{color:e.palette.text.primary,fontSize:e.typography.body1.fontSize,borderTop:`1px solid ${e.palette.divider}`,overflow:"auto",padding:e.spacing(1,2),maxHeight:420,"& pre":{marginTop:0,background:`${e.palette.background.paper} !important`}},previewSection:{marginBottom:e.spacing(2)}})),N=()=>{const e=I(),{getValues:r}=p(),{selectedItem:o}=w(),i=D(r(),o),m=r("filtersStep.filter"),s=r("filtersStep.keyValueFilter"),d=r("filtersStep.excludeFilter"),u=r("filtersStep.excludeKeyValueFilter"),y=S(m,n()),{watch:f}=p(),a=f("detailsStep.type")==="manual";a&&delete i.rule;const E=b(()=>{const l={...i,id:o?i.id:"<ID WILL BE GENERATED WHEN CHECK IS SAVED>"};return F(l,g=>!!g)},[i,o]);return t.createElement(C,null,t.createElement(h,{variant:"body2"},a?"Manual checks cannot be dry-run. These types of checks are meant to be executed manually by users.":"Take a moment to review your check and perform dry runs to ensure everything is working as expected before you save."),t.createElement("div",{className:e.container},t.createElement(R,{className:e.previewSection,title:"YAML"},t.createElement("div",{className:e.preview},t.createElement(V,{data:E,dataType:"yaml"}))),!a&&t.createElement(k,{pagination:{limit:10}},t.createElement(A,{title:`Test Against ${y?"Select Filters to Dry Run Against Applicable Entities":"Applicable Entities"}`,filter:m??n(),keyValueFilter:s??c(),excludeFilter:d??n(),excludeKeyValueFilter:u??c(),hideTags:!0,additionalColumns:[{title:"Dry Run",cellStyle:{padding:"0px 16px 0px 20px"},id:"dry-run",render:l=>t.createElement(t.Fragment,null,t.createElement(T,{check:i,entityRef:x(l)}))}]}))))};export{N as CheckReviewStep};
|
|
2
2
|
//# sourceMappingURL=CheckReviewStep.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Typography as
|
|
1
|
+
import{Typography as o,FormControlLabel as d,Checkbox as u}from"@material-ui/core";import{makeStyles as E}from"@material-ui/core/styles";import e from"react";import{useFormContext as c,Controller as h}from"react-hook-form";import"../../../contexts/TrackFormContext.esm.js";import{useCheckFormContext as f}from"../../../contexts/CheckFormContext.esm.js";import"../../../contexts/CampaignFormContext.esm.js";import"../../../contexts/UserProvider.esm.js";import{FormFieldLabel as C}from"../../FormFieldLabel/FormFieldLabel.esm.js";import"../FormFields/CheckNameInput/CheckNameInput.esm.js";import{PassFailMessageInput as v}from"../FormFields/PassFailMessageInput/PassFailMessageInput.esm.js";import"../../FormMarkdownInput/FormMarkdownInput.esm.js";import{CHECK_FIELDS as g}from"../utils/checkFormUtils.esm.js";import"../FormFields/TeamDetailsInput/TeamDetailsInput.esm.js";import"../FormFields/RuleInput/AddMenuButton.esm.js";import{RuleInputBox as k}from"../FormFields/RuleInput/RuleInputBox.esm.js";import"../FormFields/RuleInput/Expressions/ExpressionBox.esm.js";import"../FormFields/RuleInput/Expressions/ExpressionTypeToggle.esm.js";import"@material-ui/icons/Close";import"@material-ui/icons/Delete";import"@material-ui/icons/List";import"@spotify/backstage-plugin-soundcheck-common";import"@backstage/core-plugin-api";import"@tanstack/react-query";import"../../../api.esm.js";import"@material-ui/icons/Search";import"../../SoundcheckDialog/SoundcheckDialog.esm.js";import"../../FactExplorer/FactExplorer.esm.js";import"../../FactExplorer/FactExplorerContext.esm.js";import"../../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import"../FormFields/RuleInput/Conditions/styles.esm.js";import"@backstage/catalog-model";import"../../../hooks/graphqlKeys.esm.js";import"@backstage/plugin-catalog-react";import"../../../hooks/useSoundcheckAlert.esm.js";import"../../../hooks/useConfirmationModal.esm.js";import"react-router-dom";import"../FormFields/RuleInput/Conditions/ValueListInput.esm.js";import"../FormFields/RuleInput/Conditions/ConditionList.esm.js";import"../FormFields/CheckScheduleSection/ScheduleSection.esm.js";import{CheckPathResolverInput as y}from"../FormFields/CheckPathResolverInput.esm.js";const b=E(t=>({container:{display:"flex",flexDirection:"column",gap:t.spacing(2)},innerContainer:{display:"flex",flexDirection:"column"}})),x=()=>{const t=b(),{isLoading:p,isReadOnly:n}=f(),{control:i}=c(),{rules:m,warnings:a}=g.rulesStep,{watch:s}=c(),r=s("detailsStep.type");return e.createElement(e.Fragment,null,r==="manual"&&e.createElement("div",{className:t.container},e.createElement("div",{className:t.innerContainer},e.createElement(o,null,"Rules do not apply to manual checks. These types of checks are meant to have their state manually set by users, not executed by Soundcheck."))),(r==="default"||r===void 0||r===null)&&e.createElement("div",{className:t.container},e.createElement("div",{className:t.innerContainer},e.createElement(y,{control:i}),e.createElement("div",null,e.createElement(C,{title:m.name,docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/checks#rules"}),e.createElement(o,{variant:"caption"},m.description)),e.createElement(k,{disabled:n,name:"rulesStep.expressions",depth:0})),e.createElement(v,{control:i,isLoading:p,disabled:n}),e.createElement("div",{className:t.container},e.createElement("div",{className:t.innerContainer},e.createElement("div",null,e.createElement(o,{variant:"subtitle2"},a.name),e.createElement(o,{variant:"caption"},a.description)),e.createElement(h,{name:"rulesStep.warning",control:i,render:({field:l})=>e.createElement(d,{disabled:n,control:e.createElement(u,{checked:l.value,onChange:l.onChange}),label:a.label})})))))};export{x as CheckRulesStep};
|
|
2
2
|
//# sourceMappingURL=CheckRulesStep.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{zodResolver as
|
|
1
|
+
import{zodResolver as a}from"@hookform/resolvers/zod";import{useForm as u}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 l}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 d,mapToCheckerInput as h,DEFAULT_FORM_VALUES as C}from"./utils/checkFormUtils.esm.js";import{manualCheckFormSchema as S,defaultCheckFormSchema as k}from"./utils/validation.esm.js";const F=p=>{const{selectedItem:r}=c(),{userEntityRef:m}=l();let e=C;r&&(e=d(r)),m&&!e.detailsStep.ownerEntityRef&&(e.detailsStep.ownerEntityRef=m);const s=u({defaultValues:e,mode:"onChange",resolver:(o,t,i)=>o.detailsStep.type==="manual"?a(S)(o,t,i):a(k)(o,t,i)}),{showModal:n}=f();return{formMethods:s,onSubmit:async o=>{if(!await n({title:"Save Check",message:`Are you sure you want to save check: ${o.detailsStep.name}?`,error:!1}))return;const t=h(o,r);p(t)}}};export{F as useCheckForm};
|
|
2
2
|
//# sourceMappingURL=useCheckForm.esm.js.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{FrequencySchema as
|
|
2
|
-
For example, selecting an include filter of 'Kind' as 'Component' and an exclude filter of 'Type' as 'Service' will select all entities with kind Component where type is NOT Service.`},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{K as CHECK_FIELDS,q as DEFAULT_FORM_VALUES,c as generateJsonPaths,V as mapCheckerToFormValues,u as mapExpressionToRule,
|
|
1
|
+
import{FrequencySchema as C}from"@spotify/backstage-plugin-soundcheck-common";import{isObject as R}from"lodash";import{v4 as O}from"uuid";import{mapInputFilterToFormFilters as x,mapCatalogFilterToFormKeyValueFilters as g,mapFiltersToCatalogFilter as h}from"../../Filter/utils.esm.js";import"../../Filter/FilterComponent.esm.js";import{emptyFilters as v,emptyKeyValueFilters as F}from"../../Filter/types.esm.js";import{TimeUnit as w}from"../../Frequency/types.esm.js";import{isTimeUnit as A}from"../../Frequency/util.esm.js";import"../../Frequency/FrequencyComponent.esm.js";import{ExpressionType as l}from"../types/ExpressionType.esm.js";import{defaultSchedule as P}from"../types/Schedule.esm.js";import"../types/Path.esm.js";import{CHECK_NAME_MAX_LENGTH as M}from"./validation.esm.js";const k=e=>{if(R(e)&&"frequency"in e){const r=C.safeParse(e.frequency);if(r.success){const t=r.data;if("cron"in t)return{enabled:!0,frequency:{type:"cron",unit:w.Hours,value:1,cron:t.cron}};const o=Object.keys(t);if(o.length){const s=o[0];if(A(s))return{enabled:!0,frequency:{type:"HumanDuration",unit:s,value:t[s]??1,cron:""}}}}}return{enabled:!1,frequency:{type:"HumanDuration",unit:w.Hours,value:1,cron:""}}},S=(e,r)=>{const{enabled:t,frequency:o}=e;if(t){const{cron:s,type:i,unit:a,value:p}=o;return i==="HumanDuration"?{frequency:{[a]:p},filter:h(r)}:{frequency:{cron:s}}}},m=e=>{if(Array.isArray(e))return e.map(r=>m(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},u=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:m(t.value)}))};return e.expressions&&e.expressions.forEach(t=>{r[e.expressionType]?.push(u(t))}),r}if(e.expressions)return e.expressions.map(u);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:m(r.value)}}return{}},T=e=>{if(e?.match(/.:./)){const r=e.split(":");if(["all","any","none"].includes(r[0]))return{operator:r[1],operatorPrefix:r[0]}}return{}},y=(e,r=!0)=>{if(!e)return{conditions:[]};const t=Object.keys(e);let o=t.includes("all")||r&&!t.includes("any")?l.AllOf:l.AnyOf;if(t.includes("not")&&(o=l.Not),t.includes(o)||r){const a=e[o]||[e],p=[],f=[];return a.forEach(n=>{const d=Object.keys(n);if(d.includes("all")||d.includes("any")||d.includes("not"))f.push(y(n,!1));else{const{operator:b,operatorPrefix:E}=T(n.operator);p.push({factRef:n.factRef,path:n.path,operator:b??n.operator,value:n.value,operatorPrefix:E})}}),{expressions:f.length>0?f:void 0,conditions:p,expressionType:o}}const{operator:s,operatorPrefix:i}=T(e.operator);return{expressionType:l.AllOf,conditions:[{factRef:e.factRef,path:e.path,operator:s??e.operator,value:e.value,operatorPrefix:i}]}},V=e=>({detailsStep:{name:e.name??"",description:e.description??"",ownerEntityRef:e.ownerEntityRef??"",type:e.type??"default"},rulesStep:{pathResolver:e.pathResolver??"jsonpath",expressions:y(e.rule),passedMessage:e.passedMessage??void 0,failedMessage:e.failedMessage??void 0,warning:e.warning??!1},filtersStep:{filter:x(e.filter),keyValueFilter:g(e.filter),excludeFilter:x(e.exclude),excludeKeyValueFilter:g(e.exclude)},scheduleStep:{schedule:k(e.schedule)}}),N=(e,r)=>{const{detailsStep:t,rulesStep:o,filtersStep:s,scheduleStep:i}=e;return{id:r?r.id:O(),ownerEntityRef:t.ownerEntityRef??void 0,name:t.name,description:t.description,pathResolver:o.pathResolver,passedMessage:o.passedMessage??void 0,failedMessage:o.failedMessage??void 0,rule:t.type==="manual"?void 0:u(o.expressions),warning:o.warning??!1,filter:s.filter||s.keyValueFilter?h(s.filter,s.keyValueFilter):void 0,exclude:s.excludeFilter||s.excludeKeyValueFilter?h(s.excludeFilter,s.excludeKeyValueFilter):void 0,schedule:S(i.schedule,s.filter),type:t.type}},c=(e,r="$")=>{const t=[];if(e.type==="object"&&e.properties){const o=e.properties;for(const s in o)if(o.hasOwnProperty(s)){const i=`${r}.${s}`;t.push(i);const a=o[s];t.push(...c(a,i))}}if(e.type==="array"&&e.items){const o=`${r}[*]`;t.push(o);const s=Array.isArray(e.items)?e.items:[e.items];for(const i of s)t.push(...c(i,o))}if(e.oneOf){const o=Array.isArray(e.oneOf)?e.oneOf:[e.oneOf];for(const s of o)t.push(...c(s,r))}if(e.allOf){const o=Array.isArray(e.allOf)?e.allOf:[e.allOf];for(const s of o)t.push(...c(s,r))}return[...new Set(t)]},q={detailsStep:{name:"",description:"",ownerEntityRef:"",type:"default"},rulesStep:{pathResolver:"jsonpath",expressions:{expressionType:l.AllOf,expressions:void 0,conditions:[{factRef:"",path:"",operator:"",operatorPrefix:"",value:"",conditions:[]}]},warning:!1},filtersStep:{filter:v(),keyValueFilter:F(),excludeFilter:v(),excludeKeyValueFilter:F()},scheduleStep:{schedule:P()}},K={details:{name:{name:"Check name",helperText:`Max ${M} 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"},type:{name:"Check Type",selectLabel:"Choose the type of check."}},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:`Use the filters below to narrow the scope of the Check. Only Entities that match the selected include and exclude filters will be applicable to the Check. Exclude filters must be used with with an include filter.
|
|
2
|
+
For example, selecting an include filter of 'Kind' as 'Component' and an exclude filter of 'Type' as 'Service' will select all entities with kind Component where type is NOT Service.`},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{K as CHECK_FIELDS,q as DEFAULT_FORM_VALUES,c as generateJsonPaths,V as mapCheckerToFormValues,u as mapExpressionToRule,k as mapInputScheduleToSchedule,y as mapRuleToExpression,S as mapScheduleToInputSchedule,N as mapToCheckerInput};
|
|
3
3
|
//# sourceMappingURL=checkFormUtils.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{CheckMessagingSchema as
|
|
1
|
+
import{CheckMessagingSchema as p,DefaultCheckDetailsSchema as m,ManualCheckDetailsSchema as f,parseFactRef as u}from"@spotify/backstage-plugin-soundcheck-common";import{z as e}from"zod";import{FrequencySchema as d,formFiltersSchema as a}from"../../../utils/validation.esm.js";import{ExpressionType as r}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 i=t=>{try{return u(t),!0}catch{return"Invalid fact reference. [source]:[scope]/[name]."}},h=100,o=async t=>{if(!await i(t))throw new Error("Fact reference validation failed");return t},n=e.union([e.string().min(1,"Required"),e.number(),e.boolean()]),s=e.lazy(()=>e.strictObject({factRef:e.string().refine(o,{message:"Valid format: [source]:[scope]/[name]"}),path:e.string().min(1,"Required"),operator:e.string().min(1,"Required"),operatorPrefix:e.string().optional().nullable(),value:n.or(e.array(n).min(1,"Required")).or(e.strictObject({factRef:e.string().refine(o,{message:"Valid format: [source]:[scope]/[name]"}),path:e.string().min(1,"Required")})),conditions:e.array(s).optional()})),c=e.lazy(()=>e.strictObject({expressionType:e.enum([r.AllOf,r.AnyOf,r.Not]).optional(),expressions:e.array(c).optional(),conditions:e.array(s).optional()})),S=e.strictObject({expressions:c,pathResolver:e.string().optional()}).merge(p),y=e.strictObject({enabled:e.boolean(),frequency:d}),l=e.strictObject({schedule:y.optional()}),b=e.strictObject({detailsStep:m,rulesStep:S,filtersStep:a,scheduleStep:l}),g=e.strictObject({detailsStep:f,rulesStep:e.any(),filtersStep:a,scheduleStep:l});export{h as CHECK_NAME_MAX_LENGTH,b as defaultCheckFormSchema,g as manualCheckFormSchema,i as validateFactRef};
|
|
2
2
|
//# sourceMappingURL=validation.esm.js.map
|
package/dist/components/CollectorPage/Configurators/AzureDevOps/NumberOfWorkItemsComponent.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as h,Box as b,Grid as o,Typography as s,TextField as u,FormHelperText as y,IconButton as g}from"@material-ui/core";import I from"@material-ui/icons/Add";import T from"@material-ui/icons/Remove";import
|
|
1
|
+
import{makeStyles as h,Box as b,Grid as o,Typography as s,TextField as u,FormHelperText as y,IconButton as g}from"@material-ui/core";import I from"@material-ui/icons/Add";import T from"@material-ui/icons/Remove";import v from"classnames";import{highlight as N,languages as C}from"prismjs";import"prismjs/components/prism-sql";import e from"react";import{useFormContext as q,useFieldArray as F,Controller as c}from"react-hook-form";import k from"react-simple-code-editor";import{FormFieldLabel as S}from"../../../FormFieldLabel/FormFieldLabel.esm.js";import*as L from"../Common/css/prism-dark-sql.css.esm.js";import{numberOfWorkItemsDataConfig as $}from"./utils.esm.js";const w=h(t=>({...L,root:{paddingTop:t.spacing(1)},factNameInput:{marginTop:0,width:"450px"},labelInput:{marginTop:0,width:"255px"},labelInputArea:{height:"40px"},queryInput:{marginTop:0,width:"420px",minHeight:"40px",maxHeight:"300px",overflowY:"scroll",outline:`1px solid ${t.palette.action.disabled}`,borderRadius:"4px",display:"grid","&:hover":{outlineColor:t.palette.textContrast}},queryInputError:{outlineColor:t.palette.error.main,"&:hover":{outlineColor:t.palette.error.main}},queryTextarea:{outline:"none"},helperText:{marginLeft:0},caption:{margin:t.spacing(2,0)}})),H=({name:t,disabled:n})=>{const r=w(),{control:m}=q(),{fields:d,insert:x,remove:E}=F({control:m,name:`${t}.data`});return e.createElement(b,{className:r.root},e.createElement(c,{name:`${t}.factName`,control:m,render:({field:p,fieldState:{error:a}})=>e.createElement(o,{item:!0},e.createElement(s,{variant:"subtitle2"},"Fact Name"),e.createElement(u,{...p,type:"text",variant:"outlined",margin:"dense",placeholder:"Fact Name",className:r.factNameInput,disabled:n,error:!!a,helperText:a?.message??"Fact name must be unique",FormHelperTextProps:{className:r.helperText}}))}),e.createElement("div",{className:r.caption},e.createElement(s,{variant:"subtitle1"},"Queries"),e.createElement(s,{variant:"caption"},"List the WIQL syntax queries to filter work items by")),e.createElement(o,{container:!0,spacing:0,direction:"column"},d.map((p,a)=>e.createElement(o,{item:!0,container:!0,spacing:2,key:p.id},e.createElement(o,{item:!0},e.createElement(s,{variant:"subtitle2"},"Label"),e.createElement(c,{name:`${t}.data.${a}.name`,control:m,render:({field:i,fieldState:{error:l}})=>e.createElement(u,{...i,type:"text",variant:"outlined",margin:"dense",placeholder:"Label",className:r.labelInput,disabled:n,error:!!l,helperText:l?.message??" ",InputProps:{className:r.labelInputArea},FormHelperTextProps:{className:r.helperText}})})),e.createElement(o,{item:!0},e.createElement(S,{title:"WIQL Query",docLink:"https://learn.microsoft.com/en-us/azure/devops/boards/queries/wiql-syntax?view=azure-devops"}),e.createElement(c,{name:`${t}.data.${a}.query`,control:m,render:({field:i,fieldState:{error:l}})=>e.createElement(e.Fragment,null,e.createElement("div",{className:v(r.queryInput,l?r.queryInputError:void 0)},e.createElement(k,{...i,highlight:f=>N(f,C.sql,"sql"),onValueChange:i.onChange,padding:10,disabled:n,placeholder:"Example: SELECT [System.Id] FROM WorkItem",textareaClassName:r.queryTextarea})),e.createElement(y,{className:r.helperText,error:!!l},l?.message??" "))})),e.createElement(o,{item:!0,alignContent:"center"},e.createElement(g,{onClick:()=>E(a),disabled:n||d.length===1},e.createElement(T,{fontSize:"small"})),e.createElement(g,{onClick:()=>x(a+1,$()),disabled:n},e.createElement(I,{fontSize:"small"})))))))};export{H as NumberOfWorkItemsComponent};
|
|
2
2
|
//# sourceMappingURL=NumberOfWorkItemsComponent.esm.js.map
|
package/dist/components/CollectorPage/Configurators/BigQuery/QueryFactDetailsComponent.esm.js
CHANGED
|
@@ -1,2 +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
|
|
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 C from"@material-ui/icons/Add";import N from"@material-ui/icons/Remove";import v from"classnames";import{highlight as S,languages as F}from"prismjs";import"prismjs/components/prism-sql";import e from"react";import{useFormContext as I,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"../Common/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}=I(),{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=>S(c,F.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(N,{fontSize:"small"})),e.createElement(E,{onClick:()=>g(t+1,H),disabled:o},e.createElement(C,{fontSize:"small"})))))))};export{w as QueryFactDetailsComponent};
|
|
2
2
|
//# sourceMappingURL=QueryFactDetailsComponent.esm.js.map
|
package/dist/components/CollectorPage/Configurators/Github/CodeScanningAlertsFactDetails.esm.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Typography as m,Box as i,TextField as p}from"@material-ui/core";import e from"react";import{useFormContext as N,Controller as s}from"react-hook-form";import{FormControlledAutocomplete as d}from"../../../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import"@material-ui/icons/CheckBox";import"@material-ui/icons/CheckBoxOutlineBlank";import"@material-ui/lab";import"../../../ListboxVirtualized/ListboxVirtualized.esm.js";import{useLabelOptions as E}from"../../../FormControlledAutocomplete/useLabelOptions.esm.js";import{FormFieldLabel as c}from"../../../FormFieldLabel/FormFieldLabel.esm.js";import{useStyles as S}from"./GithubConfigurator.esm.js";import{CODE_SCANNING_ALERTS_STATE_OPTIONS as T,CODE_SCANNING_ALERTS_SEVERITY_OPTIONS as v}from"./types.esm.js";const x=({name:r,disabled:o})=>{const l=S(),{control:n}=N(),f=E(T.map(t=>({label:t,value:t}))),u=E(v.map(t=>({label:t,value:t})));return e.createElement("div",{className:l.root},e.createElement(c,{title:"Fact Name"}),e.createElement(m,{variant:"caption"},"Fact name must be unique"),e.createElement(i,null,e.createElement(s,{name:`${r}.factName`,control:n,render:({field:t,fieldState:{error:a}})=>e.createElement(p,{...t,type:"text",variant:"outlined",margin:"dense",placeholder:"Fact Name",className:l.formInput,disabled:o,error:!!a,helperText:a?.message,FormHelperTextProps:{className:l.helperText}})})),e.createElement(c,{title:"Code Scanning Tool Name"}),e.createElement(m,{variant:"caption"},"Optional, if not provided results by all code scanning tools will be collected"),e.createElement(i,null,e.createElement(s,{name:`${r}.toolName`,control:n,render:({field:t,fieldState:{error:a}})=>e.createElement(p,{...t,type:"text",variant:"outlined",margin:"dense",placeholder:"Example: CodeQL",className:l.formInput,disabled:o,error:!!a,helperText:a?.message,FormHelperTextProps:{className:l.helperText}})})),e.createElement(c,{title:"Code Scanning Alert State"}),e.createElement(m,{variant:"caption"},"Optional, if not provided code scanning alerts with all states will be collected"),e.createElement(i,{className:l.formInput},e.createElement(d,{name:`${r}.state`,control:n,fullWidth:!0,freeSolo:!1,disabled:o,placeholder:"Example: open",...f})),e.createElement(c,{title:"Code Scanning Alert Severity"}),e.createElement(m,{variant:"caption"},"Optional, if not provided code scanning alerts with all severities will be collected"),e.createElement(i,{className:l.formInput},e.createElement(d,{name:`${r}.severity`,control:n,fullWidth:!0,freeSolo:!1,disabled:o,placeholder:"Example: critical",...u})))};export{x as CodeScanningAlertsFactDetails};
|
|
2
|
+
//# sourceMappingURL=CodeScanningAlertsFactDetails.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Typography as m,Box as i,TextField as f}from"@material-ui/core";import e from"react";import{useFormContext as u,Controller as b}from"react-hook-form";import"../../../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import{FormControlledMultipleAutocomplete as c}from"../../../FormControlledAutocomplete/FormControlledMultipleAutocomplete.esm.js";import{useLabelOptions as s}from"../../../FormControlledAutocomplete/useLabelOptions.esm.js";import"@material-ui/lab";import"../../../ListboxVirtualized/ListboxVirtualized.esm.js";import{FormFieldLabel as n}from"../../../FormFieldLabel/FormFieldLabel.esm.js";import{useStyles as T}from"./GithubConfigurator.esm.js";import{DEPENDABOT_ALERTS_STATE_OPTIONS as v,DEPENDABOT_ALERTS_SEVERITY_OPTIONS as N}from"./types.esm.js";const S=({name:a,disabled:r})=>{const l=T(),{control:o}=u(),d=s(v.map(t=>({label:t,value:t}))),E=s(N.map(t=>({label:t,value:t})));return e.createElement("div",{className:l.root},e.createElement(n,{title:"Fact Name"}),e.createElement(m,{variant:"caption"},"Fact name must be unique"),e.createElement(i,null,e.createElement(b,{name:`${a}.factName`,control:o,render:({field:t,fieldState:{error:p}})=>e.createElement(f,{...t,type:"text",variant:"outlined",margin:"dense",placeholder:"Fact Name",className:l.formInput,disabled:r,error:!!p,helperText:p?.message,FormHelperTextProps:{className:l.helperText}})})),e.createElement(n,{title:"Dependabot Alert States"}),e.createElement(m,{variant:"caption"},"Optional, if not provided dependabot alerts with all states will be collected"),e.createElement(i,{className:l.formInput},e.createElement(c,{name:`${a}.states`,control:o,fullWidth:!0,freeSolo:!1,disabled:r,placeholder:"Example: open",...d})),e.createElement(n,{title:"Dependabot Alert Severities"}),e.createElement(m,{variant:"caption"},"Optional, if not provided dependabot alerts with all severities will be collected"),e.createElement(i,{className:l.formInput},e.createElement(c,{name:`${a}.severities`,control:o,fullWidth:!0,freeSolo:!1,disabled:r,placeholder:"Example: critical",...E})))};export{S as DependabotAlertsFactDetails};
|
|
2
|
+
//# sourceMappingURL=DependabotAlertsFactDetails.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as
|
|
1
|
+
import{zodResolver as E}from"@hookform/resolvers/zod";import{makeStyles as h,Paper as S,Divider as a}from"@material-ui/core";import e from"react";import{useForm as A,FormProvider as F}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 D}from"../../../../hooks/useNavigateBack.esm.js";import{useUpdateCollectorConfig as R}from"../../../../hooks/collectors/useUpdateCollectorConfig.esm.js";import{integrationsPageRouteRef as B}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 T}from"../../../SoundcheckHeader/useHeader.esm.js";import{FactCollectionConfig as r}from"../Common/FactCollectionConfig.esm.js";import{collectorHeaderContent as P,confirmationModalContent as w}from"../Common/utils.esm.js";import{CodeScanningAlertsFactDetails as G}from"./CodeScanningAlertsFactDetails.esm.js";import{DependabotAlertsFactDetails as N}from"./DependabotAlertsFactDetails.esm.js";import{SecretScanningAlertsFactDetails as x}from"./SecretScanningAlertsFactDetails.esm.js";import{SecurityAdvisoriesFactDetails as I}from"./SecurityAdvisoriesFactDetails.esm.js";import{mapConfigToGithubCollectorConfig as M,defaultGithubConfig as O,DEFAULT_NEW_COLLECTOR_CONFIG as n,mapGithubCollectorConfigToConfig as _}from"./utils.esm.js";import{githubCollectorFormSchema as k}from"./validation.esm.js";const p=h(t=>({spacer:{height:t.spacing(8),width:"100%"},section:{marginBottom:t.spacing(2)},form:{marginBottom:t.spacing(2)},root:{paddingTop:t.spacing(1)},formInput:{marginTop:0,marginBottom:t.spacing(2),width:"500px"},helperText:{marginLeft:0}})),H=({disabled:t,selectedCollector:i})=>{const l=A({defaultValues:i?M(i.config):O(),mode:"onChange",resolver:E(k)}),{formState:{errors:o},handleSubmit:s}=l,c=p(),d=!!o.branchProtections||!!o.branchRules||!!o.codeScanningAlerts||!!o.dependabotAlerts||!!o.repositoryDetails||!!o.repositoryLanguages||!!o.secretScanningAlerts||!!o.securityAdvisories,{mutateAsync:u}=R(),[f,g]=D(B),{showModal:b}=v(),m=async C=>{if(!await b(w(i)))return;const y=_(C);await u({collectorId:i.id,config:y})&&g()};return T(P(i)),e.createElement(e.Fragment,null,e.createElement(S,{className:c.form},e.createElement(F,{...l},e.createElement("form",{onSubmit:s(m)},e.createElement(r,{name:"branchProtections",label:"Branch Protections",description:"Collects branch protection information from an entity's repository.",disabled:t}),e.createElement(a,null),e.createElement(r,{name:"branchRules",label:"Branch Rules",description:"Collects branch rules information from an entity's repository.",disabled:t}),e.createElement(a,null),e.createElement(r,{name:"codeScanningAlerts",label:"Code Scanning Alerts",description:"Collects details about code scanning alerts for an entity's repository.",disabled:t,FactDetailsComponent:G,multipleCollectors:{enable:!0,defaultConfig:n}}),e.createElement(a,null),e.createElement(r,{name:"dependabotAlerts",label:"Dependabot Alerts",description:"Collects details about dependabot alerts for an entity's repository.",disabled:t,FactDetailsComponent:N,multipleCollectors:{enable:!0,defaultConfig:n}}),e.createElement(a,null),e.createElement(r,{name:"repositoryDetails",label:"Repository Details",description:"Collects details about an entity's repository.",disabled:t}),e.createElement(a,null),e.createElement(r,{name:"repositoryLanguages",label:"Repository Languages",description:"Collects details about the languages used in an entity's repository.",disabled:t}),e.createElement(a,null),e.createElement(r,{name:"secretScanningAlerts",label:"Secret Scanning Alerts",description:"Collects details about secret scanning alerts for an entity's repository.",disabled:t,FactDetailsComponent:x,multipleCollectors:{enable:!0,defaultConfig:n}}),e.createElement(a,null),e.createElement(r,{name:"securityAdvisories",label:"Security Advisories",description:"Collects details about security advisories for an entity's repository.",disabled:t,FactDetailsComponent:I,multipleCollectors:{enable:!0,defaultConfig:n}})))),e.createElement("div",{className:c.section},e.createElement(L,{onCancel:f,saveButtonText:"Save",isLoading:!1,onSave:s(m),disableSave:d})))};export{H as GithubConfigurator,p as useStyles};
|
|
2
2
|
//# sourceMappingURL=GithubConfigurator.esm.js.map
|
package/dist/components/CollectorPage/Configurators/Github/SecretScanningAlertsFactDetails.esm.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Typography as n,Box as m,TextField as E}from"@material-ui/core";import e from"react";import{useFormContext as f,Controller as S}from"react-hook-form";import{FormControlledAutocomplete as u}from"../../../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import{FormControlledMultipleAutocomplete as N}from"../../../FormControlledAutocomplete/FormControlledMultipleAutocomplete.esm.js";import{useLabelOptions as p}from"../../../FormControlledAutocomplete/useLabelOptions.esm.js";import"@material-ui/lab";import"../../../ListboxVirtualized/ListboxVirtualized.esm.js";import{FormFieldLabel as i}from"../../../FormFieldLabel/FormFieldLabel.esm.js";import{useStyles as T}from"./GithubConfigurator.esm.js";import{SECRET_SCANNING_ALERTS_STATE_OPTIONS as v,SECRET_SCANNING_ALERTS_VALIDITY_OPTIONS as b}from"./types.esm.js";const A=({name:a,disabled:r})=>{const l=T(),{control:o}=f(),s=p(v.map(t=>({label:t,value:t}))),d=p(b.map(t=>({label:t,value:t})));return e.createElement("div",{className:l.root},e.createElement(i,{title:"Fact Name"}),e.createElement(n,{variant:"caption"},"Fact name must be unique"),e.createElement(m,null,e.createElement(S,{name:`${a}.factName`,control:o,render:({field:t,fieldState:{error:c}})=>e.createElement(E,{...t,type:"text",variant:"outlined",margin:"dense",placeholder:"Fact Name",className:l.formInput,disabled:r,error:!!c,helperText:c?.message,FormHelperTextProps:{className:l.helperText}})})),e.createElement(i,{title:"Secret Scanning Alert State"}),e.createElement(n,{variant:"caption"},"Optional, if not provided secret scanning alerts with all states will be collected"),e.createElement(m,{className:l.formInput},e.createElement(u,{name:`${a}.state`,control:o,fullWidth:!0,freeSolo:!1,disabled:r,placeholder:"Example: open",...s})),e.createElement(i,{title:"Secret Scanning Alert Validities"}),e.createElement(n,{variant:"caption"},"Optional, if not provided secret scanning alerts with all validities will be collected"),e.createElement(m,{className:l.formInput},e.createElement(N,{name:`${a}.validities`,control:o,fullWidth:!0,freeSolo:!1,disabled:r,placeholder:"Example: active",...d})))};export{A as SecretScanningAlertsFactDetails};
|
|
2
|
+
//# sourceMappingURL=SecretScanningAlertsFactDetails.esm.js.map
|
package/dist/components/CollectorPage/Configurators/Github/SecurityAdvisoriesFactDetails.esm.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{Typography as i,Box as n,TextField as p}from"@material-ui/core";import e from"react";import{useFormContext as d,Controller as u}from"react-hook-form";import{FormControlledAutocomplete as f}from"../../../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import"@material-ui/icons/CheckBox";import"@material-ui/icons/CheckBoxOutlineBlank";import"@material-ui/lab";import"../../../ListboxVirtualized/ListboxVirtualized.esm.js";import{useLabelOptions as E}from"../../../FormControlledAutocomplete/useLabelOptions.esm.js";import{FormFieldLabel as c}from"../../../FormFieldLabel/FormFieldLabel.esm.js";import{useStyles as S}from"./GithubConfigurator.esm.js";import{SECURITY_ADVISORIES_STATE_OPTIONS as F}from"./types.esm.js";const b=({name:o,disabled:a})=>{const t=S(),{control:l}=d(),s=E(F.map(r=>({label:r,value:r})));return e.createElement("div",{className:t.root},e.createElement(c,{title:"Fact Name"}),e.createElement(i,{variant:"caption"},"Fact name must be unique"),e.createElement(n,null,e.createElement(u,{name:`${o}.factName`,control:l,render:({field:r,fieldState:{error:m}})=>e.createElement(p,{...r,type:"text",variant:"outlined",margin:"dense",placeholder:"Fact Name",className:t.formInput,disabled:a,error:!!m,helperText:m?.message,FormHelperTextProps:{className:t.helperText}})})),e.createElement(c,{title:"Security Advisory State"}),e.createElement(i,{variant:"caption"},"Optional, if not provided security advisories with all states will be collected"),e.createElement(n,{className:t.formInput},e.createElement(f,{name:`${o}.state`,control:l,fullWidth:!0,freeSolo:!1,disabled:a,placeholder:"Example: published",...s})))};export{b as SecurityAdvisoriesFactDetails};
|
|
2
|
+
//# sourceMappingURL=SecurityAdvisoriesFactDetails.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const _="BranchProtections",E="branch_protections",T="BranchRules",A="branch_rules",S="CodeScanningAlerts",N="code_scanning_alerts",e="open",R=["open","closed","dismissed","fixed"],O=["critical","high","medium","low","warning","note","error"],C="DependabotAlerts",L="dependabot_alerts",i=["open"],s=["open","fixed","dismissed","auto_dismissed"],I=["critical","high","medium","low"],n="RepositoryDetails",o="repository_details",r="RepositoryLanguages",t="repository_languages",a="SecretScanningAlerts",D="secret_scanning_alerts",P="open",c=["open","resolved"],d=["active","inactive","unknown"],l="SecurityAdvisories",Y="security_advisories",p="published",G=["triage","draft","published","closed"];export{_ as BRANCH_PROTECTIONS_COLLECTOR_TYPE,E as BRANCH_PROTECTIONS_FACT_NAME,T as BRANCH_RULES_COLLECTOR_TYPE,A as BRANCH_RULES_FACT_NAME,S as CODE_SCANNING_ALERTS_COLLECTOR_TYPE,e as CODE_SCANNING_ALERTS_DEFAULT_STATE,N as CODE_SCANNING_ALERTS_FACT_NAME,O as CODE_SCANNING_ALERTS_SEVERITY_OPTIONS,R as CODE_SCANNING_ALERTS_STATE_OPTIONS,C as DEPENDABOT_ALERTS_COLLECTOR_TYPE,i as DEPENDABOT_ALERTS_DEFAULT_STATES,L as DEPENDABOT_ALERTS_FACT_NAME,I as DEPENDABOT_ALERTS_SEVERITY_OPTIONS,s as DEPENDABOT_ALERTS_STATE_OPTIONS,n as REPOSITORY_DETAILS_COLLECTOR_TYPE,o as REPOSITORY_DETAILS_FACT_NAME,r as REPOSITORY_LANGUAGES_COLLECTOR_TYPE,t as REPOSITORY_LANGUAGES_FACT_NAME,a as SECRET_SCANNING_ALERTS_COLLECTOR_TYPE,P as SECRET_SCANNING_ALERTS_DEFAULT_STATE,D as SECRET_SCANNING_ALERTS_FACT_NAME,c as SECRET_SCANNING_ALERTS_STATE_OPTIONS,d as SECRET_SCANNING_ALERTS_VALIDITY_OPTIONS,l as SECURITY_ADVISORIES_COLLECTOR_TYPE,p as SECURITY_ADVISORIES_DEFAULT_STATE,Y as SECURITY_ADVISORIES_FACT_NAME,G as SECURITY_ADVISORIES_STATE_OPTIONS};
|
|
2
|
+
//# sourceMappingURL=types.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{asArray as u}from"@spotify/backstage-plugin-soundcheck-common";import{defaultCollectorOption as
|
|
1
|
+
import{asArray as u}from"@spotify/backstage-plugin-soundcheck-common";import{defaultBaseCollectorOption as p,defaultCollectorOption as N}from"../Common/CollectorOption.esm.js";import{mapBackendConfigToFormIntegrationConfig as n,mapFormIntegrationConfigToBackendConfig as c}from"../Common/utils.esm.js";import{CODE_SCANNING_ALERTS_FACT_NAME as A,CODE_SCANNING_ALERTS_DEFAULT_STATE as P,DEPENDABOT_ALERTS_FACT_NAME as _,DEPENDABOT_ALERTS_DEFAULT_STATES as I,SECRET_SCANNING_ALERTS_FACT_NAME as g,SECRET_SCANNING_ALERTS_DEFAULT_STATE as F,SECURITY_ADVISORIES_FACT_NAME as m,SECURITY_ADVISORIES_DEFAULT_STATE as Y,BRANCH_PROTECTIONS_COLLECTOR_TYPE as D,BRANCH_RULES_COLLECTOR_TYPE as O,CODE_SCANNING_ALERTS_COLLECTOR_TYPE as S,DEPENDABOT_ALERTS_COLLECTOR_TYPE as R,REPOSITORY_DETAILS_COLLECTOR_TYPE as h,REPOSITORY_LANGUAGES_COLLECTOR_TYPE as L,SECRET_SCANNING_ALERTS_COLLECTOR_TYPE as b,SECURITY_ADVISORIES_COLLECTOR_TYPE as y,BRANCH_PROTECTIONS_FACT_NAME as G,BRANCH_RULES_FACT_NAME as U,REPOSITORY_DETAILS_FACT_NAME as B,REPOSITORY_LANGUAGES_FACT_NAME as M}from"./types.esm.js";const H={...p(),factDetails:{factName:""}},v=a=>({branchProtections:N(a),branchRules:N(a),codeScanningAlerts:{enabled:!1,collectors:[{...p(a),factDetails:{factName:A,state:P}}]},dependabotAlerts:{enabled:!1,collectors:[{...p(a),factDetails:{factName:_,states:I}}]},repositoryDetails:N(a),repositoryLanguages:N(a),secretScanningAlerts:{enabled:!1,collectors:[{...p(a),factDetails:{factName:g,state:F}}]},securityAdvisories:{enabled:!1,collectors:[{...p(a),factDetails:{factName:m,state:Y}}]}});function V(a){const{branchProtections:i,branchRules:l,codeScanningAlerts:o,dependabotAlerts:f,repositoryDetails:r,repositoryLanguages:d,secretScanningAlerts:T,securityAdvisories:E}=a;if(i.enabled||l.enabled||o.enabled||f.enabled||r.enabled||d.enabled||T.enabled||E.enabled){const C={},s=[];return C.collects=s,i.enabled&&s.push(c({factType:D,configOption:i,additionalParams:{factName:G}})),l.enabled&&s.push(c({factType:O,configOption:l,additionalParams:{factName:U}})),o.enabled&&o.collectors.forEach(e=>{s.push(c({factType:S,configOption:e,additionalParams:{factName:e.factDetails.factName,toolName:e.factDetails.toolName?.length?e.factDetails.toolName:void 0,state:e.factDetails.state?.length?e.factDetails.state:void 0,severity:e.factDetails.severity?.length?e.factDetails.severity:void 0}}))}),f.enabled&&f.collectors.forEach(e=>{s.push(c({factType:R,configOption:e,additionalParams:{factName:e.factDetails.factName,states:e.factDetails.states?.length?e.factDetails.states:void 0,severities:e.factDetails.severities?.length?e.factDetails.severities:void 0}}))}),r.enabled&&s.push(c({factType:h,configOption:r,additionalParams:{factName:B}})),d.enabled&&s.push(c({factType:L,configOption:d,additionalParams:{factName:M}})),T.enabled&&T.collectors.forEach(e=>{s.push(c({factType:b,configOption:e,additionalParams:{factName:e.factDetails.factName,state:e.factDetails.state?.length?e.factDetails.state:void 0,validities:e.factDetails.validities?.length?e.factDetails.validities:void 0}}))}),E.enabled&&E.collectors.forEach(e=>{s.push(c({factType:y,configOption:e,additionalParams:{factName:e.factDetails.factName,state:e.factDetails.state?.length?e.factDetails.state:void 0}}))}),C}return{collects:[]}}function k(a){const i=v(a);if(a){const l=a.collects;if(l){const o=u(l),f=o.find(t=>t.type===D);f&&(i.branchProtections={...n({parentConfig:a,factTypeConfig:f}),enabled:!0});const r=o.find(t=>t.type===O);r&&(i.branchRules={...n({parentConfig:a,factTypeConfig:r}),enabled:!0});const d=o.filter(t=>t.type===S);d.length&&(i.codeScanningAlerts={enabled:!0,collectors:d.map(t=>({...n({parentConfig:a,factTypeConfig:t}),factDetails:{factName:t.factName??A,toolName:t.toolName?.length?t.toolName:void 0,state:t.state?.length?t.state:void 0,severity:t.severity?.length?t.severity:void 0}}))});const T=o.filter(t=>t.type===R);T.length&&(i.dependabotAlerts={enabled:!0,collectors:T.map(t=>({...n({parentConfig:a,factTypeConfig:t}),factDetails:{factName:t.factName??_,states:t.states?.length?t.states:void 0,severities:t.severities?.length?t.severities:void 0}}))});const E=o.find(t=>t.type===h);E&&(i.repositoryDetails={...n({parentConfig:a,factTypeConfig:E}),enabled:!0});const C=o.find(t=>t.type===L);C&&(i.repositoryLanguages={...n({parentConfig:a,factTypeConfig:C}),enabled:!0});const s=o.filter(t=>t.type===b);s.length&&(i.secretScanningAlerts={enabled:!0,collectors:s.map(t=>({...n({parentConfig:a,factTypeConfig:t}),factDetails:{factName:t.factName??g,state:t.state?.length?t.state:void 0,validities:t.validities?.length?t.validities:void 0}}))});const e=o.filter(t=>t.type===y);e.length&&(i.securityAdvisories={enabled:!0,collectors:e.map(t=>({...n({parentConfig:a,factTypeConfig:t}),factDetails:{factName:t.factName??m,state:t.state?.length?t.state:void 0}}))})}}return i}export{H as DEFAULT_NEW_COLLECTOR_CONFIG,v as defaultGithubConfig,k as mapConfigToGithubCollectorConfig,V as mapGithubCollectorConfigToConfig};
|
|
2
2
|
//# sourceMappingURL=utils.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{validNameRegex as n}from"@spotify/backstage-plugin-soundcheck-common";import{z as e}from"zod";import{FIELD_IS_REQUIRED_MSG as m}from"../../../../utils/validation.esm.js";import{BaseCollectorSchema as A,CollectorOptionSchema as S}from"../Common/CollectorOption.esm.js";import{CODE_SCANNING_ALERTS_STATE_OPTIONS as d,CODE_SCANNING_ALERTS_SEVERITY_OPTIONS as _,DEPENDABOT_ALERTS_STATE_OPTIONS as E,DEPENDABOT_ALERTS_SEVERITY_OPTIONS as f,SECRET_SCANNING_ALERTS_STATE_OPTIONS as T,SECRET_SCANNING_ALERTS_VALIDITY_OPTIONS as I,SECURITY_ADVISORIES_STATE_OPTIONS as O,BRANCH_PROTECTIONS_FACT_NAME as u,BRANCH_RULES_FACT_NAME as b,REPOSITORY_DETAILS_FACT_NAME as g,REPOSITORY_LANGUAGES_FACT_NAME as p}from"./types.esm.js";const o="Fact name is not unique",r="The field contains forbidden characters",l="Max 100 characters",D=A.merge(e.object({factDetails:e.strictObject({factName:e.string().min(1,m).max(100,l).regex(n,r),toolName:e.string().optional(),state:e.enum(d).or(e.literal("")).optional(),severity:e.enum(_).or(e.literal("")).optional()})})).strict(),C=A.merge(e.object({factDetails:e.strictObject({factName:e.string().min(1,m).max(100,l).regex(n,r),states:e.array(e.enum(E)).optional(),severities:e.array(e.enum(f)).optional()})})).strict(),R=A.merge(e.object({factDetails:e.strictObject({factName:e.string().min(1,m).max(100,l).regex(n,r),state:e.enum(T).or(e.literal("")).optional(),validities:e.array(e.enum(I)).optional()})})).strict(),h=A.merge(e.object({factDetails:e.strictObject({factName:e.string().min(1,m).max(100,l).regex(n,r),state:e.enum(O).or(e.literal("")).optional()})})).strict(),y=e.strictObject({branchProtections:S,branchRules:S,codeScanningAlerts:e.strictObject({enabled:e.boolean(),collectors:e.array(D)}),dependabotAlerts:e.strictObject({enabled:e.boolean(),collectors:e.array(C)}),repositoryDetails:S,repositoryLanguages:S,secretScanningAlerts:e.strictObject({enabled:e.boolean(),collectors:e.array(R)}),securityAdvisories:e.strictObject({enabled:e.boolean(),collectors:e.array(h)})}).superRefine((c,i)=>{const N=[u,b,g,p,...c.codeScanningAlerts.collectors.map(t=>t.factDetails.factName),...c.dependabotAlerts.collectors.map(t=>t.factDetails.factName),...c.secretScanningAlerts.collectors.map(t=>t.factDetails.factName),...c.securityAdvisories.collectors.map(t=>t.factDetails.factName)],s=N.filter((t,a)=>N.indexOf(t)!==a);s.length&&(c.codeScanningAlerts.collectors.forEach((t,a)=>{s.includes(t.factDetails.factName)&&i.addIssue({code:e.ZodIssueCode.custom,message:o,path:["codeScanningAlerts","collectors",a,"factDetails","factName"]})}),c.dependabotAlerts.collectors.forEach((t,a)=>{s.includes(t.factDetails.factName)&&i.addIssue({code:e.ZodIssueCode.custom,message:o,path:["dependabotAlerts","collectors",a,"factDetails","factName"]})}),c.secretScanningAlerts.collectors.forEach((t,a)=>{s.includes(t.factDetails.factName)&&i.addIssue({code:e.ZodIssueCode.custom,message:o,path:["secretScanningAlerts","collectors",a,"factDetails","factName"]})}),c.securityAdvisories.collectors.forEach((t,a)=>{s.includes(t.factDetails.factName)&&i.addIssue({code:e.ZodIssueCode.custom,message:o,path:["securityAdvisories","collectors",a,"factDetails","factName"]})}))});export{o as FACT_NAME_IS_NOT_UNIQUE_MSG,r as INVALID_CHARACTERS_MSG,l as MAX_100_CHARACTERS_MSG,y as githubCollectorFormSchema};
|
|
2
|
+
//# sourceMappingURL=validation.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Grid as a,TextField as p,MenuItem as f,FormHelperText as x,Typography as y,IconButton as g}from"@material-ui/core";import T from"@material-ui/icons/Add";import k from"@material-ui/icons/Remove";import q from"classnames";import{highlight as
|
|
1
|
+
import{Grid as a,TextField as p,MenuItem as f,FormHelperText as x,Typography as y,IconButton as g}from"@material-ui/core";import T from"@material-ui/icons/Add";import k from"@material-ui/icons/Remove";import q from"classnames";import{highlight as b,languages as N}from"prismjs";import"prismjs/components/prism-json";import e from"react";import{useFormContext as H,useFieldArray as I,Controller as s}from"react-hook-form";import v from"react-simple-code-editor";import{FormFieldLabel as m}from"../../../FormFieldLabel/FormFieldLabel.esm.js";import{useStyles as S}from"./RequestFactDetailsComponent.esm.js";import{HTTP_METHOD_OPTIONS as P,defaultNewHeaderConfig as F}from"./utils.esm.js";const $=({name:c,disabled:o})=>{const r=S(),{control:i}=H(),{fields:u,insert:h,remove:E}=I({control:i,name:`${c}.headers`});return e.createElement(a,{container:!0,spacing:1,direction:"column",className:r.root},e.createElement(a,{item:!0},e.createElement(m,{title:"Target Plugin ID (Optional)",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/http#request-required"}),e.createElement(s,{name:`${c}.targetPluginId`,control:i,render:({field:l,fieldState:{error:t}})=>e.createElement(p,{...l,fullWidth:!0,type:"text",variant:"outlined",margin:"dense",placeholder:"Example: soundcheck",className:r.textInput,disabled:o,error:!!t,helperText:t?.message??"Specify if calling a plugin's API to use {{targetPluginBaseUrl}} and {{targetPluginAuthToken}} template tags",FormHelperTextProps:{className:r.helperText}})})),e.createElement(a,{item:!0},e.createElement(m,{title:"Request URL",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/http#request-required"}),e.createElement(a,{container:!0,spacing:1,direction:"row"},e.createElement(a,{item:!0,xs:2},e.createElement(s,{name:`${c}.method`,control:i,render:({field:l,fieldState:{error:t}})=>e.createElement(p,{...l,fullWidth:!0,select:!0,type:"text",variant:"outlined",margin:"dense",placeholder:"Method",className:r.textInput,disabled:o,error:!!t,helperText:t?.message??"Method",FormHelperTextProps:{className:r.helperText}},P.map(n=>e.createElement(f,{key:n,value:n},n)))})),e.createElement(a,{item:!0,xs:10},e.createElement(s,{name:`${c}.url`,control:i,render:({field:l,fieldState:{error:t}})=>e.createElement(p,{...l,fullWidth:!0,type:"text",variant:"outlined",margin:"dense",placeholder:"Example: https://api.example.com/{{entity.metadata.name}}/get",className:r.textInput,disabled:o,error:!!t,helperText:t?.message??"Request URL can use liquid template language",FormHelperTextProps:{className:r.helperText}})})))),e.createElement(a,{item:!0},e.createElement(m,{title:"Request Body (Optional)",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/http#request-required"}),e.createElement(s,{name:`${c}.body`,control:i,render:({field:l,fieldState:{error:t}})=>e.createElement("div",null,e.createElement("div",{className:q(r.jsonInput,t?r.jsonInputError:void 0)},e.createElement(v,{...l,highlight:n=>b(n??"",N.json,"json"),onValueChange:l.onChange,padding:10,disabled:o,placeholder:"Request Body",textareaClassName:r.jsonTextarea})),e.createElement(x,{className:r.helperText,error:!!t},t?.message??"Request body can use liquid template language"))})),e.createElement(a,{item:!0},e.createElement(a,{container:!0,spacing:0,direction:"column"},e.createElement(m,{title:"Request Headers (Optional)",docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/http#request-required"}),e.createElement(y,{color:"textSecondary",variant:"caption"},"Header keys and values can use liquid template language"),u.map((l,t)=>e.createElement(a,{item:!0,container:!0,alignItems:"center",spacing:2,key:l.id},e.createElement(a,{item:!0,xs:5},e.createElement(m,{title:"Key"}),e.createElement(s,{name:`${c}.headers.${t}.key`,control:i,render:({field:n,fieldState:{error:d}})=>e.createElement(p,{...n,fullWidth:!0,type:"text",variant:"outlined",margin:"dense",placeholder:"Header Key",className:r.textInput,disabled:o,error:!!d,helperText:d?.message??" ",FormHelperTextProps:{className:r.helperText}})})),e.createElement(a,{item:!0,xs:5},e.createElement(m,{title:"Value"}),e.createElement(s,{name:`${c}.headers.${t}.value`,control:i,render:({field:n,fieldState:{error:d}})=>e.createElement(p,{...n,fullWidth:!0,type:"text",variant:"outlined",margin:"dense",placeholder:"Header Value",className:r.textInput,disabled:o,error:!!d,helperText:d?.message??" ",FormHelperTextProps:{className:r.helperText}})})),e.createElement(a,{item:!0,xs:2},e.createElement(g,{onClick:()=>E(t),disabled:o||u.length===1},e.createElement(k,{fontSize:"small"})),e.createElement(g,{onClick:()=>h(t+1,F()),disabled:o},e.createElement(T,{fontSize:"small"}))))))))};export{$ as HttpRequestComponent};
|
|
2
2
|
//# sourceMappingURL=HttpRequestComponent.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as h,Box as u,Chip as g,TextField as x,FormControlLabel as T,Checkbox as E}from"@material-ui/core";import C from"@material-ui/icons/CheckBox";import S from"@material-ui/icons/CheckBoxOutlineBlank";import{Autocomplete as
|
|
1
|
+
import{makeStyles as h,Box as u,Chip as g,TextField as x,FormControlLabel as T,Checkbox as E}from"@material-ui/core";import C from"@material-ui/icons/CheckBox";import S from"@material-ui/icons/CheckBoxOutlineBlank";import{Autocomplete as v}from"@material-ui/lab";import l,{useState as N,useEffect as k}from"react";import{ListboxVirtualized as I}from"../../../ListboxVirtualized/ListboxVirtualized.esm.js";import{HTTP_STATUSES as i}from"./utils.esm.js";const L=h(r=>({statusInput:{marginTop:0},statusChips:{marginBottom:r.spacing(1)},helperText:{marginLeft:0}})),z=({value:r,onChange:s,disabled:n,errors:p,helperText:d})=>{const m=L(),[o,c]=N(r??[]);k(()=>{s&&s(o.map(e=>Number(e)))},[o,s]);const b=(e,t)=>{c(o?.filter(a=>a!==t))},f=(e,t)=>{const a=t.length?t[t.length-1]:void 0;a&&isNaN(Number(a))||c(t)};return l.createElement(u,null,l.createElement(u,null,o.map(e=>l.createElement(g,{key:e,label:e,size:"small",className:m.statusChips,onDelete:t=>b(t,e),clickable:!1,disabled:n}))),l.createElement(v,{disableCloseOnSelect:!0,fullWidth:!0,multiple:!0,freeSolo:!0,popupIcon:null,renderTags:()=>null,disabled:n,options:i.map(e=>e.value),getOptionLabel:e=>i.find(t=>t.value===e)?.label??"",value:o,onChange:(e,t)=>f(e,t),ListboxComponent:I,ListboxProps:{itemHeight:40},renderInput:e=>l.createElement(x,{...e,variant:"outlined",margin:"dense",className:m.statusInput,placeholder:"Example: 500",disabled:n,error:!!p,helperText:p?.message??d,FormHelperTextProps:{className:m.helperText}}),renderOption:(e,{selected:t})=>l.createElement(T,{onClick:a=>a.preventDefault(),control:l.createElement(E,{icon:l.createElement(S,{fontSize:"small"}),checkedIcon:l.createElement(C,{fontSize:"small"}),checked:t,disabled:n}),label:i.find(a=>a.value===e)?.label??""})}))};export{z as HttpStatusesInput};
|
|
2
2
|
//# sourceMappingURL=HttpStatusesInput.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{asArray as x}from"@spotify/backstage-plugin-soundcheck-common";import{sumBy as C}from"lodash";import{defaultBaseCollectorOption as D}from"../Common/CollectorOption.esm.js";import{mapBackendConfigToFormIntegrationConfig as m,mapFormIntegrationConfigToBackendConfig as h}from"../Common/utils.esm.js";const d={name:"",path:""},y={name:"",type:"string"},g={name:"",jsonPath:"",type:"string"},N={factName:"",data:[d]},_={factName:"",path:"",regex:"",data:[]},L={factName:"",path:"",data:[g]},u=(t={})=>{const l=D(t);return{exists:{enabled:!1,collectors:[{factDetails:N,...l}]},regex:{enabled:!1,collectors:[{factDetails:_,...l}]},json:{enabled:!1,collectors:[{factDetails:L,...l}]}}},O={factDetails:{factName:{name:"Fact Name",helperText:"Fact name must be unique",placeholder:"Fact Name"},branch:{name:"Custom Branch (Optional)",helperText:"If omitted collects data from default branch",placeholder:"Example: develop"},filePath:{name:"File Path",helperText:"Path to the file whose content will be searched",placeholder:"Example: /catalog-info.yaml"},label:{name:"Label",placeholder:"Label"},type:{name:"Type",placeholder:"Type"},exists:{filesSection:{name:"Files",description:"List the files whose existence will be checked"}},regex:{regex:{name:"RegEx Pattern",helperText:"RegEx pattern to match",placeholder:"Example: ^apiVersion: backstage.io/(.+)"},flags:{name:"RegEx Flags (Optional)",helperText:"Allowed RegEx flags: g, i, m, s, u, y",placeholder:"Example: mi"},trueFalseMode:{label:"True / False Mode",description:"True / False Mode uses a RegEx to search for a match in the given file."},captureGroupsMode:{label:"Capture Groups Mode",description:"RegEx Capture Groups Mode allows the collector to associate capture groups within a RegEx to named values."},captureGroupsSection:{name:"Capture Groups",description:"Each element must correspond to a capture group in the given RegEx"}},json:{jsonPath:{name:"Json Path",placeholder:"Example: metadata.tags"},jsonElementsSection:{name:"JSON / YAML Elements",description:"List json / yaml paths from which to pull data from the given file"}}}},i="exists",f="regex",r="json",E=["string","number","integer","boolean","object"],T=E.map(b);function P(t){const{exists:l,regex:c,json:o}=t;if(l.collectors.length||c.collectors.length||o.collectors.length){const a={},n=[];return a.collects=n,l.enabled&&l.collectors.forEach(e=>{n.push(h({factType:i,configOption:e,additionalParams:{factName:e.factDetails.factName,branch:e.factDetails.branch?.length?e.factDetails.branch:void 0,data:e.factDetails.data}}))}),c.enabled&&c.collectors.forEach(e=>{n.push(h({factType:f,configOption:e,additionalParams:{factName:e.factDetails.factName,branch:e.factDetails.branch?.length?e.factDetails.branch:void 0,path:e.factDetails.path,regex:e.factDetails.regex,flags:e.factDetails.flags?.length?e.factDetails.flags:void 0,data:e.factDetails.data.length?e.factDetails.data:void 0}}))}),o.enabled&&o.collectors.forEach(e=>{n.push(h({factType:r,configOption:e,additionalParams:{factName:e.factDetails.factName,branch:e.factDetails.branch?.length?e.factDetails.branch:void 0,path:e.factDetails.path,data:e.factDetails.data.map(s=>T.includes(s.type)?{name:s.name,jsonPath:s.jsonPath,type:"array",items:{type:A(s.type)}}:s)}}))}),a}return{collects:[]}}const p=(t,l)=>C(t,({type:c})=>+(c===l));function F(t){const l=u(t),c=t?.collects;if(c&&c.length>0){const o=x(c);return{exists:p(o,i)>0?{collectors:o.filter(a=>a.type===i).map(a=>({...m({factTypeConfig:a,parentConfig:t}),factDetails:{factName:a.factName,branch:a.branch,data:a.data}})),enabled:!0}:l.exists,regex:p(o,f)>0?{collectors:o.filter(a=>a.type===f).map(a=>({...m({factTypeConfig:a,parentConfig:t}),factDetails:{factName:a.factName,branch:a.branch,path:a.path,regex:a.regex,flags:a.flags,data:a.data}})),enabled:!0}:l.regex,json:p(o,r)>0?{collectors:o.filter(a=>a.type===r).map(a=>({...m({factTypeConfig:a,parentConfig:t}),factDetails:{factName:a.factName,branch:a.branch,path:a.path,data:a.data.map(n=>n.type==="array"?{name:n.name,jsonPath:n.jsonPath,type:b(n.items?.type)}:n)}})),enabled:p(o,r)>0}:l.json}}return l}function b(t="object"){return`array[${t}]`}function A(t){const l="array[";return t.substring(t.indexOf(l)+l.length,t.lastIndexOf("]"))}export{T as ARRAY_ELEMENT_TYPES,d as DEFAULT_EXISTS_FACT_DATA,g as DEFAULT_JSON_FACT_DATA,y as DEFAULT_REGEX_FACT_DATA,E as ELEMENT_TYPES,i as EXISTS_COLLECTOR_TYPE,r as JSON_COLLECTOR_TYPE,f as REGEX_COLLECTOR_TYPE,O as SCM_COLLECTOR_FIELDS,u as defaultScmCollectorConfig,F as mapConfigToScmCollectorConfig,P as mapScmCollectorConfigToConfig};
|
|
1
|
+
import{asArray as x}from"@spotify/backstage-plugin-soundcheck-common";import{sumBy as C}from"lodash";import{defaultBaseCollectorOption as D}from"../Common/CollectorOption.esm.js";import{mapBackendConfigToFormIntegrationConfig as m,mapFormIntegrationConfigToBackendConfig as h}from"../Common/utils.esm.js";const d={name:"",path:""},y={name:"",type:"string"},g={name:"",jsonPath:"",type:"string"},N={factName:"",data:[d]},_={factName:"",path:"",regex:"",data:[]},L={factName:"",path:"",data:[g]},u=(t={})=>{const l=D(t);return{exists:{enabled:!1,collectors:[{factDetails:N,...l}]},regex:{enabled:!1,collectors:[{factDetails:_,...l}]},json:{enabled:!1,collectors:[{factDetails:L,...l}]}}},O={factDetails:{factName:{name:"Fact Name",helperText:"Fact name must be unique",placeholder:"Fact Name"},branch:{name:"Custom Branch (Optional)",helperText:"If omitted collects data from default branch",placeholder:"Example: develop"},filePath:{name:"File Path",helperText:"Path to the file whose content will be searched",placeholder:"Example: /catalog-info.yaml"},label:{name:"Label",placeholder:"Label"},type:{name:"Type",placeholder:"Type"},exists:{filesSection:{name:"Files",description:"List the files whose existence will be checked"}},regex:{regex:{name:"RegEx Pattern",helperText:"RegEx pattern to match",placeholder:"Example: ^apiVersion: backstage.io/(.+)"},flags:{name:"RegEx Flags (Optional)",helperText:"Allowed RegEx flags: g, i, m, s, u, y",placeholder:"Example: mi"},trueFalseMode:{label:"True / False Mode",description:"True / False Mode uses a RegEx to search for a match in the given file."},captureGroupsMode:{label:"Capture Groups Mode",description:"RegEx Capture Groups Mode allows the collector to associate capture groups within a RegEx to named values."},captureGroupsSection:{name:"Capture Groups",description:"Each element must correspond to a capture group in the given RegEx"}},json:{jsonPath:{name:"Json Path",placeholder:"Example: $.metadata.tags"},jsonElementsSection:{name:"JSON / YAML Elements",description:"List json / yaml paths from which to pull data from the given file"}}}},i="exists",f="regex",r="json",E=["string","number","integer","boolean","object"],T=E.map(b);function P(t){const{exists:l,regex:c,json:o}=t;if(l.collectors.length||c.collectors.length||o.collectors.length){const a={},n=[];return a.collects=n,l.enabled&&l.collectors.forEach(e=>{n.push(h({factType:i,configOption:e,additionalParams:{factName:e.factDetails.factName,branch:e.factDetails.branch?.length?e.factDetails.branch:void 0,data:e.factDetails.data}}))}),c.enabled&&c.collectors.forEach(e=>{n.push(h({factType:f,configOption:e,additionalParams:{factName:e.factDetails.factName,branch:e.factDetails.branch?.length?e.factDetails.branch:void 0,path:e.factDetails.path,regex:e.factDetails.regex,flags:e.factDetails.flags?.length?e.factDetails.flags:void 0,data:e.factDetails.data.length?e.factDetails.data:void 0}}))}),o.enabled&&o.collectors.forEach(e=>{n.push(h({factType:r,configOption:e,additionalParams:{factName:e.factDetails.factName,branch:e.factDetails.branch?.length?e.factDetails.branch:void 0,path:e.factDetails.path,data:e.factDetails.data.map(s=>T.includes(s.type)?{name:s.name,jsonPath:s.jsonPath,type:"array",items:{type:A(s.type)}}:s)}}))}),a}return{collects:[]}}const p=(t,l)=>C(t,({type:c})=>+(c===l));function F(t){const l=u(t),c=t?.collects;if(c&&c.length>0){const o=x(c);return{exists:p(o,i)>0?{collectors:o.filter(a=>a.type===i).map(a=>({...m({factTypeConfig:a,parentConfig:t}),factDetails:{factName:a.factName,branch:a.branch,data:a.data}})),enabled:!0}:l.exists,regex:p(o,f)>0?{collectors:o.filter(a=>a.type===f).map(a=>({...m({factTypeConfig:a,parentConfig:t}),factDetails:{factName:a.factName,branch:a.branch,path:a.path,regex:a.regex,flags:a.flags,data:a.data}})),enabled:!0}:l.regex,json:p(o,r)>0?{collectors:o.filter(a=>a.type===r).map(a=>({...m({factTypeConfig:a,parentConfig:t}),factDetails:{factName:a.factName,branch:a.branch,path:a.path,data:a.data.map(n=>n.type==="array"?{name:n.name,jsonPath:n.jsonPath,type:b(n.items?.type)}:n)}})),enabled:p(o,r)>0}:l.json}}return l}function b(t="object"){return`array[${t}]`}function A(t){const l="array[";return t.substring(t.indexOf(l)+l.length,t.lastIndexOf("]"))}export{T as ARRAY_ELEMENT_TYPES,d as DEFAULT_EXISTS_FACT_DATA,g as DEFAULT_JSON_FACT_DATA,y as DEFAULT_REGEX_FACT_DATA,E as ELEMENT_TYPES,i as EXISTS_COLLECTOR_TYPE,r as JSON_COLLECTOR_TYPE,f as REGEX_COLLECTOR_TYPE,O as SCM_COLLECTOR_FIELDS,u as defaultScmCollectorConfig,F as mapConfigToScmCollectorConfig,P as mapScmCollectorConfigToConfig};
|
|
2
2
|
//# sourceMappingURL=utils.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useApi as o}from"@backstage/core-plugin-api";import{entityPresentationApiRef as
|
|
1
|
+
import{useApi as o}from"@backstage/core-plugin-api";import{entityPresentationApiRef as m,EntityRefLink as c}from"@backstage/plugin-catalog-react";import{Chip as a,Avatar as s}from"@material-ui/core";import{Skeleton as n}from"@material-ui/lab";import e from"react";import p from"react-use/esm/useAsync";const f=({entityOrRef:r,style:i})=>{const l=o(m),{value:t}=p(async()=>await l.forEntity(r).promise);return t?e.createElement(c,{entityRef:r},e.createElement(a,{size:"small",avatar:t.Icon?e.createElement(s,null,e.createElement(t.Icon,null)):void 0,label:t.primaryTitle,style:{cursor:"pointer",...i}})):e.createElement(a,{size:"small",avatar:e.createElement(n,{variant:"circle",width:16,height:16}),label:e.createElement(n,{variant:"text",width:65}),style:i})};export{f as EntityChip};
|
|
2
2
|
//# sourceMappingURL=EntityChip.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as Q,Box as n,Typography as o,Button as w}from"@material-ui/core";import{parseFactRef as U}from"@spotify/backstage-plugin-soundcheck-common";import e,{useMemo as E,useState as g,useEffect as q,useCallback as X}from"react";import{useGetEntityRefs as Y}from"../../hooks/catalog/useGetEntityRefs.esm.js";import{useGetCollectors as Z}from"../../hooks/collectors/useGetCollectors.esm.js";import{useGetFactSchema as _}from"../../hooks/collectors/useGetFactSchema.esm.js";import{useGetFact as ee}from"../../hooks/useGetFact.esm.js";import{useGetPathResolvers as te}from"../../hooks/useGetPathResolvers.esm.js";import{generateJsonPaths as ae}from"../CheckForm/utils/checkFormUtils.esm.js";import{hasLogo as oe,CollectorLogo as ne}from"../CollectorsPage/CollectorListPage/CollectorLogo.esm.js";import{ExpandableSection as O}from"../ExpandableSection/ExpandableSection.esm.js";import{mapFiltersToCatalogFilter as
|
|
1
|
+
import{makeStyles as Q,Box as n,Typography as o,Button as w}from"@material-ui/core";import{parseFactRef as U}from"@spotify/backstage-plugin-soundcheck-common";import e,{useMemo as E,useState as g,useEffect as q,useCallback as X}from"react";import{useGetEntityRefs as Y}from"../../hooks/catalog/useGetEntityRefs.esm.js";import{useGetCollectors as Z}from"../../hooks/collectors/useGetCollectors.esm.js";import{useGetFactSchema as _}from"../../hooks/collectors/useGetFactSchema.esm.js";import{useGetFact as ee}from"../../hooks/useGetFact.esm.js";import{useGetPathResolvers as te}from"../../hooks/useGetPathResolvers.esm.js";import{generateJsonPaths as ae}from"../CheckForm/utils/checkFormUtils.esm.js";import{hasLogo as oe,CollectorLogo as ne}from"../CollectorsPage/CollectorListPage/CollectorLogo.esm.js";import{ExpandableSection as O}from"../ExpandableSection/ExpandableSection.esm.js";import{mapFiltersToCatalogFilter as re}from"../Filter/utils.esm.js";import"../Filter/FilterComponent.esm.js";import{emptyFilters as le}from"../Filter/types.esm.js";import{FormattedPreview as N}from"../FormattedPreview/FormattedPreview.esm.js";import"../FormControlledAutocomplete/FormControlledAutocomplete.esm.js";import"@material-ui/icons/CheckBox";import"@material-ui/icons/CheckBoxOutlineBlank";import"@material-ui/lab";import"react-hook-form";import"../ListboxVirtualized/ListboxVirtualized.esm.js";import{useLabelOptions as ie}from"../FormControlledAutocomplete/useLabelOptions.esm.js";import{ControlledAutocomplete as h}from"../FormControlledAutocomplete/ControlledAutocomplete.esm.js";import{LoadingIndicator as ce}from"../LoadingIndicator/LoadingIndicator.esm.js";import{useFactOptions as me}from"./useFactOptions.esm.js";const se=800,de=Q(t=>({content:{padding:t.spacing(2,3),width:se},section:{margin:t.spacing(2,0)},expandedSection:{borderTop:`1px solid ${t.palette.divider}`,padding:t.spacing(0,2)},loading:{margin:t.spacing(2)},preview:{maxHeight:500,overflow:"auto",border:`1px solid ${t.palette.divider}`},pathSection:{display:"flex",alignItems:"center",margin:t.spacing(1,0)},testPathButton:{margin:t.spacing(1,1,.5,0)},collectorName:{fontSize:24}})),k=t=>{const f=!t||Object.values(t).every(m=>!m?.length)?{...le(),selectedKinds:["Component","System"]}:t;return re(f)},pe=({factRef:t,updateFactRef:f,path:m,updatePath:B,entityRef:d,updateEntityRef:G,pathResolver:c,filters:I,onSave:C})=>{const a=de(),s=E(()=>{if(t)return U(t)},[t]),[y,R]=g(s?.source??null);q(()=>{s?.source&&R(s.source)},[s?.source]);const[v,T]=g("jsonpath"),[b,x]=g(),[S,j]=g(),{data:P}=te(),V=E(()=>P?.map(i=>i.id)??[],[P]),{data:p}=_(s?.source,s?.name,!0),W=E(()=>p?ae(p.schema):[],[p]),{data:F,isLoading:M}=Z(),$=F?.map(i=>i.id)?.sort()??[],{data:D,isLoading:J}=Y(k(I),500),r=E(()=>F?.find(i=>i.id===y),[F,y]),{factOptions:z}=me({selectedCollector:r}),{options:A,getOptionLabel:L}=ie(z),{data:l,isLoading:u}=ee({factRef:t||"",entityRef:S||"",path:b,pathResolver:c??v??void 0},!!t&&!!S),H=X(()=>{x(m),j(d)},[d,m]),K=E(()=>!!r?.config?.cache,[r]);return e.createElement(n,{className:a.content,"data-testid":"fact-explorer"},e.createElement(n,null,e.createElement(n,null,e.createElement(o,{variant:"subtitle1"},"Select an Integration"),e.createElement(h,{options:$,onChange:i=>{R(i),f("")},value:y,placeholder:"Integration",disabled:M,fullWidth:!0})),!!r&&e.createElement(e.Fragment,null,e.createElement(n,{className:a.section},oe(r.id)?e.createElement(ne,{noMargin:!0,collectorId:r.id}):e.createElement(o,{variant:"h5",className:a.collectorName,component:"div"},r.name??r.id," "),!!r.description&&e.createElement(o,{variant:"body2"},r.description),e.createElement(h,{options:A,onChange:f,value:t??null,placeholder:"Select Fact",getOptionLabel:L,noOptionsText:"No Facts",fullWidth:!0}))),!!t&&e.createElement(e.Fragment,null,!!p?.schema&&e.createElement(n,{className:a.section},e.createElement(O,{elevation:1,title:"JSON Schema"},e.createElement("div",{className:a.preview},e.createElement(N,{data:p.schema})))),e.createElement(n,{className:a.section},e.createElement(o,{variant:"subtitle1"},"Path Resolver"),!c&&e.createElement(o,{variant:"caption"},"Defaults to jsonpath"),c?e.createElement(o,{variant:"body1"},c):e.createElement(h,{options:V,onChange:T,value:c??v,placeholder:"Path Resolver (Optional)",getOptionLabel:L,fullWidth:!0,disabled:!!c})),e.createElement(n,{className:a.section},e.createElement(o,{variant:"subtitle1"},"Path"),e.createElement(h,{options:(c??v)==="jsonpath"?W:[],onChange:i=>{b&&x(void 0),B(i)},value:m??null,placeholder:"Path",fullWidth:!0,freeSolo:!0}),e.createElement("div",{className:a.pathSection},!!C&&e.createElement(w,{className:a.testPathButton,variant:"contained",onClick:()=>C({factRef:t,path:m??"",pathResolver:v??c??""}),disabled:!m,color:"primary"},"Save")))),!!t&&e.createElement(O,{elevation:0,title:"Sample Fact and Test Path"},e.createElement(n,{className:a.expandedSection},e.createElement(n,{marginBottom:1},e.createElement(o,{variant:"subtitle1"},"Select an Entity"),e.createElement(o,{variant:"caption"},"Fact will be sampled from this entity.",e.createElement("br",null),"If you don't see the entity in the drop-down list, you can type its reference in the format ","<kind>:<namespace>/<name>","."),e.createElement(h,{options:D??[],onChange:G,value:d??null,placeholder:"Entity Selection",isLoading:J,freeSolo:!0,fullWidth:!0})),e.createElement(n,null,e.createElement(w,{className:a.testPathButton,variant:"contained",onClick:H,disabled:!d,color:"primary"},"Sample Fact")),e.createElement(e.Fragment,null,!!b&&!u&&e.createElement(n,{className:a.section},e.createElement(o,{variant:"subtitle1"},"Resolved Value"),l?.resolvedValue!==null&&l?.resolvedValue!==void 0?e.createElement(n,{className:a.preview},e.createElement(N,{data:l?.resolvedValue})):e.createElement(o,{color:"textSecondary",variant:"body2"},"Could not resolve path")),!!S&&e.createElement(n,{className:a.section},e.createElement(o,{variant:"subtitle1"},"Fact Data"),K&&e.createElement(o,{variant:"caption"},"Uses cache when available."),!!u&&e.createElement("div",{className:a.loading},e.createElement(ce,null)),!u&&!!l?.fact&&e.createElement(n,{className:a.preview},e.createElement(N,{data:l?.fact?.data})),!u&&!!l?.collectionError&&e.createElement(o,{color:"textSecondary",variant:"body2"},"Failed to collect:"," ",l?.collectionError?.errorMessage),!u&&!l?.fact&&!l?.collectionError&&e.createElement(o,{color:"textSecondary",variant:"body2"},"Fact ",t," unavailable for entity ",d)))))))};export{pe as FactExplorer,k as toEntityFilterQuery};
|
|
2
2
|
//# sourceMappingURL=FactExplorer.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{parseEntityRef as S,DEFAULT_NAMESPACE as
|
|
1
|
+
import{parseEntityRef as S,DEFAULT_NAMESPACE as A}from"@backstage/catalog-model";import{useApi as O,configApiRef as v}from"@backstage/core-plugin-api";import{makeStyles as w,Typography as T,Box as z,FormControlLabel as G,Checkbox as N,TextField as I}from"@material-ui/core";import M from"@material-ui/icons/CheckBox";import U from"@material-ui/icons/CheckBoxOutlineBlank";import B from"@material-ui/icons/ExpandMore";import{Autocomplete as D}from"@material-ui/lab";import{combineEntityFilterQueries as P}from"@spotify/backstage-plugin-soundcheck-common";import t,{useState as R,useMemo as q,useCallback as u}from"react";import{useGetEntityFacets as H}from"../../hooks/catalog/useGetEntityFacets.esm.js";import{getGroupFilterFromConfig as K}from"../../utils/getGroupFilterFromConfig.esm.js";import{FormFieldLabel as Q}from"../FormFieldLabel/FormFieldLabel.esm.js";import{ListboxVirtualized as V}from"../ListboxVirtualized/ListboxVirtualized.esm.js";const _=w({container:{padding:0},formControl:{flexGrow:1},label:{lineHeight:"1em"}}),j=({facet:s,label:p,values:l,onChange:a,disabled:b,filter:g,isOwnerSelect:f})=>{const m=_(),E=O(v),[C,i]=R(!1),{data:r,isLoading:h,error:L}=H(s,P(g,f?K(E):void 0)),o=q(()=>r?.map(e=>e.toLocaleLowerCase("en-US")),[r]),d=l?.map(e=>e.toLocaleLowerCase("en-US"))??[],x=u((e,n)=>{a(n),o&&o.every(c=>n.includes(c))&&i(!1)},[o,a,i]),k=u(()=>{a(l?.length?l:void 0)},[l,a]);if(!r||!o||L)return t.createElement(T,{color:"error"},"Failed to load facet: ",s);const y=b||h||!l?.length&&(!r?.length||!o?.length),F=Array.from(new Set([...o,...d]));return t.createElement(z,{pb:1,pt:1,className:m.container},t.createElement(Q,{title:p,docLink:"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/filters"}),t.createElement(D,{open:C,onOpen:()=>i(!0),onClose:()=>i(!1),className:m.formControl,multiple:!0,limitTags:4,disableCloseOnSelect:!0,"aria-label":p,options:F,value:d,getOptionLabel:e=>{if(f){const n=r[o.indexOf(e)];return n?S(n,{defaultKind:"group",defaultNamespace:A}).name:e}return r[o.indexOf(e)]??e},onChange:x,onBlur:k,disabled:y,ListboxComponent:V,renderOption:(e,{selected:n})=>t.createElement(G,{onClick:c=>c.preventDefault(),control:t.createElement(N,{icon:t.createElement(U,{fontSize:"small"}),checkedIcon:t.createElement(M,{fontSize:"small"}),checked:n}),label:r[o.indexOf(e)]??e,classes:{label:m.label}}),size:"small",popupIcon:t.createElement(B,{"data-testid":"selected-facets-expand"}),renderInput:e=>t.createElement(I,{...e,variant:"outlined"})}))};export{j as EntityAutocompletePicker};
|
|
2
2
|
//# sourceMappingURL=EntityAutocompletePicker.esm.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{TextField as T,FormControlLabel as L,Checkbox as k}from"@material-ui/core";import z from"@material-ui/icons/CheckBox";import F from"@material-ui/icons/CheckBoxOutlineBlank";import{Autocomplete as I}from"@material-ui/lab";import e from"react";import{Controller as O}from"react-hook-form";import{ListboxVirtualized as W}from"../ListboxVirtualized/ListboxVirtualized.esm.js";import{useStyles as w}from"./FormControlledAutocomplete.esm.js";const y=({name:i,rules:s,label:p,control:u,options:f,getOptionLabel:h,getOptionValue:m,onChange:b,disabled:C,placeholder:g,freeSolo:x=!0,width:c,helperText:v,disableClearable:E,fullWidth:d})=>{const a=w();return e.createElement(O,{name:i,control:u,rules:s,render:({field:l,fieldState:n})=>e.createElement(I,{...l,value:l.value,freeSolo:x,autoSelect:!0,"data-testid":`${i}-autocomplete`,style:c?{width:c}:{minWidth:d?void 0:250},disabled:C,options:f,getOptionLabel:h,classes:{clearIndicator:a.clearIndicator},disableClearable:E,fullWidth:d,multiple:!0,size:"small",renderInput:t=>e.createElement(T,{...t,variant:"outlined",label:p,error:n.invalid,placeholder:l.value?.length?"":g,FormHelperTextProps:{className:a.helperText},margin:"dense",className:a.noMargin,helperText:v??(n.error?n.error.message:null)}),renderOption:(t,{selected:o})=>e.createElement(L,{onClick:r=>r.preventDefault(),control:e.createElement(k,{icon:e.createElement(F,{fontSize:"small"}),checkedIcon:e.createElement(z,{fontSize:"small"}),checked:o}),label:t}),onChange:(t,o)=>{const r=m?o.map(S=>m(S)):o;b?.(r),l.onChange(r)},ListboxComponent:W})})};export{y as FormControlledMultipleAutocomplete};
|
|
2
|
+
//# sourceMappingURL=FormControlledMultipleAutocomplete.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as
|
|
1
|
+
import{makeStyles as g,FormControl as E,InputLabel as f,Select as y,MenuItem as d,FormHelperText as h}from"@material-ui/core";import e from"react";import{Controller as k}from"react-hook-form";const x=g(l=>({helperText:{marginLeft:0},selectField:{width:"100%",display:"flex",alignItems:"center"},menuBackground:{backgroundColor:l.palette.background.paper}})),F=({name:l,control:c,selectLabel:r,options:i,disabled:p,rules:u,style:b,helperText:o,placeholder:m})=>{const a=x();return e.createElement(k,{name:l,control:c,rules:u,render:({field:s,fieldState:t})=>e.createElement(E,{variant:"outlined",style:b??{minWidth:200},error:t.invalid},r&&e.createElement(f,{id:`${l}-select-label`},r),e.createElement(y,{...s,className:a.selectField,disabled:p,error:t.invalid,"data-testid":`${l}-select`,labelId:`${l}-select-label`,label:r,displayEmpty:!0,value:s.value??"",MenuProps:{classes:{paper:a.menuBackground}},margin:"dense"},m&&e.createElement(d,{value:"",disabled:!0},m),i?.map(({value:n,label:v})=>e.createElement(d,{key:n,value:n,"data-testid":`${n}-menu-item`},v))),(o||t.error)&&e.createElement(h,{className:a.helperText},t.error?t.error.message:o))})};export{F as FormControlledSelect};
|
|
2
2
|
//# sourceMappingURL=FormControlledSelect.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useApi as E,configApiRef as v}from"@backstage/core-plugin-api";import{makeStyles as O,alpha as k,TextField as w,CircularProgress as y}from"@material-ui/core";import P from"@material-ui/lab/Autocomplete";import s,{useMemo as x,useCallback as I,useEffect as f}from"react";import{useSearchParams as A}from"react-router-dom";import F from"react-use/lib/useLocalStorage";import{useGroupOptions as G}from"../../hooks/groups/useGroupOptions.esm.js";const L=O(r=>({root:{width:"100%",minWidth:250},textField:{"& $notchedOutline":{borderColor:k(r.page.fontColor,.25)},"&:hover $notchedOutline":{borderColor:r.page.fontColor}},input:{backgroundColor:"transparent",color:r.page.fontColor},clearIndicator:{color:r.page.fontColor},popupIndicator:{color:r.page.fontColor},notchedOutline:{}}),{name:"SoundcheckGroupSelector"}),N=({setError:r,margin:
|
|
1
|
+
import{useApi as E,configApiRef as v}from"@backstage/core-plugin-api";import{makeStyles as O,alpha as k,TextField as w,CircularProgress as y}from"@material-ui/core";import P from"@material-ui/lab/Autocomplete";import s,{useMemo as x,useCallback as I,useEffect as f}from"react";import{useSearchParams as A}from"react-router-dom";import F from"react-use/lib/useLocalStorage";import{useGroupOptions as G}from"../../hooks/groups/useGroupOptions.esm.js";const L=O(r=>({root:{width:"100%",minWidth:250},textField:{"& $notchedOutline":{borderColor:k(r.page.fontColor,.25)},"&:hover $notchedOutline":{borderColor:r.page.fontColor}},input:{backgroundColor:"transparent",color:r.page.fontColor},clearIndicator:{color:r.page.fontColor},popupIndicator:{color:r.page.fontColor},notchedOutline:{}}),{name:"SoundcheckGroupSelector"}),N=({setError:r,margin:b,baseClass:a})=>{const{options:o,isLoading:p,isError:d}=G(),t=L(),[i,h]=A(),[n,C]=F("soundcheck.overview.groupRef",null),u=i.get("group"),m=E(v).getOptionalString("soundcheck.overview.defaultSelectedGroupType"),g=x(()=>{if(!p&&o.length){if(u||n){const e=u??n;return o.find(c=>c.ref===e)??o[0]}else if(m)return o.find(e=>e.type===m)??o[0];return o[0]}return null},[m,p,o,u,n]),l=I((e,c)=>{e&&i.get("group")!==e&&(i.set("group",e),h(i,{replace:c}),C(e))},[i,C,h]),S=I((e,c)=>{l?.(c?.ref)},[l]);return f(()=>{n&&!u&&l(n,!0)},[n,u,l]),f(()=>{l(g?.ref,!0)},[l,g]),f(()=>{r?.(d?new Error("Error loading groups"):void 0)},[d,r]),d?null:s.createElement(P,{"aria-label":"Current group",className:a?"":t.root,classes:{clearIndicator:a?"":t.clearIndicator,popupIndicator:a?"":t.popupIndicator},disableClearable:!0,options:o??[],loading:p,groupBy:e=>e.key,value:g,freeSolo:!1,onChange:S,getOptionLabel:e=>e.name,renderInput:e=>s.createElement(w,{...e,variant:"outlined",placeholder:p?"Loading":"Select a group",className:t.textField,margin:b,InputProps:{...e.InputProps,className:a?"":t.input,classes:{notchedOutline:a?"":t.notchedOutline},endAdornment:s.createElement(s.Fragment,null,p?s.createElement(y,{color:"inherit",size:20}):null,e.InputProps.endAdornment)}})})};export{N as GroupSelector};
|
|
2
2
|
//# sourceMappingURL=GroupSelector.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as T,Typography as m,TextField as h,CircularProgress as F,Switch as L}from"@material-ui/core";import i from"@material-ui/core/Box";import W from"@material-ui/icons/Search";import{Autocomplete as A}from"@material-ui/lab";import t,{useContext as B,useEffect as v}from"react";import G from"react-use/lib/useLocalStorage";import{GroupSelector as K}from"../GroupSelector/GroupSelector.esm.js";import{OverviewPageContext as O}from"./OverviewPageContent.esm.js";const H=T(a=>({wrapper:{background:a.palette.background.default,paddingTop:a.spacing(0),paddingBottom:a.spacing(2),paddingRight:a.spacing(3),display:"flex",gap:a.spacing(3)},switchLabel:{marginLeft:a.spacing(1.5)}})),R=({setError:a,unfilteredFacets:E,kind:l,type:o,onChange:d,isLoading:
|
|
1
|
+
import{makeStyles as T,Typography as m,TextField as h,CircularProgress as F,Switch as L}from"@material-ui/core";import i from"@material-ui/core/Box";import W from"@material-ui/icons/Search";import{Autocomplete as A}from"@material-ui/lab";import t,{useContext as B,useEffect as v}from"react";import G from"react-use/lib/useLocalStorage";import{GroupSelector as K}from"../GroupSelector/GroupSelector.esm.js";import{OverviewPageContext as O}from"./OverviewPageContent.esm.js";const H=T(a=>({wrapper:{background:a.palette.background.default,paddingTop:a.spacing(0),paddingBottom:a.spacing(2),paddingRight:a.spacing(3),display:"flex",gap:a.spacing(3)},switchLabel:{marginLeft:a.spacing(1.5)}})),R=({setError:a,unfilteredFacets:E,kind:l,type:o,onChange:d,isLoading:b,isFixedGroup:x})=>{const k=H(),r={types:E?.types.filter(({count:e})=>e>0)??[]},[u,C]=G("soundcheck-overview-pivot-status",!1),{searchValue:P,updateSearchValue:S,pivot:p,updatePivot:g}=B(O);v(()=>{u!==p&&g(!!u)},[]),v(()=>{const e=r?.types&&r.types.length>=0,n=!l&&e,c=l&&e&&!r?.types.find(({kind:s,type:f})=>l===s&&(!o&&!f||o===f));(n||c)&&d(r?.types[0]?.kind??"",r?.types[0]?.type,!0)},[l,o,r?.types,d]);const y=r?.types.map(({kind:e,type:n,count:c})=>{const s=`${e}|${n??""}`;return{facetKind:e,facetType:n,key:s,label:`${n??e} (${c>50?"50+":c})`,id:s}}).sort((e,n)=>e.key.localeCompare(n.key))??[],w=y.find(e=>e.key===`${l}|${o??""}`)??null,I=r&&(r.types?.length??0)>0;return t.createElement(i,{className:k.wrapper},!x&&t.createElement(i,{flex:1,maxWidth:364},t.createElement(m,{variant:"subtitle2",component:"div"},"Group"),t.createElement(K,{baseClass:!0,margin:"dense",setError:a})),I&&t.createElement(t.Fragment,null,t.createElement(i,{flex:1,maxWidth:500},t.createElement(m,{variant:"subtitle2",component:"div"},"Entity Type"),t.createElement(A,{"aria-label":"Entity Type Selection",disableClearable:!0,options:y??[],freeSolo:!1,groupBy:e=>e.facetKind,getOptionLabel:e=>e.label,value:w,onChange:(e,n)=>d(n.facetKind,n.facetType,!0),renderInput:e=>t.createElement(h,{...e,variant:"outlined",placeholder:"Select entity type",margin:"dense",fullWidth:!0,InputProps:{...e.InputProps,endAdornment:t.createElement(t.Fragment,null,b?t.createElement(F,{color:"inherit",size:20}):null,e.InputProps.endAdornment)}})})),t.createElement(i,{maxWidth:580,flex:1},t.createElement(m,{variant:"subtitle2",component:"div"},"Search Entities"),t.createElement(h,{margin:"dense",placeholder:"Search entities",variant:"outlined",fullWidth:!0,value:P,onChange:e=>S(e.currentTarget.value),InputProps:{startAdornment:t.createElement(i,{marginRight:.75,display:"flex",alignItems:"center"},t.createElement(W,{color:"inherit"}))}})),t.createElement(i,{display:"flex",flexDirection:"column"},t.createElement(m,{style:{marginLeft:10},variant:"subtitle2",component:"div"},"Pivot"),t.createElement(i,{flex:1,display:"flex",alignItems:"center"},t.createElement(L,{checked:p,onChange:()=>{C(!p),g(!p)},inputProps:{"aria-label":"pivot overview table"}})))))};export{R as OverviewPageHeader};
|
|
2
2
|
//# sourceMappingURL=OverviewPageHeader.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Page as
|
|
1
|
+
import{Page as D,TabbedLayout as n}from"@backstage/core-components";import{useApi as p,featureFlagsApiRef as N,configApiRef as O}from"@backstage/core-plugin-api";import{usePermission as m}from"@backstage/plugin-permission-react";import{makeStyles as $,Box as i}from"@material-ui/core";import{SpotifyLicenseBanner as B}from"@spotify/backstage-plugin-core";import{soundcheckCampaignCreatePermission as G,soundcheckCollectorReadPermission as Q,soundcheckCheckCreatePermission as q,soundcheckTrackCreatePermission as M}from"@spotify/backstage-plugin-soundcheck-common";import e from"react";import{Routes as U,Route as t}from"react-router-dom";import"../../contexts/TrackFormContext.esm.js";import"../../contexts/CheckFormContext.esm.js";import"../../contexts/CampaignFormContext.esm.js";import{UserProvider as V}from"../../contexts/UserProvider.esm.js";import W from"../../hooks/useConfirmationModal.esm.js";import{AlertProvider as j}from"../../hooks/useSoundcheckAlert.esm.js";import{CampaignInsightsPage as z}from"../CampaignInsightsPage/CampaignInsightsPage.esm.js";import{CampaignsPage as J}from"../CampaignsPage/CampaignsPage.esm.js";import{CampaignCreatePage as K}from"../CampaignCreatePage/CampaignCreatePage.esm.js";import{EditCampaignView as X}from"../CampaignsPage/EditCampaignView.esm.js";import{CheckCreatePage as Y}from"../CheckCreatePage/CheckCreatePage.esm.js";import{CheckEditPage as Z}from"../CheckPage/CheckEditPage.esm.js";import{CheckInsightsPage as h}from"../CheckPage/CheckInsightsPage.esm.js";import{ChecksTab as _}from"../ChecksTab/ChecksTab.esm.js";import{CheckTemplatesPage as ee}from"../CheckTemplatesPage/CheckTemplatesPage.esm.js";import{CollectorPage as te}from"../CollectorPage/CollectorPage.esm.js";import{CollectorsPage as ae}from"../CollectorsPage/CollectorsPage.esm.js";import le from"../OrgHealth/OrgHealthPage.esm.js";import{OverviewPageContent as ne}from"../OverviewPage/OverviewPageContent.esm.js";import{QuickstartPage as re}from"../QuickstartPage/QuickstartPage.esm.js";import{SoundcheckHeader as ce}from"../SoundcheckHeader/SoundcheckHeader.esm.js";import{SoundcheckHeaderProvider as me}from"../SoundcheckHeader/SoundcheckHeaderContext.esm.js";import{SoundcheckQueryClientProvider as ie}from"../SoundcheckQueryClientProvider/SoundcheckQueryClientProvider.esm.js";import{TechHealth as oe}from"../TechHealth/TechHealth.esm.js";import{TrackCreatePage as se}from"../TrackCreatePage/TrackCreatePage.esm.js";import{TrackEditPage as pe}from"../TrackEditPage/TrackEditPage.esm.js";import{TrackPage as he}from"../TrackPage/TrackPage.esm.js";import{TracksTab as de}from"../TracksTab/TracksTab.esm.js";const ue=$(r=>({tabContent:{margin:0,padding:0},root:{"& > *":{display:"flex",flexDirection:"column",flexGrow:1}},pageContent:{display:"flex",flexDirection:"row",flexGrow:1},pageLayout:{display:"flex",flexDirection:"column",flex:"1 1 0%",maxWidth:"100%","& > article":{display:"flex",flexDirection:"column",flex:"1 1 auto",padding:`${r.spacing(3)}px !important`}}})),ge=({title:r="Soundcheck"})=>{const c=ue(),a=p(N),o=p(O).getOptionalStringArray("soundcheck.flags"),d=(()=>{const l=a.getRegisteredFlags().some(H=>H.name==="soundcheck-enable-org-health"),S=a.isActive("soundcheck-enable-org-health"),L=o?.includes("enable-org-health");return(!l||S)&&L})(),u=(!a.getRegisteredFlags().find(l=>l.name==="soundcheck-enable-tech-health")||a.isActive("soundcheck-enable-tech-health"))&&!o?.includes("soundcheck-disable-tech-health"),g=!a.getRegisteredFlags().find(l=>l.name==="soundcheck-enable-collectors")||a.isActive("soundcheck-enable-collectors"),s=!a.getRegisteredFlags().find(l=>l.name==="soundcheck-enable-campaigns")||a.isActive("soundcheck-enable-campaigns"),{loading:k,allowed:E}=m({permission:G}),f=!k&&E,{loading:C,allowed:b}=m({permission:Q}),{loading:P,allowed:v}=m({permission:q}),R=!a.getRegisteredFlags().find(l=>l.name==="soundcheck-enable-check-creation")||a.isActive("soundcheck-enable-check-creation"),x=!P&&v&&R,{loading:w,allowed:T}=m({permission:M}),I=!a.getRegisteredFlags().find(l=>l.name==="soundcheck-enable-track-creation")||a.isActive("soundcheck-enable-track-creation"),y=!w&&T&&I,A=g&&!C&&b,F=u;return e.createElement(j,null,e.createElement(V,null,e.createElement(ie,null,e.createElement(me,{defaultTitle:r},e.createElement(W,null,e.createElement(i,{className:c.root},e.createElement(D,{themeId:"website"},e.createElement(B,{backend:"soundcheck",invalidLicenseMessage:"Submitted facts and check results will still be stored, but it will not be possible to view certifications or individual results until a valid license is present."}),e.createElement(ce,{documentTitle:r}),e.createElement(i,{className:c.pageContent},e.createElement(i,{className:c.pageLayout},e.createElement(U,null,d&&e.createElement(t,{path:"/org-health",element:e.createElement(le,null)}),s&&e.createElement(e.Fragment,null,e.createElement(t,{path:"/campaigns/:campaignId/edit",element:e.createElement(X,null)}),e.createElement(t,{path:"/campaigns/:campaignId",element:e.createElement(z,null)}),f&&e.createElement(t,{path:"/campaigns/create",element:e.createElement(K,null)})),e.createElement(t,{path:"/quickstart",element:e.createElement(re,null)}),e.createElement(t,{path:"/tracks/:trackId/edit",element:e.createElement(pe,null)}),y&&e.createElement(t,{path:"/tracks/create",element:e.createElement(se,null)}),e.createElement(t,{path:"/tracks/:trackId",element:e.createElement(he,null)}),e.createElement(t,{path:"/tracks/:trackId/checks/:checkId",element:e.createElement(h,null)}),e.createElement(t,{path:"/checks/:checkId",element:e.createElement(h,null)}),e.createElement(t,{path:"/checks/:checkId/edit",element:e.createElement(Z,null)}),x&&e.createElement(e.Fragment,null,e.createElement(t,{path:"/checks/create",element:e.createElement(Y,null)}),e.createElement(t,{path:"/checks/templates",element:e.createElement(ee,null)})),e.createElement(t,{path:"/integrations/:integrationId",element:e.createElement(te,null)}),e.createElement(t,{path:"/*",element:e.createElement(n,null,e.createElement(n.Route,{title:"Overview",path:"/"},e.createElement("div",{className:c.tabContent},e.createElement(ne,null))),F&&e.createElement(n.Route,{title:"Tech Health",path:"/tech-health"},e.createElement(oe,null)),e.createElement(n.Route,{title:"Checks",path:"/checks"},e.createElement(_,null)),e.createElement(n.Route,{title:"Tracks",path:"/tracks"},e.createElement(de,null)),s&&e.createElement(n.Route,{title:"Campaigns",path:"/campaigns"},e.createElement(J,null)),A&&e.createElement(n.Route,{title:"Integrations",path:"/integrations"},e.createElement(ae,null)))}))," ")))))))))};export{ge as RoutingPage};
|
|
2
2
|
//# sourceMappingURL=RoutingPage.esm.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{makeStyles as m,Box as c,Typography as o}from"@material-ui/core";import t from"react";import{ConditionResultComponent as i}from"./ConditionResultComponent.esm.js";const
|
|
1
|
+
import{makeStyles as m,Box as c,Typography as o}from"@material-ui/core";import t from"react";import{ConditionResultComponent as i}from"./ConditionResultComponent.esm.js";const d=m(e=>({container:{display:"flex",flexDirection:"row",overflow:"hidden",backgroundColor:e.palette.background.default},colorStrip:{display:"flex",alignItems:"center",justifyContent:"center",color:e.palette.common.white,fontWeight:"bold",padding:e.spacing(.5),marginRight:e.spacing(1),alignSelf:"stretch","& p":{background:"rgba(0, 0, 0, 0.33)",padding:e.spacing(.25),borderRadius:8}},success:{backgroundColor:e.palette.success.main},error:{backgroundColor:e.palette.error.main},disabled:{backgroundColor:e.palette.action.disabled},subResults:{display:"flex",flexDirection:"column",paddingTop:e.spacing(1),paddingRight:e.spacing(1),paddingBottom:e.spacing(1),gap:2}})),p=(e,a)=>e===!0?a.success:e===!1?a.error:a.disabled,l=({result:e})=>{const a=d(),s=p(e.result,a);return t.createElement(c,{className:a.container},t.createElement("div",{className:`${a.colorStrip} ${s}`},"all"in e&&t.createElement(o,{variant:"body2"},"ALL"),"any"in e&&t.createElement(o,{variant:"body2"},"ANY"),"not"in e&&t.createElement(o,{variant:"body2"},"NOT")),t.createElement(c,{className:a.subResults},"all"in e&&e.all.map((r,n)=>t.createElement(t.Fragment,{key:n},"all"in r||"any"in r||"not"in r?t.createElement(l,{result:r}):t.createElement(i,{result:r}))),"any"in e&&e.any.map((r,n)=>t.createElement(t.Fragment,{key:n},"all"in r||"any"in r||"not"in r?t.createElement(l,{result:r}):t.createElement(i,{result:r}))),"not"in e&&e.not.map((r,n)=>t.createElement(t.Fragment,{key:n},"all"in r||"any"in r||"not"in r?t.createElement(l,{result:r}):t.createElement(i,{result:r})))))};export{l as BranchResultComponent};
|
|
2
2
|
//# sourceMappingURL=BranchResultComponent.esm.js.map
|