@backstage/plugin-scaffolder 1.19.4-next.1 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,47 @@
1
1
  # @backstage/plugin-scaffolder
2
2
 
3
+ ## 1.20.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 4268696: `MultiEntityPicker` uses `EntityDisplayName` instead of `humanizeEntityRef` to display entity.
8
+
9
+ ### Patch Changes
10
+
11
+ - 9156654: Capturing more event clicks for scaffolder
12
+ - 131e5cb: Fix broken links in README.
13
+ - 0040ec2: Updated dependency `@rjsf/utils` to `5.18.2`.
14
+ Updated dependency `@rjsf/core` to `5.18.2`.
15
+ Updated dependency `@rjsf/material-ui` to `5.18.2`.
16
+ Updated dependency `@rjsf/validator-ajv8` to `5.18.2`.
17
+ - 762141c: Fixed a bug where the `MultiEntityPicker` was not able to be set as required
18
+ - Updated dependencies
19
+ - @backstage/plugin-scaffolder-common@1.5.2
20
+ - @backstage/plugin-scaffolder-react@1.8.5
21
+ - @backstage/core-compat-api@0.2.5
22
+ - @backstage/core-components@0.14.7
23
+ - @backstage/catalog-model@1.5.0
24
+ - @backstage/plugin-catalog-react@1.12.0
25
+ - @backstage/integration@1.11.0
26
+ - @backstage/catalog-client@1.6.5
27
+ - @backstage/frontend-plugin-api@0.6.5
28
+ - @backstage/integration-react@1.1.27
29
+ - @backstage/plugin-catalog-common@1.0.23
30
+
31
+ ## 1.19.4-next.2
32
+
33
+ ### Patch Changes
34
+
35
+ - 762141c: Fixed a bug where the `MultiEntityPicker` was not able to be set as required
36
+ - Updated dependencies
37
+ - @backstage/plugin-catalog-react@1.12.0-next.2
38
+ - @backstage/core-components@0.14.7-next.2
39
+ - @backstage/integration@1.11.0-next.0
40
+ - @backstage/core-compat-api@0.2.5-next.1
41
+ - @backstage/frontend-plugin-api@0.6.5-next.1
42
+ - @backstage/plugin-scaffolder-react@1.8.5-next.2
43
+ - @backstage/integration-react@1.1.27-next.0
44
+
3
45
  ## 1.19.4-next.1
4
46
 
5
47
  ### Patch Changes
package/README.md CHANGED
@@ -1,7 +1,6 @@
1
1
  # Scaffolder Frontend
2
2
 
