@kartverket/backstage-plugin-risk-scorecard 3.9.6 → 3.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,6 @@ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
4
4
  import { Box, Text, Switch, Flex, RadioGroup, Radio } from '@backstage/ui';
5
5
  import { RiScDialogStates } from './RiScDialog.esm.js';
6
6
  import { Divider } from '@mui/material';
7
- import { DefaultRiScType } from '../../utils/types.esm.js';
8
7
  import { useDefaultRiScTypeDescriptors } from '../../contexts/DefaultRiScTypesContext.esm.js';
9
8
  import { useTheme } from '@mui/material/styles';
10
9
 
@@ -73,36 +72,29 @@ const RadioOption = ({
73
72
  }
74
73
  ) });
75
74
  };
76
- function sortStandardRiScFirst(defaultRiScTypeDescriptors) {
77
- return defaultRiScTypeDescriptors.sort((a, b) => {
78
- if (a.riScType === DefaultRiScType.Standard && b.riScType !== DefaultRiScType.Standard)
79
- return -1;
80
- if (a.riScType !== DefaultRiScType.Standard && b.riScType === DefaultRiScType.Standard)
81
- return 1;
82
- return 0;
83
- });
84
- }
85
75
  function ConfigInitialRisc(props) {
86
76
  const { t } = useTranslationRef(pluginRiScTranslationRef);
87
- const { defaultRiScTypeDescriptors, getDescriptorOfType } = useDefaultRiScTypeDescriptors();
88
- function onSwitchChange() {
77
+ const {
78
+ defaultRiScTypeDescriptors,
79
+ riScSelectedByDefault,
80
+ getDescriptorOfId
81
+ } = useDefaultRiScTypeDescriptors();
82
+ function onCreateDefaultRiScSwitchChange() {
89
83
  if (props.switchOn) {
90
84
  props.setValue("content.title", "");
91
85
  props.setValue("content.scope", "");
92
86
  } else {
93
- const standardDescriptor = getDescriptorOfType(DefaultRiScType.Standard);
94
- props.setSelectedRiScType(DefaultRiScType.Standard);
95
- if (standardDescriptor) {
96
- props.setValue("content.title", standardDescriptor.defaultTitle);
97
- props.setValue("content.scope", standardDescriptor.defaultScope);
87
+ props.setSelectedRiScId(riScSelectedByDefault?.id);
88
+ if (riScSelectedByDefault) {
89
+ props.setValue("content.title", riScSelectedByDefault.defaultTitle);
90
+ props.setValue("content.scope", riScSelectedByDefault.defaultScope);
98
91
  }
99
92
  }
100
93
  props.setSwitchOn(!props.switchOn);
101
94
  }
102
- function onSelectRiScType(newRiScType) {
103
- const defaultRiScType = newRiScType;
104
- props.setSelectedRiScType(defaultRiScType);
105
- const descriptor = getDescriptorOfType(newRiScType);
95
+ function onSelectRiScType(selectedDefaultRiScId) {
96
+ props.setSelectedRiScId(selectedDefaultRiScId);
97
+ const descriptor = getDescriptorOfId(selectedDefaultRiScId);
106
98
  if (descriptor) {
107
99
  props.setValue("content.title", descriptor.defaultTitle);
108
100
  props.setValue("content.scope", descriptor.defaultScope);
@@ -122,7 +114,7 @@ function ConfigInitialRisc(props) {
122
114
  Switch,
123
115
  {
124
116
  isSelected: props.switchOn,
125
- onChange: onSwitchChange,
117
+ onChange: onCreateDefaultRiScSwitchChange,
126
118
  label: props.switchOn ? t("dictionary.yes") : t("dictionary.no")
127
119
  }
128
120
  )
@@ -151,21 +143,19 @@ function ConfigInitialRisc(props) {
151
143
  onChange: onSelectRiScType,
152
144
  isDisabled: !props.switchOn,
153
145
  "aria-label": "Select application type",
154
- value: props.selectedRiScType,
155
- children: sortStandardRiScFirst(defaultRiScTypeDescriptors).map(
156
- (descriptor) => /* @__PURE__ */ jsx(
157
- RadioOption,
158
- {
159
- value: descriptor.riScType,
160
- label: descriptor.listName,
161
- description: descriptor.listDescription,
162
- active: !props.switchOn,
163
- numActions: descriptor.numberOfActions,
164
- numScenarios: descriptor.numberOfScenarios
165
- },
166
- descriptor.riScType
167
- )
168
- )
146
+ value: props.selectedRiScId,
147
+ children: defaultRiScTypeDescriptors.map((descriptor) => /* @__PURE__ */ jsx(
148
+ RadioOption,
149
+ {
150
+ value: descriptor.id,
151
+ label: descriptor.listName,
152
+ description: descriptor.listDescription,
153
+ active: !props.switchOn,
154
+ numActions: descriptor.numberOfActions,
155
+ numScenarios: descriptor.numberOfScenarios
156
+ },
157
+ descriptor.id
158
+ ))
169
159
  }
170
160
  )
171
161
  ] })
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigInitialRisc.esm.js","sources":["../../../src/components/riScDialog/ConfigInitialRisc.tsx"],"sourcesContent":["import { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { Box, Flex, Radio, RadioGroup, Switch, Text } from '@backstage/ui';\nimport { RiScDialogStates } from './RiScDialog';\nimport { Divider } from '@mui/material';\nimport {\n DefaultRiScType,\n DefaultRiScTypeDescriptor,\n RiScWithMetadata,\n} from '../../utils/types.ts';\nimport { useDefaultRiScTypeDescriptors } from '../../contexts/DefaultRiScTypesContext.tsx';\nimport { UseFormSetValue } from 'react-hook-form/dist/types/form';\nimport { useTheme } from '@mui/material/styles';\n\ntype RadioOptionProps = {\n value: string;\n label: string;\n description?: string;\n active?: boolean;\n numActions: number | null;\n numScenarios: number | null;\n};\n\nconst RadioOption = ({\n value,\n label,\n description,\n active = true,\n numActions,\n numScenarios,\n}: RadioOptionProps) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const theme = useTheme();\n const style = {\n fontSize: '12px',\n border: `1px solid ${active ? 'var(--bui-gray-6)' : 'var(--bui-gray-8)'}`,\n borderRadius: '24px',\n padding: '2px 8px',\n };\n\n return (\n <>\n <Flex\n direction=\"column\"\n align=\"start\"\n p=\"12px 16px\"\n gap=\"2\"\n style={{\n backgroundColor:\n theme.palette.mode === 'dark'\n ? 'var(--bui-gray-5)'\n : 'var(--bui-gray-2)',\n borderRadius: '8px',\n }}\n >\n <Radio value={value}>\n <Text\n weight=\"bold\"\n as=\"h5\"\n variant=\"body-large\"\n color={active ? 'secondary' : 'primary'}\n >\n {label}\n </Text>\n <Flex gap=\"8px\">\n <Text color={active ? 'secondary' : 'primary'} style={style}>\n {numActions} {t('dictionary.measuresInitialRiSc')}\n </Text>\n <Text color={active ? 'secondary' : 'primary'} style={style}>\n {numScenarios} {t('dictionary.scenarios')}\n </Text>\n </Flex>\n </Radio>\n {description && (\n <Flex ml=\"6\">\n <Text\n as=\"p\"\n variant=\"body-large\"\n color={active ? 'secondary' : 'primary'}\n >\n {description}\n </Text>\n </Flex>\n )}\n </Flex>\n </>\n );\n};\n\ninterface ConfigInitialRiscProps {\n dialogState: RiScDialogStates;\n switchOn: boolean;\n setSwitchOn: (val: boolean) => void;\n setValue: UseFormSetValue<RiScWithMetadata>;\n selectedRiScType: DefaultRiScType;\n setSelectedRiScType: (riScType: DefaultRiScType) => void;\n}\n\nfunction sortStandardRiScFirst(\n defaultRiScTypeDescriptors: DefaultRiScTypeDescriptor[],\n): DefaultRiScTypeDescriptor[] {\n return defaultRiScTypeDescriptors.sort((a, b) => {\n if (\n a.riScType === DefaultRiScType.Standard &&\n b.riScType !== DefaultRiScType.Standard\n )\n return -1;\n if (\n a.riScType !== DefaultRiScType.Standard &&\n b.riScType === DefaultRiScType.Standard\n )\n return 1;\n return 0;\n });\n}\n\nfunction ConfigInitialRisc(props: ConfigInitialRiscProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { defaultRiScTypeDescriptors, getDescriptorOfType } =\n useDefaultRiScTypeDescriptors();\n\n function onSwitchChange() {\n if (props.switchOn) {\n props.setValue('content.title', '');\n props.setValue('content.scope', '');\n } else {\n const standardDescriptor = getDescriptorOfType(DefaultRiScType.Standard);\n props.setSelectedRiScType(DefaultRiScType.Standard);\n if (standardDescriptor) {\n props.setValue('content.title', standardDescriptor.defaultTitle);\n props.setValue('content.scope', standardDescriptor.defaultScope);\n }\n }\n props.setSwitchOn(!props.switchOn);\n }\n\n function onSelectRiScType(newRiScType: string) {\n const defaultRiScType = newRiScType as DefaultRiScType;\n props.setSelectedRiScType(defaultRiScType);\n const descriptor = getDescriptorOfType(newRiScType as DefaultRiScType);\n if (descriptor) {\n props.setValue('content.title', descriptor.defaultTitle);\n props.setValue('content.scope', descriptor.defaultScope);\n }\n }\n\n return (\n <>\n <Divider sx={{ margin: '16px' }} />\n {props.dialogState === RiScDialogStates.Create && (\n <>\n <Box>\n <Box mb=\"4\">\n <Text variant=\"title-small\" as=\"h6\" weight=\"bold\">\n {t('rosDialog.initialRiscTitle')}{' '}\n </Text>\n </Box>\n {defaultRiScTypeDescriptors.length > 0 && (\n <>\n <Box pb=\"2\">\n <Text variant=\"body-medium\" as=\"p\">\n {t('rosDialog.initialRiscScopeDescription')}\n </Text>\n <Switch\n isSelected={props.switchOn}\n onChange={onSwitchChange}\n label={\n props.switchOn ? t('dictionary.yes') : t('dictionary.no')\n }\n />\n </Box>\n <Flex direction=\"column\" justify=\"between\" mt=\"2\" gap=\"2\">\n <Text\n weight=\"bold\"\n as=\"p\"\n color={!props.switchOn ? 'secondary' : 'primary'}\n >\n {t('rosDialog.applicationType')}\n </Text>\n <Text\n variant=\"body-medium\"\n color={!props.switchOn ? 'secondary' : 'primary'}\n >\n {t('rosDialog.initialRiscApplicationType')}\n </Text>\n\n <RadioGroup\n onChange={onSelectRiScType}\n isDisabled={!props.switchOn}\n aria-label=\"Select application type\"\n value={props.selectedRiScType}\n >\n {sortStandardRiScFirst(defaultRiScTypeDescriptors).map(\n descriptor => (\n <RadioOption\n key={descriptor.riScType}\n value={descriptor.riScType}\n label={descriptor.listName}\n description={descriptor.listDescription}\n active={!props.switchOn}\n numActions={descriptor.numberOfActions}\n numScenarios={descriptor.numberOfScenarios}\n />\n ),\n )}\n </RadioGroup>\n </Flex>\n </>\n )}\n {defaultRiScTypeDescriptors.length === 0 && (\n <Text>{t('rosDialog.noInitialRiScFound')}</Text>\n )}\n </Box>\n </>\n )}\n </>\n );\n}\n\nexport default ConfigInitialRisc;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConfigInitialRisc.esm.js","sources":["../../../src/components/riScDialog/ConfigInitialRisc.tsx"],"sourcesContent":["import { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { Box, Flex, Radio, RadioGroup, Switch, Text } from '@backstage/ui';\nimport { RiScDialogStates } from './RiScDialog';\nimport { Divider } from '@mui/material';\nimport { RiScWithMetadata } from '../../utils/types.ts';\nimport { useDefaultRiScTypeDescriptors } from '../../contexts/DefaultRiScTypesContext.tsx';\nimport { UseFormSetValue } from 'react-hook-form/dist/types/form';\nimport { useTheme } from '@mui/material/styles';\n\ntype RadioOptionProps = {\n value: string;\n label: string;\n description?: string;\n active?: boolean;\n numActions: number | null;\n numScenarios: number | null;\n};\n\nconst RadioOption = ({\n value,\n label,\n description,\n active = true,\n numActions,\n numScenarios,\n}: RadioOptionProps) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const theme = useTheme();\n const style = {\n fontSize: '12px',\n border: `1px solid ${active ? 'var(--bui-gray-6)' : 'var(--bui-gray-8)'}`,\n borderRadius: '24px',\n padding: '2px 8px',\n };\n\n return (\n <>\n <Flex\n direction=\"column\"\n align=\"start\"\n p=\"12px 16px\"\n gap=\"2\"\n style={{\n backgroundColor:\n theme.palette.mode === 'dark'\n ? 'var(--bui-gray-5)'\n : 'var(--bui-gray-2)',\n borderRadius: '8px',\n }}\n >\n <Radio value={value}>\n <Text\n weight=\"bold\"\n as=\"h5\"\n variant=\"body-large\"\n color={active ? 'secondary' : 'primary'}\n >\n {label}\n </Text>\n <Flex gap=\"8px\">\n <Text color={active ? 'secondary' : 'primary'} style={style}>\n {numActions} {t('dictionary.measuresInitialRiSc')}\n </Text>\n <Text color={active ? 'secondary' : 'primary'} style={style}>\n {numScenarios} {t('dictionary.scenarios')}\n </Text>\n </Flex>\n </Radio>\n {description && (\n <Flex ml=\"6\">\n <Text\n as=\"p\"\n variant=\"body-large\"\n color={active ? 'secondary' : 'primary'}\n >\n {description}\n </Text>\n </Flex>\n )}\n </Flex>\n </>\n );\n};\n\ninterface ConfigInitialRiscProps {\n dialogState: RiScDialogStates;\n switchOn: boolean;\n setSwitchOn: (val: boolean) => void;\n setValue: UseFormSetValue<RiScWithMetadata>;\n selectedRiScId: string | undefined;\n setSelectedRiScId: (riScId: string | undefined) => void;\n}\n\nfunction ConfigInitialRisc(props: ConfigInitialRiscProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const {\n defaultRiScTypeDescriptors,\n riScSelectedByDefault,\n getDescriptorOfId,\n } = useDefaultRiScTypeDescriptors();\n\n function onCreateDefaultRiScSwitchChange() {\n if (props.switchOn) {\n props.setValue('content.title', '');\n props.setValue('content.scope', '');\n } else {\n props.setSelectedRiScId(riScSelectedByDefault?.id);\n if (riScSelectedByDefault) {\n props.setValue('content.title', riScSelectedByDefault.defaultTitle);\n props.setValue('content.scope', riScSelectedByDefault.defaultScope);\n }\n }\n props.setSwitchOn(!props.switchOn);\n }\n\n function onSelectRiScType(selectedDefaultRiScId: string) {\n props.setSelectedRiScId(selectedDefaultRiScId);\n const descriptor = getDescriptorOfId(selectedDefaultRiScId);\n if (descriptor) {\n props.setValue('content.title', descriptor.defaultTitle);\n props.setValue('content.scope', descriptor.defaultScope);\n }\n }\n\n return (\n <>\n <Divider sx={{ margin: '16px' }} />\n {props.dialogState === RiScDialogStates.Create && (\n <>\n <Box>\n <Box mb=\"4\">\n <Text variant=\"title-small\" as=\"h6\" weight=\"bold\">\n {t('rosDialog.initialRiscTitle')}{' '}\n </Text>\n </Box>\n {defaultRiScTypeDescriptors.length > 0 && (\n <>\n <Box pb=\"2\">\n <Text variant=\"body-medium\" as=\"p\">\n {t('rosDialog.initialRiscScopeDescription')}\n </Text>\n <Switch\n isSelected={props.switchOn}\n onChange={onCreateDefaultRiScSwitchChange}\n label={\n props.switchOn ? t('dictionary.yes') : t('dictionary.no')\n }\n />\n </Box>\n <Flex direction=\"column\" justify=\"between\" mt=\"2\" gap=\"2\">\n <Text\n weight=\"bold\"\n as=\"p\"\n color={!props.switchOn ? 'secondary' : 'primary'}\n >\n {t('rosDialog.applicationType')}\n </Text>\n <Text\n variant=\"body-medium\"\n color={!props.switchOn ? 'secondary' : 'primary'}\n >\n {t('rosDialog.initialRiscApplicationType')}\n </Text>\n\n <RadioGroup\n onChange={onSelectRiScType}\n isDisabled={!props.switchOn}\n aria-label=\"Select application type\"\n value={props.selectedRiScId}\n >\n {defaultRiScTypeDescriptors.map(descriptor => (\n <RadioOption\n key={descriptor.id}\n value={descriptor.id}\n label={descriptor.listName}\n description={descriptor.listDescription}\n active={!props.switchOn}\n numActions={descriptor.numberOfActions}\n numScenarios={descriptor.numberOfScenarios}\n />\n ))}\n </RadioGroup>\n </Flex>\n </>\n )}\n {defaultRiScTypeDescriptors.length === 0 && (\n <Text>{t('rosDialog.noInitialRiScFound')}</Text>\n )}\n </Box>\n </>\n )}\n </>\n );\n}\n\nexport default ConfigInitialRisc;\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useState } from 'react';
3
- import { DefaultRiScType } from '../../utils/types.esm.js';
2
+ import { useState, useEffect } from 'react';
4
3
  import { emptyRiSc, isDeeplyEqual } from '../../utils/utilityfunctions.esm.js';
5
4
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
6
5
  import { pluginRiScTranslationRef } from '../../utils/translations.esm.js';
@@ -16,6 +15,7 @@ import ConfigEncryptionDialog from './ConfigEncryptionDialog.esm.js';
16
15
  import ConfigRiscInfo from './ConfigRiscInfo.esm.js';
17
16
  import ConfigInitialRisc from './ConfigInitialRisc.esm.js';
18
17
  import { Button, Flex, Box } from '@backstage/ui';
18
+ import { useDefaultRiScTypeDescriptors } from '../../contexts/DefaultRiScTypesContext.esm.js';
19
19
 
20
20
  var RiScDialogStates = /* @__PURE__ */ ((RiScDialogStates2) => {
21
21
  RiScDialogStates2[RiScDialogStates2["Closed"] = 0] = "Closed";
@@ -73,9 +73,13 @@ function RiScDialog({
73
73
  });
74
74
  const [activeStep, setActiveStep] = useState(0);
75
75
  const [switchOn, setSwitchOn] = useState(false);
76
- const [selectedRiScType, setSelectedRiScType] = useState(
77
- DefaultRiScType.Standard
76
+ const { riScSelectedByDefault } = useDefaultRiScTypeDescriptors();
77
+ const [selectedRiScId, setSelectedRiScId] = useState(
78
+ riScSelectedByDefault?.id
78
79
  );
80
+ useEffect(() => {
81
+ setSelectedRiScId(riScSelectedByDefault?.id);
82
+ }, [riScSelectedByDefault]);
79
83
  const handleNext = handleSubmit(
80
84
  () => {
81
85
  if (activeStep === 0) {
@@ -102,7 +106,7 @@ function RiScDialog({
102
106
  }
103
107
  const handleFinish = handleSubmit((data) => {
104
108
  if (dialogState === 1 /* Create */) {
105
- createNewRiSc(data, switchOn, [selectedRiScType]);
109
+ createNewRiSc(data, switchOn, selectedRiScId);
106
110
  } else if (dialogState === 5 /* Delete */) {
107
111
  deleteRiSc(
108
112
  () => selectRiSc(riScs && riScs.length > 0 ? riScs[0].id : "")
@@ -153,8 +157,8 @@ function RiScDialog({
153
157
  switchOn,
154
158
  setSwitchOn,
155
159
  setValue,
156
- selectedRiScType,
157
- setSelectedRiScType
160
+ selectedRiScId,
161
+ setSelectedRiScId
158
162
  }
159
163
  ),
160
164
  activeStep === 1 && /* @__PURE__ */ jsx(
@@ -1 +1 @@
1
- {"version":3,"file":"RiScDialog.esm.js","sources":["../../../src/components/riScDialog/RiScDialog.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { DefaultRiScType, RiScWithMetadata } from '../../utils/types';\nimport { emptyRiSc, isDeeplyEqual } from '../../utils/utilityfunctions';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { useForm } from 'react-hook-form';\nimport Dialog from '@mui/material/Dialog';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogActions from '@mui/material/DialogActions';\nimport { dialogActions } from '../common/mixins';\nimport { Step, StepLabel, Stepper } from '@mui/material';\nimport ConfigEncryptionDialog from './ConfigEncryptionDialog';\nimport ConfigRiscInfo from './ConfigRiscInfo';\nimport ConfigInitialRisc from './ConfigInitialRisc';\nimport { Flex, Box, Button } from '@backstage/ui';\n\nexport enum RiScDialogStates {\n Closed = 0,\n Create = 1,\n EditRiscInfo = 2,\n SelectInitialRisc = 3,\n EditEncryption = 4,\n Delete = 5,\n}\n\ninterface RiScDialogProps {\n onClose: () => void;\n dialogState: RiScDialogStates;\n onDelete: () => void;\n}\n\nfunction RiScStepper({\n children,\n activeStep,\n}: {\n children: React.ReactNode;\n activeStep: number;\n}) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const steps = [\n t('rosDialog.initialRiscTitle'),\n t('rosDialog.stepRiscDetails'),\n t('rosDialog.stepEncryption'),\n ];\n return (\n <Box style={{ width: '100%', padding: '24px' }}>\n <Stepper activeStep={activeStep} alternativeLabel>\n {steps.map(label => (\n <Step key={label}>\n <StepLabel>{label}</StepLabel>\n </Step>\n ))}\n </Stepper>\n {children}\n </Box>\n );\n}\n\nexport function RiScDialog({\n onClose,\n dialogState,\n onDelete,\n}: RiScDialogProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const {\n selectedRiSc,\n riScs,\n selectRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n gcpCryptoKeys,\n } = useRiScs();\n const {\n register,\n handleSubmit,\n watch,\n formState: { errors },\n setValue,\n } = useForm<RiScWithMetadata>({\n defaultValues:\n dialogState === RiScDialogStates.EditRiscInfo ||\n dialogState === RiScDialogStates.EditEncryption\n ? selectedRiSc!\n : {\n content: emptyRiSc(),\n sopsConfig: {\n shamir_threshold: 2,\n },\n },\n mode: 'onBlur',\n });\n\n const [activeStep, setActiveStep] = useState(0);\n\n const [switchOn, setSwitchOn] = useState(false);\n\n const [selectedRiScType, setSelectedRiScType] = useState<DefaultRiScType>(\n DefaultRiScType.Standard,\n );\n\n const handleNext = handleSubmit(\n () => {\n if (activeStep === 0) {\n setActiveStep(1);\n }\n if (activeStep === 1) {\n setActiveStep(2);\n }\n },\n // Continue to step 1 even if there are errors, as long as there are no errors in step 0 (the content)\n validationErrors => {\n if (activeStep === 0 && validationErrors.content === undefined) {\n setActiveStep(1);\n }\n },\n );\n\n function handleBack() {\n if (activeStep === 1) {\n setActiveStep(0);\n }\n if (activeStep === 2) {\n setActiveStep(1);\n }\n }\n\n const handleFinish = handleSubmit((data: RiScWithMetadata) => {\n if (dialogState === RiScDialogStates.Create) {\n createNewRiSc(data, switchOn, [selectedRiScType]);\n } else if (dialogState === RiScDialogStates.Delete) {\n deleteRiSc(() =>\n selectRiSc(riScs && riScs.length > 0 ? riScs[0].id : ''),\n );\n } else {\n // Do manual comparison of contents, as the sopsConfig field contains many values from the backend that are not\n // used or set by the frontend.\n // Check if the additional Age keys are equal, using the single important field, `recipient`\n const areAgeKeysEqual = isDeeplyEqual(\n data.sopsConfig.age?.map(age => age.recipient).sort(),\n selectedRiSc?.sopsConfig.age?.map(age => age.recipient).sort(),\n );\n\n // Check if the GCP keys are equal, using the two important fields, `resource_id` and `created_at`.\n // Comparison uses dictionaries, where resource ids are keys and created at dates are values\n const areGCPKeysEqual = isDeeplyEqual(\n Object.fromEntries(\n data.sopsConfig.gcp_kms?.map(key => [\n key.resource_id,\n key.created_at,\n ]) ?? [],\n ),\n Object.fromEntries(\n selectedRiSc?.sopsConfig.gcp_kms?.map(key => [\n key.resource_id,\n key.created_at,\n ]) ?? [],\n ),\n );\n\n // Only update the risc if it has changed\n if (\n !isDeeplyEqual(data, selectedRiSc, ['sopsConfig']) ||\n !areGCPKeysEqual ||\n !areAgeKeysEqual\n ) {\n updateRiSc(data);\n }\n }\n onClose();\n });\n\n if (dialogState === RiScDialogStates.Create) {\n return (\n <Dialog open={true} onClose={onClose}>\n <DialogTitle>{t('rosDialog.titleNew')}</DialogTitle>\n <RiScStepper activeStep={activeStep}>\n <DialogContent\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n paddingX: 1,\n paddingY: 0.5,\n }}\n >\n {activeStep === 0 && (\n <ConfigInitialRisc\n dialogState={dialogState}\n switchOn={switchOn}\n setSwitchOn={setSwitchOn}\n setValue={setValue}\n selectedRiScType={selectedRiScType}\n setSelectedRiScType={setSelectedRiScType}\n />\n )}\n {activeStep === 1 && (\n <ConfigRiscInfo\n dialogState={dialogState}\n register={register}\n errors={errors}\n setValue={setValue}\n watch={watch}\n />\n )}\n {activeStep === 2 && (\n <ConfigEncryptionDialog\n gcpCryptoKeys={gcpCryptoKeys}\n setValue={setValue}\n state={dialogState}\n register={register}\n errors={errors}\n />\n )}\n </DialogContent>\n </RiScStepper>\n <DialogActions sx={dialogActions}>\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Flex>\n <Button\n size=\"medium\"\n variant=\"secondary\"\n isDisabled={activeStep === 0}\n onClick={handleBack}\n >\n {t('dictionary.previous')}\n </Button>\n {activeStep < 2 ? (\n <Button size=\"medium\" variant=\"primary\" onClick={handleNext}>\n {t('dictionary.next')}\n </Button>\n ) : (\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n )}\n </Flex>\n </DialogActions>\n </Dialog>\n );\n }\n\n if (dialogState === RiScDialogStates.Delete) {\n return (\n <Dialog open={true} onClose={onClose}>\n <DialogTitle>{t('deleteDialog.title')}</DialogTitle>\n <DialogContent>\n <DialogContent>{t('deleteDialog.confirmationMessage')}</DialogContent>\n </DialogContent>\n <DialogActions>\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.delete')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n if (dialogState === RiScDialogStates.EditRiscInfo) {\n return (\n <Dialog open={true} onClose={onClose}>\n <DialogTitle>\n <Flex direction=\"column\">{t('rosDialog.titleEdit')}</Flex>\n </DialogTitle>\n <DialogContent\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n width: '100%',\n paddingX: 4,\n paddingY: 3,\n }}\n >\n <ConfigRiscInfo\n dialogState={dialogState}\n register={register}\n errors={errors}\n setValue={setValue}\n watch={watch}\n />\n </DialogContent>\n <DialogActions sx={dialogActions}>\n <Button\n size=\"medium\"\n variant=\"tertiary\"\n onClick={onDelete}\n style={{ color: '#d32f2f', paddingLeft: 0 }}\n >\n <i className=\"ri-delete-bin-line\" style={{ fontSize: '16px' }} />\n {t('contentHeader.deleteButton')}\n </Button>\n <Flex>\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n </Flex>\n </DialogActions>\n </Dialog>\n );\n }\n\n if (dialogState === RiScDialogStates.EditEncryption) {\n return (\n <Dialog open={true} onClose={onClose}>\n <DialogTitle>{t('rosDialog.editEncryption')}</DialogTitle>\n <DialogContent\n sx={{ display: 'flex', flexDirection: 'column', gap: '16px' }}\n >\n <ConfigEncryptionDialog\n gcpCryptoKeys={gcpCryptoKeys}\n sopsData={selectedRiSc?.sopsConfig}\n setValue={setValue}\n state={dialogState}\n register={register}\n errors={errors}\n />\n </DialogContent>\n <DialogActions sx={dialogActions}>\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n return null;\n}\n"],"names":["RiScDialogStates"],"mappings":"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"}
1
+ {"version":3,"file":"RiScDialog.esm.js","sources":["../../../src/components/riScDialog/RiScDialog.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { RiScWithMetadata } from '../../utils/types';\nimport { emptyRiSc, isDeeplyEqual } from '../../utils/utilityfunctions';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { useForm } from 'react-hook-form';\nimport Dialog from '@mui/material/Dialog';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogActions from '@mui/material/DialogActions';\nimport { dialogActions } from '../common/mixins';\nimport { Step, StepLabel, Stepper } from '@mui/material';\nimport ConfigEncryptionDialog from './ConfigEncryptionDialog';\nimport ConfigRiscInfo from './ConfigRiscInfo';\nimport ConfigInitialRisc from './ConfigInitialRisc';\nimport { Flex, Box, Button } from '@backstage/ui';\nimport { useDefaultRiScTypeDescriptors } from '../../contexts/DefaultRiScTypesContext.tsx';\n\nexport enum RiScDialogStates {\n Closed = 0,\n Create = 1,\n EditRiscInfo = 2,\n SelectInitialRisc = 3,\n EditEncryption = 4,\n Delete = 5,\n}\n\ninterface RiScDialogProps {\n onClose: () => void;\n dialogState: RiScDialogStates;\n onDelete: () => void;\n}\n\nfunction RiScStepper({\n children,\n activeStep,\n}: {\n children: React.ReactNode;\n activeStep: number;\n}) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const steps = [\n t('rosDialog.initialRiscTitle'),\n t('rosDialog.stepRiscDetails'),\n t('rosDialog.stepEncryption'),\n ];\n return (\n <Box style={{ width: '100%', padding: '24px' }}>\n <Stepper activeStep={activeStep} alternativeLabel>\n {steps.map(label => (\n <Step key={label}>\n <StepLabel>{label}</StepLabel>\n </Step>\n ))}\n </Stepper>\n {children}\n </Box>\n );\n}\n\nexport function RiScDialog({\n onClose,\n dialogState,\n onDelete,\n}: RiScDialogProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const {\n selectedRiSc,\n riScs,\n selectRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n gcpCryptoKeys,\n } = useRiScs();\n const {\n register,\n handleSubmit,\n watch,\n formState: { errors },\n setValue,\n } = useForm<RiScWithMetadata>({\n defaultValues:\n dialogState === RiScDialogStates.EditRiscInfo ||\n dialogState === RiScDialogStates.EditEncryption\n ? selectedRiSc!\n : {\n content: emptyRiSc(),\n sopsConfig: {\n shamir_threshold: 2,\n },\n },\n mode: 'onBlur',\n });\n\n const [activeStep, setActiveStep] = useState(0);\n\n const [switchOn, setSwitchOn] = useState(false);\n\n const { riScSelectedByDefault } = useDefaultRiScTypeDescriptors();\n const [selectedRiScId, setSelectedRiScId] = useState<string | undefined>(\n riScSelectedByDefault?.id,\n );\n useEffect(() => {\n setSelectedRiScId(riScSelectedByDefault?.id);\n }, [riScSelectedByDefault]);\n\n const handleNext = handleSubmit(\n () => {\n if (activeStep === 0) {\n setActiveStep(1);\n }\n if (activeStep === 1) {\n setActiveStep(2);\n }\n },\n // Continue to step 1 even if there are errors, as long as there are no errors in step 0 (the content)\n validationErrors => {\n if (activeStep === 0 && validationErrors.content === undefined) {\n setActiveStep(1);\n }\n },\n );\n\n function handleBack() {\n if (activeStep === 1) {\n setActiveStep(0);\n }\n if (activeStep === 2) {\n setActiveStep(1);\n }\n }\n\n const handleFinish = handleSubmit((data: RiScWithMetadata) => {\n if (dialogState === RiScDialogStates.Create) {\n createNewRiSc(data, switchOn, selectedRiScId);\n } else if (dialogState === RiScDialogStates.Delete) {\n deleteRiSc(() =>\n selectRiSc(riScs && riScs.length > 0 ? riScs[0].id : ''),\n );\n } else {\n // Do manual comparison of contents, as the sopsConfig field contains many values from the backend that are not\n // used or set by the frontend.\n // Check if the additional Age keys are equal, using the single important field, `recipient`\n const areAgeKeysEqual = isDeeplyEqual(\n data.sopsConfig.age?.map(age => age.recipient).sort(),\n selectedRiSc?.sopsConfig.age?.map(age => age.recipient).sort(),\n );\n\n // Check if the GCP keys are equal, using the two important fields, `resource_id` and `created_at`.\n // Comparison uses dictionaries, where resource ids are keys and created at dates are values\n const areGCPKeysEqual = isDeeplyEqual(\n Object.fromEntries(\n data.sopsConfig.gcp_kms?.map(key => [\n key.resource_id,\n key.created_at,\n ]) ?? [],\n ),\n Object.fromEntries(\n selectedRiSc?.sopsConfig.gcp_kms?.map(key => [\n key.resource_id,\n key.created_at,\n ]) ?? [],\n ),\n );\n\n // Only update the risc if it has changed\n if (\n !isDeeplyEqual(data, selectedRiSc, ['sopsConfig']) ||\n !areGCPKeysEqual ||\n !areAgeKeysEqual\n ) {\n updateRiSc(data);\n }\n }\n onClose();\n });\n\n if (dialogState === RiScDialogStates.Create) {\n return (\n <Dialog open={true} onClose={onClose}>\n <DialogTitle>{t('rosDialog.titleNew')}</DialogTitle>\n <RiScStepper activeStep={activeStep}>\n <DialogContent\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n paddingX: 1,\n paddingY: 0.5,\n }}\n >\n {activeStep === 0 && (\n <ConfigInitialRisc\n dialogState={dialogState}\n switchOn={switchOn}\n setSwitchOn={setSwitchOn}\n setValue={setValue}\n selectedRiScId={selectedRiScId}\n setSelectedRiScId={setSelectedRiScId}\n />\n )}\n {activeStep === 1 && (\n <ConfigRiscInfo\n dialogState={dialogState}\n register={register}\n errors={errors}\n setValue={setValue}\n watch={watch}\n />\n )}\n {activeStep === 2 && (\n <ConfigEncryptionDialog\n gcpCryptoKeys={gcpCryptoKeys}\n setValue={setValue}\n state={dialogState}\n register={register}\n errors={errors}\n />\n )}\n </DialogContent>\n </RiScStepper>\n <DialogActions sx={dialogActions}>\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Flex>\n <Button\n size=\"medium\"\n variant=\"secondary\"\n isDisabled={activeStep === 0}\n onClick={handleBack}\n >\n {t('dictionary.previous')}\n </Button>\n {activeStep < 2 ? (\n <Button size=\"medium\" variant=\"primary\" onClick={handleNext}>\n {t('dictionary.next')}\n </Button>\n ) : (\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n )}\n </Flex>\n </DialogActions>\n </Dialog>\n );\n }\n\n if (dialogState === RiScDialogStates.Delete) {\n return (\n <Dialog open={true} onClose={onClose}>\n <DialogTitle>{t('deleteDialog.title')}</DialogTitle>\n <DialogContent>\n <DialogContent>{t('deleteDialog.confirmationMessage')}</DialogContent>\n </DialogContent>\n <DialogActions>\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.delete')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n if (dialogState === RiScDialogStates.EditRiscInfo) {\n return (\n <Dialog open={true} onClose={onClose}>\n <DialogTitle>\n <Flex direction=\"column\">{t('rosDialog.titleEdit')}</Flex>\n </DialogTitle>\n <DialogContent\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: '16px',\n width: '100%',\n paddingX: 4,\n paddingY: 3,\n }}\n >\n <ConfigRiscInfo\n dialogState={dialogState}\n register={register}\n errors={errors}\n setValue={setValue}\n watch={watch}\n />\n </DialogContent>\n <DialogActions sx={dialogActions}>\n <Button\n size=\"medium\"\n variant=\"tertiary\"\n onClick={onDelete}\n style={{ color: '#d32f2f', paddingLeft: 0 }}\n >\n <i className=\"ri-delete-bin-line\" style={{ fontSize: '16px' }} />\n {t('contentHeader.deleteButton')}\n </Button>\n <Flex>\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n </Flex>\n </DialogActions>\n </Dialog>\n );\n }\n\n if (dialogState === RiScDialogStates.EditEncryption) {\n return (\n <Dialog open={true} onClose={onClose}>\n <DialogTitle>{t('rosDialog.editEncryption')}</DialogTitle>\n <DialogContent\n sx={{ display: 'flex', flexDirection: 'column', gap: '16px' }}\n >\n <ConfigEncryptionDialog\n gcpCryptoKeys={gcpCryptoKeys}\n sopsData={selectedRiSc?.sopsConfig}\n setValue={setValue}\n state={dialogState}\n register={register}\n errors={errors}\n />\n </DialogContent>\n <DialogActions sx={dialogActions}>\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n </DialogActions>\n </Dialog>\n );\n }\n\n return null;\n}\n"],"names":["RiScDialogStates"],"mappings":"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"}
@@ -1,30 +1,45 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { useState, useEffect, createContext, useContext } from 'react';
3
3
  import { useAuthenticatedFetch } from '../utils/hooks.esm.js';
4
+ import { useEntity } from '@backstage/plugin-catalog-react';
4
5
 
5
6
  const DefaultRiScTypesContext = createContext(void 0);
6
7
  function DefaultRiScTypesProvider({
7
8
  children
8
9
  }) {
9
10
  const { fetchDefaultRiScTypeDescriptors } = useAuthenticatedFetch();
11
+ const { entity } = useEntity();
10
12
  const [defaultRiScTypeDescriptors, setDefaultRiScTypeDescriptors] = useState([]);
13
+ const [riScSelectedByDefault, setRiScSelectedByDefault] = useState(void 0);
11
14
  useEffect(() => {
12
15
  fetchDefaultRiScTypeDescriptors((response) => {
13
16
  setDefaultRiScTypeDescriptors(response);
17
+ setRiScSelectedByDefault(getRiScSelectedByDefault(response));
14
18
  });
15
19
  }, []);
16
- function getDescriptorOfType(type) {
17
- if (defaultRiScTypeDescriptors === void 0) return null;
18
- const descriptor = defaultRiScTypeDescriptors.find(
19
- (value) => value.riScType === type
20
+ function getRiScSelectedByDefault(descriptors) {
21
+ const componentType = entity.spec?.type;
22
+ if (!componentType) {
23
+ if (descriptors.length > 0) return descriptors[0];
24
+ return void 0;
25
+ }
26
+ const selectedDescriptor = descriptors.find(
27
+ (descriptor) => descriptor.preferredBackstageComponentType === componentType
20
28
  );
21
- if (descriptor === void 0) return null;
22
- return descriptor;
29
+ if (!selectedDescriptor && descriptors.length > 0) return descriptors[0];
30
+ return selectedDescriptor;
31
+ }
32
+ function getDescriptorOfId(id) {
33
+ return defaultRiScTypeDescriptors.find((descriptor) => descriptor.id === id);
23
34
  }
24
35
  return /* @__PURE__ */ jsx(
25
36
  DefaultRiScTypesContext.Provider,
26
37
  {
27
- value: { defaultRiScTypeDescriptors, getDescriptorOfType },
38
+ value: {
39
+ defaultRiScTypeDescriptors,
40
+ riScSelectedByDefault,
41
+ getDescriptorOfId
42
+ },
28
43
  children
29
44
  }
30
45
  );
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultRiScTypesContext.esm.js","sources":["../../src/contexts/DefaultRiScTypesContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport { useAuthenticatedFetch } from '../utils/hooks.ts';\nimport { DefaultRiScType, DefaultRiScTypeDescriptor } from '../utils/types.ts';\n\ntype DefaultRiScTypesContextObject = {\n defaultRiScTypeDescriptors: DefaultRiScTypeDescriptor[];\n getDescriptorOfType: (\n type: DefaultRiScType,\n ) => DefaultRiScTypeDescriptor | null;\n};\n\nconst DefaultRiScTypesContext = createContext<\n DefaultRiScTypesContextObject | undefined\n>(undefined);\n\nexport function DefaultRiScTypesProvider({\n children,\n}: {\n children: ReactNode;\n}) {\n const { fetchDefaultRiScTypeDescriptors } = useAuthenticatedFetch();\n\n const [defaultRiScTypeDescriptors, setDefaultRiScTypeDescriptors] = useState<\n DefaultRiScTypeDescriptor[]\n >([]);\n\n useEffect(() => {\n fetchDefaultRiScTypeDescriptors(response => {\n setDefaultRiScTypeDescriptors(response);\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function getDescriptorOfType(\n type: DefaultRiScType,\n ): DefaultRiScTypeDescriptor | null {\n if (defaultRiScTypeDescriptors === undefined) return null;\n\n const descriptor = defaultRiScTypeDescriptors.find(\n value => value.riScType === type,\n );\n if (descriptor === undefined) return null;\n return descriptor;\n }\n\n return (\n <DefaultRiScTypesContext.Provider\n value={{ defaultRiScTypeDescriptors, getDescriptorOfType }}\n >\n {children}\n </DefaultRiScTypesContext.Provider>\n );\n}\n\nexport function useDefaultRiScTypeDescriptors() {\n const context = useContext(DefaultRiScTypesContext);\n\n if (context === undefined) {\n throw new Error(\n 'useDefaultRiScTypeDescriptors must be used within a DefaultRiScTypesContext provider',\n );\n }\n return context;\n}\n"],"names":[],"mappings":";;;;AAiBA,MAAM,uBAAA,GAA0B,cAE9B,MAAS,CAAA;AAEJ,SAAS,wBAAA,CAAyB;AAAA,EACvC;AACF,CAAA,EAEG;AACD,EAAA,MAAM,EAAE,+BAAA,EAAgC,GAAI,qBAAA,EAAsB;AAElE,EAAA,MAAM,CAAC,0BAAA,EAA4B,6BAA6B,CAAA,GAAI,QAAA,CAElE,EAAE,CAAA;AAEJ,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,+BAAA,CAAgC,CAAA,QAAA,KAAY;AAC1C,MAAA,6BAAA,CAA8B,QAAQ,CAAA;AAAA,IACxC,CAAC,CAAA;AAAA,EAEH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAS,oBACP,IAAA,EACkC;AAClC,IAAA,IAAI,0BAAA,KAA+B,QAAW,OAAO,IAAA;AAErD,IAAA,MAAM,aAAa,0BAAA,CAA2B,IAAA;AAAA,MAC5C,CAAA,KAAA,KAAS,MAAM,QAAA,KAAa;AAAA,KAC9B;AACA,IAAA,IAAI,UAAA,KAAe,QAAW,OAAO,IAAA;AACrC,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,uBAAA,CAAwB,QAAA;AAAA,IAAxB;AAAA,MACC,KAAA,EAAO,EAAE,0BAAA,EAA4B,mBAAA,EAAoB;AAAA,MAExD;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,6BAAA,GAAgC;AAC9C,EAAA,MAAM,OAAA,GAAU,WAAW,uBAAuB,CAAA;AAElD,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;;;;"}
1
+ {"version":3,"file":"DefaultRiScTypesContext.esm.js","sources":["../../src/contexts/DefaultRiScTypesContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport { useAuthenticatedFetch } from '../utils/hooks.ts';\nimport { DefaultRiScTypeDescriptor } from '../utils/types.ts';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\ntype DefaultRiScTypesContextObject = {\n defaultRiScTypeDescriptors: DefaultRiScTypeDescriptor[];\n riScSelectedByDefault: DefaultRiScTypeDescriptor | undefined;\n getDescriptorOfId: (id: string) => DefaultRiScTypeDescriptor | undefined;\n};\n\nconst DefaultRiScTypesContext = createContext<\n DefaultRiScTypesContextObject | undefined\n>(undefined);\n\nexport function DefaultRiScTypesProvider({\n children,\n}: {\n children: ReactNode;\n}) {\n const { fetchDefaultRiScTypeDescriptors } = useAuthenticatedFetch();\n const { entity } = useEntity();\n const [defaultRiScTypeDescriptors, setDefaultRiScTypeDescriptors] = useState<\n DefaultRiScTypeDescriptor[]\n >([]);\n const [riScSelectedByDefault, setRiScSelectedByDefault] = useState<\n DefaultRiScTypeDescriptor | undefined\n >(undefined);\n\n useEffect(() => {\n fetchDefaultRiScTypeDescriptors(response => {\n setDefaultRiScTypeDescriptors(response);\n setRiScSelectedByDefault(getRiScSelectedByDefault(response));\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function getRiScSelectedByDefault(\n descriptors: DefaultRiScTypeDescriptor[],\n ): DefaultRiScTypeDescriptor | undefined {\n const componentType = entity.spec?.type as string | undefined;\n\n if (!componentType) {\n if (descriptors.length > 0) return descriptors[0];\n return undefined;\n }\n\n const selectedDescriptor = descriptors.find(\n descriptor =>\n descriptor.preferredBackstageComponentType === componentType,\n );\n if (!selectedDescriptor && descriptors.length > 0) return descriptors[0];\n return selectedDescriptor;\n }\n\n function getDescriptorOfId(\n id: string,\n ): DefaultRiScTypeDescriptor | undefined {\n return defaultRiScTypeDescriptors.find(descriptor => descriptor.id === id);\n }\n\n return (\n <DefaultRiScTypesContext.Provider\n value={{\n defaultRiScTypeDescriptors,\n riScSelectedByDefault,\n getDescriptorOfId,\n }}\n >\n {children}\n </DefaultRiScTypesContext.Provider>\n );\n}\n\nexport function useDefaultRiScTypeDescriptors() {\n const context = useContext(DefaultRiScTypesContext);\n\n if (context === undefined) {\n throw new Error(\n 'useDefaultRiScTypeDescriptors must be used within a DefaultRiScTypesContext provider',\n );\n }\n return context;\n}\n"],"names":[],"mappings":";;;;;AAiBA,MAAM,uBAAA,GAA0B,cAE9B,MAAS,CAAA;AAEJ,SAAS,wBAAA,CAAyB;AAAA,EACvC;AACF,CAAA,EAEG;AACD,EAAA,MAAM,EAAE,+BAAA,EAAgC,GAAI,qBAAA,EAAsB;AAClE,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,CAAC,0BAAA,EAA4B,6BAA6B,CAAA,GAAI,QAAA,CAElE,EAAE,CAAA;AACJ,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAAI,SAExD,MAAS,CAAA;AAEX,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,+BAAA,CAAgC,CAAA,QAAA,KAAY;AAC1C,MAAA,6BAAA,CAA8B,QAAQ,CAAA;AACtC,MAAA,wBAAA,CAAyB,wBAAA,CAAyB,QAAQ,CAAC,CAAA;AAAA,IAC7D,CAAC,CAAA;AAAA,EAEH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAS,yBACP,WAAA,EACuC;AACvC,IAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,EAAM,IAAA;AAEnC,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,OAAO,YAAY,CAAC,CAAA;AAChD,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,qBAAqB,WAAA,CAAY,IAAA;AAAA,MACrC,CAAA,UAAA,KACE,WAAW,+BAAA,KAAoC;AAAA,KACnD;AACA,IAAA,IAAI,CAAC,kBAAA,IAAsB,WAAA,CAAY,SAAS,CAAA,EAAG,OAAO,YAAY,CAAC,CAAA;AACvE,IAAA,OAAO,kBAAA;AAAA,EACT;AAEA,EAAA,SAAS,kBACP,EAAA,EACuC;AACvC,IAAA,OAAO,0BAAA,CAA2B,IAAA,CAAK,CAAA,UAAA,KAAc,UAAA,CAAW,OAAO,EAAE,CAAA;AAAA,EAC3E;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,uBAAA,CAAwB,QAAA;AAAA,IAAxB;AAAA,MACC,KAAA,EAAO;AAAA,QACL,0BAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,6BAAA,GAAgC;AAC9C,EAAA,MAAM,OAAA,GAAU,WAAW,uBAAuB,CAAA;AAElD,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;;;;"}
@@ -176,7 +176,7 @@ function RiScProvider({ children }) {
176
176
  navigate(getRiScPath({ riScId: selectedRiScId }));
177
177
  }
178
178
  }
179
- function createNewRiSc(riSc, generateInitialRisc, initialRiscType) {
179
+ function createNewRiSc(riSc, generateInitialRisc, defaultRiScId) {
180
180
  setIsFetching(true);
181
181
  setSelectedRiSc(null);
182
182
  const newRiSc = {
@@ -185,7 +185,7 @@ function RiScProvider({ children }) {
185
185
  newRiSc.content,
186
186
  generateInitialRisc,
187
187
  newRiSc.sopsConfig,
188
- initialRiscType,
188
+ defaultRiScId,
189
189
  (res) => {
190
190
  if (!res.riScId) throw new Error("No RiSc ID returned");
191
191
  if (!res.riScContent) throw new Error("No RiSc content returned");
@@ -1 +1 @@
1
- {"version":3,"file":"RiScContext.esm.js","sources":["../../src/contexts/RiScContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n ContentStatus,\n DefaultRiScType,\n ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n getTranslationKey,\n requiresNewApproval,\n} from '../utils/utilityfunctions';\nimport { riScRouteRef } from '../routes';\nimport { useLocation, useNavigate, useParams } from 'react-router';\nimport {\n dtoToRiSc,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n RiScDTO,\n} from '../utils/DTOs';\nimport { useAuthenticatedFetch } from '../utils/hooks';\nimport { latestSupportedVersion } from '../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../utils/translations';\n\nexport type UpdateStatus = {\n isLoading: boolean;\n isError: boolean;\n isSuccess: boolean;\n};\n\ntype RiScDrawerProps = {\n riScs: RiScWithMetadata[] | null;\n selectRiSc: (title: string) => void;\n selectedRiSc: RiScWithMetadata | null;\n createNewRiSc: (\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n initialRiscType: DefaultRiScType[],\n ) => void;\n deleteRiSc: (onSuccess?: () => void, onError?: () => void) => void;\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: boolean;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n response: SubmitResponseObject | null;\n};\n\nconst RiScContext = createContext<RiScDrawerProps | undefined>(undefined);\n\nexport function RiScProvider({ children }: { children: ReactNode }) {\n const { riScId: riScIdFromParams } = useParams();\n const location = useLocation();\n const navigate = useNavigate();\n const getRiScPath = useRouteRef(riScRouteRef);\n const [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n deleteRiScs,\n putRiScs,\n publishRiScs,\n response,\n setResponse,\n } = useAuthenticatedFetch();\n\n const [riScs, setRiScs] = useState<RiScWithMetadata[] | null>(null);\n const [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\n const [isFetching, setIsFetching] = useState(true);\n const isFetchingRef = useRef(isFetching);\n const [isFetchingRiScs, setIsFetchingRiScs] = useState(true);\n const isFetchingRiScsRef = useRef(isFetchingRiScs);\n const [isFetchingGcpCryptoKeys, setIsFetchingGcpCryptoKeys] = useState(true);\n const isFetchingGcpCryptoKeysRef = useRef(isFetchingGcpCryptoKeys);\n const [updateStatus, setUpdateStatus] = useState({\n isLoading: false,\n isError: false,\n isSuccess: false,\n });\n\n const [gcpCryptoKeys, setGcpCryptoKeys] = useState<GcpCryptoKeyObject[]>([]);\n\n useEffect(() => {\n if (location.state) {\n setResponse({\n statusMessage: location.state,\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n });\n }\n }, [location, setResponse]);\n\n // Initial fetch of GCP crypto keys\n useEffect(() => {\n fetchGcpCryptoKeys(\n res => {\n setGcpCryptoKeys(res);\n // Sorts the crypto keys on whether the user has encrypt/decrypt role on it\n setGcpCryptoKeys(\n res.sort((a, b) => {\n if (b.hasEncryptDecryptAccess === a.hasEncryptDecryptAccess) {\n return 0;\n }\n return b.hasEncryptDecryptAccess ? 1 : -1;\n }),\n );\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n (_error, loginRejected) => {\n setResponse({\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: loginRejected\n ? `${t('errorMessages.ErrorWhenFetchingGcpCryptoKeys')}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\n });\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Initial fetch of RiScs\n useEffect(() => {\n fetchRiScs(\n res => {\n const fetchedRiScs: RiScWithMetadata[] = res\n .filter(risk => risk.status === ContentStatus.Success)\n .map(riScDTO => {\n const json = JSON.parse(riScDTO.riScContent) as RiScDTO;\n\n const content = dtoToRiSc(json);\n return {\n id: riScDTO.riScId,\n content: content,\n sopsConfig: riScDTO.sopsConfig,\n status: riScDTO.riScStatus,\n pullRequestUrl: riScDTO.pullRequestUrl,\n migrationStatus: riScDTO.migrationStatus,\n lastPublished: riScDTO.lastPublished,\n };\n });\n setRiScs(fetchedRiScs);\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n\n const errorRiScs: string[] = res\n .filter(risk => risk.status !== ContentStatus.Success)\n .map(risk => risk.riScId);\n\n if (errorRiScs.length > 0) {\n const errorRiScIds = errorRiScs.join(', ');\n setResponse({\n statusMessage: t('errorMessages.ErrorWhenFetchingRiScs').concat(\n errorRiScIds,\n ),\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n });\n }\n\n // If there are no RiScs, don't set a selected RiSc\n if (fetchedRiScs.length === 0) {\n return;\n }\n\n // If there is no RiSc ID in the URL, navigate to the first RiSc\n if (!riScIdFromParams) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n\n // If there is an invalid RiSc ID in the URL, navigate to the first RiSc with error state\n if (!riSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n return;\n }\n },\n loginRejected => {\n setResponse({\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: loginRejected\n ? `${t('errorMessages.ErrorWhenFetchingRiScs')}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : t('errorMessages.ErrorWhenFetchingRiScs'),\n });\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Set selected RiSc based on URL\n useEffect(() => {\n if (riScIdFromParams) {\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n }\n }\n }, [riScs, riScIdFromParams]);\n\n const resetRiScStatus = useCallback(() => {\n setUpdateStatus({\n isLoading: false,\n isSuccess: false,\n isError: false,\n });\n }, []);\n\n // use callback to avoid infinite loop\n const resetResponse = useCallback(() => {\n setResponse(null);\n }, [setResponse]);\n\n function selectRiSc(id: string) {\n const selectedRiScId = riScs?.find(riSc => riSc.id === id)?.id;\n if (selectedRiScId) {\n navigate(getRiScPath({ riScId: selectedRiScId }));\n }\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n initialRiscType: DefaultRiScType[],\n ) {\n setIsFetching(true);\n setSelectedRiSc(null);\n\n const newRiSc: RiScWithMetadata = {\n ...riSc,\n schemaVersion: latestSupportedVersion,\n };\n postRiScs(\n newRiSc.content,\n generateInitialRisc,\n newRiSc.sopsConfig,\n initialRiscType,\n res => {\n if (!res.riScId) throw new Error('No RiSc ID returned');\n if (!res.riScContent) throw new Error('No RiSc content returned');\n const json = JSON.parse(res.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n const riScWithMetaData: RiScWithMetadata = {\n id: res.riScId,\n status: RiScStatus.Draft,\n content: content,\n sopsConfig: riSc.sopsConfig,\n schemaVersion: riSc.schemaVersion,\n lastPublished: riSc.lastPublished,\n };\n setRiScs(riScs ? [...riScs, riScWithMetaData] : [riScWithMetaData]);\n setIsFetching(false);\n navigate(getRiScPath({ riScId: res.riScId }));\n setResponse({\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n });\n setUpdateStatus({\n isLoading: false,\n isError: false,\n isSuccess: true,\n });\n },\n (error: ProcessRiScResultDTO, loginRejected: boolean) => {\n setSelectedRiSc(selectedRiSc);\n setIsFetching(false);\n setUpdateStatus({\n isLoading: false,\n isError: true,\n isSuccess: false,\n });\n\n setResponse({\n ...error,\n statusMessage: loginRejected\n ? `${getTranslationKey('error', error.status, t)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey('error', error.status, t),\n });\n },\n );\n }\n\n function deleteRiSc(onSuccess?: () => void, onError?: () => void) {\n if (selectedRiSc && riScs) {\n const updatedRiSc = {\n ...selectedRiSc,\n status: RiScStatus.DeletionDraft,\n };\n const originalRiSc = selectedRiSc;\n\n setUpdateStatus({\n isLoading: true,\n isError: false,\n isSuccess: false,\n });\n deleteRiScs(\n selectedRiSc.id,\n res => {\n setUpdateStatus({\n isLoading: false,\n isError: false,\n isSuccess: true,\n });\n setIsRequesting(false);\n if (res.status === ProcessingStatus.DeletedRiSc) {\n setSelectedRiSc(\n riScs.find(riSc => riSc.id !== selectedRiSc.id) || null,\n );\n setRiScs(riScs.filter(riSc => riSc.id !== updatedRiSc.id));\n } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n if (onSuccess) onSuccess();\n setResponse({\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n });\n },\n (error, loginRejected) => {\n setSelectedRiSc(originalRiSc);\n setUpdateStatus({\n isLoading: false,\n isError: true,\n isSuccess: false,\n });\n setIsRequesting(false);\n if (onError) onError();\n setResponse({\n ...error,\n statusMessage: loginRejected\n ? `${getTranslationKey('error', error.status, t)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey('error', error.status, t),\n });\n },\n );\n }\n }\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n if (selectedRiSc && riScs) {\n const isRequiresNewApproval =\n selectedRiSc.migrationStatus?.migrationRequiresNewApproval ||\n requiresNewApproval(selectedRiSc.content, riSc.content);\n\n const updatedRiSc: RiScWithMetadata = {\n ...selectedRiSc,\n sopsConfig: riSc.sopsConfig,\n content: riSc.content,\n status:\n selectedRiSc.status !== RiScStatus.Draft && isRequiresNewApproval\n ? RiScStatus.Draft\n : selectedRiSc.status,\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n migrationStatus: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n },\n };\n const originalRiSc = selectedRiSc;\n setSelectedRiSc(updatedRiSc);\n setUpdateStatus({\n isLoading: true,\n isError: false,\n isSuccess: false,\n });\n putRiScs(\n updatedRiSc,\n res => {\n setUpdateStatus({\n isLoading: false,\n isError: false,\n isSuccess: true,\n });\n if ('pendingApproval' in res && res.pendingApproval?.pullRequestUrl) {\n updatedRiSc.pullRequestUrl = res.pendingApproval.pullRequestUrl;\n updatedRiSc.status = RiScStatus.SentForApproval;\n }\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setIsRequesting(false);\n if (onSuccess) onSuccess();\n setResponse({\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n });\n },\n (error, loginRejected) => {\n setUpdateStatus({\n isLoading: false,\n isError: true,\n isSuccess: false,\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n setResponse({\n ...error,\n statusMessage: loginRejected\n ? `${getTranslationKey('error', error.status, t)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey('error', error.status, t),\n });\n },\n );\n }\n }\n\n function approveRiSc() {\n if (selectedRiSc && riScs) {\n setUpdateStatus({\n isLoading: true,\n isError: false,\n isSuccess: false,\n });\n publishRiScs(\n selectedRiSc.id,\n res => {\n const prUrl = res.pendingApproval?.pullRequestUrl;\n const updatedRiSc = {\n ...selectedRiSc,\n status:\n selectedRiSc.status === RiScStatus.Draft\n ? RiScStatus.SentForApproval\n : RiScStatus.DeletionSentForApproval,\n pullRequestUrl: prUrl,\n };\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setUpdateStatus({\n isLoading: false,\n isError: false,\n isSuccess: true,\n });\n setResponse({\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n });\n },\n (error, loginRejected) => {\n setUpdateStatus({\n isLoading: false,\n isError: true,\n isSuccess: false,\n });\n setResponse({\n ...error,\n statusMessage: loginRejected\n ? `${getTranslationKey('error', error.status, t)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey('error', error.status, t),\n });\n },\n );\n }\n }\n\n const value = {\n riScs,\n selectRiSc,\n selectedRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n approveRiSc,\n updateStatus,\n resetRiScStatus,\n resetResponse,\n isRequesting,\n isFetching,\n response,\n gcpCryptoKeys,\n };\n\n return (\n <RiScContext.Provider\n value={{\n ...value,\n isFetchingGcpCryptoKeys: false,\n failedToFetchGcpCryptoKeys: false,\n }}\n >\n {children}\n </RiScContext.Provider>\n );\n}\n\nexport function useRiScs() {\n const context = useContext(RiScContext);\n if (context === undefined) {\n throw new Error('useRiScs must be used within a RiScProvider');\n }\n return context;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAmEA,MAAM,WAAA,GAAc,cAA2C,MAAS,CAAA;AAEjE,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAA4B;AAClE,EAAA,MAAM,EAAE,MAAA,EAAQ,gBAAA,EAAiB,GAAI,SAAA,EAAU;AAC/C,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,WAAA,GAAc,YAAY,YAAY,CAAA;AAC5C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAkB,KAAK,CAAA;AAC/D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,MACE,qBAAA,EAAsB;AAE1B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAoC,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA;AAAA,IACtC;AAAA,GACF;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,IAAI,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,OAAO,UAAU,CAAA;AACvC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3D,EAAA,MAAM,kBAAA,GAAqB,OAAO,eAAe,CAAA;AACjD,EAAA,MAAM,CAAC,uBAAA,EAAyB,0BAA0B,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3E,EAAA,MAAM,0BAAA,GAA6B,OAAO,uBAAuB,CAAA;AACjE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA,CAAS;AAAA,IAC/C,SAAA,EAAW,KAAA;AAAA,IACX,OAAA,EAAS,KAAA;AAAA,IACT,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,CAA+B,EAAE,CAAA;AAE3E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,WAAA,CAAY;AAAA,QACV,eAAe,QAAA,CAAS,KAAA;AAAA,QACxB,QAAQ,gBAAA,CAAiB;AAAA,OAC1B,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,WAAW,CAAC,CAAA;AAG1B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,kBAAA;AAAA,MACE,CAAA,GAAA,KAAO;AACL,QAAA,gBAAA,CAAiB,GAAG,CAAA;AAEpB,QAAA,gBAAA;AAAA,UACE,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACjB,YAAA,IAAI,CAAA,CAAE,uBAAA,KAA4B,CAAA,CAAE,uBAAA,EAAyB;AAC3D,cAAA,OAAO,CAAA;AAAA,YACT;AACA,YAAA,OAAO,CAAA,CAAE,0BAA0B,CAAA,GAAI,EAAA;AAAA,UACzC,CAAC;AAAA,SACH;AACA,QAAA,0BAAA,CAA2B,OAAA,GAAU,KAAA;AACrC,QAAA,0BAAA,CAA2B,2BAA2B,OAAO,CAAA;AAC7D,QAAA,IAAI,CAAC,mBAAmB,OAAA,EAAS;AAC/B,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAAA,MACF,CAAA;AAAA,MACA,CAAC,QAAQ,aAAA,KAAkB;AACzB,QAAA,WAAA,CAAY;AAAA,UACV,QAAQ,gBAAA,CAAiB,8BAAA;AAAA,UACzB,eAAe,aAAA,GACX,CAAA,EAAG,CAAA,CAAE,8CAA8C,CAAC,CAAA,EAAA,EAAK,CAAA;AAAA,YACvD;AAAA,WACD,CAAA,CAAA,GACD,CAAA,CAAE,8CAA8C;AAAA,SACrD,CAAA;AACD,QAAA,0BAAA,CAA2B,OAAA,GAAU,KAAA;AACrC,QAAA,0BAAA,CAA2B,2BAA2B,OAAO,CAAA;AAC7D,QAAA,IAAI,CAAC,mBAAmB,OAAA,EAAS;AAC/B,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,KACF;AAAA,EAEF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,UAAA;AAAA,MACE,CAAA,GAAA,KAAO;AACL,QAAA,MAAM,YAAA,GAAmC,GAAA,CACtC,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,WAAW,aAAA,CAAc,OAAO,CAAA,CACpD,GAAA,CAAI,CAAA,OAAA,KAAW;AACd,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AAE3C,UAAA,MAAM,OAAA,GAAU,UAAU,IAAI,CAAA;AAC9B,UAAA,OAAO;AAAA,YACL,IAAI,OAAA,CAAQ,MAAA;AAAA,YACZ,OAAA;AAAA,YACA,YAAY,OAAA,CAAQ,UAAA;AAAA,YACpB,QAAQ,OAAA,CAAQ,UAAA;AAAA,YAChB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,YACxB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,YACzB,eAAe,OAAA,CAAQ;AAAA,WACzB;AAAA,QACF,CAAC,CAAA;AACH,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,QAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAC7B,QAAA,kBAAA,CAAmB,mBAAmB,OAAO,CAAA;AAC7C,QAAA,IAAI,CAAC,2BAA2B,OAAA,EAAS;AACvC,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAEA,QAAA,MAAM,UAAA,GAAuB,GAAA,CAC1B,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAA,KAAW,aAAA,CAAc,OAAO,CAAA,CACpD,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAM,CAAA;AAE1B,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,UAAA,MAAM,YAAA,GAAe,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACzC,UAAA,WAAA,CAAY;AAAA,YACV,aAAA,EAAe,CAAA,CAAE,sCAAsC,CAAA,CAAE,MAAA;AAAA,cACvD;AAAA,aACF;AAAA,YACA,QAAQ,gBAAA,CAAiB;AAAA,WAC1B,CAAA;AAAA,QACH;AAGA,QAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,UAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,YAAA,CAAa,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACpD,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,OAAO,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAgB,CAAA;AAG7D,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,YAAA,CAAa,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,EAAG;AAAA,YACpD,KAAA,EAAO,EAAE,gCAAgC;AAAA,WAC1C,CAAA;AACD,UAAA;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,CAAA,aAAA,KAAiB;AACf,QAAA,WAAA,CAAY;AAAA,UACV,QAAQ,gBAAA,CAAiB,sBAAA;AAAA,UACzB,eAAe,aAAA,GACX,CAAA,EAAG,CAAA,CAAE,sCAAsC,CAAC,CAAA,EAAA,EAAK,CAAA;AAAA,YAC/C;AAAA,WACD,CAAA,CAAA,GACD,CAAA,CAAE,sCAAsC;AAAA,SAC7C,CAAA;AACD,QAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAC7B,QAAA,kBAAA,CAAmB,mBAAmB,OAAO,CAAA;AAC7C,QAAA,IAAI,CAAC,2BAA2B,OAAA,EAAS;AACvC,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,KACF;AAAA,EAEF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAM,OAAO,KAAA,EAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAgB,CAAA;AACvD,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,gBAAgB,CAAC,CAAA;AAE5B,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,eAAA,CAAgB;AAAA,MACd,SAAA,EAAW,KAAA;AAAA,MACX,SAAA,EAAW,KAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,WAAA,CAAY,IAAI,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,SAAS,WAAW,EAAA,EAAY;AAC9B,IAAA,MAAM,iBAAiB,KAAA,EAAO,IAAA,CAAK,UAAQ,IAAA,CAAK,EAAA,KAAO,EAAE,CAAA,EAAG,EAAA;AAC5D,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,cAAA,EAAgB,CAAC,CAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,SAAS,aAAA,CACP,IAAA,EACA,mBAAA,EACA,eAAA,EACA;AACA,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,GAAG,IAEL,CAAA;AACA,IAAA,SAAA;AAAA,MACE,OAAA,CAAQ,OAAA;AAAA,MACR,mBAAA;AAAA,MACA,OAAA,CAAQ,UAAA;AAAA,MACR,eAAA;AAAA,MACA,CAAA,GAAA,KAAO;AACL,QAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,MAAM,IAAI,MAAM,qBAAqB,CAAA;AACtD,QAAA,IAAI,CAAC,GAAA,CAAI,WAAA,EAAa,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAChE,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA;AACvC,QAAA,MAAM,OAAA,GAAU,UAAU,IAAI,CAAA;AAC9B,QAAA,MAAM,gBAAA,GAAqC;AAAA,UACzC,IAAI,GAAA,CAAI,MAAA;AAAA,UACR,QAAQ,UAAA,CAAW,KAAA;AAAA,UACnB,OAAA;AAAA,UACA,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,eAAe,IAAA,CAAK,aAAA;AAAA,UACpB,eAAe,IAAA,CAAK;AAAA,SACtB;AACA,QAAA,QAAA,CAAS,KAAA,GAAQ,CAAC,GAAG,KAAA,EAAO,gBAAgB,CAAA,GAAI,CAAC,gBAAgB,CAAC,CAAA;AAClE,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,QAAA,CAAS,YAAY,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA;AAC5C,QAAA,WAAA,CAAY;AAAA,UACV,GAAG,GAAA;AAAA,UACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA,SACvD,CAAA;AACD,QAAA,eAAA,CAAgB;AAAA,UACd,SAAA,EAAW,KAAA;AAAA,UACX,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,MACH,CAAA;AAAA,MACA,CAAC,OAA6B,aAAA,KAA2B;AACvD,QAAA,eAAA,CAAgB,YAAY,CAAA;AAC5B,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,eAAA,CAAgB;AAAA,UACd,SAAA,EAAW,KAAA;AAAA,UACX,OAAA,EAAS,IAAA;AAAA,UACT,SAAA,EAAW;AAAA,SACZ,CAAA;AAED,QAAA,WAAA,CAAY;AAAA,UACV,GAAG,KAAA;AAAA,UACH,aAAA,EAAe,gBACX,CAAA,EAAG,iBAAA,CAAkB,SAAS,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAC,CAAA,EAAA,EAAK,CAAA;AAAA,YACjD;AAAA,WACD,CAAA,CAAA,GACD,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,QAAQ,CAAC;AAAA,SAC/C,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EACF;AAEA,EAAA,SAAS,UAAA,CAAW,WAAwB,OAAA,EAAsB;AAChE,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,GAAG,YAAA;AAAA,QACH,QAAQ,UAAA,CAAW;AAAA,OACrB;AACA,MAAA,MAAM,YAAA,GAAe,YAAA;AAErB,MAAA,eAAA,CAAgB;AAAA,QACd,SAAA,EAAW,IAAA;AAAA,QACX,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA,WAAA;AAAA,QACE,YAAA,CAAa,EAAA;AAAA,QACb,CAAA,GAAA,KAAO;AACL,UAAA,eAAA,CAAgB;AAAA,YACd,SAAA,EAAW,KAAA;AAAA,YACX,OAAA,EAAS,KAAA;AAAA,YACT,SAAA,EAAW;AAAA,WACZ,CAAA;AACD,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,GAAA,CAAI,MAAA,KAAW,gBAAA,CAAiB,WAAA,EAAa;AAC/C,YAAA,eAAA;AAAA,cACE,MAAM,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,EAAA,KAAO,YAAA,CAAa,EAAE,CAAA,IAAK;AAAA,aACrD;AACA,YAAA,QAAA,CAAS,MAAM,MAAA,CAAO,CAAA,IAAA,KAAQ,KAAK,EAAA,KAAO,WAAA,CAAY,EAAE,CAAC,CAAA;AAAA,UAC3D,CAAA,MAAO;AACL,YAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,YAAA,QAAA;AAAA,cACE,KAAA,CAAM,GAAA;AAAA,gBAAI,CAAA,IAAA,KACR,IAAA,CAAK,EAAA,KAAO,YAAA,CAAa,KAAK,WAAA,GAAc;AAAA;AAC9C,aACF;AAAA,UACF;AACA,UAAA,IAAI,WAAW,SAAA,EAAU;AACzB,UAAA,WAAA,CAAY;AAAA,YACV,GAAG,GAAA;AAAA,YACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA,WACvD,CAAA;AAAA,QACH,CAAA;AAAA,QACA,CAAC,OAAO,aAAA,KAAkB;AACxB,UAAA,eAAA,CAAgB,YAAY,CAAA;AAC5B,UAAA,eAAA,CAAgB;AAAA,YACd,SAAA,EAAW,KAAA;AAAA,YACX,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW;AAAA,WACZ,CAAA;AACD,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,SAAS,OAAA,EAAQ;AACrB,UAAA,WAAA,CAAY;AAAA,YACV,GAAG,KAAA;AAAA,YACH,aAAA,EAAe,gBACX,CAAA,EAAG,iBAAA,CAAkB,SAAS,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAC,CAAA,EAAA,EAAK,CAAA;AAAA,cACjD;AAAA,aACD,CAAA,CAAA,GACD,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,QAAQ,CAAC;AAAA,WAC/C,CAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAS,UAAA,CACP,IAAA,EACA,SAAA,EACA,OAAA,EACA;AACA,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,MAAM,qBAAA,GACJ,aAAa,eAAA,EAAiB,4BAAA,IAC9B,oBAAoB,YAAA,CAAa,OAAA,EAAS,KAAK,OAAO,CAAA;AAExD,MAAA,MAAM,WAAA,GAAgC;AAAA,QACpC,GAAG,YAAA;AAAA,QACH,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,MAAA,EACE,aAAa,MAAA,KAAW,UAAA,CAAW,SAAS,qBAAA,GACxC,UAAA,CAAW,QACX,YAAA,CAAa,MAAA;AAAA,QACnB,qBAAA;AAAA,QACA,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,eAAA,EAAiB;AAAA,UACf,gBAAA,EAAkB,KAAA;AAAA,UAClB,4BAAA,EAA8B;AAAA;AAChC,OACF;AACA,MAAA,MAAM,YAAA,GAAe,YAAA;AACrB,MAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,MAAA,eAAA,CAAgB;AAAA,QACd,SAAA,EAAW,IAAA;AAAA,QACX,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA,QAAA;AAAA,QACE,WAAA;AAAA,QACA,CAAA,GAAA,KAAO;AACL,UAAA,eAAA,CAAgB;AAAA,YACd,SAAA,EAAW,KAAA;AAAA,YACX,OAAA,EAAS,KAAA;AAAA,YACT,SAAA,EAAW;AAAA,WACZ,CAAA;AACD,UAAA,IAAI,iBAAA,IAAqB,GAAA,IAAO,GAAA,CAAI,eAAA,EAAiB,cAAA,EAAgB;AACnE,YAAA,WAAA,CAAY,cAAA,GAAiB,IAAI,eAAA,CAAgB,cAAA;AACjD,YAAA,WAAA,CAAY,SAAS,UAAA,CAAW,eAAA;AAAA,UAClC;AACA,UAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,UAAA,QAAA;AAAA,YACE,KAAA,CAAM,IAAI,CAAA,CAAA,KAAM,CAAA,CAAE,OAAO,YAAA,CAAa,EAAA,GAAK,cAAc,CAAE;AAAA,WAC7D;AACA,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,WAAW,SAAA,EAAU;AACzB,UAAA,WAAA,CAAY;AAAA,YACV,GAAG,GAAA;AAAA,YACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA,WACvD,CAAA;AAAA,QACH,CAAA;AAAA,QACA,CAAC,OAAO,aAAA,KAAkB;AACxB,UAAA,eAAA,CAAgB;AAAA,YACd,SAAA,EAAW,KAAA;AAAA,YACX,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW;AAAA,WACZ,CAAA;AACD,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,SAAS,OAAA,EAAQ;AACrB,UAAA,eAAA,CAAgB,YAAY,CAAA;AAC5B,UAAA,WAAA,CAAY;AAAA,YACV,GAAG,KAAA;AAAA,YACH,aAAA,EAAe,gBACX,CAAA,EAAG,iBAAA,CAAkB,SAAS,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAC,CAAA,EAAA,EAAK,CAAA;AAAA,cACjD;AAAA,aACD,CAAA,CAAA,GACD,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,QAAQ,CAAC;AAAA,WAC/C,CAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAS,WAAA,GAAc;AACrB,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,eAAA,CAAgB;AAAA,QACd,SAAA,EAAW,IAAA;AAAA,QACX,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA,YAAA;AAAA,QACE,YAAA,CAAa,EAAA;AAAA,QACb,CAAA,GAAA,KAAO;AACL,UAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAiB,cAAA;AACnC,UAAA,MAAM,WAAA,GAAc;AAAA,YAClB,GAAG,YAAA;AAAA,YACH,QACE,YAAA,CAAa,MAAA,KAAW,WAAW,KAAA,GAC/B,UAAA,CAAW,kBACX,UAAA,CAAW,uBAAA;AAAA,YACjB,cAAA,EAAgB;AAAA,WAClB;AACA,UAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,UAAA,QAAA;AAAA,YACE,KAAA,CAAM,IAAI,CAAA,CAAA,KAAM,CAAA,CAAE,OAAO,YAAA,CAAa,EAAA,GAAK,cAAc,CAAE;AAAA,WAC7D;AACA,UAAA,eAAA,CAAgB;AAAA,YACd,SAAA,EAAW,KAAA;AAAA,YACX,OAAA,EAAS,KAAA;AAAA,YACT,SAAA,EAAW;AAAA,WACZ,CAAA;AACD,UAAA,WAAA,CAAY;AAAA,YACV,GAAG,GAAA;AAAA,YACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA,WACvD,CAAA;AAAA,QACH,CAAA;AAAA,QACA,CAAC,OAAO,aAAA,KAAkB;AACxB,UAAA,eAAA,CAAgB;AAAA,YACd,SAAA,EAAW,KAAA;AAAA,YACX,OAAA,EAAS,IAAA;AAAA,YACT,SAAA,EAAW;AAAA,WACZ,CAAA;AACD,UAAA,WAAA,CAAY;AAAA,YACV,GAAG,KAAA;AAAA,YACH,aAAA,EAAe,gBACX,CAAA,EAAG,iBAAA,CAAkB,SAAS,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAC,CAAA,EAAA,EAAK,CAAA;AAAA,cACjD;AAAA,aACD,CAAA,CAAA,GACD,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,QAAQ,CAAC;AAAA,WAC/C,CAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,KAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,WAAA,CAAY,QAAA;AAAA,IAAZ;AAAA,MACC,KAAA,EAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,uBAAA,EAAyB,KAAA;AAAA,QACzB,0BAAA,EAA4B;AAAA,OAC9B;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,OAAA;AACT;;;;"}
1
+ {"version":3,"file":"RiScContext.esm.js","sources":["../../src/contexts/RiScContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n ContentStatus,\n ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n getTranslationKey,\n requiresNewApproval,\n} from '../utils/utilityfunctions';\nimport { riScRouteRef } from '../routes';\nimport { useLocation, useNavigate, useParams } from 'react-router';\nimport {\n dtoToRiSc,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n RiScDTO,\n} from '../utils/DTOs';\nimport { useAuthenticatedFetch } from '../utils/hooks';\nimport { latestSupportedVersion } from '../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../utils/translations';\n\nexport type UpdateStatus = {\n isLoading: boolean;\n isError: boolean;\n isSuccess: boolean;\n};\n\ntype RiScDrawerProps = {\n riScs: RiScWithMetadata[] | null;\n selectRiSc: (title: string) => void;\n selectedRiSc: RiScWithMetadata | null;\n createNewRiSc: (\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) => void;\n deleteRiSc: (onSuccess?: () => void, onError?: () => void) => void;\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: boolean;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n response: SubmitResponseObject | null;\n};\n\nconst RiScContext = createContext<RiScDrawerProps | undefined>(undefined);\n\nexport function RiScProvider({ children }: { children: ReactNode }) {\n const { riScId: riScIdFromParams } = useParams();\n const location = useLocation();\n const navigate = useNavigate();\n const getRiScPath = useRouteRef(riScRouteRef);\n const [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n deleteRiScs,\n putRiScs,\n publishRiScs,\n response,\n setResponse,\n } = useAuthenticatedFetch();\n\n const [riScs, setRiScs] = useState<RiScWithMetadata[] | null>(null);\n const [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\n const [isFetching, setIsFetching] = useState(true);\n const isFetchingRef = useRef(isFetching);\n const [isFetchingRiScs, setIsFetchingRiScs] = useState(true);\n const isFetchingRiScsRef = useRef(isFetchingRiScs);\n const [isFetchingGcpCryptoKeys, setIsFetchingGcpCryptoKeys] = useState(true);\n const isFetchingGcpCryptoKeysRef = useRef(isFetchingGcpCryptoKeys);\n const [updateStatus, setUpdateStatus] = useState({\n isLoading: false,\n isError: false,\n isSuccess: false,\n });\n\n const [gcpCryptoKeys, setGcpCryptoKeys] = useState<GcpCryptoKeyObject[]>([]);\n\n useEffect(() => {\n if (location.state) {\n setResponse({\n statusMessage: location.state,\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n });\n }\n }, [location, setResponse]);\n\n // Initial fetch of GCP crypto keys\n useEffect(() => {\n fetchGcpCryptoKeys(\n res => {\n setGcpCryptoKeys(res);\n // Sorts the crypto keys on whether the user has encrypt/decrypt role on it\n setGcpCryptoKeys(\n res.sort((a, b) => {\n if (b.hasEncryptDecryptAccess === a.hasEncryptDecryptAccess) {\n return 0;\n }\n return b.hasEncryptDecryptAccess ? 1 : -1;\n }),\n );\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n (_error, loginRejected) => {\n setResponse({\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: loginRejected\n ? `${t('errorMessages.ErrorWhenFetchingGcpCryptoKeys')}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\n });\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Initial fetch of RiScs\n useEffect(() => {\n fetchRiScs(\n res => {\n const fetchedRiScs: RiScWithMetadata[] = res\n .filter(risk => risk.status === ContentStatus.Success)\n .map(riScDTO => {\n const json = JSON.parse(riScDTO.riScContent) as RiScDTO;\n\n const content = dtoToRiSc(json);\n return {\n id: riScDTO.riScId,\n content: content,\n sopsConfig: riScDTO.sopsConfig,\n status: riScDTO.riScStatus,\n pullRequestUrl: riScDTO.pullRequestUrl,\n migrationStatus: riScDTO.migrationStatus,\n lastPublished: riScDTO.lastPublished,\n };\n });\n setRiScs(fetchedRiScs);\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n\n const errorRiScs: string[] = res\n .filter(risk => risk.status !== ContentStatus.Success)\n .map(risk => risk.riScId);\n\n if (errorRiScs.length > 0) {\n const errorRiScIds = errorRiScs.join(', ');\n setResponse({\n statusMessage: t('errorMessages.ErrorWhenFetchingRiScs').concat(\n errorRiScIds,\n ),\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n });\n }\n\n // If there are no RiScs, don't set a selected RiSc\n if (fetchedRiScs.length === 0) {\n return;\n }\n\n // If there is no RiSc ID in the URL, navigate to the first RiSc\n if (!riScIdFromParams) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n\n // If there is an invalid RiSc ID in the URL, navigate to the first RiSc with error state\n if (!riSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n return;\n }\n },\n loginRejected => {\n setResponse({\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: loginRejected\n ? `${t('errorMessages.ErrorWhenFetchingRiScs')}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : t('errorMessages.ErrorWhenFetchingRiScs'),\n });\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Set selected RiSc based on URL\n useEffect(() => {\n if (riScIdFromParams) {\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n }\n }\n }, [riScs, riScIdFromParams]);\n\n const resetRiScStatus = useCallback(() => {\n setUpdateStatus({\n isLoading: false,\n isSuccess: false,\n isError: false,\n });\n }, []);\n\n // use callback to avoid infinite loop\n const resetResponse = useCallback(() => {\n setResponse(null);\n }, [setResponse]);\n\n function selectRiSc(id: string) {\n const selectedRiScId = riScs?.find(riSc => riSc.id === id)?.id;\n if (selectedRiScId) {\n navigate(getRiScPath({ riScId: selectedRiScId }));\n }\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) {\n setIsFetching(true);\n setSelectedRiSc(null);\n\n const newRiSc: RiScWithMetadata = {\n ...riSc,\n schemaVersion: latestSupportedVersion,\n };\n postRiScs(\n newRiSc.content,\n generateInitialRisc,\n newRiSc.sopsConfig,\n defaultRiScId,\n res => {\n if (!res.riScId) throw new Error('No RiSc ID returned');\n if (!res.riScContent) throw new Error('No RiSc content returned');\n const json = JSON.parse(res.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n const riScWithMetaData: RiScWithMetadata = {\n id: res.riScId,\n status: RiScStatus.Draft,\n content: content,\n sopsConfig: riSc.sopsConfig,\n schemaVersion: riSc.schemaVersion,\n lastPublished: riSc.lastPublished,\n };\n setRiScs(riScs ? [...riScs, riScWithMetaData] : [riScWithMetaData]);\n setIsFetching(false);\n navigate(getRiScPath({ riScId: res.riScId }));\n setResponse({\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n });\n setUpdateStatus({\n isLoading: false,\n isError: false,\n isSuccess: true,\n });\n },\n (error: ProcessRiScResultDTO, loginRejected: boolean) => {\n setSelectedRiSc(selectedRiSc);\n setIsFetching(false);\n setUpdateStatus({\n isLoading: false,\n isError: true,\n isSuccess: false,\n });\n\n setResponse({\n ...error,\n statusMessage: loginRejected\n ? `${getTranslationKey('error', error.status, t)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey('error', error.status, t),\n });\n },\n );\n }\n\n function deleteRiSc(onSuccess?: () => void, onError?: () => void) {\n if (selectedRiSc && riScs) {\n const updatedRiSc = {\n ...selectedRiSc,\n status: RiScStatus.DeletionDraft,\n };\n const originalRiSc = selectedRiSc;\n\n setUpdateStatus({\n isLoading: true,\n isError: false,\n isSuccess: false,\n });\n deleteRiScs(\n selectedRiSc.id,\n res => {\n setUpdateStatus({\n isLoading: false,\n isError: false,\n isSuccess: true,\n });\n setIsRequesting(false);\n if (res.status === ProcessingStatus.DeletedRiSc) {\n setSelectedRiSc(\n riScs.find(riSc => riSc.id !== selectedRiSc.id) || null,\n );\n setRiScs(riScs.filter(riSc => riSc.id !== updatedRiSc.id));\n } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n if (onSuccess) onSuccess();\n setResponse({\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n });\n },\n (error, loginRejected) => {\n setSelectedRiSc(originalRiSc);\n setUpdateStatus({\n isLoading: false,\n isError: true,\n isSuccess: false,\n });\n setIsRequesting(false);\n if (onError) onError();\n setResponse({\n ...error,\n statusMessage: loginRejected\n ? `${getTranslationKey('error', error.status, t)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey('error', error.status, t),\n });\n },\n );\n }\n }\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n if (selectedRiSc && riScs) {\n const isRequiresNewApproval =\n selectedRiSc.migrationStatus?.migrationRequiresNewApproval ||\n requiresNewApproval(selectedRiSc.content, riSc.content);\n\n const updatedRiSc: RiScWithMetadata = {\n ...selectedRiSc,\n sopsConfig: riSc.sopsConfig,\n content: riSc.content,\n status:\n selectedRiSc.status !== RiScStatus.Draft && isRequiresNewApproval\n ? RiScStatus.Draft\n : selectedRiSc.status,\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n migrationStatus: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n },\n };\n const originalRiSc = selectedRiSc;\n setSelectedRiSc(updatedRiSc);\n setUpdateStatus({\n isLoading: true,\n isError: false,\n isSuccess: false,\n });\n putRiScs(\n updatedRiSc,\n res => {\n setUpdateStatus({\n isLoading: false,\n isError: false,\n isSuccess: true,\n });\n if ('pendingApproval' in res && res.pendingApproval?.pullRequestUrl) {\n updatedRiSc.pullRequestUrl = res.pendingApproval.pullRequestUrl;\n updatedRiSc.status = RiScStatus.SentForApproval;\n }\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setIsRequesting(false);\n if (onSuccess) onSuccess();\n setResponse({\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n });\n },\n (error, loginRejected) => {\n setUpdateStatus({\n isLoading: false,\n isError: true,\n isSuccess: false,\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n setResponse({\n ...error,\n statusMessage: loginRejected\n ? `${getTranslationKey('error', error.status, t)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey('error', error.status, t),\n });\n },\n );\n }\n }\n\n function approveRiSc() {\n if (selectedRiSc && riScs) {\n setUpdateStatus({\n isLoading: true,\n isError: false,\n isSuccess: false,\n });\n publishRiScs(\n selectedRiSc.id,\n res => {\n const prUrl = res.pendingApproval?.pullRequestUrl;\n const updatedRiSc = {\n ...selectedRiSc,\n status:\n selectedRiSc.status === RiScStatus.Draft\n ? RiScStatus.SentForApproval\n : RiScStatus.DeletionSentForApproval,\n pullRequestUrl: prUrl,\n };\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setUpdateStatus({\n isLoading: false,\n isError: false,\n isSuccess: true,\n });\n setResponse({\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n });\n },\n (error, loginRejected) => {\n setUpdateStatus({\n isLoading: false,\n isError: true,\n isSuccess: false,\n });\n setResponse({\n ...error,\n statusMessage: loginRejected\n ? `${getTranslationKey('error', error.status, t)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey('error', error.status, t),\n });\n },\n );\n }\n }\n\n const value = {\n riScs,\n selectRiSc,\n selectedRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n approveRiSc,\n updateStatus,\n resetRiScStatus,\n resetResponse,\n isRequesting,\n isFetching,\n response,\n gcpCryptoKeys,\n };\n\n return (\n <RiScContext.Provider\n value={{\n ...value,\n isFetchingGcpCryptoKeys: false,\n failedToFetchGcpCryptoKeys: false,\n }}\n >\n {children}\n </RiScContext.Provider>\n );\n}\n\nexport function useRiScs() {\n const context = useContext(RiScContext);\n if (context === undefined) {\n throw new Error('useRiScs must be used within a RiScProvider');\n }\n return context;\n}\n"],"names":[],"mappings":"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"}
@@ -25,12 +25,12 @@ function profileInfoToDTOString(profile) {
25
25
  email: profile.email ?? ""
26
26
  });
27
27
  }
28
- function riScToDTOString(riSc, isRequiresNewApproval, profile, sopsConfig, initialRiScType) {
28
+ function riScToDTOString(riSc, isRequiresNewApproval, profile, sopsConfig, defaultRiScId) {
29
29
  const json = JSON.stringify({
30
30
  riSc: JSON.stringify(riScToDTO(riSc)),
31
31
  isRequiresNewApproval,
32
32
  schemaVersion: riSc.schemaVersion,
33
- defaultRiScTypes: initialRiScType,
33
+ defaultRiScId: defaultRiScId ?? null,
34
34
  userInfo: {
35
35
  name: profile.displayName ?? "",
36
36
  email: profile.email ?? ""
@@ -1 +1 @@
1
- {"version":3,"file":"DTOs.esm.js","sources":["../../src/utils/DTOs.ts"],"sourcesContent":["import {\n Action,\n ContentStatus,\n DefaultRiScType,\n LastPublished,\n MigrationStatus,\n Modify,\n ProcessingStatus,\n RiSc,\n RiScStatus,\n Risk,\n Scenario,\n Valuations,\n} from './types';\nimport { ProfileInfo } from '@backstage/core-plugin-api';\n\nexport type ProcessRiScResultDTO = {\n riScId: string;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n};\n\n// Takes a normal ProcessRiScResultDTO and changes status to ContentStatus.\ntype ContentRiScResultDTO = Modify<\n ProcessRiScResultDTO,\n 'status',\n ContentStatus\n> & { pullRequestUrl: string };\n\nexport type PublishRiScResultDTO = {\n pendingApproval?: {\n pullRequestUrl: string;\n pullRequestName: string;\n };\n} & ProcessRiScResultDTO;\n\nexport type CreateRiScResultDTO = {\n riScId: String;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n sopsConfig: SopsConfigDTO;\n} & ProcessRiScResultDTO;\n\nexport type DeleteRiScResultDTO = ProcessRiScResultDTO;\n\nexport type RiScContentResultDTO = {\n riScStatus: RiScStatus;\n riScContent: string;\n sopsConfig: SopsConfigDTO;\n migrationStatus: MigrationStatus;\n lastPublished: LastPublished;\n} & ContentRiScResultDTO;\n\nexport type RiScDTO = {\n schemaVersion: string;\n title: string;\n scope: string;\n valuations: Valuations[];\n scenarios: ScenarioDTO[];\n};\n\nexport type GcpCryptoKeyObject = {\n projectId: string;\n keyRing: string;\n keyName: string;\n locations: string;\n resourceId: string;\n createdAt: string;\n hasEncryptDecryptAccess?: boolean;\n};\n\nexport type ScenarioDTO = {\n title: string;\n scenario: {\n ID: string;\n url?: string;\n description: string;\n threatActors: string[];\n vulnerabilities: string[];\n risk: Risk;\n actions: ActionsDTO[];\n remainingRisk: Risk;\n };\n};\n\nexport type ActionsDTO = {\n title: string;\n action: {\n ID: string;\n description: string;\n status: string;\n url: string;\n lastUpdated?: Date | null;\n lastUpdatedBy?: string | null;\n };\n};\n\nexport function dtoToRiSc(riScDTO: RiScDTO): RiSc {\n return {\n ...riScDTO,\n // TODO implementere løsning for migrering, kan bumpe fra 3.2 til 3.3 på denne måten manuelt ved å åpne og lagre riscen:\n // skjemaVersjon: '3.3',\n scenarios: riScDTO.scenarios.map(dtoToScenario),\n };\n}\n\nexport function dtoToScenario(scenarioDTO: ScenarioDTO): Scenario {\n return {\n ...scenarioDTO.scenario,\n title: scenarioDTO.title,\n actions: scenarioDTO.scenario.actions.map(dtoToAction),\n };\n}\n\nexport function dtoToAction(actionDTO: ActionsDTO): Action {\n return {\n ...actionDTO.action,\n title: actionDTO.title,\n };\n}\n\nexport function profileInfoToDTOString(profile: ProfileInfo): string {\n return JSON.stringify({\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n });\n}\n\nexport function riScToDTOString(\n riSc: RiSc,\n isRequiresNewApproval: boolean,\n profile: ProfileInfo,\n sopsConfig: SopsConfigDTO,\n initialRiScType?: DefaultRiScType[],\n): string {\n const json = JSON.stringify({\n riSc: JSON.stringify(riScToDTO(riSc)),\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n defaultRiScTypes: initialRiScType,\n userInfo: {\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n },\n sopsConfig: sopsConfig,\n });\n return json;\n}\n\nfunction riScToDTO(riSc: RiSc): RiScDTO {\n return {\n ...riSc,\n scenarios: riSc.scenarios.map(scenarioToDTO),\n };\n}\n\nfunction scenarioToDTO(scenario: Scenario): ScenarioDTO {\n return {\n title: scenario.title,\n scenario: {\n ID: scenario.ID,\n url: scenario.url,\n description: scenario.description,\n threatActors: scenario.threatActors,\n vulnerabilities: scenario.vulnerabilities,\n risk: scenario.risk,\n actions: scenario.actions.map(actionToDTO),\n remainingRisk: scenario.remainingRisk,\n },\n };\n}\n\nfunction actionToDTO(action: Action): ActionsDTO {\n return {\n title: action.title,\n action: {\n ID: action.ID,\n description: action.description,\n status: action.status,\n url: action.url,\n lastUpdated: action.lastUpdated,\n lastUpdatedBy: action.lastUpdatedBy,\n },\n };\n}\n\nexport type SopsConfigDTO = {\n shamir_threshold: number;\n age?: AgeEntry[];\n gcp_kms: GcpKmsEntry[];\n lastModified?: string;\n unencrypted_suffix?: string;\n version?: string;\n};\n\ntype GcpKmsEntry = {\n resource_id: string;\n created_at: string;\n};\n\ntype AgeEntry = {\n recipient: string;\n};\n"],"names":[],"mappings":"AAmGO,SAAS,UAAU,OAAA,EAAwB;AAChD,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA;AAAA;AAAA,IAGH,SAAA,EAAW,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,aAAa;AAAA,GAChD;AACF;AAEO,SAAS,cAAc,WAAA,EAAoC;AAChE,EAAA,OAAO;AAAA,IACL,GAAG,WAAA,CAAY,QAAA;AAAA,IACf,OAAO,WAAA,CAAY,KAAA;AAAA,IACnB,OAAA,EAAS,WAAA,CAAY,QAAA,CAAS,OAAA,CAAQ,IAAI,WAAW;AAAA,GACvD;AACF;AAEO,SAAS,YAAY,SAAA,EAA+B;AACzD,EAAA,OAAO;AAAA,IACL,GAAG,SAAA,CAAU,MAAA;AAAA,IACb,OAAO,SAAA,CAAU;AAAA,GACnB;AACF;AAEO,SAAS,uBAAuB,OAAA,EAA8B;AACnE,EAAA,OAAO,KAAK,SAAA,CAAU;AAAA,IACpB,IAAA,EAAM,QAAQ,WAAA,IAAe,EAAA;AAAA,IAC7B,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA,GACzB,CAAA;AACH;AAEO,SAAS,eAAA,CACd,IAAA,EACA,qBAAA,EACA,OAAA,EACA,YACA,eAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU;AAAA,IAC1B,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IACpC,qBAAA;AAAA,IACA,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,gBAAA,EAAkB,eAAA;AAAA,IAClB,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,QAAQ,WAAA,IAAe,EAAA;AAAA,MAC7B,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA,KAC1B;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAU,IAAA,EAAqB;AACtC,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,aAAa;AAAA,GAC7C;AACF;AAEA,SAAS,cAAc,QAAA,EAAiC;AACtD,EAAA,OAAO;AAAA,IACL,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,QAAA,EAAU;AAAA,MACR,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,aAAa,QAAA,CAAS,WAAA;AAAA,MACtB,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,iBAAiB,QAAA,CAAS,eAAA;AAAA,MAC1B,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,OAAA,EAAS,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA;AAAA,MACzC,eAAe,QAAA,CAAS;AAAA;AAC1B,GACF;AACF;AAEA,SAAS,YAAY,MAAA,EAA4B;AAC/C,EAAA,OAAO;AAAA,IACL,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,MAAA,EAAQ;AAAA,MACN,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,eAAe,MAAA,CAAO;AAAA;AACxB,GACF;AACF;;;;"}
1
+ {"version":3,"file":"DTOs.esm.js","sources":["../../src/utils/DTOs.ts"],"sourcesContent":["import {\n Action,\n ContentStatus,\n LastPublished,\n MigrationStatus,\n Modify,\n ProcessingStatus,\n RiSc,\n RiScStatus,\n Risk,\n Scenario,\n Valuations,\n} from './types';\nimport { ProfileInfo } from '@backstage/core-plugin-api';\n\nexport type ProcessRiScResultDTO = {\n riScId: string;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n};\n\n// Takes a normal ProcessRiScResultDTO and changes status to ContentStatus.\ntype ContentRiScResultDTO = Modify<\n ProcessRiScResultDTO,\n 'status',\n ContentStatus\n> & { pullRequestUrl: string };\n\nexport type PublishRiScResultDTO = {\n pendingApproval?: {\n pullRequestUrl: string;\n pullRequestName: string;\n };\n} & ProcessRiScResultDTO;\n\nexport type CreateRiScResultDTO = {\n riScId: String;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n sopsConfig: SopsConfigDTO;\n} & ProcessRiScResultDTO;\n\nexport type DeleteRiScResultDTO = ProcessRiScResultDTO;\n\nexport type RiScContentResultDTO = {\n riScStatus: RiScStatus;\n riScContent: string;\n sopsConfig: SopsConfigDTO;\n migrationStatus: MigrationStatus;\n lastPublished: LastPublished;\n} & ContentRiScResultDTO;\n\nexport type RiScDTO = {\n schemaVersion: string;\n title: string;\n scope: string;\n valuations: Valuations[];\n scenarios: ScenarioDTO[];\n};\n\nexport type GcpCryptoKeyObject = {\n projectId: string;\n keyRing: string;\n keyName: string;\n locations: string;\n resourceId: string;\n createdAt: string;\n hasEncryptDecryptAccess?: boolean;\n};\n\nexport type ScenarioDTO = {\n title: string;\n scenario: {\n ID: string;\n url?: string;\n description: string;\n threatActors: string[];\n vulnerabilities: string[];\n risk: Risk;\n actions: ActionsDTO[];\n remainingRisk: Risk;\n };\n};\n\nexport type ActionsDTO = {\n title: string;\n action: {\n ID: string;\n description: string;\n status: string;\n url: string;\n lastUpdated?: Date | null;\n lastUpdatedBy?: string | null;\n };\n};\n\nexport function dtoToRiSc(riScDTO: RiScDTO): RiSc {\n return {\n ...riScDTO,\n // TODO implementere løsning for migrering, kan bumpe fra 3.2 til 3.3 på denne måten manuelt ved å åpne og lagre riscen:\n // skjemaVersjon: '3.3',\n scenarios: riScDTO.scenarios.map(dtoToScenario),\n };\n}\n\nexport function dtoToScenario(scenarioDTO: ScenarioDTO): Scenario {\n return {\n ...scenarioDTO.scenario,\n title: scenarioDTO.title,\n actions: scenarioDTO.scenario.actions.map(dtoToAction),\n };\n}\n\nexport function dtoToAction(actionDTO: ActionsDTO): Action {\n return {\n ...actionDTO.action,\n title: actionDTO.title,\n };\n}\n\nexport function profileInfoToDTOString(profile: ProfileInfo): string {\n return JSON.stringify({\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n });\n}\n\nexport function riScToDTOString(\n riSc: RiSc,\n isRequiresNewApproval: boolean,\n profile: ProfileInfo,\n sopsConfig: SopsConfigDTO,\n defaultRiScId?: string | undefined,\n): string {\n const json = JSON.stringify({\n riSc: JSON.stringify(riScToDTO(riSc)),\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n defaultRiScId: defaultRiScId ?? null,\n userInfo: {\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n },\n sopsConfig: sopsConfig,\n });\n return json;\n}\n\nfunction riScToDTO(riSc: RiSc): RiScDTO {\n return {\n ...riSc,\n scenarios: riSc.scenarios.map(scenarioToDTO),\n };\n}\n\nfunction scenarioToDTO(scenario: Scenario): ScenarioDTO {\n return {\n title: scenario.title,\n scenario: {\n ID: scenario.ID,\n url: scenario.url,\n description: scenario.description,\n threatActors: scenario.threatActors,\n vulnerabilities: scenario.vulnerabilities,\n risk: scenario.risk,\n actions: scenario.actions.map(actionToDTO),\n remainingRisk: scenario.remainingRisk,\n },\n };\n}\n\nfunction actionToDTO(action: Action): ActionsDTO {\n return {\n title: action.title,\n action: {\n ID: action.ID,\n description: action.description,\n status: action.status,\n url: action.url,\n lastUpdated: action.lastUpdated,\n lastUpdatedBy: action.lastUpdatedBy,\n },\n };\n}\n\nexport type SopsConfigDTO = {\n shamir_threshold: number;\n age?: AgeEntry[];\n gcp_kms: GcpKmsEntry[];\n lastModified?: string;\n unencrypted_suffix?: string;\n version?: string;\n};\n\ntype GcpKmsEntry = {\n resource_id: string;\n created_at: string;\n};\n\ntype AgeEntry = {\n recipient: string;\n};\n"],"names":[],"mappings":"AAkGO,SAAS,UAAU,OAAA,EAAwB;AAChD,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA;AAAA;AAAA,IAGH,SAAA,EAAW,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,aAAa;AAAA,GAChD;AACF;AAEO,SAAS,cAAc,WAAA,EAAoC;AAChE,EAAA,OAAO;AAAA,IACL,GAAG,WAAA,CAAY,QAAA;AAAA,IACf,OAAO,WAAA,CAAY,KAAA;AAAA,IACnB,OAAA,EAAS,WAAA,CAAY,QAAA,CAAS,OAAA,CAAQ,IAAI,WAAW;AAAA,GACvD;AACF;AAEO,SAAS,YAAY,SAAA,EAA+B;AACzD,EAAA,OAAO;AAAA,IACL,GAAG,SAAA,CAAU,MAAA;AAAA,IACb,OAAO,SAAA,CAAU;AAAA,GACnB;AACF;AAEO,SAAS,uBAAuB,OAAA,EAA8B;AACnE,EAAA,OAAO,KAAK,SAAA,CAAU;AAAA,IACpB,IAAA,EAAM,QAAQ,WAAA,IAAe,EAAA;AAAA,IAC7B,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA,GACzB,CAAA;AACH;AAEO,SAAS,eAAA,CACd,IAAA,EACA,qBAAA,EACA,OAAA,EACA,YACA,aAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU;AAAA,IAC1B,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,IACpC,qBAAA;AAAA,IACA,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,eAAe,aAAA,IAAiB,IAAA;AAAA,IAChC,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,QAAQ,WAAA,IAAe,EAAA;AAAA,MAC7B,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA,KAC1B;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,UAAU,IAAA,EAAqB;AACtC,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,aAAa;AAAA,GAC7C;AACF;AAEA,SAAS,cAAc,QAAA,EAAiC;AACtD,EAAA,OAAO;AAAA,IACL,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,QAAA,EAAU;AAAA,MACR,IAAI,QAAA,CAAS,EAAA;AAAA,MACb,KAAK,QAAA,CAAS,GAAA;AAAA,MACd,aAAa,QAAA,CAAS,WAAA;AAAA,MACtB,cAAc,QAAA,CAAS,YAAA;AAAA,MACvB,iBAAiB,QAAA,CAAS,eAAA;AAAA,MAC1B,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,OAAA,EAAS,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,WAAW,CAAA;AAAA,MACzC,eAAe,QAAA,CAAS;AAAA;AAC1B,GACF;AACF;AAEA,SAAS,YAAY,MAAA,EAA4B;AAC/C,EAAA,OAAO;AAAA,IACL,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,MAAA,EAAQ;AAAA,MACN,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,eAAe,MAAA,CAAO;AAAA;AACxB,GACF;AACF;;;;"}
@@ -196,7 +196,7 @@ function useAuthenticatedFetch() {
196
196
  )
197
197
  );
198
198
  }
199
- function postRiScs(riSc, generateDefault, sopsConfig, initialRiScType, onSuccess, onError) {
199
+ function postRiScs(riSc, generateDefault, sopsConfig, defaultRiScId, onSuccess, onError) {
200
200
  return identityApi.getProfileInfo().then(
201
201
  (profile) => fullyAuthenticatedFetch(
202
202
  `${riScUri}?generateDefault=${generateDefault}`,
@@ -208,7 +208,7 @@ function useAuthenticatedFetch() {
208
208
  (error, rejectedLogin) => {
209
209
  if (onError) onError(error, rejectedLogin);
210
210
  },
211
- riScToDTOString(riSc, true, profile, sopsConfig, initialRiScType)
211
+ riScToDTOString(riSc, true, profile, sopsConfig, defaultRiScId)
212
212
  )
213
213
  );
214
214
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.esm.js","sources":["../../src/utils/hooks.ts"],"sourcesContent":["import {\n configApiRef,\n fetchApiRef,\n githubAuthApiRef,\n googleAuthApiRef,\n identityApiRef,\n useApi,\n} from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { URLS } from '../urls';\nimport {\n CreateRiScResultDTO,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n PublishRiScResultDTO,\n RiScContentResultDTO,\n SopsConfigDTO,\n profileInfoToDTOString,\n riScToDTOString,\n DeleteRiScResultDTO,\n} from './DTOs';\nimport { ActionStatusOptions, latestSupportedVersion } from './constants';\nimport {\n DefaultRiScType,\n DefaultRiScTypeDescriptor,\n DifferenceDTO,\n GithubRepoInfo,\n RiSc,\n RiScWithMetadata,\n Scenario,\n SubmitResponseObject,\n} from './types';\nimport {\n calculateDaysSince,\n calculateUpdatedStatus,\n UpdatedStatusEnumType,\n} from './utilityfunctions';\n\nexport function useGithubRepositoryInformation(): GithubRepoInfo {\n const [, org, repo] =\n useEntity().entity.metadata.annotations?.['backstage.io/view-url'].match(\n /github\\.com\\/([^\\/]+)\\/([^\\/]+)/,\n ) || [];\n\n return {\n owner: org,\n name: repo,\n };\n}\n\nexport function useAuthenticatedFetch() {\n const repoInformation = useGithubRepositoryInformation();\n const googleApi = useApi(googleAuthApiRef);\n const gitHubApi = useApi(githubAuthApiRef);\n const identityApi = useApi(identityApiRef);\n const { fetch } = useApi(fetchApiRef);\n const backendUrl = useApi(configApiRef).getString('backend.baseUrl');\n const riScUri = `${backendUrl}${URLS.backend.riScUri_temp}/${repoInformation.owner}/${repoInformation.name}`; // URLS.backend.riScUri\n\n const uriToFetchAllRiScs = `${riScUri}/${latestSupportedVersion}/all`; // URLS.backend.fetchAllRiScs\n const uriToFetchDefaultRiScDescriptors = `${backendUrl}${URLS.backend.fetchDefaultRiScTypeDescriptors}`;\n\n function uriToFetchDifference(id: string) {\n // URLS.backend.fetchDifference\n return `${riScUri}/${id}/difference`;\n }\n\n function uriToFetchRiSc(id: string) {\n // URLS.backend.fetchRiSc\n return `${riScUri}/${id}`;\n }\n\n function uriToDeleteRiSc(id: string) {\n // URLS.backend.deleteRiSc\n return `${riScUri}/${id}`;\n }\n\n function uriToPublishRiSc(id: string) {\n // URLS.backend.publishRiSc\n return `${riScUri}/publish/${id}`;\n }\n\n function useResponse(): [\n SubmitResponseObject | null,\n (submitStatus: SubmitResponseObject | null) => void,\n ] {\n const [submitResponse, setSubmitResponse] =\n useState<SubmitResponseObject | null>(null);\n // use callback to avoid infinite loop\n const displaySubmitResponse = useCallback(\n (submitStatus: SubmitResponseObject | null) => {\n setSubmitResponse(submitStatus);\n setTimeout(() => {\n setSubmitResponse(null);\n }, 10000);\n },\n [],\n );\n\n return [submitResponse, displaySubmitResponse];\n }\n\n const [response, setResponse] = useResponse();\n\n const configApi = useApi(configApiRef);\n\n function isDevelopment() {\n return configApi.getString('auth.environment') === 'development';\n }\n\n function fullyAuthenticatedFetch<T, K>(\n uri: string,\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n onSuccess: (response: T) => void,\n onError: (error: K, rejectedLogin: boolean) => void,\n body?: string,\n ) {\n Promise.all([\n identityApi.getCredentials(),\n googleApi.getAccessToken([\n URLS.external.www_googleapis_com__cloudkms,\n URLS.external.www_googleapis_com__cloud_platform,\n URLS.external.www_googleapis_com__cloudplatformprojects_readonly,\n ]),\n gitHubApi.getAccessToken(['repo']),\n ])\n .then(([idToken, googleAccessToken, gitHubAccessToken]) => {\n fetch(uri, {\n method: method,\n headers: {\n Authorization: `Bearer ${idToken.token}`,\n 'GCP-Access-Token': googleAccessToken,\n 'GitHub-Access-Token': gitHubAccessToken,\n 'Content-Type': 'application/json',\n },\n body: body,\n }).then(res => {\n if (!res.ok) {\n return res\n .json()\n .then(json => json as K)\n .then(typedJson => onError(typedJson, false))\n .catch(error => onError(error, false));\n }\n return res\n .json()\n .then(json => json as T)\n .then(typedJson => onSuccess(typedJson));\n });\n })\n .catch(error => {\n if (error.name === 'RejectedError') {\n onError(error, true);\n } else {\n onError(error, false);\n }\n });\n }\n\n function googleAuthenticatedFetch<T, K>(\n uri: string,\n method: 'GET',\n onSuccess: (response: T) => void,\n onError: (error: K, rejectedLogin: boolean) => void,\n body?: string,\n ) {\n Promise.all([\n identityApi.getCredentials(),\n googleApi.getAccessToken([\n URLS.external.www_googleapis_com__cloudkms,\n URLS.external.www_googleapis_com__cloud_platform,\n URLS.external.www_googleapis_com__cloudplatformprojects_readonly,\n ]),\n ])\n .then(([idToken, googleAccessToken]) => {\n fetch(uri, {\n method: method,\n headers: {\n Authorization: `Bearer ${idToken.token}`,\n 'GCP-Access-Token': googleAccessToken,\n 'Content-Type': 'application/json',\n },\n body: body,\n }).then(res => {\n if (!res.ok) {\n return res\n .json()\n .then(json => json as K)\n .then(typedJson => onError(typedJson, false))\n .catch(error => onError(error, false));\n }\n return res\n .json()\n .then(json => json as T)\n .then(typedJson => onSuccess(typedJson));\n });\n })\n .catch(error => {\n if (error.name === 'RejectedError') {\n onError(error, true);\n } else {\n onError(error, false);\n }\n });\n }\n\n function fetchDifference(\n selectedRiSc: RiScWithMetadata,\n onSuccess: (response: DifferenceDTO) => void,\n onError?: (loginRejected: boolean) => void,\n ) {\n return identityApi.getProfileInfo().then(profile => {\n fullyAuthenticatedFetch<DifferenceDTO, DifferenceDTO>(\n uriToFetchDifference(selectedRiSc.id),\n 'POST',\n onSuccess,\n (_, rejectedLogin) => {\n if (onError) onError(rejectedLogin);\n },\n riScToDTOString(\n selectedRiSc.content,\n false,\n profile,\n selectedRiSc.sopsConfig,\n ),\n );\n });\n }\n\n function fetchRiScs(\n onSuccess: (response: RiScContentResultDTO[]) => void,\n onError?: (loginRejected: boolean) => void,\n ) {\n if (isDevelopment()) {\n fullyAuthenticatedFetch<RiScContentResultDTO[], RiScContentResultDTO[]>(\n uriToFetchAllRiScs,\n 'GET',\n onSuccess,\n (_, rejectedLogin) => {\n if (onError) onError(rejectedLogin);\n },\n );\n } else {\n googleAuthenticatedFetch<RiScContentResultDTO[], RiScContentResultDTO[]>(\n uriToFetchAllRiScs,\n 'GET',\n onSuccess,\n (_, rejectedLogin) => {\n if (onError) onError(rejectedLogin);\n },\n );\n }\n }\n\n function postFeedback(feedback: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fullyAuthenticatedFetch<void, any>(\n `${riScUri}/feedback`,\n 'POST',\n () => resolve(),\n error => reject(error),\n feedback,\n );\n });\n }\n\n function fetchGcpCryptoKeys(\n onSuccess: (response: GcpCryptoKeyObject[]) => void,\n onError?: (error: GcpCryptoKeyObject[], loginRejected: boolean) => void,\n ) {\n googleAuthenticatedFetch<GcpCryptoKeyObject[], GcpCryptoKeyObject[]>(\n `${backendUrl}/api/proxy/risc-proxy/api/google/gcpCryptoKeys`, // URL\n 'GET',\n res => onSuccess(res),\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n );\n }\n\n function publishRiScs(\n riScId: string,\n onSuccess?: (response: PublishRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) {\n return identityApi.getProfileInfo().then(profile =>\n fullyAuthenticatedFetch<PublishRiScResultDTO, ProcessRiScResultDTO>(\n uriToPublishRiSc(riScId),\n 'POST',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n profileInfoToDTOString(profile),\n ),\n );\n }\n\n function postRiScs(\n riSc: RiSc,\n generateDefault: boolean,\n sopsConfig: SopsConfigDTO,\n initialRiScType: DefaultRiScType[],\n onSuccess?: (response: CreateRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) {\n return identityApi.getProfileInfo().then(profile =>\n fullyAuthenticatedFetch<CreateRiScResultDTO, ProcessRiScResultDTO>(\n `${riScUri}?generateDefault=${generateDefault}`,\n 'POST',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n riScToDTOString(riSc, true, profile, sopsConfig, initialRiScType),\n ),\n );\n }\n\n function putRiScs(\n riSc: RiScWithMetadata,\n onSuccess?: (response: ProcessRiScResultDTO | PublishRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) {\n identityApi.getProfileInfo().then(profile =>\n fullyAuthenticatedFetch<\n ProcessRiScResultDTO | PublishRiScResultDTO,\n ProcessRiScResultDTO\n >(\n uriToFetchRiSc(riSc.id),\n 'PUT',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n riScToDTOString(\n riSc.content,\n riSc.isRequiresNewApproval!!,\n profile,\n riSc.sopsConfig,\n ),\n ),\n );\n }\n\n function deleteRiScs(\n riScId: string,\n onSuccess?: (response: DeleteRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) {\n fullyAuthenticatedFetch<DeleteRiScResultDTO, ProcessRiScResultDTO>(\n uriToDeleteRiSc(riScId),\n 'DELETE',\n res => {\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n );\n }\n\n function fetchDefaultRiScTypeDescriptors(\n onSuccess: (response: DefaultRiScTypeDescriptor[]) => void,\n ) {\n googleAuthenticatedFetch<DefaultRiScTypeDescriptor[], void>(\n uriToFetchDefaultRiScDescriptors,\n 'GET',\n res => onSuccess(res),\n () => {},\n );\n }\n return {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n putRiScs,\n deleteRiScs,\n publishRiScs,\n response,\n setResponse,\n fetchDifference,\n postFeedback,\n fetchDefaultRiScTypeDescriptors,\n };\n}\n\nexport function useIsMounted() {\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n return useCallback(() => mountedRef.current, []);\n}\n\nexport function useDebounce<T>(\n value: T,\n delay: number,\n callback: (value: T) => void,\n) {\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const latestValueRef = useRef<T>(value);\n const latestCallbackRef = useRef<(v: T) => void>(callback);\n\n useEffect(() => {\n latestValueRef.current = value;\n }, [value]);\n\n useEffect(() => {\n latestCallbackRef.current = callback;\n }, [callback]);\n\n useEffect(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n latestCallbackRef.current(latestValueRef.current);\n timeoutRef.current = null;\n }, delay);\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [value, delay]);\n\n const flush = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n const v = latestValueRef.current;\n const hasValue = Array.isArray(v) ? v.length > 0 : v !== null;\n if (hasValue) {\n latestCallbackRef.current(v);\n }\n }, []);\n return { flush };\n}\n\ntype UseDisplayScenarios = (\n tempScenarios: RiSc['scenarios'] | null | undefined,\n visibleType: UpdatedStatusEnumType | null,\n lastPublishedCommits: number | null,\n sortOrder?: string,\n) => RiSc['scenarios'];\nexport const useDisplayScenarios: UseDisplayScenarios = (\n tempScenarios,\n visibleType,\n lastPublishedCommits,\n sortOrder,\n) => {\n return useMemo(() => {\n if (!tempScenarios) return [] as RiSc['scenarios'];\n\n const filtered = !visibleType\n ? tempScenarios\n : tempScenarios.filter(scenario =>\n scenario.actions.some(action => {\n const daysSinceLastUpdate = action.lastUpdated\n ? calculateDaysSince(new Date(action.lastUpdated))\n : null;\n const status = calculateUpdatedStatus(\n daysSinceLastUpdate,\n lastPublishedCommits,\n );\n return status === visibleType;\n }),\n );\n\n const sorted = [...filtered].sort((a, b) => {\n switch (sortOrder) {\n case 'title':\n return a.title.localeCompare(b.title, 'en');\n\n case 'initialRisk':\n return (\n b.risk.consequence * b.risk.probability -\n a.risk.consequence * a.risk.probability\n );\n\n case 'implementedActions':\n return (\n b.actions.filter(status => status.status === ActionStatusOptions.OK)\n .length -\n a.actions.filter(status => status.status === ActionStatusOptions.OK)\n .length\n );\n\n case 'remainingActions': {\n const remainingA = a.actions.filter(\n action =>\n action.status !== ActionStatusOptions.OK &&\n action.status !== ActionStatusOptions.NotRelevant,\n ).length;\n const remainingB = b.actions.filter(\n action =>\n action.status !== ActionStatusOptions.OK &&\n action.status !== ActionStatusOptions.NotRelevant,\n ).length;\n return remainingB - remainingA;\n }\n\n default:\n return 0;\n }\n });\n\n return sorted;\n }, [tempScenarios, visibleType, lastPublishedCommits, sortOrder]);\n};\n\nexport function useSearchActions(\n scenarios: Scenario[] | undefined | null,\n searchQuery: string,\n debounceMs = 300,\n): { matches: Record<string, Scenario['actions']>; isDebouncing: boolean } {\n const [debouncedQuery, setDebouncedQuery] = useState(searchQuery);\n const [hasTyped, setHasTyped] = useState(false);\n const queryRef = useRef(searchQuery);\n\n useEffect(() => {\n queryRef.current = searchQuery;\n const id = setTimeout(\n () => setDebouncedQuery(queryRef.current),\n debounceMs,\n );\n return () => clearTimeout(id);\n }, [searchQuery, debounceMs]);\n\n const isDebouncing = searchQuery !== debouncedQuery;\n\n useEffect(() => {\n if (searchQuery) setHasTyped(true);\n }, [searchQuery]);\n\n const findMatches = useCallback(\n (query: string) => {\n const result: Record<string, Scenario['actions']> = {};\n if (!query || !scenarios) return result;\n const q = query.toLowerCase();\n\n for (const scenario of scenarios) {\n const filtered = (scenario.actions ?? []).filter(a =>\n (a.title ?? '').toLowerCase().includes(q),\n );\n if (filtered.length > 0) result[scenario.ID] = filtered;\n }\n return result;\n },\n [scenarios],\n );\n\n const matches = useMemo(\n () => findMatches(debouncedQuery),\n [findMatches, debouncedQuery],\n );\n const immediateMatches = useMemo(\n () => findMatches(searchQuery),\n [findMatches, searchQuery],\n );\n\n const shouldUseImmediate = !hasTyped || (!debouncedQuery && isDebouncing);\n const returnedMatches = shouldUseImmediate ? immediateMatches : matches;\n\n return { matches: returnedMatches, isDebouncing };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks.esm.js","sources":["../../src/utils/hooks.ts"],"sourcesContent":["import {\n configApiRef,\n fetchApiRef,\n githubAuthApiRef,\n googleAuthApiRef,\n identityApiRef,\n useApi,\n} from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { URLS } from '../urls';\nimport {\n CreateRiScResultDTO,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n PublishRiScResultDTO,\n RiScContentResultDTO,\n SopsConfigDTO,\n profileInfoToDTOString,\n riScToDTOString,\n DeleteRiScResultDTO,\n} from './DTOs';\nimport { ActionStatusOptions, latestSupportedVersion } from './constants';\nimport {\n DefaultRiScTypeDescriptor,\n DifferenceDTO,\n GithubRepoInfo,\n RiSc,\n RiScWithMetadata,\n Scenario,\n SubmitResponseObject,\n} from './types';\nimport {\n calculateDaysSince,\n calculateUpdatedStatus,\n UpdatedStatusEnumType,\n} from './utilityfunctions';\n\nexport function useGithubRepositoryInformation(): GithubRepoInfo {\n const [, org, repo] =\n useEntity().entity.metadata.annotations?.['backstage.io/view-url'].match(\n /github\\.com\\/([^\\/]+)\\/([^\\/]+)/,\n ) || [];\n\n return {\n owner: org,\n name: repo,\n };\n}\n\nexport function useAuthenticatedFetch() {\n const repoInformation = useGithubRepositoryInformation();\n const googleApi = useApi(googleAuthApiRef);\n const gitHubApi = useApi(githubAuthApiRef);\n const identityApi = useApi(identityApiRef);\n const { fetch } = useApi(fetchApiRef);\n const backendUrl = useApi(configApiRef).getString('backend.baseUrl');\n const riScUri = `${backendUrl}${URLS.backend.riScUri_temp}/${repoInformation.owner}/${repoInformation.name}`; // URLS.backend.riScUri\n\n const uriToFetchAllRiScs = `${riScUri}/${latestSupportedVersion}/all`; // URLS.backend.fetchAllRiScs\n const uriToFetchDefaultRiScDescriptors = `${backendUrl}${URLS.backend.fetchDefaultRiScTypeDescriptors}`;\n\n function uriToFetchDifference(id: string) {\n // URLS.backend.fetchDifference\n return `${riScUri}/${id}/difference`;\n }\n\n function uriToFetchRiSc(id: string) {\n // URLS.backend.fetchRiSc\n return `${riScUri}/${id}`;\n }\n\n function uriToDeleteRiSc(id: string) {\n // URLS.backend.deleteRiSc\n return `${riScUri}/${id}`;\n }\n\n function uriToPublishRiSc(id: string) {\n // URLS.backend.publishRiSc\n return `${riScUri}/publish/${id}`;\n }\n\n function useResponse(): [\n SubmitResponseObject | null,\n (submitStatus: SubmitResponseObject | null) => void,\n ] {\n const [submitResponse, setSubmitResponse] =\n useState<SubmitResponseObject | null>(null);\n // use callback to avoid infinite loop\n const displaySubmitResponse = useCallback(\n (submitStatus: SubmitResponseObject | null) => {\n setSubmitResponse(submitStatus);\n setTimeout(() => {\n setSubmitResponse(null);\n }, 10000);\n },\n [],\n );\n\n return [submitResponse, displaySubmitResponse];\n }\n\n const [response, setResponse] = useResponse();\n\n const configApi = useApi(configApiRef);\n\n function isDevelopment() {\n return configApi.getString('auth.environment') === 'development';\n }\n\n function fullyAuthenticatedFetch<T, K>(\n uri: string,\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n onSuccess: (response: T) => void,\n onError: (error: K, rejectedLogin: boolean) => void,\n body?: string,\n ) {\n Promise.all([\n identityApi.getCredentials(),\n googleApi.getAccessToken([\n URLS.external.www_googleapis_com__cloudkms,\n URLS.external.www_googleapis_com__cloud_platform,\n URLS.external.www_googleapis_com__cloudplatformprojects_readonly,\n ]),\n gitHubApi.getAccessToken(['repo']),\n ])\n .then(([idToken, googleAccessToken, gitHubAccessToken]) => {\n fetch(uri, {\n method: method,\n headers: {\n Authorization: `Bearer ${idToken.token}`,\n 'GCP-Access-Token': googleAccessToken,\n 'GitHub-Access-Token': gitHubAccessToken,\n 'Content-Type': 'application/json',\n },\n body: body,\n }).then(res => {\n if (!res.ok) {\n return res\n .json()\n .then(json => json as K)\n .then(typedJson => onError(typedJson, false))\n .catch(error => onError(error, false));\n }\n return res\n .json()\n .then(json => json as T)\n .then(typedJson => onSuccess(typedJson));\n });\n })\n .catch(error => {\n if (error.name === 'RejectedError') {\n onError(error, true);\n } else {\n onError(error, false);\n }\n });\n }\n\n function googleAuthenticatedFetch<T, K>(\n uri: string,\n method: 'GET',\n onSuccess: (response: T) => void,\n onError: (error: K, rejectedLogin: boolean) => void,\n body?: string,\n ) {\n Promise.all([\n identityApi.getCredentials(),\n googleApi.getAccessToken([\n URLS.external.www_googleapis_com__cloudkms,\n URLS.external.www_googleapis_com__cloud_platform,\n URLS.external.www_googleapis_com__cloudplatformprojects_readonly,\n ]),\n ])\n .then(([idToken, googleAccessToken]) => {\n fetch(uri, {\n method: method,\n headers: {\n Authorization: `Bearer ${idToken.token}`,\n 'GCP-Access-Token': googleAccessToken,\n 'Content-Type': 'application/json',\n },\n body: body,\n }).then(res => {\n if (!res.ok) {\n return res\n .json()\n .then(json => json as K)\n .then(typedJson => onError(typedJson, false))\n .catch(error => onError(error, false));\n }\n return res\n .json()\n .then(json => json as T)\n .then(typedJson => onSuccess(typedJson));\n });\n })\n .catch(error => {\n if (error.name === 'RejectedError') {\n onError(error, true);\n } else {\n onError(error, false);\n }\n });\n }\n\n function fetchDifference(\n selectedRiSc: RiScWithMetadata,\n onSuccess: (response: DifferenceDTO) => void,\n onError?: (loginRejected: boolean) => void,\n ) {\n return identityApi.getProfileInfo().then(profile => {\n fullyAuthenticatedFetch<DifferenceDTO, DifferenceDTO>(\n uriToFetchDifference(selectedRiSc.id),\n 'POST',\n onSuccess,\n (_, rejectedLogin) => {\n if (onError) onError(rejectedLogin);\n },\n riScToDTOString(\n selectedRiSc.content,\n false,\n profile,\n selectedRiSc.sopsConfig,\n ),\n );\n });\n }\n\n function fetchRiScs(\n onSuccess: (response: RiScContentResultDTO[]) => void,\n onError?: (loginRejected: boolean) => void,\n ) {\n if (isDevelopment()) {\n fullyAuthenticatedFetch<RiScContentResultDTO[], RiScContentResultDTO[]>(\n uriToFetchAllRiScs,\n 'GET',\n onSuccess,\n (_, rejectedLogin) => {\n if (onError) onError(rejectedLogin);\n },\n );\n } else {\n googleAuthenticatedFetch<RiScContentResultDTO[], RiScContentResultDTO[]>(\n uriToFetchAllRiScs,\n 'GET',\n onSuccess,\n (_, rejectedLogin) => {\n if (onError) onError(rejectedLogin);\n },\n );\n }\n }\n\n function postFeedback(feedback: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fullyAuthenticatedFetch<void, any>(\n `${riScUri}/feedback`,\n 'POST',\n () => resolve(),\n error => reject(error),\n feedback,\n );\n });\n }\n\n function fetchGcpCryptoKeys(\n onSuccess: (response: GcpCryptoKeyObject[]) => void,\n onError?: (error: GcpCryptoKeyObject[], loginRejected: boolean) => void,\n ) {\n googleAuthenticatedFetch<GcpCryptoKeyObject[], GcpCryptoKeyObject[]>(\n `${backendUrl}/api/proxy/risc-proxy/api/google/gcpCryptoKeys`, // URL\n 'GET',\n res => onSuccess(res),\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n );\n }\n\n function publishRiScs(\n riScId: string,\n onSuccess?: (response: PublishRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) {\n return identityApi.getProfileInfo().then(profile =>\n fullyAuthenticatedFetch<PublishRiScResultDTO, ProcessRiScResultDTO>(\n uriToPublishRiSc(riScId),\n 'POST',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n profileInfoToDTOString(profile),\n ),\n );\n }\n\n function postRiScs(\n riSc: RiSc,\n generateDefault: boolean,\n sopsConfig: SopsConfigDTO,\n defaultRiScId: string | undefined,\n onSuccess?: (response: CreateRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) {\n return identityApi.getProfileInfo().then(profile =>\n fullyAuthenticatedFetch<CreateRiScResultDTO, ProcessRiScResultDTO>(\n `${riScUri}?generateDefault=${generateDefault}`,\n 'POST',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n riScToDTOString(riSc, true, profile, sopsConfig, defaultRiScId),\n ),\n );\n }\n\n function putRiScs(\n riSc: RiScWithMetadata,\n onSuccess?: (response: ProcessRiScResultDTO | PublishRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) {\n identityApi.getProfileInfo().then(profile =>\n fullyAuthenticatedFetch<\n ProcessRiScResultDTO | PublishRiScResultDTO,\n ProcessRiScResultDTO\n >(\n uriToFetchRiSc(riSc.id),\n 'PUT',\n res => {\n setResponse(res);\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n riScToDTOString(\n riSc.content,\n riSc.isRequiresNewApproval!!,\n profile,\n riSc.sopsConfig,\n ),\n ),\n );\n }\n\n function deleteRiScs(\n riScId: string,\n onSuccess?: (response: DeleteRiScResultDTO) => void,\n onError?: (error: ProcessRiScResultDTO, loginRejected: boolean) => void,\n ) {\n fullyAuthenticatedFetch<DeleteRiScResultDTO, ProcessRiScResultDTO>(\n uriToDeleteRiSc(riScId),\n 'DELETE',\n res => {\n if (onSuccess) onSuccess(res);\n },\n (error, rejectedLogin) => {\n if (onError) onError(error, rejectedLogin);\n },\n );\n }\n\n function fetchDefaultRiScTypeDescriptors(\n onSuccess: (response: DefaultRiScTypeDescriptor[]) => void,\n ) {\n googleAuthenticatedFetch<DefaultRiScTypeDescriptor[], void>(\n uriToFetchDefaultRiScDescriptors,\n 'GET',\n res => onSuccess(res),\n () => {},\n );\n }\n return {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n putRiScs,\n deleteRiScs,\n publishRiScs,\n response,\n setResponse,\n fetchDifference,\n postFeedback,\n fetchDefaultRiScTypeDescriptors,\n };\n}\n\nexport function useIsMounted() {\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n return useCallback(() => mountedRef.current, []);\n}\n\nexport function useDebounce<T>(\n value: T,\n delay: number,\n callback: (value: T) => void,\n) {\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const latestValueRef = useRef<T>(value);\n const latestCallbackRef = useRef<(v: T) => void>(callback);\n\n useEffect(() => {\n latestValueRef.current = value;\n }, [value]);\n\n useEffect(() => {\n latestCallbackRef.current = callback;\n }, [callback]);\n\n useEffect(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n latestCallbackRef.current(latestValueRef.current);\n timeoutRef.current = null;\n }, delay);\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [value, delay]);\n\n const flush = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n const v = latestValueRef.current;\n const hasValue = Array.isArray(v) ? v.length > 0 : v !== null;\n if (hasValue) {\n latestCallbackRef.current(v);\n }\n }, []);\n return { flush };\n}\n\ntype UseDisplayScenarios = (\n tempScenarios: RiSc['scenarios'] | null | undefined,\n visibleType: UpdatedStatusEnumType | null,\n lastPublishedCommits: number | null,\n sortOrder?: string,\n) => RiSc['scenarios'];\nexport const useDisplayScenarios: UseDisplayScenarios = (\n tempScenarios,\n visibleType,\n lastPublishedCommits,\n sortOrder,\n) => {\n return useMemo(() => {\n if (!tempScenarios) return [] as RiSc['scenarios'];\n\n const filtered = !visibleType\n ? tempScenarios\n : tempScenarios.filter(scenario =>\n scenario.actions.some(action => {\n const daysSinceLastUpdate = action.lastUpdated\n ? calculateDaysSince(new Date(action.lastUpdated))\n : null;\n const status = calculateUpdatedStatus(\n daysSinceLastUpdate,\n lastPublishedCommits,\n );\n return status === visibleType;\n }),\n );\n\n const sorted = [...filtered].sort((a, b) => {\n switch (sortOrder) {\n case 'title':\n return a.title.localeCompare(b.title, 'en');\n\n case 'initialRisk':\n return (\n b.risk.consequence * b.risk.probability -\n a.risk.consequence * a.risk.probability\n );\n\n case 'implementedActions':\n return (\n b.actions.filter(status => status.status === ActionStatusOptions.OK)\n .length -\n a.actions.filter(status => status.status === ActionStatusOptions.OK)\n .length\n );\n\n case 'remainingActions': {\n const remainingA = a.actions.filter(\n action =>\n action.status !== ActionStatusOptions.OK &&\n action.status !== ActionStatusOptions.NotRelevant,\n ).length;\n const remainingB = b.actions.filter(\n action =>\n action.status !== ActionStatusOptions.OK &&\n action.status !== ActionStatusOptions.NotRelevant,\n ).length;\n return remainingB - remainingA;\n }\n\n default:\n return 0;\n }\n });\n\n return sorted;\n }, [tempScenarios, visibleType, lastPublishedCommits, sortOrder]);\n};\n\nexport function useSearchActions(\n scenarios: Scenario[] | undefined | null,\n searchQuery: string,\n debounceMs = 300,\n): { matches: Record<string, Scenario['actions']>; isDebouncing: boolean } {\n const [debouncedQuery, setDebouncedQuery] = useState(searchQuery);\n const [hasTyped, setHasTyped] = useState(false);\n const queryRef = useRef(searchQuery);\n\n useEffect(() => {\n queryRef.current = searchQuery;\n const id = setTimeout(\n () => setDebouncedQuery(queryRef.current),\n debounceMs,\n );\n return () => clearTimeout(id);\n }, [searchQuery, debounceMs]);\n\n const isDebouncing = searchQuery !== debouncedQuery;\n\n useEffect(() => {\n if (searchQuery) setHasTyped(true);\n }, [searchQuery]);\n\n const findMatches = useCallback(\n (query: string) => {\n const result: Record<string, Scenario['actions']> = {};\n if (!query || !scenarios) return result;\n const q = query.toLowerCase();\n\n for (const scenario of scenarios) {\n const filtered = (scenario.actions ?? []).filter(a =>\n (a.title ?? '').toLowerCase().includes(q),\n );\n if (filtered.length > 0) result[scenario.ID] = filtered;\n }\n return result;\n },\n [scenarios],\n );\n\n const matches = useMemo(\n () => findMatches(debouncedQuery),\n [findMatches, debouncedQuery],\n );\n const immediateMatches = useMemo(\n () => findMatches(searchQuery),\n [findMatches, searchQuery],\n );\n\n const shouldUseImmediate = !hasTyped || (!debouncedQuery && isDebouncing);\n const returnedMatches = shouldUseImmediate ? immediateMatches : matches;\n\n return { matches: returnedMatches, isDebouncing };\n}\n"],"names":[],"mappings":"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"}
@@ -1,10 +1,3 @@
1
- var DefaultRiScType = /* @__PURE__ */ ((DefaultRiScType2) => {
2
- DefaultRiScType2["InternalJob"] = "InternalJob";
3
- DefaultRiScType2["Standard"] = "Standard";
4
- DefaultRiScType2["Ops"] = "Ops";
5
- DefaultRiScType2["Begrenset"] = "Begrenset";
6
- return DefaultRiScType2;
7
- })(DefaultRiScType || {});
8
1
  var RiScStatus = /* @__PURE__ */ ((RiScStatus2) => {
9
2
  RiScStatus2["Draft"] = "Draft";
10
3
  RiScStatus2["Published"] = "Published";
@@ -53,5 +46,5 @@ var DifferenceStatus = /* @__PURE__ */ ((DifferenceStatus2) => {
53
46
  return DifferenceStatus2;
54
47
  })(DifferenceStatus || {});
55
48
 
56
- export { ContentStatus, DefaultRiScType, DifferenceStatus, ProcessingStatus, RiScStatus };
49
+ export { ContentStatus, DifferenceStatus, ProcessingStatus, RiScStatus };
57
50
  //# sourceMappingURL=types.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.esm.js","sources":["../../src/utils/types.ts"],"sourcesContent":["import type { Dispatch } from 'react';\nimport { ActionsDTO, ScenarioDTO, SopsConfigDTO } from './DTOs';\nimport { ActionStatusOptions } from './constants';\n\n/**\n * Modify one key on an object type. Modify takes 3 type arguments. First one takes the original type you want to modify. Second is the specific key you want to modify. Third is the new type for that key.\n * @template {object} O Which object type to use as basis\n * @template {string} K Key of field in object to modify\n * @template R New type to set field of key to\n */\nexport type Modify<O, K extends keyof any, R> = Omit<O, K> & { [P in K]: R };\n\n/** Type of the setter from `useState` */\nexport type SetState<T extends any> = Dispatch<React.SetStateAction<T>>;\n\nexport type LastPublished = {\n dateTime: Date;\n numberOfCommits: number;\n};\n\nexport type RiScWithMetadata = {\n id: string;\n status: RiScStatus;\n content: RiSc;\n sopsConfig: SopsConfigDTO;\n isRequiresNewApproval?: boolean;\n pullRequestUrl?: string;\n schemaVersion?: string;\n migrationStatus?: MigrationStatus;\n lastPublished?: LastPublished;\n};\n\nexport type DefaultRiScTypeDescriptor = {\n riScType: DefaultRiScType;\n listName: string;\n listDescription: string;\n defaultTitle: string;\n defaultScope: string;\n numberOfScenarios: number | null;\n numberOfActions: number | null;\n};\n\nexport enum DefaultRiScType {\n InternalJob = 'InternalJob',\n Standard = 'Standard',\n Ops = 'Ops',\n Begrenset = 'Begrenset',\n}\n\nexport type MigrationStatus = {\n migrationChanges: boolean;\n migrationRequiresNewApproval: boolean;\n migrationVersions?: MigrationVersions;\n migrationChanges40?: MigrationChanges40;\n migrationChanges41?: MigrationChanges41;\n migrationChanges42?: MigrationChanges42;\n migrationChanges50?: MigrationChanges50;\n migrationChanges51?: MigrationChanges51;\n};\n\nexport type MigrationVersions = {\n fromVersion: string;\n toVersion: string;\n};\n\nexport type MigrationChanges51 = {\n scenarios: MigrationChanges51Scenario[];\n};\n\nexport type MigrationChanges51Scenario = {\n title: string;\n id: string;\n changedActions: MigrationChanges51Action[];\n};\n\nexport type MigrationChanges51Action = {\n title: string;\n id: string;\n lastUpdatedBy?: string | null;\n};\n\nexport type MigrationChanges50 = {\n scenarios: MigrationChanges50Scenario[];\n};\n\nexport type MigrationChanges50Scenario = {\n title: string;\n id: string;\n changedActions: MigrationChanges50Action[];\n};\n\nexport type MigrationChanges50Action = {\n title: string;\n id: string;\n changedActionStatus: MigrationChangedTypedValue<\n ActionStatusOptionsV4,\n ActionStatusOptions\n >;\n};\n\nexport type MigrationChanges42 = {\n scenarios: MigrationChanges42Scenario[];\n};\n\nexport type MigrationChanges42Scenario = {\n title: string;\n id: string;\n changedActions: MigrationChanges42Action[];\n};\n\nexport type MigrationChanges42Action = {\n title: string;\n id: string;\n lastUpdated?: Date | null;\n};\n\nexport type MigrationChanges41 = {\n scenarios: MigrationChanges41Scenario[];\n};\n\nexport type MigrationChanges41Scenario = {\n title: string;\n id: string;\n changedRiskConsequence?: MigrationChangedValue<number>;\n changedRiskProbability?: MigrationChangedValue<number>;\n changedRemainingRiskConsequence?: MigrationChangedValue<number>;\n changedRemainingRiskProbability?: MigrationChangedValue<number>;\n};\n\nexport type MigrationChanges40 = {\n scenarios: MigrationChanges40Scenario[];\n};\n\nexport type MigrationChanges40Scenario = {\n title: string;\n id: string;\n removedExistingActions?: string;\n changedVulnerabilities: MigrationChangedValue<string>[];\n changedActions: MigrationChanges40Action[];\n};\n\nexport type MigrationChanges40Action = {\n title: string;\n id: string;\n removedOwner?: string;\n removedDeadline?: string;\n};\n\nexport type MigrationChangedValue<T> = {\n oldValue: T;\n newValue: T;\n};\n\nexport type MigrationChangedTypedValue<S, T> = {\n oldValue: S;\n newValue: T;\n};\n\nexport type RiSc = {\n schemaVersion: string;\n title: string;\n scope: string;\n valuations: Valuations[];\n scenarios: Scenario[];\n};\n\nexport type Valuations = {\n description: string;\n confidentiality: string;\n integrity: string;\n availability: string;\n};\n\nexport type Scenario = {\n ID: string;\n title: string;\n url?: string;\n description: string;\n threatActors: string[];\n vulnerabilities: string[];\n risk: Risk;\n remainingRisk: Risk;\n actions: Action[];\n};\n\nexport type Risk = {\n summary: string;\n probability: number;\n consequence: number;\n};\n\nexport type Action = {\n ID: string;\n title: string;\n description: string;\n status: string;\n url: string;\n lastUpdated?: Date | null;\n lastUpdatedBy?: string | null;\n};\n\nexport type GithubRepoInfo = {\n name: string;\n owner: string;\n};\n\nexport type SubmitResponseObject = {\n status: ProcessingStatus;\n statusMessage: string;\n};\n\nexport enum RiScStatus {\n Draft = 'Draft',\n Published = 'Published',\n SentForApproval = 'SentForApproval',\n DeletionDraft = 'DeletionDraft',\n DeletionSentForApproval = 'DeletionSentForApproval',\n}\n\nexport enum ProcessingStatus {\n RiScNotValid = 'RiScNotValid',\n EncryptionFailed = 'EncryptionFailed',\n CouldNotCreateBranch = 'CouldNotCreateBranch',\n UpdatedRiSc = 'UpdatedRiSc',\n DeletedRiSc = 'DeletedRiSc',\n DeletedRiScRequiresApproval = 'DeletedRiScRequiresApproval',\n UpdatedSops = 'UpdatedSops',\n UpdatedRiScRequiresNewApproval = 'UpdatedRiScRequiresNewApproval',\n UpdatedRiScAndCreatedPullRequest = 'UpdatedRiScAndCreatedPullRequest',\n CreatedRiSc = 'CreatedRiSc',\n OpenedPullRequest = 'OpenedPullRequest',\n CreatedPullRequest = 'CreatedPullRequest',\n ErrorWhenCreatingRiSc = 'ErrorWhenCreatingRiSc',\n ErrorWhenUpdatingRiSc = 'ErrorWhenUpdatingRiSc',\n ErrorWhenDeletingRiSc = 'ErrorWhenDeletingRiSc',\n ErrorWhenPublishingRiSc = 'ErrorWhenPublishingRiSc',\n ErrorWhenNoWriteAccessToRepository = 'ErrorWhenNoWriteAccessToRepository',\n ErrorWhenFetchingRiScs = 'ErrorWhenFetchingRiScs',\n ErrorWhenCreatingPullRequest = 'ErrorWhenCreatingPullRequest',\n ErrorWhenFetchingGcpCryptoKeys = 'ErrorWhenFetchingGcpCryptoKeys',\n FailedToFetchGcpProjectIds = 'Failed to fetch GCP project IDs',\n}\n\nexport enum ContentStatus {\n Success = 'Success',\n Deleted = 'Deleted',\n Failure = 'Failure',\n FileNotFound = 'FileNotFound',\n DecryptionFailed = 'DecryptionFailed',\n NoReadAccess = 'NoReadAccess',\n}\n\nexport enum DifferenceStatus {\n Success = 'Success',\n GithubFileNotFound = 'GithubFileNotFound',\n FrontendFallback = 'FrontendFallback',\n}\n\nexport enum ActionStatusOptionsV4 {\n NotStarted = 'Not started',\n InProgress = 'In progress',\n OnHold = 'On hold',\n Completed = 'Completed',\n Aborted = 'Aborted',\n}\n\ntype FormRisk = Modify<\n Modify<Risk, 'probability', string>,\n 'consequence',\n string\n>;\n\nexport type FormScenario = Modify<\n Modify<Scenario, 'risk', FormRisk>,\n 'remainingRisk',\n FormRisk\n>;\n\nexport type Difference = {\n type: '4.*';\n migrationChanges: MigrationStatus;\n title?: SimpleTrackedProperty<string>;\n scope?: SimpleTrackedProperty<string>;\n valuations: SimpleTrackedProperty<Valuations>[];\n scenarios: TrackedProperty<ScenarioChange, ScenarioDTO>[];\n};\n\nexport type ScenarioChange = {\n title: SimpleTrackedProperty<string>;\n id: string;\n description: SimpleTrackedProperty<string>;\n url?: SimpleTrackedProperty<string | null>;\n threatActors: SimpleTrackedProperty<string>[];\n vulnerabilities: SimpleTrackedProperty<string>[];\n risk: SimpleTrackedProperty<ScenarioRiskChange>;\n remainingRisk: SimpleTrackedProperty<ScenarioRiskChange>;\n actions: TrackedProperty<ActionChange, ActionsDTO>[];\n};\n\nexport type ActionChange = {\n title: SimpleTrackedProperty<string>;\n // The id will never change\n id: string;\n description: SimpleTrackedProperty<string>;\n url?: SimpleTrackedProperty<string | null>;\n status?: SimpleTrackedProperty<string>;\n lastUpdated?: SimpleTrackedProperty<Date | null>;\n lastUpdatedBy?: SimpleTrackedProperty<string | null>;\n};\n\nexport type ScenarioRiskChange = {\n summary?: SimpleTrackedProperty<string | null>;\n probability: SimpleTrackedProperty<number>;\n consequence: SimpleTrackedProperty<number>;\n};\n\nexport type SimpleTrackedProperty<T> = TrackedProperty<T, T>;\n\nexport type TrackedProperty<S, T> =\n | AddedProperty<T>\n | ChangedProperty<S>\n | ContentChangedProperty<S>\n | DeletedProperty<T>\n | UnchangedProperty<T>;\n\nexport type AddedProperty<T> = {\n type: 'ADDED';\n newValue: T;\n};\n\nexport type ChangedProperty<S> = {\n type: 'CHANGED';\n oldValue: S;\n newValue: S;\n};\n\nexport type ContentChangedProperty<S> = {\n type: 'CONTENT_CHANGED';\n value: S;\n};\n\nexport type DeletedProperty<T> = {\n type: 'DELETED';\n oldValue: T;\n};\n\nexport type UnchangedProperty<T> = {\n type: 'UNCHANGED';\n value: T;\n};\n\nexport type DifferenceDTO = {\n status: DifferenceStatus;\n differenceState: Difference;\n errorMessage?: string;\n defaultLastModifiedDateString: string;\n};\n\nexport type DifferenceFetchState = Modify<\n DifferenceDTO,\n 'status',\n DifferenceStatus | null\n> & { isLoading: boolean; currentDifferenceId: string };\n"],"names":["DefaultRiScType","RiScStatus","ProcessingStatus","ContentStatus","DifferenceStatus"],"mappings":"AA0CO,IAAK,eAAA,qBAAAA,gBAAAA,KAAL;AACL,EAAAA,iBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,iBAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,iBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,iBAAA,WAAA,CAAA,GAAY,WAAA;AAJF,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AAyKL,IAAK,UAAA,qBAAAC,WAAAA,KAAL;AACL,EAAAA,YAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,YAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,YAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,YAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,YAAA,yBAAA,CAAA,GAA0B,yBAAA;AALhB,EAAA,OAAAA,WAAAA;AAAA,CAAA,EAAA,UAAA,IAAA,EAAA;AAQL,IAAK,gBAAA,qBAAAC,iBAAAA,KAAL;AACL,EAAAA,kBAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,kBAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,kBAAA,sBAAA,CAAA,GAAuB,sBAAA;AACvB,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,6BAAA,CAAA,GAA8B,6BAAA;AAC9B,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,gCAAA,CAAA,GAAiC,gCAAA;AACjC,EAAAA,kBAAA,kCAAA,CAAA,GAAmC,kCAAA;AACnC,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,mBAAA,CAAA,GAAoB,mBAAA;AACpB,EAAAA,kBAAA,oBAAA,CAAA,GAAqB,oBAAA;AACrB,EAAAA,kBAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,kBAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,kBAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,kBAAA,yBAAA,CAAA,GAA0B,yBAAA;AAC1B,EAAAA,kBAAA,oCAAA,CAAA,GAAqC,oCAAA;AACrC,EAAAA,kBAAA,wBAAA,CAAA,GAAyB,wBAAA;AACzB,EAAAA,kBAAA,8BAAA,CAAA,GAA+B,8BAAA;AAC/B,EAAAA,kBAAA,gCAAA,CAAA,GAAiC,gCAAA;AACjC,EAAAA,kBAAA,4BAAA,CAAA,GAA6B,iCAAA;AArBnB,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;AAwBL,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AACL,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,eAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AANL,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AASL,IAAK,gBAAA,qBAAAC,iBAAAA,KAAL;AACL,EAAAA,kBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,kBAAA,oBAAA,CAAA,GAAqB,oBAAA;AACrB,EAAAA,kBAAA,kBAAA,CAAA,GAAmB,kBAAA;AAHT,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;;;;"}
1
+ {"version":3,"file":"types.esm.js","sources":["../../src/utils/types.ts"],"sourcesContent":["import type { Dispatch } from 'react';\nimport { ActionsDTO, ScenarioDTO, SopsConfigDTO } from './DTOs';\nimport { ActionStatusOptions } from './constants';\n\n/**\n * Modify one key on an object type. Modify takes 3 type arguments. First one takes the original type you want to modify. Second is the specific key you want to modify. Third is the new type for that key.\n * @template {object} O Which object type to use as basis\n * @template {string} K Key of field in object to modify\n * @template R New type to set field of key to\n */\nexport type Modify<O, K extends keyof any, R> = Omit<O, K> & { [P in K]: R };\n\n/** Type of the setter from `useState` */\nexport type SetState<T extends any> = Dispatch<React.SetStateAction<T>>;\n\nexport type LastPublished = {\n dateTime: Date;\n numberOfCommits: number;\n};\n\nexport type RiScWithMetadata = {\n id: string;\n status: RiScStatus;\n content: RiSc;\n sopsConfig: SopsConfigDTO;\n isRequiresNewApproval?: boolean;\n pullRequestUrl?: string;\n schemaVersion?: string;\n migrationStatus?: MigrationStatus;\n lastPublished?: LastPublished;\n};\n\nexport type DefaultRiScTypeDescriptor = {\n id: string;\n listName: string;\n listDescription: string;\n defaultTitle: string;\n defaultScope: string;\n numberOfScenarios: number | null;\n numberOfActions: number | null;\n preferredBackstageComponentType: string | null;\n priorityIndex: number | null;\n};\n\nexport type MigrationStatus = {\n migrationChanges: boolean;\n migrationRequiresNewApproval: boolean;\n migrationVersions?: MigrationVersions;\n migrationChanges40?: MigrationChanges40;\n migrationChanges41?: MigrationChanges41;\n migrationChanges42?: MigrationChanges42;\n migrationChanges50?: MigrationChanges50;\n migrationChanges51?: MigrationChanges51;\n};\n\nexport type MigrationVersions = {\n fromVersion: string;\n toVersion: string;\n};\n\nexport type MigrationChanges51 = {\n scenarios: MigrationChanges51Scenario[];\n};\n\nexport type MigrationChanges51Scenario = {\n title: string;\n id: string;\n changedActions: MigrationChanges51Action[];\n};\n\nexport type MigrationChanges51Action = {\n title: string;\n id: string;\n lastUpdatedBy?: string | null;\n};\n\nexport type MigrationChanges50 = {\n scenarios: MigrationChanges50Scenario[];\n};\n\nexport type MigrationChanges50Scenario = {\n title: string;\n id: string;\n changedActions: MigrationChanges50Action[];\n};\n\nexport type MigrationChanges50Action = {\n title: string;\n id: string;\n changedActionStatus: MigrationChangedTypedValue<\n ActionStatusOptionsV4,\n ActionStatusOptions\n >;\n};\n\nexport type MigrationChanges42 = {\n scenarios: MigrationChanges42Scenario[];\n};\n\nexport type MigrationChanges42Scenario = {\n title: string;\n id: string;\n changedActions: MigrationChanges42Action[];\n};\n\nexport type MigrationChanges42Action = {\n title: string;\n id: string;\n lastUpdated?: Date | null;\n};\n\nexport type MigrationChanges41 = {\n scenarios: MigrationChanges41Scenario[];\n};\n\nexport type MigrationChanges41Scenario = {\n title: string;\n id: string;\n changedRiskConsequence?: MigrationChangedValue<number>;\n changedRiskProbability?: MigrationChangedValue<number>;\n changedRemainingRiskConsequence?: MigrationChangedValue<number>;\n changedRemainingRiskProbability?: MigrationChangedValue<number>;\n};\n\nexport type MigrationChanges40 = {\n scenarios: MigrationChanges40Scenario[];\n};\n\nexport type MigrationChanges40Scenario = {\n title: string;\n id: string;\n removedExistingActions?: string;\n changedVulnerabilities: MigrationChangedValue<string>[];\n changedActions: MigrationChanges40Action[];\n};\n\nexport type MigrationChanges40Action = {\n title: string;\n id: string;\n removedOwner?: string;\n removedDeadline?: string;\n};\n\nexport type MigrationChangedValue<T> = {\n oldValue: T;\n newValue: T;\n};\n\nexport type MigrationChangedTypedValue<S, T> = {\n oldValue: S;\n newValue: T;\n};\n\nexport type RiSc = {\n schemaVersion: string;\n title: string;\n scope: string;\n valuations: Valuations[];\n scenarios: Scenario[];\n};\n\nexport type Valuations = {\n description: string;\n confidentiality: string;\n integrity: string;\n availability: string;\n};\n\nexport type Scenario = {\n ID: string;\n title: string;\n url?: string;\n description: string;\n threatActors: string[];\n vulnerabilities: string[];\n risk: Risk;\n remainingRisk: Risk;\n actions: Action[];\n};\n\nexport type Risk = {\n summary: string;\n probability: number;\n consequence: number;\n};\n\nexport type Action = {\n ID: string;\n title: string;\n description: string;\n status: string;\n url: string;\n lastUpdated?: Date | null;\n lastUpdatedBy?: string | null;\n};\n\nexport type GithubRepoInfo = {\n name: string;\n owner: string;\n};\n\nexport type SubmitResponseObject = {\n status: ProcessingStatus;\n statusMessage: string;\n};\n\nexport enum RiScStatus {\n Draft = 'Draft',\n Published = 'Published',\n SentForApproval = 'SentForApproval',\n DeletionDraft = 'DeletionDraft',\n DeletionSentForApproval = 'DeletionSentForApproval',\n}\n\nexport enum ProcessingStatus {\n RiScNotValid = 'RiScNotValid',\n EncryptionFailed = 'EncryptionFailed',\n CouldNotCreateBranch = 'CouldNotCreateBranch',\n UpdatedRiSc = 'UpdatedRiSc',\n DeletedRiSc = 'DeletedRiSc',\n DeletedRiScRequiresApproval = 'DeletedRiScRequiresApproval',\n UpdatedSops = 'UpdatedSops',\n UpdatedRiScRequiresNewApproval = 'UpdatedRiScRequiresNewApproval',\n UpdatedRiScAndCreatedPullRequest = 'UpdatedRiScAndCreatedPullRequest',\n CreatedRiSc = 'CreatedRiSc',\n OpenedPullRequest = 'OpenedPullRequest',\n CreatedPullRequest = 'CreatedPullRequest',\n ErrorWhenCreatingRiSc = 'ErrorWhenCreatingRiSc',\n ErrorWhenUpdatingRiSc = 'ErrorWhenUpdatingRiSc',\n ErrorWhenDeletingRiSc = 'ErrorWhenDeletingRiSc',\n ErrorWhenPublishingRiSc = 'ErrorWhenPublishingRiSc',\n ErrorWhenNoWriteAccessToRepository = 'ErrorWhenNoWriteAccessToRepository',\n ErrorWhenFetchingRiScs = 'ErrorWhenFetchingRiScs',\n ErrorWhenCreatingPullRequest = 'ErrorWhenCreatingPullRequest',\n ErrorWhenFetchingGcpCryptoKeys = 'ErrorWhenFetchingGcpCryptoKeys',\n FailedToFetchGcpProjectIds = 'Failed to fetch GCP project IDs',\n}\n\nexport enum ContentStatus {\n Success = 'Success',\n Deleted = 'Deleted',\n Failure = 'Failure',\n FileNotFound = 'FileNotFound',\n DecryptionFailed = 'DecryptionFailed',\n NoReadAccess = 'NoReadAccess',\n}\n\nexport enum DifferenceStatus {\n Success = 'Success',\n GithubFileNotFound = 'GithubFileNotFound',\n FrontendFallback = 'FrontendFallback',\n}\n\nexport enum ActionStatusOptionsV4 {\n NotStarted = 'Not started',\n InProgress = 'In progress',\n OnHold = 'On hold',\n Completed = 'Completed',\n Aborted = 'Aborted',\n}\n\ntype FormRisk = Modify<\n Modify<Risk, 'probability', string>,\n 'consequence',\n string\n>;\n\nexport type FormScenario = Modify<\n Modify<Scenario, 'risk', FormRisk>,\n 'remainingRisk',\n FormRisk\n>;\n\nexport type Difference = {\n type: '4.*';\n migrationChanges: MigrationStatus;\n title?: SimpleTrackedProperty<string>;\n scope?: SimpleTrackedProperty<string>;\n valuations: SimpleTrackedProperty<Valuations>[];\n scenarios: TrackedProperty<ScenarioChange, ScenarioDTO>[];\n};\n\nexport type ScenarioChange = {\n title: SimpleTrackedProperty<string>;\n id: string;\n description: SimpleTrackedProperty<string>;\n url?: SimpleTrackedProperty<string | null>;\n threatActors: SimpleTrackedProperty<string>[];\n vulnerabilities: SimpleTrackedProperty<string>[];\n risk: SimpleTrackedProperty<ScenarioRiskChange>;\n remainingRisk: SimpleTrackedProperty<ScenarioRiskChange>;\n actions: TrackedProperty<ActionChange, ActionsDTO>[];\n};\n\nexport type ActionChange = {\n title: SimpleTrackedProperty<string>;\n // The id will never change\n id: string;\n description: SimpleTrackedProperty<string>;\n url?: SimpleTrackedProperty<string | null>;\n status?: SimpleTrackedProperty<string>;\n lastUpdated?: SimpleTrackedProperty<Date | null>;\n lastUpdatedBy?: SimpleTrackedProperty<string | null>;\n};\n\nexport type ScenarioRiskChange = {\n summary?: SimpleTrackedProperty<string | null>;\n probability: SimpleTrackedProperty<number>;\n consequence: SimpleTrackedProperty<number>;\n};\n\nexport type SimpleTrackedProperty<T> = TrackedProperty<T, T>;\n\nexport type TrackedProperty<S, T> =\n | AddedProperty<T>\n | ChangedProperty<S>\n | ContentChangedProperty<S>\n | DeletedProperty<T>\n | UnchangedProperty<T>;\n\nexport type AddedProperty<T> = {\n type: 'ADDED';\n newValue: T;\n};\n\nexport type ChangedProperty<S> = {\n type: 'CHANGED';\n oldValue: S;\n newValue: S;\n};\n\nexport type ContentChangedProperty<S> = {\n type: 'CONTENT_CHANGED';\n value: S;\n};\n\nexport type DeletedProperty<T> = {\n type: 'DELETED';\n oldValue: T;\n};\n\nexport type UnchangedProperty<T> = {\n type: 'UNCHANGED';\n value: T;\n};\n\nexport type DifferenceDTO = {\n status: DifferenceStatus;\n differenceState: Difference;\n errorMessage?: string;\n defaultLastModifiedDateString: string;\n};\n\nexport type DifferenceFetchState = Modify<\n DifferenceDTO,\n 'status',\n DifferenceStatus | null\n> & { isLoading: boolean; currentDifferenceId: string };\n"],"names":["RiScStatus","ProcessingStatus","ContentStatus","DifferenceStatus"],"mappings":"AA8MO,IAAK,UAAA,qBAAAA,WAAAA,KAAL;AACL,EAAAA,YAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,YAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,YAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,YAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,YAAA,yBAAA,CAAA,GAA0B,yBAAA;AALhB,EAAA,OAAAA,WAAAA;AAAA,CAAA,EAAA,UAAA,IAAA,EAAA;AAQL,IAAK,gBAAA,qBAAAC,iBAAAA,KAAL;AACL,EAAAA,kBAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,kBAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,kBAAA,sBAAA,CAAA,GAAuB,sBAAA;AACvB,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,6BAAA,CAAA,GAA8B,6BAAA;AAC9B,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,gCAAA,CAAA,GAAiC,gCAAA;AACjC,EAAAA,kBAAA,kCAAA,CAAA,GAAmC,kCAAA;AACnC,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,mBAAA,CAAA,GAAoB,mBAAA;AACpB,EAAAA,kBAAA,oBAAA,CAAA,GAAqB,oBAAA;AACrB,EAAAA,kBAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,kBAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,kBAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,kBAAA,yBAAA,CAAA,GAA0B,yBAAA;AAC1B,EAAAA,kBAAA,oCAAA,CAAA,GAAqC,oCAAA;AACrC,EAAAA,kBAAA,wBAAA,CAAA,GAAyB,wBAAA;AACzB,EAAAA,kBAAA,8BAAA,CAAA,GAA+B,8BAAA;AAC/B,EAAAA,kBAAA,gCAAA,CAAA,GAAiC,gCAAA;AACjC,EAAAA,kBAAA,4BAAA,CAAA,GAA6B,iCAAA;AArBnB,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;AAwBL,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AACL,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,eAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AANL,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AASL,IAAK,gBAAA,qBAAAC,iBAAAA,KAAL;AACL,EAAAA,kBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,kBAAA,oBAAA,CAAA,GAAqB,oBAAA;AACrB,EAAAA,kBAAA,kBAAA,CAAA,GAAmB,kBAAA;AAHT,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kartverket/backstage-plugin-risk-scorecard",
3
- "version": "3.9.6",
3
+ "version": "3.10.0",
4
4
  "main": "dist/index.esm.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "MIT",