diff --git a/packages/zapp/console/src/components/Launch/LaunchForm/LaunchFormInputs.tsx b/packages/zapp/console/src/components/Launch/LaunchForm/LaunchFormInputs.tsx
index 63dcecab4b..6a5169e942 100644
--- a/packages/zapp/console/src/components/Launch/LaunchForm/LaunchFormInputs.tsx
+++ b/packages/zapp/console/src/components/Launch/LaunchForm/LaunchFormInputs.tsx
@@ -4,6 +4,7 @@ import { BlobInput } from './BlobInput';
import { CollectionInput } from './CollectionInput';
import { formStrings, inputsDescription } from './constants';
import { LaunchState } from './launchMachine';
+import { MapInput } from './MapInput';
import { NoInputsNeeded } from './NoInputsNeeded';
import { SimpleInput } from './SimpleInput';
import { StructInput } from './StructInput';
@@ -24,6 +25,7 @@ function getComponentForInput(input: InputProps, showErrors: boolean) {
case InputType.Struct:
return ;
case InputType.Map:
+ return ;
case InputType.Unknown:
case InputType.None:
return ;
diff --git a/packages/zapp/console/src/components/Launch/LaunchForm/MapInput.tsx b/packages/zapp/console/src/components/Launch/LaunchForm/MapInput.tsx
new file mode 100644
index 0000000000..ae03a5b775
--- /dev/null
+++ b/packages/zapp/console/src/components/Launch/LaunchForm/MapInput.tsx
@@ -0,0 +1,213 @@
+import { Button, IconButton, TextField, Typography } from '@material-ui/core';
+import { makeStyles, Theme } from '@material-ui/core/styles';
+import * as React from 'react';
+import RemoveIcon from '@material-ui/icons/Remove';
+import Card from '@material-ui/core/Card';
+import CardContent from '@material-ui/core/CardContent';
+import { requiredInputSuffix } from './constants';
+import { InputProps, InputType, InputTypeDefinition, InputValue } from './types';
+import { formatType, toMappedTypeValue } from './utils';
+
+const useStyles = makeStyles((theme: Theme) => ({
+ formControl: {
+ width: '100%',
+ marginTop: theme.spacing(1),
+ },
+ controls: {
+ margin: theme.spacing(1),
+ width: '100%',
+ display: 'flex',
+ alignItems: 'flex-start',
+ flexDirection: 'row',
+ },
+ keyControl: {
+ marginRight: theme.spacing(1),
+ },
+ valueControl: {
+ flexGrow: 1,
+ },
+ addButton: {
+ display: 'flex',
+ justifyContent: 'flex-end',
+ marginTop: theme.spacing(1),
+ },
+ error: {
+ border: '1px solid #f44336',
+ },
+}));
+
+interface MapInputItemProps {
+ data: MapInputItem;
+ subtype?: InputTypeDefinition;
+ setKey: (key: string) => void;
+ setValue: (value: string) => void;
+ isValid: (value: string) => boolean;
+ onDeleteItem: () => void;
+}
+
+const MapSingleInputItem = (props: MapInputItemProps) => {
+ const classes = useStyles();
+ const { data, subtype, setKey, setValue, isValid, onDeleteItem } = props;
+ const [error, setError] = React.useState(false);
+
+ const isOneLineType = subtype?.type === InputType.String || subtype?.type === InputType.Integer;
+
+ return (
+
+ ) => {
+ setKey(value);
+ setError(!!value && !isValid(value));
+ }}
+ value={data.key}
+ error={error}
+ placeholder="key"
+ variant="outlined"
+ helperText={error ? 'This key already defined' : ''}
+ className={classes.keyControl}
+ />
+ ) => {
+ setValue(value);
+ }}
+ value={data.value}
+ variant="outlined"
+ className={classes.valueControl}
+ multiline={!isOneLineType}
+ type={subtype?.type === InputType.Integer ? 'number' : 'text'}
+ />
+
+
+
+
+ );
+};
+
+type MapInputItem = {
+ id: number | null;
+ key: string;
+ value: string;
+};
+
+const getNewMapItem = (id, key = '', value = ''): MapInputItem => {
+ return { id, key, value };
+};
+
+function parseMappedTypeValue(value?: InputValue): MapInputItem[] {
+ const fallback = [getNewMapItem(0)];
+ if (!value) {
+ return fallback;
+ }
+ try {
+ const mapObj = JSON.parse(value.toString());
+ if (typeof mapObj === 'object') {
+ return Object.keys(mapObj).map((key, index) => getNewMapItem(index, key, mapObj[key]));
+ }
+ } catch (e) {
+ // do nothing
+ }
+
+ return fallback;
+}
+
+export const MapInput = (props: InputProps) => {
+ const {
+ value,
+ label,
+ onChange,
+ typeDefinition: { subtype },
+ } = props;
+ const classes = useStyles();
+
+ const [data, setData] = React.useState(parseMappedTypeValue(value));
+
+ const onAddItem = () => {
+ setData((data) => [...data, getNewMapItem(data.length)]);
+ };
+
+ const updateUpperStream = () => {
+ const newPairs = data
+ .filter((item) => {
+ // we filter out delted values and items with errors or empty keys/values
+ return item.id !== null && !!item.key && !!item.value;
+ })
+ .map((item) => {
+ return {
+ key: item.key,
+ value: item.value,
+ };
+ });
+ const newValue = toMappedTypeValue(newPairs);
+ onChange(newValue);
+ };
+
+ const onSetKey = (id: number | null, key: string) => {
+ if (id === null) return;
+ setData((data) => {
+ data[id].key = key;
+ return [...data];
+ });
+ updateUpperStream();
+ };
+
+ const onSetValue = (id: number | null, value: string) => {
+ if (id === null) return;
+ setData((data) => {
+ data[id].value = value;
+ return [...data];
+ });
+ updateUpperStream();
+ };
+
+ const onDeleteItem = (id: number | null) => {
+ if (id === null) return;
+ setData((data) => {
+ const dataIndex = data.findIndex((item) => item.id === id);
+ if (dataIndex >= 0 && dataIndex < data.length) {
+ data[dataIndex].id = null;
+ }
+ return [...data];
+ });
+ updateUpperStream();
+ };
+
+ const isValid = (id: number | null, value: string) => {
+ if (id === null) return true;
+ // findIndex returns -1 if value is not found, which means we can use that key
+ return (
+ data
+ .filter((item) => item.id !== null && item.id !== id)
+ .findIndex((item) => item.key === value) === -1
+ );
+ };
+
+ return (
+
+
+
+ {label}
+
+ {data
+ .filter((item) => item.id !== null)
+ .map((item) => {
+ return (
+ onSetKey(item.id, key)}
+ setValue={(value) => onSetValue(item.id, value)}
+ isValid={(value) => isValid(item.id, value)}
+ onDeleteItem={() => onDeleteItem(item.id)}
+ />
+ );
+ })}
+
+
+
+
+
+ );
+};
diff --git a/packages/zapp/console/src/components/Launch/LaunchForm/__mocks__/utils.ts b/packages/zapp/console/src/components/Launch/LaunchForm/__mocks__/utils.ts
index b6ccd62811..73f1356eac 100644
--- a/packages/zapp/console/src/components/Launch/LaunchForm/__mocks__/utils.ts
+++ b/packages/zapp/console/src/components/Launch/LaunchForm/__mocks__/utils.ts
@@ -51,3 +51,31 @@ export function nestedCollectionInputTypeDefinition(
},
};
}
+
+export function mapInputTypeDefinition(typeDefinition: InputTypeDefinition): InputTypeDefinition {
+ return {
+ literalType: {
+ mapValueType: typeDefinition.literalType,
+ },
+ type: InputType.Map,
+ subtype: typeDefinition,
+ };
+}
+
+export function nestedMapInputTypeDefinition(
+ typeDefinition: InputTypeDefinition,
+): InputTypeDefinition {
+ return {
+ literalType: {
+ mapValueType: {
+ mapValueType: typeDefinition.literalType,
+ },
+ },
+ type: InputType.Map,
+ subtype: {
+ literalType: { mapValueType: typeDefinition.literalType },
+ type: InputType.Map,
+ subtype: typeDefinition,
+ },
+ };
+}
diff --git a/packages/zapp/console/src/components/Launch/LaunchForm/__stories__/MapInput.stories.tsx b/packages/zapp/console/src/components/Launch/LaunchForm/__stories__/MapInput.stories.tsx
new file mode 100644
index 0000000000..4bea0afd56
--- /dev/null
+++ b/packages/zapp/console/src/components/Launch/LaunchForm/__stories__/MapInput.stories.tsx
@@ -0,0 +1,26 @@
+import { storiesOf } from '@storybook/react';
+import * as React from 'react';
+import { MapInput } from '../MapInput';
+import { InputValue } from '../types';
+import { inputTypes } from '../inputHelpers/test/testCases';
+
+const stories = storiesOf('Launch/MapInput', module);
+
+stories.addDecorator((story) => {
+ return {story()}
;
+});
+
+stories.add('Base', () => {
+ return (
+ {
+ console.log('onChange', newValue);
+ }}
+ />
+ );
+});
diff --git a/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/getHelperForInput.ts b/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/getHelperForInput.ts
index 9b809ba903..819faad788 100644
--- a/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/getHelperForInput.ts
+++ b/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/getHelperForInput.ts
@@ -6,6 +6,7 @@ import { datetimeHelper } from './datetime';
import { durationHelper } from './duration';
import { floatHelper } from './float';
import { integerHelper } from './integer';
+import { mapHelper } from './map';
import { noneHelper } from './none';
import { schemaHelper } from './schema';
import { stringHelper } from './string';
@@ -26,7 +27,7 @@ const inputHelpers: Record = {
[InputType.Error]: unsupportedHelper,
[InputType.Float]: floatHelper,
[InputType.Integer]: integerHelper,
- [InputType.Map]: unsupportedHelper,
+ [InputType.Map]: mapHelper,
[InputType.None]: noneHelper,
[InputType.Schema]: schemaHelper,
[InputType.String]: stringHelper,
diff --git a/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/map.ts b/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/map.ts
new file mode 100644
index 0000000000..840fe8996e
--- /dev/null
+++ b/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/map.ts
@@ -0,0 +1,104 @@
+import { stringifyValue } from 'common/utils';
+import { Core } from 'flyteidl';
+import { InputTypeDefinition, InputValue } from '../types';
+import { getHelperForInput } from './getHelperForInput';
+import { ConverterInput, InputHelper, InputValidatorParams } from './types';
+import t from '../../../common/strings';
+import { parseJSON } from './parseJson';
+import { literalNone } from './constants';
+
+function parseMap(map: string) {
+ const parsed = parseJSON(map);
+ if (typeof parsed !== 'object') {
+ throw new Error(t('valueNotParse'));
+ }
+ return parsed;
+}
+
+function fromLiteral(literal: Core.ILiteral, { subtype }: InputTypeDefinition): InputValue {
+ if (!subtype) {
+ throw new Error(t('missingMapSubType'));
+ }
+ if (!literal.map) {
+ throw new Error(t('mapMissingMapProperty'));
+ }
+ if (!literal.map.literals) {
+ throw new Error(t('mapMissingMapLiteralsProperty'));
+ }
+ if (typeof literal.map.literals !== 'object') {
+ throw new Error(t('mapLiternalNotObject'));
+ }
+ if (!Object.keys(literal.map.literals).length) {
+ throw new Error(t('mapLiternalObjectEmpty'));
+ }
+
+ const result = {};
+
+ Object.entries(literal.map.literals).forEach(([key, childLiteral]) => {
+ const helper = getHelperForInput(subtype.type);
+ result[key] = helper.fromLiteral(childLiteral, subtype);
+ });
+
+ return stringifyValue(result);
+}
+
+function toLiteral({ value, typeDefinition: { subtype } }: ConverterInput): Core.ILiteral {
+ if (!subtype) {
+ throw new Error(t('missingMapSubType'));
+ }
+ let parsed: { [key: string]: any };
+ // If we're processing a nested map, it may already have been parsed
+ if (typeof value === 'object') {
+ parsed = value;
+ } else {
+ const stringValue = typeof value === 'string' ? value : value.toString();
+ if (!stringValue.length) {
+ return literalNone();
+ }
+ parsed = parseMap(stringValue);
+ }
+ const result = { map: { literals: {} } };
+ Object.keys(parsed)?.forEach((key) => {
+ const helper = getHelperForInput(subtype.type);
+ result.map.literals[key] = helper.toLiteral({ value: parsed[key], typeDefinition: subtype });
+ });
+
+ return result;
+}
+
+function validate({ value, typeDefinition: { subtype } }: InputValidatorParams) {
+ if (!subtype) {
+ throw new Error(t('missingMapSubType'));
+ }
+ if (typeof value !== 'string') {
+ throw new Error(t('valueNotString'));
+ }
+ if (!value.toString().length) {
+ throw new Error(t('valueRequired'));
+ }
+ try {
+ parseMap(value);
+ } catch (e) {
+ throw new Error(t('valueNotParse'));
+ }
+ const obj = parseJSON(value);
+ if (!Object.keys(obj).length || Object.keys(obj).some((key) => !key.trim().length)) {
+ throw new Error(t('valueKeyRequired'));
+ }
+ Object.keys(obj).forEach((key) => {
+ const helper = getHelperForInput(subtype.type);
+ const subValue = obj[key];
+
+ try {
+ helper.validate({ value: subValue, typeDefinition: subtype, name: '', required: false });
+ } catch (e) {
+ throw new Error(t('valueValueInvalid'));
+ }
+ });
+}
+
+export const mapHelper: InputHelper = {
+ fromLiteral,
+ toLiteral,
+ validate,
+};
diff --git a/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/test/inputHelpers.test.ts b/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/test/inputHelpers.test.ts
index a6a2c47bfc..d84d83318b 100644
--- a/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/test/inputHelpers.test.ts
+++ b/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/test/inputHelpers.test.ts
@@ -5,7 +5,9 @@ import { BlobDimensionality, SimpleType } from 'models/Common/types';
import { InputProps, InputType, InputTypeDefinition } from '../../types';
import {
collectionInputTypeDefinition,
+ mapInputTypeDefinition,
nestedCollectionInputTypeDefinition,
+ nestedMapInputTypeDefinition,
primitiveLiteral,
} from '../../__mocks__/utils';
import { literalNone } from '../constants';
@@ -34,6 +36,22 @@ function makeSimpleInput(typeDefinition: InputTypeDefinition, value: any): Input
return { ...baseInputProps, value, typeDefinition };
}
+function makeMapInput(typeDefinition: InputTypeDefinition, value: string): InputProps {
+ return {
+ ...baseInputProps,
+ value,
+ typeDefinition: mapInputTypeDefinition(typeDefinition),
+ };
+}
+
+function makeNestedMapInput(typeDefinition: InputTypeDefinition, value: string): InputProps {
+ return {
+ ...baseInputProps,
+ value,
+ typeDefinition: nestedMapInputTypeDefinition(typeDefinition),
+ };
+}
+
function makeCollectionInput(typeDefinition: InputTypeDefinition, value: string): InputProps {
return {
...baseInputProps,
@@ -66,6 +84,36 @@ describe('literalToInputValue', () => {
expect(literalToInputValue(inputTypes.none, literalNone())).toEqual(undefined));
});
+ describe('Map', () => {
+ literalToInputTestCases.map(([typeDefinition, input, output]) => {
+ it(`should correctly convert map of ${typeDefinition.type}: ${stringifyValue(input)}`, () => {
+ const map: Core.ILiteral = {
+ map: {
+ literals: { a: input },
+ },
+ };
+ const expectedString = stringifyValue({ a: output });
+ const result = literalToInputValue(mapInputTypeDefinition(typeDefinition), map);
+ expect(result).toEqual(expectedString);
+ });
+ });
+
+ it('should return empty for noneType literals', () => {
+ const map: Core.ILiteral = {
+ map: {
+ literals: { a: literalNone() },
+ },
+ };
+
+ const typeDefinition: InputTypeDefinition = {
+ literalType: { simple: Core.SimpleType.NONE },
+ type: InputType.None,
+ };
+
+ expect(literalToInputValue(mapInputTypeDefinition(typeDefinition), map)).toEqual('{}');
+ });
+ });
+
describe('Collections', () => {
literalToInputTestCases.map(([typeDefinition, input, output]) => {
it(`should correctly convert collection of ${typeDefinition.type}: ${stringifyValue(
@@ -128,6 +176,49 @@ describe('inputToLiteral', () => {
});
});
+ describe('Map', () => {
+ literalTestCases.map(([typeDefinition, input, output]) => {
+ let singleMapValue: any;
+ let nestedMapValue: any;
+ if (typeDefinition.type === InputType.Struct) {
+ const objValue = JSON.parse(input);
+ singleMapValue = stringifyValue({ a: objValue });
+ nestedMapValue = stringifyValue({ a: { b: objValue } });
+ } else if (['boolean', 'number'].includes(typeof input)) {
+ singleMapValue = `{"a":${input}}`;
+ nestedMapValue = `{"a":{"b":${input}}}`;
+ } else if (input == null) {
+ singleMapValue = '{"a":null}';
+ nestedMapValue = '{"a":{"b":null}}';
+ } else if (typeof input === 'string' || Long.isLong(input)) {
+ singleMapValue = `{"a":"${input}"}`;
+ nestedMapValue = `{"a":{"b":"${input}"}}`;
+ } else if (input instanceof Date) {
+ const dateString = input.toISOString();
+ singleMapValue = `{"a":"${dateString}"}`;
+ nestedMapValue = `{"a":{"b":"${dateString}"}}`;
+ } else {
+ const stringValue = stringifyValue(input);
+ singleMapValue = `{"a":${stringValue}}`;
+ nestedMapValue = `{"a":{"b":${stringValue}}}`;
+ }
+
+ it(`should correctly convert map of type ${
+ typeDefinition.type
+ }: ${singleMapValue} (${typeof input})`, () => {
+ const result = inputToLiteral(makeMapInput(typeDefinition, singleMapValue));
+ expect(result.map!.literals!.a).toEqual(output);
+ });
+
+ it(`should correctly convert nested map of type ${
+ typeDefinition.type
+ }: ${nestedMapValue} (${typeof input})`, () => {
+ const result = inputToLiteral(makeNestedMapInput(typeDefinition, nestedMapValue));
+ expect(result.map!.literals!.a.map!.literals!.b).toEqual(output);
+ });
+ });
+ });
+
describe('Collections', () => {
literalTestCases.map(([typeDefinition, input, output]) => {
let singleCollectionValue: any;
diff --git a/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/test/testCases.ts b/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/test/testCases.ts
index e2060a9829..569958b53d 100644
--- a/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/test/testCases.ts
+++ b/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/test/testCases.ts
@@ -67,6 +67,10 @@ export const inputTypes: Record = {
literalType: {
mapValueType: { simple: Core.SimpleType.STRING },
},
+ subtype: {
+ literalType: { simple: Core.SimpleType.NONE },
+ type: InputType.None,
+ },
type: InputType.Map,
},
none: {
@@ -112,7 +116,6 @@ export const supportedPrimitives: InputTypeDefinition[] = [
export const unsupportedTypes: InputTypeDefinition[] = [
inputTypes.binary,
inputTypes.error,
- inputTypes.map,
inputTypes.none,
];
diff --git a/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/test/utils.test.ts b/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/test/utils.test.ts
index d6f4129c94..bd3003d388 100644
--- a/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/test/utils.test.ts
+++ b/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/test/utils.test.ts
@@ -1,6 +1,8 @@
import {
collectionInputTypeDefinition,
+ mapInputTypeDefinition,
nestedCollectionInputTypeDefinition,
+ nestedMapInputTypeDefinition,
} from '../../__mocks__/utils';
import { InputTypeDefinition } from '../../types';
import { typeIsSupported } from '../utils';
@@ -25,6 +27,16 @@ describe('Launch/inputHelpers/utils', () => {
nestedCollectionInputTypeDefinition(typeDefinition),
true,
]),
+ ...supportedPrimitives.map((typeDefinition) => [
+ `supports 1-dimension map of type ${typeDefinition.type}`,
+ mapInputTypeDefinition(typeDefinition),
+ true,
+ ]),
+ ...supportedPrimitives.map((typeDefinition) => [
+ `supports 2-dimension map of type: ${typeDefinition.type}`,
+ nestedMapInputTypeDefinition(typeDefinition),
+ true,
+ ]),
...unsupportedTypes.map((typeDefinition) => [
`does NOT support type ${typeDefinition.type}`,
typeDefinition,
@@ -40,6 +52,16 @@ describe('Launch/inputHelpers/utils', () => {
nestedCollectionInputTypeDefinition(typeDefinition),
false,
]),
+ ...unsupportedTypes.map((typeDefinition) => [
+ `does NOT support 1-dimension map of type ${typeDefinition.type}`,
+ mapInputTypeDefinition(typeDefinition),
+ false,
+ ]),
+ ...unsupportedTypes.map((typeDefinition) => [
+ `does NOT support 2-dimension map of type: ${typeDefinition.type}`,
+ nestedMapInputTypeDefinition(typeDefinition),
+ false,
+ ]),
];
cases.forEach(([description, value, expected]) =>
diff --git a/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/utils.ts b/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/utils.ts
index 2d3ee69719..2f989dba3e 100644
--- a/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/utils.ts
+++ b/packages/zapp/console/src/components/Launch/LaunchForm/inputHelpers/utils.ts
@@ -33,7 +33,6 @@ export function typeIsSupported(typeDefinition: InputTypeDefinition): boolean {
switch (type) {
case InputType.Binary:
case InputType.Error:
- case InputType.Map:
case InputType.None:
case InputType.Unknown:
return false;
@@ -48,6 +47,11 @@ export function typeIsSupported(typeDefinition: InputTypeDefinition): boolean {
case InputType.String:
case InputType.Struct:
return true;
+ case InputType.Map:
+ if (!subtype) {
+ return false;
+ }
+ return typeIsSupported(subtype);
case InputType.Collection: {
if (!subtype) {
console.error('Unexpected missing subtype for collection input', typeDefinition);
diff --git a/packages/zapp/console/src/components/Launch/LaunchForm/test/constants.ts b/packages/zapp/console/src/components/Launch/LaunchForm/test/constants.ts
index d86b78d918..16274440ef 100644
--- a/packages/zapp/console/src/components/Launch/LaunchForm/test/constants.ts
+++ b/packages/zapp/console/src/components/Launch/LaunchForm/test/constants.ts
@@ -7,6 +7,7 @@ export const datetimeInputName = 'simpleDatetime';
export const integerInputName = 'simpleInteger';
export const binaryInputName = 'simpleBinary';
export const errorInputName = 'simpleError';
+export const mapInputName = 'simpleMap';
export const iamRoleString = 'arn:aws:iam::12345678:role/defaultrole';
export const k8sServiceAccountString = 'default-service-account';
diff --git a/packages/zapp/console/src/components/Launch/LaunchForm/utils.ts b/packages/zapp/console/src/components/Launch/LaunchForm/utils.ts
index fa59ec600e..05b65e54a5 100644
--- a/packages/zapp/console/src/components/Launch/LaunchForm/utils.ts
+++ b/packages/zapp/console/src/components/Launch/LaunchForm/utils.ts
@@ -20,6 +20,7 @@ import {
InputTypeDefinition,
ParsedInput,
SearchableVersion,
+ InputValue,
} from './types';
/** Creates a unique cache key for an input based on its name and type.
@@ -192,6 +193,14 @@ export function isEnterInputsState(state: BaseInterpretedLaunchState): boolean {
].some(state.matches);
}
+export function toMappedTypeValue(entries: { key: string; value: string }[]): string {
+ const result = {};
+ entries.forEach(
+ ({ key, value }) => (result[key] = result[key] === undefined ? value : result[key]),
+ );
+ return JSON.stringify(result);
+}
+
export function literalsToLiteralValueMap(
literals: {
[k: string]: Core.ILiteral;
diff --git a/packages/zapp/console/src/components/common/strings.ts b/packages/zapp/console/src/components/common/strings.ts
index 13e17f4559..97b6cad043 100644
--- a/packages/zapp/console/src/components/common/strings.ts
+++ b/packages/zapp/console/src/components/common/strings.ts
@@ -12,6 +12,16 @@ const str = {
securityContextHeader: 'Security Context',
serviceAccountHeader: 'Service Account',
noMatchingResults: 'No matching results',
+ missingMapSubType: 'Unexpected missing subtype for map',
+ mapMissingMapProperty: 'Map literal missing `map` property',
+ mapMissingMapLiteralsProperty: 'Map literal missing `map.literals` property',
+ mapLiternalNotObject: 'Map literal is not an object',
+ mapLiternalObjectEmpty: 'Map literal object is empty',
+ valueNotString: 'Value is not a string',
+ valueRequired: 'Value is required',
+ valueNotParse: 'Value did not parse to an object',
+ valueKeyRequired: "Value's key is required",
+ valueValueInvalid: "Value's value is invalid",
};
export { patternKey } from '@flyteconsole/locale';
diff --git a/yarn.lock b/yarn.lock
index 66316da0d1..e6813f00a8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1647,6 +1647,21 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
+"@eslint/eslintrc@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f"
+ integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^9.3.2"
+ globals "^13.15.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
"@flyteorg/flyteidl@1.1.4":
version "1.1.4"
resolved "https://registry.yarnpkg.com/@flyteorg/flyteidl/-/flyteidl-1.1.4.tgz#7a02d80e22c623817b6061f1f5e88ec243041cf1"
@@ -5078,6 +5093,11 @@ acorn-jsx@^5.3.1:
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
acorn-walk@^7.1.1, acorn-walk@^7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
@@ -5093,7 +5113,7 @@ acorn@^7.1.1, acorn@^7.4.1:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
-acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0:
+acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0, acorn@^8.7.1:
version "8.7.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
@@ -6041,6 +6061,15 @@ bl@^4.0.3:
inherits "^2.0.4"
readable-stream "^3.4.0"
+bl@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
+ integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
+ dependencies:
+ buffer "^5.5.0"
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+
bluebird@^3.3.5, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
@@ -6717,7 +6746,7 @@ chalk@^4.0.0, chalk@^4.1.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-chalk@^4.1.2:
+chalk@^4.1.1, chalk@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -6725,7 +6754,7 @@ chalk@^4.1.2:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
-chalk@^5.0.0:
+chalk@^5.0.0, chalk@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.1.tgz#ca57d71e82bb534a296df63bbacc4a1c22b2a4b6"
integrity sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==
@@ -6750,6 +6779,11 @@ character-reference-invalid@^1.0.0:
resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
+chardet@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
+ integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+
chart.js@^3.6.2:
version "3.6.2"
resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-3.6.2.tgz#47342c551f688ffdda2cd53b534cb7e461ecec33"
@@ -6952,6 +6986,18 @@ cli-cursor@^2.0.0, cli-cursor@^2.1.0:
dependencies:
restore-cursor "^2.0.0"
+cli-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+ integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+ dependencies:
+ restore-cursor "^3.1.0"
+
+cli-spinners@^2.5.0:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d"
+ integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==
+
cli-table3@^0.5.0, cli-table3@^0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202"
@@ -6988,6 +7034,11 @@ cli-truncate@^0.2.1:
slice-ansi "0.0.4"
string-width "^1.0.1"
+cli-width@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
+ integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
+
cliui@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
@@ -9331,6 +9382,47 @@ eslint@^8.11.0:
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
+eslint@^8.15.0:
+ version "8.18.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.18.0.tgz#78d565d16c993d0b73968c523c0446b13da784fd"
+ integrity sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==
+ dependencies:
+ "@eslint/eslintrc" "^1.3.0"
+ "@humanwhocodes/config-array" "^0.9.2"
+ ajv "^6.10.0"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
+ doctrine "^3.0.0"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^7.1.1"
+ eslint-utils "^3.0.0"
+ eslint-visitor-keys "^3.3.0"
+ espree "^9.3.2"
+ esquery "^1.4.0"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
+ functional-red-black-tree "^1.0.1"
+ glob-parent "^6.0.1"
+ globals "^13.15.0"
+ ignore "^5.2.0"
+ import-fresh "^3.0.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ js-yaml "^4.1.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.4.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
+ natural-compare "^1.4.0"
+ optionator "^0.9.1"
+ regexpp "^3.2.0"
+ strip-ansi "^6.0.1"
+ strip-json-comments "^3.1.0"
+ text-table "^0.2.0"
+ v8-compile-cache "^2.0.3"
+
espree@^9.3.1:
version "9.3.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd"
@@ -9340,6 +9432,15 @@ espree@^9.3.1:
acorn-jsx "^5.3.1"
eslint-visitor-keys "^3.3.0"
+espree@^9.3.2:
+ version "9.3.2"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596"
+ integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==
+ dependencies:
+ acorn "^8.7.1"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.3.0"
+
esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
@@ -9629,6 +9730,15 @@ extend@^3.0.0, extend@~3.0.2:
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+external-editor@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
+ integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
+ dependencies:
+ chardet "^0.7.0"
+ iconv-lite "^0.4.24"
+ tmp "^0.0.33"
+
extglob@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
@@ -10609,6 +10719,13 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+globals@^13.15.0:
+ version "13.15.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac"
+ integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==
+ dependencies:
+ type-fest "^0.20.2"
+
globals@^13.6.0, globals@^13.9.0:
version "13.13.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b"
@@ -11305,7 +11422,7 @@ hyphenate-style-name@^1.0.3:
resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d"
integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==
-iconv-lite@0.4, iconv-lite@0.4.24:
+iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -11532,6 +11649,27 @@ inline-style-parser@0.1.1:
resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1"
integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==
+inquirer@^8.2.4:
+ version "8.2.4"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4"
+ integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==
+ dependencies:
+ ansi-escapes "^4.2.1"
+ chalk "^4.1.1"
+ cli-cursor "^3.1.0"
+ cli-width "^3.0.0"
+ external-editor "^3.0.3"
+ figures "^3.0.0"
+ lodash "^4.17.21"
+ mute-stream "0.0.8"
+ ora "^5.4.1"
+ run-async "^2.4.0"
+ rxjs "^7.5.5"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+ through "^2.3.6"
+ wrap-ansi "^7.0.0"
+
internal-slot@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
@@ -11898,6 +12036,11 @@ is-installed-globally@^0.1.0:
global-dirs "^0.1.0"
is-path-inside "^1.0.0"
+is-interactive@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
+ integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
+
is-lambda@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5"
@@ -12106,6 +12249,11 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0:
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+is-unicode-supported@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
+ integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
is-weakref@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
@@ -13428,7 +13576,7 @@ listr-verbose-renderer@^0.5.0:
date-fns "^1.27.2"
figures "^2.0.0"
-listr@^0.14.1:
+listr@^0.14.1, listr@^0.14.3:
version "0.14.3"
resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586"
integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==
@@ -13702,6 +13850,14 @@ log-symbols@^2.2.0:
dependencies:
chalk "^2.0.1"
+log-symbols@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
+ integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
+ dependencies:
+ chalk "^4.1.0"
+ is-unicode-supported "^0.1.0"
+
log-update@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708"
@@ -14564,7 +14720,7 @@ multicast-dns@^7.2.4:
dns-packet "^5.2.2"
thunky "^1.0.2"
-mute-stream@~0.0.4:
+mute-stream@0.0.8, mute-stream@~0.0.4:
version "0.0.8"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
@@ -14611,6 +14767,11 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+ncp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
+ integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==
+
negotiator@0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
@@ -15573,6 +15734,21 @@ optionator@^0.9.1:
type-check "^0.4.0"
word-wrap "^1.2.3"
+ora@^5.4.1:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18"
+ integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==
+ dependencies:
+ bl "^4.1.0"
+ chalk "^4.1.0"
+ cli-cursor "^3.1.0"
+ cli-spinners "^2.5.0"
+ is-interactive "^1.0.0"
+ is-unicode-supported "^0.1.0"
+ log-symbols "^4.1.0"
+ strip-ansi "^6.0.0"
+ wcwidth "^1.0.1"
+
os-browserify@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
@@ -15592,7 +15768,7 @@ os-locale@^2.0.0:
lcid "^1.0.0"
mem "^1.1.0"
-os-tmpdir@^1.0.0:
+os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
@@ -17810,6 +17986,14 @@ restore-cursor@^2.0.0:
onetime "^2.0.0"
signal-exit "^3.0.2"
+restore-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+ integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+ dependencies:
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+
ret@~0.1.10:
version "0.1.15"
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
@@ -17869,6 +18053,11 @@ rsvp@^4.8.4:
resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
+run-async@^2.4.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
+ integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+
run-parallel@^1.1.9:
version "1.1.10"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef"
@@ -17893,6 +18082,13 @@ rxjs@^6.3.3:
dependencies:
tslib "^1.9.0"
+rxjs@^7.5.5:
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f"
+ integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==
+ dependencies:
+ tslib "^2.1.0"
+
safe-buffer@5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
@@ -19361,7 +19557,7 @@ through2@^4.0.0, through2@^4.0.2:
dependencies:
readable-stream "3"
-through@2, "through@>=2.2.7 <3":
+through@2, "through@>=2.2.7 <3", through@^2.3.6:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
@@ -19408,6 +19604,13 @@ tinycolor2@^1.1.2, tinycolor2@^1.4.1, tinycolor2@^1.4.2:
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"
integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==
+tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
tmpl@1.0.x:
version "1.0.5"
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
@@ -19618,6 +19821,11 @@ tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.3.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
+tslib@^2.1.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
+ integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
+
tsutils@^3.21.0:
version "3.21.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
@@ -20352,7 +20560,7 @@ wbuf@^1.1.0, wbuf@^1.7.3:
dependencies:
minimalistic-assert "^1.0.0"
-wcwidth@^1.0.0:
+wcwidth@^1.0.0, wcwidth@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=