3
- This is the React frontend for the default Backstage [software
4
- templates](https://backstage.io/docs/features/software-templates/).
3
+ This is the React frontend for the default Backstage [software templates](https://backstage.io/docs/features/software-templates/).
5
4
  This package supplies interfaces related to showing available templates in the
6
5
  Backstage catalog and the workflow to create software using those templates.
7
6
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-scaffolder",
3
- "version": "1.19.4-next.1",
3
+ "version": "1.20.0",
4
4
  "main": "../dist/alpha.esm.js",
5
5
  "module": "../dist/alpha.esm.js",
6
6
  "types": "../dist/alpha.d.ts"
@@ -1,7 +1,7 @@
1
1
  import { CATALOG_FILTER_EXISTS } from '@backstage/catalog-client';
2
- import { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';
2
+ import { stringifyEntityRef, parseEntityRef } from '@backstage/catalog-model';
3
3
  import { useApi } from '@backstage/core-plugin-api';
4
- import { catalogApiRef, humanizeEntityRef } from '@backstage/plugin-catalog-react';
4
+ import { catalogApiRef, entityPresentationApiRef, EntityDisplayName } from '@backstage/plugin-catalog-react';
5
5
  import TextField from '@material-ui/core/TextField';
6
6
  import FormControl from '@material-ui/core/FormControl';
7
7
  import Autocomplete from '@material-ui/lab/Autocomplete';
@@ -24,29 +24,22 @@ const MultiEntityPicker = (props) => {
24
24
  const defaultKind = (_a = uiSchema["ui:options"]) == null ? void 0 : _a.defaultKind;
25
25
  const defaultNamespace = ((_b = uiSchema["ui:options"]) == null ? void 0 : _b.defaultNamespace) || void 0;
26
26
  const catalogApi = useApi(catalogApiRef);
27
+ const entityPresentationApi = useApi(entityPresentationApiRef);
27
28
  const { value: entities, loading } = useAsync(async () => {
28
29
  const { items } = await catalogApi.getEntities(
29
30
  catalogFilter ? { filter: catalogFilter } : void 0
30
31
  );
31
- return items;
32
+ const entityRefToPresentation = new Map(
33
+ await Promise.all(
34
+ items.map(async (item) => {
35
+ const presentation = await entityPresentationApi.forEntity(item).promise;
36
+ return [stringifyEntityRef(item), presentation];
37
+ })
38
+ )
39
+ );
40
+ return { entities: items, entityRefToPresentation };
32
41
  });
33
42
  const allowArbitraryValues = (_d = (_c = uiSchema["ui:options"]) == null ? void 0 : _c.allowArbitraryValues) != null ? _d : true;
34
- const getLabel = useCallback(
35
- (ref) => {
36
- try {
37
- return humanizeEntityRef(
38
- parseEntityRef(ref, { defaultKind, defaultNamespace }),
39
- {
40
- defaultKind,
41
- defaultNamespace
42
- }
43
- );
44
- } catch (err) {
45
- return ref;
46
- }
47
- },
48
- [defaultKind, defaultNamespace]
49
- );
50
43
  const onSelect = useCallback(
51
44
  (_, refs, reason) => {
52
45
  const values = refs.map((ref) => {
@@ -75,8 +68,9 @@ const MultiEntityPicker = (props) => {
75
68
  [onChange, formData, defaultKind, defaultNamespace, allowArbitraryValues]
76
69
  );
77
70
  useEffect(() => {
78
- if ((entities == null ? void 0 : entities.length) === 1) {
79
- onChange([stringifyEntityRef(entities[0])]);
71
+ var _a2;
72
+ if (((_a2 = entities == null ? void 0 : entities.entities) == null ? void 0 : _a2.length) === 1) {
73
+ onChange([stringifyEntityRef(entities == null ? void 0 : entities.entities[0])]);
80
74
  }
81
75
  }, [entities, onChange]);
82
76
  return /* @__PURE__ */ React.createElement(
@@ -91,22 +85,19 @@ const MultiEntityPicker = (props) => {
91
85
  {
92
86
  multiple: true,
93
87
  filterSelectedOptions: true,
94
- disabled: (entities == null ? void 0 : entities.length) === 1,
88
+ disabled: ((_e = entities == null ? void 0 : entities.entities) == null ? void 0 : _e.length) === 1,
95
89
  id: idSchema == null ? void 0 : idSchema.$id,
96
- value: (
97
- // Since free solo can be enabled, attempt to parse as a full entity ref first, then fall
98
- // back to the given value.
99
- (_e = entities == null ? void 0 : entities.filter(
100
- (e) => formData && formData.includes(stringifyEntityRef(e))
101
- )) != null ? _e : allowArbitraryValues && formData ? formData.map(getLabel) : []
102
- ),
103
90
  loading,
104
91
  onChange: onSelect,
105
- options: entities || [],
106
- getOptionLabel: (option) => (
107
- // option can be a string due to freeSolo.
108
- typeof option === "string" ? option : humanizeEntityRef(option, { defaultKind, defaultNamespace })
109
- ),
92
+ options: (entities == null ? void 0 : entities.entities) || [],
93
+ renderOption: (option) => /* @__PURE__ */ React.createElement(EntityDisplayName, { entityRef: option }),
94
+ getOptionLabel: (option) => {
95
+ var _a2;
96
+ return (
97
+ // option can be a string due to freeSolo.
98
+ typeof option === "string" ? option : (_a2 = entities == null ? void 0 : entities.entityRefToPresentation.get(stringifyEntityRef(option))) == null ? void 0 : _a2.entityRef
99
+ );
100
+ },
110
101
  autoSelect: true,
111
102
  freeSolo: allowArbitraryValues,
112
103
  renderInput: (params) => /* @__PURE__ */ React.createElement(
@@ -116,10 +107,16 @@ const MultiEntityPicker = (props) => {
116
107
  label: title,
117
108
  margin: "dense",
118
109
  helperText: description,
119
- FormHelperTextProps: { margin: "dense", style: { marginLeft: 0 } },
110
+ FormHelperTextProps: {
111
+ margin: "dense",
112
+ style: { marginLeft: 0 }
113
+ },
120
114
  variant: "outlined",
121
115
  required,
122
- InputProps: params.InputProps
116
+ InputProps: {
117
+ ...params.InputProps,
118
+ required: formData.length === 0 && required
119
+ }
123
120
  }
124
121
  )
125
122
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MultiEntityPicker.esm.js","sources":["../../../../src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n type EntityFilterQuery,\n CATALOG_FILTER_EXISTS,\n} from '@backstage/catalog-client';\nimport {\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n humanizeEntityRef,\n} from '@backstage/plugin-catalog-react';\nimport TextField from '@material-ui/core/TextField';\nimport FormControl from '@material-ui/core/FormControl';\nimport Autocomplete, {\n AutocompleteChangeReason,\n} from '@material-ui/lab/Autocomplete';\nimport React, { useCallback, useEffect } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { FieldValidation } from '@rjsf/utils';\nimport {\n MultiEntityPickerFilterQueryValue,\n MultiEntityPickerProps,\n MultiEntityPickerUiOptions,\n MultiEntityPickerFilterQuery,\n} from './schema';\n\nexport { MultiEntityPickerSchema } from './schema';\n\n/**\n * The underlying component that is rendered in the form for the `MultiEntityPicker`\n * field extension.\n */\nexport const MultiEntityPicker = (props: MultiEntityPickerProps) => {\n const {\n onChange,\n schema: { title = 'Entity', description = 'An entity from the catalog' },\n required,\n uiSchema,\n rawErrors,\n formData,\n idSchema,\n } = props;\n const catalogFilter = buildCatalogFilter(uiSchema);\n const defaultKind = uiSchema['ui:options']?.defaultKind;\n const defaultNamespace =\n uiSchema['ui:options']?.defaultNamespace || undefined;\n\n const catalogApi = useApi(catalogApiRef);\n\n const { value: entities, loading } = useAsync(async () => {\n const { items } = await catalogApi.getEntities(\n catalogFilter ? { filter: catalogFilter } : undefined,\n );\n return items;\n });\n const allowArbitraryValues =\n uiSchema['ui:options']?.allowArbitraryValues ?? true;\n\n const getLabel = useCallback(\n (ref: string) => {\n try {\n return humanizeEntityRef(\n parseEntityRef(ref, { defaultKind, defaultNamespace }),\n {\n defaultKind,\n defaultNamespace,\n },\n );\n } catch (err) {\n return ref;\n }\n },\n [defaultKind, defaultNamespace],\n );\n\n const onSelect = useCallback(\n (_: any, refs: (string | Entity)[], reason: AutocompleteChangeReason) => {\n const values = refs\n .map(ref => {\n if (typeof ref !== 'string') {\n // if ref does not exist: pass 'undefined' to trigger validation for required value\n return ref ? stringifyEntityRef(ref as Entity) : undefined;\n }\n if (reason === 'blur' || reason === 'create-option') {\n // Add in default namespace, etc.\n let entityRef = ref;\n try {\n // Attempt to parse the entity ref into it's full form.\n entityRef = stringifyEntityRef(\n parseEntityRef(ref as string, {\n defaultKind,\n defaultNamespace,\n }),\n );\n } catch (err) {\n // If the passed in value isn't an entity ref, do nothing.\n }\n\n // We need to check against formData here as that's the previous value for this field.\n if (formData.includes(ref) || allowArbitraryValues) {\n return entityRef;\n }\n }\n\n return undefined;\n })\n .filter(ref => ref !== undefined) as string[];\n\n onChange(values);\n },\n [onChange, formData, defaultKind, defaultNamespace, allowArbitraryValues],\n );\n\n useEffect(() => {\n if (entities?.length === 1) {\n onChange([stringifyEntityRef(entities[0])]);\n }\n }, [entities, onChange]);\n\n return (\n <FormControl\n margin=\"normal\"\n required={required}\n error={rawErrors?.length > 0 && !formData}\n >\n <Autocomplete\n multiple\n filterSelectedOptions\n disabled={entities?.length === 1}\n id={idSchema?.$id}\n value={\n // Since free solo can be enabled, attempt to parse as a full entity ref first, then fall\n // back to the given value.\n entities?.filter(\n e => formData && formData.includes(stringifyEntityRef(e)),\n ) ?? (allowArbitraryValues && formData ? formData.map(getLabel) : [])\n }\n loading={loading}\n onChange={onSelect}\n options={entities || []}\n getOptionLabel={option =>\n // option can be a string due to freeSolo.\n typeof option === 'string'\n ? option\n : humanizeEntityRef(option, { defaultKind, defaultNamespace })!\n }\n autoSelect\n freeSolo={allowArbitraryValues}\n renderInput={params => (\n <TextField\n {...params}\n label={title}\n margin=\"dense\"\n helperText={description}\n FormHelperTextProps={{ margin: 'dense', style: { marginLeft: 0 } }}\n variant=\"outlined\"\n required={required}\n InputProps={params.InputProps}\n />\n )}\n />\n </FormControl>\n );\n};\n\nexport const validateMultiEntityPickerValidation = (\n values: string[],\n validation: FieldValidation,\n) => {\n values.forEach(value => {\n try {\n parseEntityRef(value);\n } catch {\n validation.addError(`${value} is not a valid entity ref`);\n }\n });\n};\n\n/**\n * Converts a special `{exists: true}` value to the `CATALOG_FILTER_EXISTS` symbol.\n *\n * @param value - The value to convert.\n * @returns The converted value.\n */\nfunction convertOpsValues(\n value: Exclude<MultiEntityPickerFilterQueryValue, Array<any>>,\n): string | symbol {\n if (typeof value === 'object' && value.exists) {\n return CATALOG_FILTER_EXISTS;\n }\n return value?.toString();\n}\n\n/**\n * Converts schema filters to entity filter query, replacing `{exists:true}` values\n * with the constant `CATALOG_FILTER_EXISTS`.\n *\n * @param schemaFilters - An object containing schema filters with keys as filter names\n * and values as filter values.\n * @returns An object with the same keys as the input object, but with `{exists:true}` values\n * transformed to `CATALOG_FILTER_EXISTS` symbol.\n */\nfunction convertSchemaFiltersToQuery(\n schemaFilters: MultiEntityPickerFilterQuery,\n): Exclude<EntityFilterQuery, Array<any>> {\n const query: EntityFilterQuery = {};\n\n for (const [key, value] of Object.entries(schemaFilters)) {\n if (Array.isArray(value)) {\n query[key] = value;\n } else {\n query[key] = convertOpsValues(value);\n }\n }\n\n return query;\n}\n\n/**\n * Builds an `EntityFilterQuery` based on the `uiSchema` passed in.\n * If `catalogFilter` is specified in the `uiSchema`, it is converted to a `EntityFilterQuery`.\n *\n * @param uiSchema The `uiSchema` of an `EntityPicker` component.\n * @returns An `EntityFilterQuery` based on the `uiSchema`, or `undefined` if `catalogFilter` is not specified in the `uiSchema`.\n */\nfunction buildCatalogFilter(\n uiSchema: MultiEntityPickerProps['uiSchema'],\n): EntityFilterQuery | undefined {\n const catalogFilter: MultiEntityPickerUiOptions['catalogFilter'] | undefined =\n uiSchema['ui:options']?.catalogFilter;\n\n if (!catalogFilter) {\n return undefined;\n }\n\n if (Array.isArray(catalogFilter)) {\n return catalogFilter.map(convertSchemaFiltersToQuery);\n }\n\n return convertSchemaFiltersToQuery(catalogFilter);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MultiEntityPicker.esm.js","sources":["../../../../src/components/fields/MultiEntityPicker/MultiEntityPicker.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n type EntityFilterQuery,\n CATALOG_FILTER_EXISTS,\n} from '@backstage/catalog-client';\nimport {\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n entityPresentationApiRef,\n EntityDisplayName,\n EntityRefPresentationSnapshot,\n} from '@backstage/plugin-catalog-react';\nimport TextField from '@material-ui/core/TextField';\nimport FormControl from '@material-ui/core/FormControl';\nimport Autocomplete, {\n AutocompleteChangeReason,\n} from '@material-ui/lab/Autocomplete';\nimport React, { useCallback, useEffect } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { FieldValidation } from '@rjsf/utils';\nimport {\n MultiEntityPickerFilterQueryValue,\n MultiEntityPickerProps,\n MultiEntityPickerUiOptions,\n MultiEntityPickerFilterQuery,\n} from './schema';\n\nexport { MultiEntityPickerSchema } from './schema';\n\n/**\n * The underlying component that is rendered in the form for the `MultiEntityPicker`\n * field extension.\n */\nexport const MultiEntityPicker = (props: MultiEntityPickerProps) => {\n const {\n onChange,\n schema: { title = 'Entity', description = 'An entity from the catalog' },\n required,\n uiSchema,\n rawErrors,\n formData,\n idSchema,\n } = props;\n const catalogFilter = buildCatalogFilter(uiSchema);\n const defaultKind = uiSchema['ui:options']?.defaultKind;\n const defaultNamespace =\n uiSchema['ui:options']?.defaultNamespace || undefined;\n\n const catalogApi = useApi(catalogApiRef);\n const entityPresentationApi = useApi(entityPresentationApiRef);\n const { value: entities, loading } = useAsync(async () => {\n const { items } = await catalogApi.getEntities(\n catalogFilter ? { filter: catalogFilter } : undefined,\n );\n const entityRefToPresentation = new Map<\n string,\n EntityRefPresentationSnapshot\n >(\n await Promise.all(\n items.map(async item => {\n const presentation = await entityPresentationApi.forEntity(item)\n .promise;\n return [stringifyEntityRef(item), presentation] as [\n string,\n EntityRefPresentationSnapshot,\n ];\n }),\n ),\n );\n return { entities: items, entityRefToPresentation };\n });\n const allowArbitraryValues =\n uiSchema['ui:options']?.allowArbitraryValues ?? true;\n\n const onSelect = useCallback(\n (_: any, refs: (string | Entity)[], reason: AutocompleteChangeReason) => {\n const values = refs\n .map(ref => {\n if (typeof ref !== 'string') {\n // if ref does not exist: pass 'undefined' to trigger validation for required value\n return ref ? stringifyEntityRef(ref as Entity) : undefined;\n }\n if (reason === 'blur' || reason === 'create-option') {\n // Add in default namespace, etc.\n let entityRef = ref;\n try {\n // Attempt to parse the entity ref into it's full form.\n entityRef = stringifyEntityRef(\n parseEntityRef(ref as string, {\n defaultKind,\n defaultNamespace,\n }),\n );\n } catch (err) {\n // If the passed in value isn't an entity ref, do nothing.\n }\n\n // We need to check against formData here as that's the previous value for this field.\n if (formData.includes(ref) || allowArbitraryValues) {\n return entityRef;\n }\n }\n\n return undefined;\n })\n .filter(ref => ref !== undefined) as string[];\n\n onChange(values);\n },\n [onChange, formData, defaultKind, defaultNamespace, allowArbitraryValues],\n );\n\n useEffect(() => {\n if (entities?.entities?.length === 1) {\n onChange([stringifyEntityRef(entities?.entities[0])]);\n }\n }, [entities, onChange]);\n\n return (\n <FormControl\n margin=\"normal\"\n required={required}\n error={rawErrors?.length > 0 && !formData}\n >\n <Autocomplete\n multiple\n filterSelectedOptions\n disabled={entities?.entities?.length === 1}\n id={idSchema?.$id}\n loading={loading}\n onChange={onSelect}\n options={entities?.entities || []}\n renderOption={option => <EntityDisplayName entityRef={option} />}\n getOptionLabel={option =>\n // option can be a string due to freeSolo.\n typeof option === 'string'\n ? option\n : entities?.entityRefToPresentation.get(stringifyEntityRef(option))\n ?.entityRef!\n }\n autoSelect\n freeSolo={allowArbitraryValues}\n renderInput={params => (\n <TextField\n {...params}\n label={title}\n margin=\"dense\"\n helperText={description}\n FormHelperTextProps={{\n margin: 'dense',\n style: { marginLeft: 0 },\n }}\n variant=\"outlined\"\n required={required}\n InputProps={{\n ...params.InputProps,\n required: formData.length === 0 && required,\n }}\n />\n )}\n />\n </FormControl>\n );\n};\n\nexport const validateMultiEntityPickerValidation = (\n values: string[],\n validation: FieldValidation,\n) => {\n values.forEach(value => {\n try {\n parseEntityRef(value);\n } catch {\n validation.addError(`${value} is not a valid entity ref`);\n }\n });\n};\n\n/**\n * Converts a special `{exists: true}` value to the `CATALOG_FILTER_EXISTS` symbol.\n *\n * @param value - The value to convert.\n * @returns The converted value.\n */\nfunction convertOpsValues(\n value: Exclude<MultiEntityPickerFilterQueryValue, Array<any>>,\n): string | symbol {\n if (typeof value === 'object' && value.exists) {\n return CATALOG_FILTER_EXISTS;\n }\n return value?.toString();\n}\n\n/**\n * Converts schema filters to entity filter query, replacing `{exists:true}` values\n * with the constant `CATALOG_FILTER_EXISTS`.\n *\n * @param schemaFilters - An object containing schema filters with keys as filter names\n * and values as filter values.\n * @returns An object with the same keys as the input object, but with `{exists:true}` values\n * transformed to `CATALOG_FILTER_EXISTS` symbol.\n */\nfunction convertSchemaFiltersToQuery(\n schemaFilters: MultiEntityPickerFilterQuery,\n): Exclude<EntityFilterQuery, Array<any>> {\n const query: EntityFilterQuery = {};\n\n for (const [key, value] of Object.entries(schemaFilters)) {\n if (Array.isArray(value)) {\n query[key] = value;\n } else {\n query[key] = convertOpsValues(value);\n }\n }\n\n return query;\n}\n\n/**\n * Builds an `EntityFilterQuery` based on the `uiSchema` passed in.\n * If `catalogFilter` is specified in the `uiSchema`, it is converted to a `EntityFilterQuery`.\n *\n * @param uiSchema The `uiSchema` of an `EntityPicker` component.\n * @returns An `EntityFilterQuery` based on the `uiSchema`, or `undefined` if `catalogFilter` is not specified in the `uiSchema`.\n */\nfunction buildCatalogFilter(\n uiSchema: MultiEntityPickerProps['uiSchema'],\n): EntityFilterQuery | undefined {\n const catalogFilter: MultiEntityPickerUiOptions['catalogFilter'] | undefined =\n uiSchema['ui:options']?.catalogFilter;\n\n if (!catalogFilter) {\n return undefined;\n }\n\n if (Array.isArray(catalogFilter)) {\n return catalogFilter.map(convertSchemaFiltersToQuery);\n }\n\n return convertSchemaFiltersToQuery(catalogFilter);\n}\n"],"names":["_a"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -110,10 +110,10 @@ declare const scaffolderPlugin: _backstage_core_plugin_api.BackstagePlugin<{
110
110
  * @public
111
111
  */
112
112
  declare const EntityPickerFieldExtension: _backstage_plugin_scaffolder_react.FieldExtensionComponent<string, {
113
- allowedKinds?: string[] | undefined;
114
113
  defaultKind?: string | undefined;
115
- allowArbitraryValues?: boolean | undefined;
116
114
  defaultNamespace?: string | false | undefined;
115
+ allowedKinds?: string[] | undefined;
116
+ allowArbitraryValues?: boolean | undefined;
117
117
  catalogFilter?: Record<string, string | string[] | {
118
118
  exists?: boolean | undefined;
119
119
  }> | Record<string, string | string[] | {
@@ -133,8 +133,8 @@ declare const EntityNamePickerFieldExtension: _backstage_plugin_scaffolder_react
133
133
  */
134
134
  declare const MultiEntityPickerFieldExtension: _backstage_plugin_scaffolder_react.FieldExtensionComponent<string[], {
135
135
  defaultKind?: string | undefined;
136
- allowArbitraryValues?: boolean | undefined;
137
136
  defaultNamespace?: string | false | undefined;
137
+ allowArbitraryValues?: boolean | undefined;
138
138
  catalogFilter?: Record<string, string | string[] | {
139
139
  exists?: boolean | undefined;
140
140
  }> | Record<string, string | string[] | {
@@ -156,12 +156,12 @@ declare const RepoUrlPickerFieldExtension: _backstage_plugin_scaffolder_react.Fi
156
156
  requestUserCredentials?: {
157
157
  secretsKey: string;
158
158
  additionalScopes?: {
159
- gitea?: string[] | undefined;
160
- gerrit?: string[] | undefined;
159
+ azure?: string[] | undefined;
161
160
  github?: string[] | undefined;
162
161
  gitlab?: string[] | undefined;
163
162
  bitbucket?: string[] | undefined;
164
- azure?: string[] | undefined;
163
+ gerrit?: string[] | undefined;
164
+ gitea?: string[] | undefined;
165
165
  } | undefined;
166
166
  } | undefined;
167
167
  }>;
@@ -171,9 +171,9 @@ declare const RepoUrlPickerFieldExtension: _backstage_plugin_scaffolder_react.Fi
171
171
  * @public
172
172
  */
173
173
  declare const OwnerPickerFieldExtension: _backstage_plugin_scaffolder_react.FieldExtensionComponent<string, {
174
+ defaultNamespace?: string | false | undefined;
174
175
  allowedKinds?: string[] | undefined;
175
176
  allowArbitraryValues?: boolean | undefined;
176
- defaultNamespace?: string | false | undefined;
177
177
  catalogFilter?: Record<string, string | string[] | {
178
178
  exists?: boolean | undefined;
179
179
  }> | Record<string, string | string[] | {
@@ -201,10 +201,10 @@ declare const ScaffolderPage: (props: React.PropsWithChildren<RouterProps>) => R
201
201
  * @public
202
202
  */
203
203
  declare const OwnedEntityPickerFieldExtension: _backstage_plugin_scaffolder_react.FieldExtensionComponent<string, {
204
- allowedKinds?: string[] | undefined;
205
204
  defaultKind?: string | undefined;
206
- allowArbitraryValues?: boolean | undefined;
207
205
  defaultNamespace?: string | false | undefined;
206
+ allowedKinds?: string[] | undefined;
207
+ allowArbitraryValues?: boolean | undefined;
208
208
  catalogFilter?: Record<string, string | string[] | {
209
209
  exists?: boolean | undefined;
210
210
  }> | Record<string, string | string[] | {
@@ -216,9 +216,9 @@ declare const OwnedEntityPickerFieldExtension: _backstage_plugin_scaffolder_reac
216
216
  * @public
217
217
  */
218
218
  declare const EntityTagsPickerFieldExtension: _backstage_plugin_scaffolder_react.FieldExtensionComponent<string[], {
219
- kinds?: string[] | undefined;
220
- showCounts?: boolean | undefined;
221
219
  helperText?: string | undefined;
220
+ showCounts?: boolean | undefined;
221
+ kinds?: string[] | undefined;
222
222
  }>;
223
223
 
224
224
  /**
@@ -242,10 +242,10 @@ declare function makeFieldSchemaFromZod<TReturnSchema extends z.ZodType, TUiOpti
242
242
  * @public
243
243
  */
244
244
  declare const EntityPickerFieldSchema: FieldSchema<string, {
245
- allowedKinds?: string[] | undefined;
246
245
  defaultKind?: string | undefined;
247
- allowArbitraryValues?: boolean | undefined;
248
246
  defaultNamespace?: string | false | undefined;
247
+ allowedKinds?: string[] | undefined;
248
+ allowArbitraryValues?: boolean | undefined;
249
249
  catalogFilter?: Record<string, string | string[] | {
250
250
  exists?: boolean | undefined;
251
251
  }> | Record<string, string | string[] | {
@@ -264,9 +264,9 @@ type EntityPickerUiOptions = typeof EntityPickerFieldSchema.uiOptionsType;
264
264
  * @public
265
265
  */
266
266
  declare const OwnerPickerFieldSchema: FieldSchema<string, {
267
+ defaultNamespace?: string | false | undefined;
267
268
  allowedKinds?: string[] | undefined;
268
269
  allowArbitraryValues?: boolean | undefined;
269
- defaultNamespace?: string | false | undefined;
270
270
  catalogFilter?: Record<string, string | string[] | {
271
271
  exists?: boolean | undefined;
272
272
  }> | Record<string, string | string[] | {
@@ -293,12 +293,12 @@ declare const RepoUrlPickerFieldSchema: FieldSchema<string, {
293
293
  requestUserCredentials?: {
294
294
  secretsKey: string;
295
295
  additionalScopes?: {
296
- gitea?: string[] | undefined;
297
- gerrit?: string[] | undefined;
296
+ azure?: string[] | undefined;
298
297
  github?: string[] | undefined;
299
298
  gitlab?: string[] | undefined;
300
299
  bitbucket?: string[] | undefined;
301
- azure?: string[] | undefined;
300
+ gerrit?: string[] | undefined;
301
+ gitea?: string[] | undefined;
302
302
  } | undefined;
303
303
  } | undefined;
304
304
  }>;
@@ -325,10 +325,10 @@ declare const repoPickerValidation: (value: string, validation: FieldValidation,
325
325
  * @public
326
326
  */
327
327
  declare const OwnedEntityPickerFieldSchema: FieldSchema<string, {
328
- allowedKinds?: string[] | undefined;
329
328
  defaultKind?: string | undefined;
330
- allowArbitraryValues?: boolean | undefined;
331
329
  defaultNamespace?: string | false | undefined;
330
+ allowedKinds?: string[] | undefined;
331
+ allowArbitraryValues?: boolean | undefined;
332
332
  catalogFilter?: Record<string, string | string[] | {
333
333
  exists?: boolean | undefined;
334
334
  }> | Record<string, string | string[] | {
@@ -347,9 +347,9 @@ type OwnedEntityPickerUiOptions = typeof OwnedEntityPickerFieldSchema.uiOptionsT
347
347
  * @public
348
348
  */
349
349
  declare const EntityTagsPickerFieldSchema: FieldSchema<string[], {
350
- kinds?: string[] | undefined;
351
- showCounts?: boolean | undefined;
352
350
  helperText?: string | undefined;
351
+ showCounts?: boolean | undefined;
352
+ kinds?: string[] | undefined;
353
353
  }>;
354
354
  /**
355
355
  * The input props that can be specified under `ui:options` for the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-scaffolder",
3
- "version": "1.19.4-next.1",
3
+ "version": "1.20.0",
4
4
  "description": "The Backstage plugin that helps you create new things",
5
5
  "backstage": {
6
6
  "role": "frontend-plugin"
@@ -48,20 +48,20 @@
48
48
  "test": "backstage-cli package test"
49
49
  },
50
50
  "dependencies": {
51
- "@backstage/catalog-client": "^1.6.5-next.0",
52
- "@backstage/catalog-model": "^1.5.0-next.0",
53
- "@backstage/core-compat-api": "^0.2.5-next.1",
54
- "@backstage/core-components": "^0.14.6-next.1",
51
+ "@backstage/catalog-client": "^1.6.5",
52
+ "@backstage/catalog-model": "^1.5.0",
53
+ "@backstage/core-compat-api": "^0.2.5",
54
+ "@backstage/core-components": "^0.14.7",
55
55
  "@backstage/core-plugin-api": "^1.9.2",
56
56
  "@backstage/errors": "^1.2.4",
57
- "@backstage/frontend-plugin-api": "^0.6.5-next.1",
58
- "@backstage/integration": "^1.10.0",
59
- "@backstage/integration-react": "^1.1.26",
60
- "@backstage/plugin-catalog-common": "^1.0.23-next.0",
61
- "@backstage/plugin-catalog-react": "^1.11.4-next.1",
57
+ "@backstage/frontend-plugin-api": "^0.6.5",
58
+ "@backstage/integration": "^1.11.0",
59
+ "@backstage/integration-react": "^1.1.27",
60
+ "@backstage/plugin-catalog-common": "^1.0.23",
61
+ "@backstage/plugin-catalog-react": "^1.12.0",
62
62
  "@backstage/plugin-permission-react": "^0.4.22",
63
- "@backstage/plugin-scaffolder-common": "^1.5.2-next.1",
64
- "@backstage/plugin-scaffolder-react": "^1.8.5-next.1",
63
+ "@backstage/plugin-scaffolder-common": "^1.5.2",
64
+ "@backstage/plugin-scaffolder-react": "^1.8.5",
65
65
  "@backstage/types": "^1.1.1",
66
66
  "@codemirror/language": "^6.0.0",
67
67
  "@codemirror/legacy-modes": "^6.1.0",
@@ -93,11 +93,11 @@
93
93
  "zod-to-json-schema": "^3.20.4"
94
94
  },
95
95
  "devDependencies": {
96
- "@backstage/cli": "^0.26.5-next.0",
97
- "@backstage/core-app-api": "^1.12.4",
98
- "@backstage/dev-utils": "^1.0.32-next.1",
99
- "@backstage/plugin-catalog": "^1.19.1-next.1",
100
- "@backstage/test-utils": "^1.5.5-next.0",
96
+ "@backstage/cli": "^0.26.5",
97
+ "@backstage/core-app-api": "^1.12.5",
98
+ "@backstage/dev-utils": "^1.0.32",
99
+ "@backstage/plugin-catalog": "^1.20.0",
100
+ "@backstage/test-utils": "^1.5.5",
101
101
  "@testing-library/dom": "^10.0.0",
102
102
  "@testing-library/jest-dom": "^6.0.0",
103
103
  "@testing-library/react": "^15.0.0",