@backstage/plugin-scaffolder-react 1.14.4-next.1 → 1.14.5-next.2

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,26 @@
1
1
  # @backstage/plugin-scaffolder-react
2
2
 
3
+ ## 1.14.5-next.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 656f67b: Reverted the validation in dependencies in scaffolder
8
+ - 2003fc2: Hide text output button if only one is present
9
+ - a35118f: build(deps): bump `immer` from 8.0.4 to 9.0.6
10
+ - 1283f06: Added missing `ajv` and `immer` dependencies to `@backstage/plugin-scaffolder-react`
11
+ - Updated dependencies
12
+ - @backstage/core-components@0.16.4-next.1
13
+ - @backstage/plugin-catalog-react@1.15.2-next.2
14
+ - @backstage/catalog-client@1.9.1
15
+ - @backstage/catalog-model@1.7.3
16
+ - @backstage/core-plugin-api@1.10.4-next.0
17
+ - @backstage/frontend-plugin-api@0.9.5-next.2
18
+ - @backstage/theme@0.6.4-next.0
19
+ - @backstage/types@1.2.1
20
+ - @backstage/version-bridge@1.0.11-next.0
21
+ - @backstage/plugin-permission-react@0.4.31-next.0
22
+ - @backstage/plugin-scaffolder-common@1.5.9
23
+
3
24
  ## 1.14.4-next.1
4
25
 
5
26
  ### Patch Changes
@@ -64,24 +64,6 @@ const createAsyncValidators = (rootSchema, validators, context) => {
64
64
  for (const [, propValue] of Object.entries(properties)) {
65
65
  await doValidate(propValue);
66
66
  }
67
- if (Array.isArray(value)) {
68
- for (const [_, v] of Object.entries(value)) {
69
- const { schema: itemSchema, uiSchema: itemUiSchema } = extractSchemaFromStep(definitionInSchema.items);
70
- if (isObject(v)) {
71
- for (const [pK, pV] of Object.entries(v)) {
72
- if ("ui:field" in itemUiSchema[pK]) {
73
- await validateForm(
74
- itemUiSchema[pK]["ui:field"],
75
- pK,
76
- pV,
77
- itemSchema,
78
- itemUiSchema
79
- );
80
- }
81
- }
82
- }
83
- }
84
- }
85
67
  } else if (isObject(value)) {
86
68
  formValidation[key] = await validate(formData, pointer, value);
87
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createAsyncValidators.esm.js","sources":["../../../../src/next/components/Stepper/createAsyncValidators.ts"],"sourcesContent":["/*\n * Copyright 2022 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 */\n\nimport { FieldValidation } from '@rjsf/utils';\nimport type { JsonObject, JsonValue } from '@backstage/types';\nimport { ApiHolder } from '@backstage/core-plugin-api';\nimport {\n Draft07 as JSONSchema,\n JsonError,\n JsonSchema,\n} from 'json-schema-library';\nimport { createFieldValidation, extractSchemaFromStep } from '../../lib';\nimport {\n CustomFieldValidator,\n FieldExtensionUiSchema,\n} from '@backstage/plugin-scaffolder-react';\nimport { isObject } from './utils';\n\n/** @alpha */\nexport type FormValidation = {\n [name: string]: FieldValidation | FormValidation;\n};\n\nconst isJsonError = (\n value: JsonError | JsonSchema,\n): value is { type: 'error'; message: string } =>\n 'type' in value && value.type === 'error';\n\n/** @alpha */\nexport const createAsyncValidators = (\n rootSchema: JsonObject,\n validators: Record<\n string,\n undefined | CustomFieldValidator<unknown, unknown>\n >,\n context: {\n apiHolder: ApiHolder;\n },\n) => {\n async function validate(\n formData: JsonObject,\n pathPrefix: string = '#',\n current: JsonObject = formData,\n ): Promise<FormValidation> {\n const parsedSchema = new JSONSchema(rootSchema);\n const formValidation: FormValidation = {};\n\n const validateForm = async (\n validatorName: string,\n key: string,\n value: JsonValue | undefined,\n schema: JsonObject,\n uiSchema: FieldExtensionUiSchema<unknown, unknown>,\n ) => {\n const validator = validators[validatorName];\n if (validator) {\n const fieldValidation = createFieldValidation();\n try {\n await validator(value, fieldValidation, {\n ...context,\n formData,\n schema,\n uiSchema,\n });\n } catch (ex) {\n fieldValidation.addError(ex.message);\n }\n formValidation[key] = fieldValidation;\n }\n };\n\n for (const [key, value] of Object.entries(current)) {\n const pointer = `${pathPrefix}/${key}`;\n const definitionInSchema = parsedSchema.getSchema({\n pointer,\n data: formData,\n });\n\n if (!definitionInSchema) {\n continue;\n }\n\n if (isJsonError(definitionInSchema)) {\n throw new Error(definitionInSchema.message);\n }\n\n const { schema, uiSchema } = extractSchemaFromStep(\n definitionInSchema as JsonObject,\n );\n\n const hasItems = definitionInSchema && definitionInSchema.items;\n\n const doValidateItem = async (\n propValue: JsonObject,\n itemSchema: JsonObject,\n itemUiSchema: FieldExtensionUiSchema<unknown, unknown>,\n ) => {\n await validateForm(\n propValue['ui:field'] as string,\n key,\n value,\n itemSchema,\n itemUiSchema,\n );\n };\n\n const doValidate = async (propValue: JsonObject) => {\n if ('ui:field' in propValue) {\n const { schema: itemsSchema, uiSchema: itemsUiSchema } =\n extractSchemaFromStep(definitionInSchema.items);\n await doValidateItem(propValue, itemsSchema, itemsUiSchema);\n }\n };\n\n if ('ui:field' in definitionInSchema) {\n await doValidateItem(definitionInSchema, schema, uiSchema);\n } else if (hasItems && 'ui:field' in definitionInSchema.items) {\n await doValidate(definitionInSchema.items);\n } else if (hasItems && definitionInSchema.items.type === 'object') {\n const properties = (definitionInSchema.items?.properties ??\n []) as JsonObject[];\n for (const [, propValue] of Object.entries(properties)) {\n await doValidate(propValue);\n }\n if (Array.isArray(value)) {\n for (const [_, v] of Object.entries(value)) {\n const { schema: itemSchema, uiSchema: itemUiSchema } =\n extractSchemaFromStep(definitionInSchema.items);\n\n if (isObject(v)) {\n for (const [pK, pV] of Object.entries(v)) {\n if ('ui:field' in itemUiSchema[pK]) {\n await validateForm(\n itemUiSchema[pK]['ui:field'],\n pK,\n pV,\n itemSchema,\n itemUiSchema,\n );\n }\n }\n }\n }\n }\n } else if (isObject(value)) {\n formValidation[key] = await validate(formData, pointer, value);\n }\n }\n\n return formValidation;\n }\n\n return async (formData: JsonObject) => {\n return await validate(formData);\n };\n};\n"],"names":["JSONSchema"],"mappings":"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"}
1
+ {"version":3,"file":"createAsyncValidators.esm.js","sources":["../../../../src/next/components/Stepper/createAsyncValidators.ts"],"sourcesContent":["/*\n * Copyright 2022 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 */\n\nimport { FieldValidation } from '@rjsf/utils';\nimport type { JsonObject, JsonValue } from '@backstage/types';\nimport { ApiHolder } from '@backstage/core-plugin-api';\nimport {\n Draft07 as JSONSchema,\n JsonError,\n JsonSchema,\n} from 'json-schema-library';\nimport { createFieldValidation, extractSchemaFromStep } from '../../lib';\nimport {\n CustomFieldValidator,\n FieldExtensionUiSchema,\n} from '@backstage/plugin-scaffolder-react';\nimport { isObject } from './utils';\n\n/** @alpha */\nexport type FormValidation = {\n [name: string]: FieldValidation | FormValidation;\n};\n\nconst isJsonError = (\n value: JsonError | JsonSchema,\n): value is { type: 'error'; message: string } =>\n 'type' in value && value.type === 'error';\n\n/** @alpha */\nexport const createAsyncValidators = (\n rootSchema: JsonObject,\n validators: Record<\n string,\n undefined | CustomFieldValidator<unknown, unknown>\n >,\n context: {\n apiHolder: ApiHolder;\n },\n) => {\n async function validate(\n formData: JsonObject,\n pathPrefix: string = '#',\n current: JsonObject = formData,\n ): Promise<FormValidation> {\n const parsedSchema = new JSONSchema(rootSchema);\n const formValidation: FormValidation = {};\n\n const validateForm = async (\n validatorName: string,\n key: string,\n value: JsonValue | undefined,\n schema: JsonObject,\n uiSchema: FieldExtensionUiSchema<unknown, unknown>,\n ) => {\n const validator = validators[validatorName];\n if (validator) {\n const fieldValidation = createFieldValidation();\n try {\n await validator(value, fieldValidation, {\n ...context,\n formData,\n schema,\n uiSchema,\n });\n } catch (ex) {\n fieldValidation.addError(ex.message);\n }\n formValidation[key] = fieldValidation;\n }\n };\n\n for (const [key, value] of Object.entries(current)) {\n const pointer = `${pathPrefix}/${key}`;\n const definitionInSchema = parsedSchema.getSchema({\n pointer,\n data: formData,\n });\n\n if (!definitionInSchema) {\n continue;\n }\n\n if (isJsonError(definitionInSchema)) {\n throw new Error(definitionInSchema.message);\n }\n\n const { schema, uiSchema } = extractSchemaFromStep(\n definitionInSchema as JsonObject,\n );\n\n const hasItems = definitionInSchema && definitionInSchema.items;\n\n const doValidateItem = async (\n propValue: JsonObject,\n itemSchema: JsonObject,\n itemUiSchema: FieldExtensionUiSchema<unknown, unknown>,\n ) => {\n await validateForm(\n propValue['ui:field'] as string,\n key,\n value,\n itemSchema,\n itemUiSchema,\n );\n };\n\n const doValidate = async (propValue: JsonObject) => {\n if ('ui:field' in propValue) {\n const { schema: itemsSchema, uiSchema: itemsUiSchema } =\n extractSchemaFromStep(definitionInSchema.items);\n await doValidateItem(propValue, itemsSchema, itemsUiSchema);\n }\n };\n\n if ('ui:field' in definitionInSchema) {\n await doValidateItem(definitionInSchema, schema, uiSchema);\n } else if (hasItems && 'ui:field' in definitionInSchema.items) {\n await doValidate(definitionInSchema.items);\n } else if (hasItems && definitionInSchema.items.type === 'object') {\n const properties = (definitionInSchema.items?.properties ??\n []) as JsonObject[];\n for (const [, propValue] of Object.entries(properties)) {\n await doValidate(propValue);\n }\n } else if (isObject(value)) {\n formValidation[key] = await validate(formData, pointer, value);\n }\n }\n\n return formValidation;\n }\n\n return async (formData: JsonObject) => {\n return await validate(formData);\n };\n};\n"],"names":["JSONSchema"],"mappings":"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"}
@@ -25,7 +25,8 @@ const DefaultTemplateOutputs = (props) => {
25
25
  if (!output) {
26
26
  return null;
27
27
  }
28
- const emptyOutput = Object.keys(output).length === 0;
28
+ const displayTextButtons = (output.text || []).length > 1;
29
+ const emptyOutput = (output.links || []).length === 0 && !displayTextButtons;
29
30
  return /* @__PURE__ */ React.createElement(React.Fragment, null, !emptyOutput ? /* @__PURE__ */ React.createElement(Box, { paddingBottom: 2, "data-testid": "output-box" }, /* @__PURE__ */ React.createElement(Paper, null, /* @__PURE__ */ React.createElement(
30
31
  Box,
31
32
  {
@@ -35,9 +36,10 @@ const DefaultTemplateOutputs = (props) => {
35
36
  gridGap: 16,
36
37
  flexWrap: "wrap"
37
38
  },
38
- /* @__PURE__ */ React.createElement(
39
+ displayTextButtons && /* @__PURE__ */ React.createElement(
39
40
  TextOutputs,
40
41
  {
42
+ "data-testid": "text-outputs",
41
43
  output,
42
44
  index: textOutputIndex,
43
45
  setIndex: setTextOutputIndex
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultTemplateOutputs.esm.js","sources":["../../../../src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx"],"sourcesContent":["/*\n * Copyright 2023 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 { InfoCard, MarkdownContent } from '@backstage/core-components';\nimport {\n ScaffolderOutputText,\n ScaffolderTaskOutput,\n} from '@backstage/plugin-scaffolder-react';\nimport Box from '@material-ui/core/Box';\nimport Paper from '@material-ui/core/Paper';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { LinkOutputs } from './LinkOutputs';\nimport { TextOutputs } from './TextOutputs';\n\n/**\n * The DefaultOutputs renderer for the scaffolder task output\n *\n * @alpha\n */\nexport const DefaultTemplateOutputs = (props: {\n output?: ScaffolderTaskOutput;\n}) => {\n const { output } = props;\n const [textOutputIndex, setTextOutputIndex] = useState<number | undefined>(\n undefined,\n );\n\n useEffect(() => {\n if (textOutputIndex === undefined && output?.text) {\n const defaultIndex = output.text.findIndex(\n (t: ScaffolderOutputText) => t.default,\n );\n setTextOutputIndex(defaultIndex >= 0 ? defaultIndex : 0);\n }\n }, [textOutputIndex, output]);\n\n const textOutput = useMemo(\n () =>\n textOutputIndex !== undefined ? output?.text?.[textOutputIndex] : null,\n [output, textOutputIndex],\n );\n\n if (!output) {\n return null;\n }\n\n const emptyOutput = Object.keys(output).length === 0;\n\n return (\n <>\n {!emptyOutput ? (\n <Box paddingBottom={2} data-testid=\"output-box\">\n <Paper>\n <Box\n padding={2}\n justifyContent=\"center\"\n display=\"flex\"\n gridGap={16}\n flexWrap=\"wrap\"\n >\n <TextOutputs\n output={output}\n index={textOutputIndex}\n setIndex={setTextOutputIndex}\n />\n <LinkOutputs output={output} />\n </Box>\n </Paper>\n </Box>\n ) : null}\n {textOutput ? (\n <Box paddingBottom={2} data-testid=\"text-output-box\">\n <InfoCard\n title={textOutput.title ?? 'Text Output'}\n noPadding\n titleTypographyProps={{ component: 'h2' }}\n >\n <Box padding={2} height=\"100%\">\n <MarkdownContent content={textOutput.content ?? ''} />\n </Box>\n </InfoCard>\n </Box>\n ) : null}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;AA+Ba,MAAA,sBAAA,GAAyB,CAAC,KAEjC,KAAA;AACJ,EAAM,MAAA,EAAE,QAAW,GAAA,KAAA;AACnB,EAAM,MAAA,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAA,QAAA;AAAA,IAC5C,KAAA;AAAA,GACF;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,eAAA,KAAoB,KAAa,CAAA,IAAA,MAAA,EAAQ,IAAM,EAAA;AACjD,MAAM,MAAA,YAAA,GAAe,OAAO,IAAK,CAAA,SAAA;AAAA,QAC/B,CAAC,MAA4B,CAAE,CAAA;AAAA,OACjC;AACA,MAAmB,kBAAA,CAAA,YAAA,IAAgB,CAAI,GAAA,YAAA,GAAe,CAAC,CAAA;AAAA;AACzD,GACC,EAAA,CAAC,eAAiB,EAAA,MAAM,CAAC,CAAA;AAE5B,EAAA,MAAM,UAAa,GAAA,OAAA;AAAA,IACjB,MACE,eAAoB,KAAA,KAAA,CAAA,GAAY,MAAQ,EAAA,IAAA,GAAO,eAAe,CAAI,GAAA,IAAA;AAAA,IACpE,CAAC,QAAQ,eAAe;AAAA,GAC1B;AAEA,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,MAAM,WAAc,GAAA,MAAA,CAAO,IAAK,CAAA,MAAM,EAAE,MAAW,KAAA,CAAA;AAEnD,EACE,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EACG,CAAC,WAAA,mBACC,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,eAAe,CAAG,EAAA,aAAA,EAAY,YACjC,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,KACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,OAAS,EAAA,CAAA;AAAA,MACT,cAAe,EAAA,QAAA;AAAA,MACf,OAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA,EAAA;AAAA,MACT,QAAS,EAAA;AAAA,KAAA;AAAA,oBAET,KAAA,CAAA,aAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,MAAA;AAAA,QACA,KAAO,EAAA,eAAA;AAAA,QACP,QAAU,EAAA;AAAA;AAAA,KACZ;AAAA,oBACA,KAAA,CAAA,aAAA,CAAC,eAAY,MAAgB,EAAA;AAAA,GAEjC,CACF,CAAA,GACE,IACH,EAAA,UAAA,uCACE,GAAI,EAAA,EAAA,aAAA,EAAe,CAAG,EAAA,aAAA,EAAY,iBACjC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,WAAW,KAAS,IAAA,aAAA;AAAA,MAC3B,SAAS,EAAA,IAAA;AAAA,MACT,oBAAA,EAAsB,EAAE,SAAA,EAAW,IAAK;AAAA,KAAA;AAAA,oBAEvC,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,OAAS,EAAA,CAAA,EAAG,MAAO,EAAA,MAAA,EAAA,kBACrB,KAAA,CAAA,aAAA,CAAA,eAAA,EAAA,EAAgB,OAAS,EAAA,UAAA,CAAW,OAAW,IAAA,EAAA,EAAI,CACtD;AAAA,GAEJ,IACE,IACN,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"DefaultTemplateOutputs.esm.js","sources":["../../../../src/next/components/TemplateOutputs/DefaultTemplateOutputs.tsx"],"sourcesContent":["/*\n * Copyright 2023 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 { InfoCard, MarkdownContent } from '@backstage/core-components';\nimport {\n ScaffolderOutputText,\n ScaffolderTaskOutput,\n} from '@backstage/plugin-scaffolder-react';\nimport Box from '@material-ui/core/Box';\nimport Paper from '@material-ui/core/Paper';\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { LinkOutputs } from './LinkOutputs';\nimport { TextOutputs } from './TextOutputs';\n\n/**\n * The DefaultOutputs renderer for the scaffolder task output\n *\n * @alpha\n */\nexport const DefaultTemplateOutputs = (props: {\n output?: ScaffolderTaskOutput;\n}) => {\n const { output } = props;\n const [textOutputIndex, setTextOutputIndex] = useState<number | undefined>(\n undefined,\n );\n\n useEffect(() => {\n if (textOutputIndex === undefined && output?.text) {\n const defaultIndex = output.text.findIndex(\n (t: ScaffolderOutputText) => t.default,\n );\n setTextOutputIndex(defaultIndex >= 0 ? defaultIndex : 0);\n }\n }, [textOutputIndex, output]);\n\n const textOutput = useMemo(\n () =>\n textOutputIndex !== undefined ? output?.text?.[textOutputIndex] : null,\n [output, textOutputIndex],\n );\n\n if (!output) {\n return null;\n }\n\n const displayTextButtons = (output.text || []).length > 1;\n const emptyOutput = (output.links || []).length === 0 && !displayTextButtons;\n\n return (\n <>\n {!emptyOutput ? (\n <Box paddingBottom={2} data-testid=\"output-box\">\n <Paper>\n <Box\n padding={2}\n justifyContent=\"center\"\n display=\"flex\"\n gridGap={16}\n flexWrap=\"wrap\"\n >\n {displayTextButtons && (\n <TextOutputs\n data-testid=\"text-outputs\"\n output={output}\n index={textOutputIndex}\n setIndex={setTextOutputIndex}\n />\n )}\n <LinkOutputs output={output} />\n </Box>\n </Paper>\n </Box>\n ) : null}\n {textOutput ? (\n <Box paddingBottom={2} data-testid=\"text-output-box\">\n <InfoCard\n title={textOutput.title ?? 'Text Output'}\n noPadding\n titleTypographyProps={{ component: 'h2' }}\n >\n <Box padding={2} height=\"100%\">\n <MarkdownContent content={textOutput.content ?? ''} />\n </Box>\n </InfoCard>\n </Box>\n ) : null}\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;AA+Ba,MAAA,sBAAA,GAAyB,CAAC,KAEjC,KAAA;AACJ,EAAM,MAAA,EAAE,QAAW,GAAA,KAAA;AACnB,EAAM,MAAA,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAA,QAAA;AAAA,IAC5C,KAAA;AAAA,GACF;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAI,IAAA,eAAA,KAAoB,KAAa,CAAA,IAAA,MAAA,EAAQ,IAAM,EAAA;AACjD,MAAM,MAAA,YAAA,GAAe,OAAO,IAAK,CAAA,SAAA;AAAA,QAC/B,CAAC,MAA4B,CAAE,CAAA;AAAA,OACjC;AACA,MAAmB,kBAAA,CAAA,YAAA,IAAgB,CAAI,GAAA,YAAA,GAAe,CAAC,CAAA;AAAA;AACzD,GACC,EAAA,CAAC,eAAiB,EAAA,MAAM,CAAC,CAAA;AAE5B,EAAA,MAAM,UAAa,GAAA,OAAA;AAAA,IACjB,MACE,eAAoB,KAAA,KAAA,CAAA,GAAY,MAAQ,EAAA,IAAA,GAAO,eAAe,CAAI,GAAA,IAAA;AAAA,IACpE,CAAC,QAAQ,eAAe;AAAA,GAC1B;AAEA,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,MAAM,kBAAsB,GAAA,CAAA,MAAA,CAAO,IAAQ,IAAA,IAAI,MAAS,GAAA,CAAA;AACxD,EAAA,MAAM,eAAe,MAAO,CAAA,KAAA,IAAS,EAAI,EAAA,MAAA,KAAW,KAAK,CAAC,kBAAA;AAE1D,EACE,uBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EACG,CAAC,WAAA,mBACC,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,eAAe,CAAG,EAAA,aAAA,EAAY,YACjC,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,KACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,OAAS,EAAA,CAAA;AAAA,MACT,cAAe,EAAA,QAAA;AAAA,MACf,OAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA,EAAA;AAAA,MACT,QAAS,EAAA;AAAA,KAAA;AAAA,IAER,kBACC,oBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,aAAY,EAAA,cAAA;AAAA,QACZ,MAAA;AAAA,QACA,KAAO,EAAA,eAAA;AAAA,QACP,QAAU,EAAA;AAAA;AAAA,KACZ;AAAA,oBAEF,KAAA,CAAA,aAAA,CAAC,eAAY,MAAgB,EAAA;AAAA,GAEjC,CACF,CAAA,GACE,IACH,EAAA,UAAA,uCACE,GAAI,EAAA,EAAA,aAAA,EAAe,CAAG,EAAA,aAAA,EAAY,iBACjC,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,WAAW,KAAS,IAAA,aAAA;AAAA,MAC3B,SAAS,EAAA,IAAA;AAAA,MACT,oBAAA,EAAsB,EAAE,SAAA,EAAW,IAAK;AAAA,KAAA;AAAA,oBAEvC,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,OAAS,EAAA,CAAA,EAAG,MAAO,EAAA,MAAA,EAAA,kBACrB,KAAA,CAAA,aAAA,CAAA,eAAA,EAAA,EAAgB,OAAS,EAAA,UAAA,CAAW,OAAW,IAAA,EAAA,EAAI,CACtD;AAAA,GAEJ,IACE,IACN,CAAA;AAEJ;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-scaffolder-react",
3
- "version": "1.14.4-next.1",
3
+ "version": "1.14.5-next.2",
4
4
  "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder",
5
5
  "backstage": {
6
6
  "role": "web-library",
@@ -68,10 +68,10 @@
68
68
  "dependencies": {
69
69
  "@backstage/catalog-client": "1.9.1",
70
70
  "@backstage/catalog-model": "1.7.3",
71
- "@backstage/core-components": "0.16.4-next.0",
71
+ "@backstage/core-components": "0.16.4-next.1",
72
72
  "@backstage/core-plugin-api": "1.10.4-next.0",
73
- "@backstage/frontend-plugin-api": "0.9.5-next.1",
74
- "@backstage/plugin-catalog-react": "1.15.2-next.1",
73
+ "@backstage/frontend-plugin-api": "0.9.5-next.2",
74
+ "@backstage/plugin-catalog-react": "1.15.2-next.2",
75
75
  "@backstage/plugin-permission-react": "0.4.31-next.0",
76
76
  "@backstage/plugin-scaffolder-common": "1.5.9",
77
77
  "@backstage/theme": "0.6.4-next.0",
@@ -86,10 +86,12 @@
86
86
  "@rjsf/utils": "5.23.2",
87
87
  "@rjsf/validator-ajv8": "5.23.2",
88
88
  "@types/json-schema": "^7.0.9",
89
+ "ajv": "^8.0.1",
89
90
  "ajv-errors": "^3.0.0",
90
91
  "classnames": "^2.2.6",
91
92
  "flatted": "3.3.2",
92
93
  "humanize-duration": "^3.25.1",
94
+ "immer": "^9.0.6",
93
95
  "json-schema": "^0.4.0",
94
96
  "json-schema-library": "^9.0.0",
95
97
  "lodash": "^4.17.21",
@@ -102,9 +104,9 @@
102
104
  "zod-to-json-schema": "^3.20.4"
103
105
  },
104
106
  "devDependencies": {
105
- "@backstage/cli": "0.30.0-next.1",
107
+ "@backstage/cli": "0.30.0-next.2",
106
108
  "@backstage/core-app-api": "1.15.5-next.0",
107
- "@backstage/plugin-catalog": "1.26.2-next.1",
109
+ "@backstage/plugin-catalog": "1.27.0-next.2",
108
110
  "@backstage/plugin-catalog-common": "1.1.3",
109
111
  "@backstage/plugin-permission-common": "0.8.4",
110
112
  "@backstage/test-utils": "1.7.5-next.0",