diff --git a/plugins/scaffolder-react/package.json b/plugins/scaffolder-react/package.json index 17391aedfa..b115437e33 100644 --- a/plugins/scaffolder-react/package.json +++ b/plugins/scaffolder-react/package.json @@ -38,6 +38,8 @@ "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/errors": "workspace:^", + "@backstage/plugin-catalog-react": "workspace:^", + "@backstage/plugin-scaffolder-common": "workspace:^", "@backstage/theme": "workspace:^", "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", @@ -56,6 +58,7 @@ "json-schema-library": "^7.3.9", "lodash": "^4.17.21", "qs": "^6.9.4", + "zen-observable": "^0.10.0", "zod": "~3.18.0", "zod-to-json-schema": "~3.18.0" }, @@ -67,8 +70,8 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-app-api": "workspace:^", + "@backstage/plugin-catalog": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", - "@backstage/plugin-scaffolder-common": "workspace:^", "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^12.1.3", diff --git a/plugins/scaffolder-react/src/extensions/types.ts b/plugins/scaffolder-react/src/extensions/types.ts index a2a1a8d69c..a9ed854afa 100644 --- a/plugins/scaffolder-react/src/extensions/types.ts +++ b/plugins/scaffolder-react/src/extensions/types.ts @@ -15,12 +15,6 @@ */ import { ApiHolder } from '@backstage/core-plugin-api'; import { FieldValidation, FieldProps } from '@rjsf/core'; -import { - UIOptionsType, - FieldProps as FieldPropsV5, - UiSchema as UiSchemaV5, - FieldValidation as FieldValidationV5, -} from '@rjsf/utils'; import { JSONSchema7 } from 'json-schema'; /** diff --git a/plugins/scaffolder-react/src/index.ts b/plugins/scaffolder-react/src/index.ts index 42a2cebb19..cc0e67e969 100644 --- a/plugins/scaffolder-react/src/index.ts +++ b/plugins/scaffolder-react/src/index.ts @@ -16,5 +16,5 @@ export * from './routes'; export * from './extensions'; - export * from './next'; +export * from './types'; diff --git a/plugins/scaffolder-react/src/next/components/Stepper/ReviewState.test.tsx b/plugins/scaffolder-react/src/next/components/ReviewState/ReviewState.test.tsx similarity index 98% rename from plugins/scaffolder-react/src/next/components/Stepper/ReviewState.test.tsx rename to plugins/scaffolder-react/src/next/components/ReviewState/ReviewState.test.tsx index c03df8f73c..0f56a32d1d 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/ReviewState.test.tsx +++ b/plugins/scaffolder-react/src/next/components/ReviewState/ReviewState.test.tsx @@ -17,7 +17,7 @@ import React from 'react'; import { ReviewState } from './ReviewState'; import { render } from '@testing-library/react'; -import { ParsedTemplateSchema } from './useTemplateSchema'; +import { ParsedTemplateSchema } from '../../hooks/useTemplateSchema'; describe('ReviewState', () => { it('should render the text as normal with no options', () => { diff --git a/plugins/scaffolder-react/src/next/components/Stepper/ReviewState.tsx b/plugins/scaffolder-react/src/next/components/ReviewState/ReviewState.tsx similarity index 93% rename from plugins/scaffolder-react/src/next/components/Stepper/ReviewState.tsx rename to plugins/scaffolder-react/src/next/components/ReviewState/ReviewState.tsx index f39a26622a..9b69a898f2 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/ReviewState.tsx +++ b/plugins/scaffolder-react/src/next/components/ReviewState/ReviewState.tsx @@ -16,14 +16,18 @@ import React from 'react'; import { StructuredMetadataTable } from '@backstage/core-components'; import { JsonObject } from '@backstage/types'; -import { ParsedTemplateSchema } from './useTemplateSchema'; import { Draft07 as JSONSchema } from 'json-schema-library'; +import { ParsedTemplateSchema } from '../../hooks/useTemplateSchema'; interface ReviewStateProps { schemas: ParsedTemplateSchema[]; formState: JsonObject; } +/** + * The ReviewState component used by the Stepper + * @alpha + */ export const ReviewState = (props: ReviewStateProps) => { const reviewData = Object.fromEntries( Object.entries(props.formState).map(([key, value]) => { diff --git a/plugins/scaffolder-react/src/next/components/ReviewState/index.ts b/plugins/scaffolder-react/src/next/components/ReviewState/index.ts new file mode 100644 index 0000000000..c94d73ec35 --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/ReviewState/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { ReviewState } from './ReviewState'; diff --git a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx index 72079d6f91..79c6e4fc92 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx @@ -33,7 +33,7 @@ import { NextFieldExtensionOptions } from '../../extensions'; import { TemplateParameterSchema } from '../../../types'; import { createAsyncValidators } from './createAsyncValidators'; import { useTemplateSchema } from '../../hooks/useTemplateSchema'; -import { ReviewState } from './ReviewState'; +import { ReviewState } from '../ReviewState'; import validator from '@rjsf/validator-ajv6'; import { selectedTemplateRouteRef } from '../../../routes'; import { useFormData } from '../../hooks/useFormData'; diff --git a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts index a4a937e6fe..6ad14e3cc4 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { JsonObject } from '@backstage/types'; -import { NextCustomFieldValidator } from '../../../extensions'; +import { NextCustomFieldValidator } from '../../extensions'; import { createAsyncValidators } from './createAsyncValidators'; describe('createAsyncValidators', () => { diff --git a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts index 6483ce2393..79466ee602 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts +++ b/plugins/scaffolder-react/src/next/components/Stepper/createAsyncValidators.ts @@ -17,9 +17,9 @@ import { FieldValidation } from '@rjsf/utils'; import { JsonObject } from '@backstage/types'; import { ApiHolder } from '@backstage/core-plugin-api'; -import { NextCustomFieldValidator } from '../../../extensions'; import { Draft07 as JSONSchema } from 'json-schema-library'; -import { createFieldValidation } from './schema'; +import { createFieldValidation } from '../../lib'; +import { NextCustomFieldValidator } from '../../extensions'; export const createAsyncValidators = ( rootSchema: JsonObject, diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/CardHeader.test.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/CardHeader.test.tsx similarity index 100% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateCard/CardHeader.test.tsx rename to plugins/scaffolder-react/src/next/components/TemplateCard/CardHeader.test.tsx diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/CardHeader.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/CardHeader.tsx similarity index 100% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateCard/CardHeader.tsx rename to plugins/scaffolder-react/src/next/components/TemplateCard/CardHeader.tsx diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/CardLink.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/CardLink.tsx similarity index 100% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateCard/CardLink.tsx rename to plugins/scaffolder-react/src/next/components/TemplateCard/CardLink.tsx diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/TemplateCard.test.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.test.tsx similarity index 98% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateCard/TemplateCard.test.tsx rename to plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.test.tsx index cb4e8428cd..a0fb1ad74e 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/TemplateCard.test.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.test.tsx @@ -25,9 +25,9 @@ import { } from '@backstage/test-utils'; import { TemplateCard } from './TemplateCard'; import React from 'react'; -import { nextRouteRef } from '@backstage/plugin-scaffolder-react'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { RELATION_OWNED_BY } from '@backstage/catalog-model'; +import { nextRouteRef } from '../../../routes'; describe('TemplateCard', () => { it('should render the card title', async () => { diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/TemplateCard.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx similarity index 99% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateCard/TemplateCard.tsx rename to plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx index b5c852949c..67b50ba8d6 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/TemplateCard.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx @@ -42,7 +42,7 @@ import React from 'react'; import { nextSelectedTemplateRouteRef, viewTechDocRouteRef, -} from '@backstage/plugin-scaffolder-react'; +} from '../../../routes'; import { CardHeader } from './CardHeader'; import { CardLink } from './CardLink'; diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateCard/index.ts b/plugins/scaffolder-react/src/next/components/TemplateCard/index.ts similarity index 100% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateCard/index.ts rename to plugins/scaffolder-react/src/next/components/TemplateCard/index.ts diff --git a/plugins/scaffolder-react/src/next/components/index.ts b/plugins/scaffolder-react/src/next/components/index.ts index 5532563e28..0e3f7ce7fa 100644 --- a/plugins/scaffolder-react/src/next/components/index.ts +++ b/plugins/scaffolder-react/src/next/components/index.ts @@ -13,4 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { Stepper } from './Stepper'; +export * from './Stepper'; +export * from './TemplateCard'; +export * from './ReviewState'; diff --git a/plugins/scaffolder-react/src/next/extensions/index.tsx b/plugins/scaffolder-react/src/next/extensions/index.tsx index 7bbf7d4112..d4161867e4 100644 --- a/plugins/scaffolder-react/src/next/extensions/index.tsx +++ b/plugins/scaffolder-react/src/next/extensions/index.tsx @@ -21,10 +21,7 @@ import { } from './types'; import { Extension, attachComponentData } from '@backstage/core-plugin-api'; import { UIOptionsType } from '@rjsf/utils'; -import { FieldExtensionComponent } from '../../extensions'; - -export const FIELD_EXTENSION_WRAPPER_KEY = 'scaffolder.extensions.wrapper.v1'; -export const FIELD_EXTENSION_KEY = 'scaffolder.extensions.field.v1'; +import { FieldExtensionComponent, FIELD_EXTENSION_KEY } from '../../extensions'; /** * Method for creating field extensions that can be used in the scaffolder diff --git a/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.test.tsx b/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.test.tsx index 9be6faa0fa..153c48468d 100644 --- a/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.test.tsx +++ b/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.test.tsx @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { TemplateParameterSchema } from '../../../types'; import { useTemplateSchema } from './useTemplateSchema'; import { renderHook } from '@testing-library/react-hooks'; import { TestApiProvider } from '@backstage/test-utils'; import React from 'react'; import { featureFlagsApiRef } from '@backstage/core-plugin-api'; +import { TemplateParameterSchema } from '../../types'; describe('useTemplateSchema', () => { it('should generate the correct schema', () => { diff --git a/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.ts b/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.ts index 6aad6baa96..733c8960b9 100644 --- a/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.ts +++ b/plugins/scaffolder-react/src/next/hooks/useTemplateSchema.ts @@ -16,8 +16,8 @@ import { featureFlagsApiRef, useApi } from '@backstage/core-plugin-api'; import { JsonObject } from '@backstage/types'; import { UiSchema } from '@rjsf/utils'; -import { TemplateParameterSchema } from '../../../types'; -import { extractSchemaFromStep } from './schema'; +import { TemplateParameterSchema } from '../../types'; +import { extractSchemaFromStep } from '../lib'; export interface ParsedTemplateSchema { uiSchema: UiSchema; @@ -26,6 +26,7 @@ export interface ParsedTemplateSchema { title: string; description?: string; } + export const useTemplateSchema = ( manifest: TemplateParameterSchema, ): { steps: ParsedTemplateSchema[] } => { diff --git a/plugins/scaffolder-react/src/next/index.ts b/plugins/scaffolder-react/src/next/index.ts index aa46a7a6cd..29992c26d5 100644 --- a/plugins/scaffolder-react/src/next/index.ts +++ b/plugins/scaffolder-react/src/next/index.ts @@ -15,3 +15,5 @@ */ export * from './components'; export * from './extensions'; +export * from './types'; +export * from './lib'; diff --git a/plugins/scaffolder-react/src/next/lib/index.ts b/plugins/scaffolder-react/src/next/lib/index.ts new file mode 100644 index 0000000000..f42c4c8ab3 --- /dev/null +++ b/plugins/scaffolder-react/src/next/lib/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright 2022 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export { extractSchemaFromStep, createFieldValidation } from './schema'; diff --git a/plugins/scaffolder-react/src/next/components/Stepper/schema.test.ts b/plugins/scaffolder-react/src/next/lib/schema.test.ts similarity index 100% rename from plugins/scaffolder-react/src/next/components/Stepper/schema.test.ts rename to plugins/scaffolder-react/src/next/lib/schema.test.ts diff --git a/plugins/scaffolder-react/src/next/components/Stepper/schema.ts b/plugins/scaffolder-react/src/next/lib/schema.ts similarity index 100% rename from plugins/scaffolder-react/src/next/components/Stepper/schema.ts rename to plugins/scaffolder-react/src/next/lib/schema.ts diff --git a/plugins/scaffolder/src/next/types.ts b/plugins/scaffolder-react/src/next/types.ts similarity index 100% rename from plugins/scaffolder/src/next/types.ts rename to plugins/scaffolder-react/src/next/types.ts diff --git a/plugins/scaffolder-react/src/types.ts b/plugins/scaffolder-react/src/types.ts index b61d59e88d..f644fbeb64 100644 --- a/plugins/scaffolder-react/src/types.ts +++ b/plugins/scaffolder-react/src/types.ts @@ -13,3 +13,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +import { JsonObject } from '@backstage/types'; + +/** + * The shape of each entry of parameters which gets rendered + * as a separate step in the wizard input + * + * @public + */ +export type TemplateParameterSchema = { + title: string; + description?: string; + steps: Array<{ + title: string; + description?: string; + schema: JsonObject; + }>; +}; diff --git a/plugins/scaffolder/src/api.ts b/plugins/scaffolder/src/api.ts index 64141dd83d..3a60f6b9a9 100644 --- a/plugins/scaffolder/src/api.ts +++ b/plugins/scaffolder/src/api.ts @@ -30,7 +30,6 @@ import { ListActionsResponse, LogEvent, ScaffolderApi, - TemplateParameterSchema, ScaffolderScaffoldOptions, ScaffolderScaffoldResponse, ScaffolderStreamLogsOptions, @@ -40,6 +39,8 @@ import { ScaffolderDryRunOptions, ScaffolderDryRunResponse, } from './types'; + +import { TemplateParameterSchema } from '@backstage/plugin-scaffolder-react'; import queryString from 'qs'; /** diff --git a/plugins/scaffolder/src/components/MultistepJsonForm/MultistepJsonForm.tsx b/plugins/scaffolder/src/components/MultistepJsonForm/MultistepJsonForm.tsx index 0ca331ab52..65db4217be 100644 --- a/plugins/scaffolder/src/components/MultistepJsonForm/MultistepJsonForm.tsx +++ b/plugins/scaffolder/src/components/MultistepJsonForm/MultistepJsonForm.tsx @@ -39,8 +39,10 @@ import * as fieldOverrides from './FieldOverrides'; import { LayoutOptions } from '../../layouts'; import { ReviewStepProps } from '../types'; import { ReviewStep } from './ReviewStep'; -import { selectedTemplateRouteRef } from '@backstage/plugin-scaffolder-react'; -import { extractSchemaFromStep } from '../../next/TemplateWizardPage/Stepper/schema'; +import { + selectedTemplateRouteRef, + extractSchemaFromStep, +} from '@backstage/plugin-scaffolder-react'; const Form = withTheme(MuiTheme); diff --git a/plugins/scaffolder/src/components/Router.tsx b/plugins/scaffolder/src/components/Router.tsx index 13ef9ed43f..0e865024bd 100644 --- a/plugins/scaffolder/src/components/Router.tsx +++ b/plugins/scaffolder/src/components/Router.tsx @@ -24,13 +24,7 @@ import { TaskPage } from './TaskPage'; import { ActionsPage } from './ActionsPage'; import { SecretsContextProvider } from './secrets/SecretsContext'; import { TemplateEditorPage } from './TemplateEditorPage'; - -import { - DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS, - FIELD_EXTENSION_KEY, - FIELD_EXTENSION_WRAPPER_KEY, - FieldExtensionOptions, -} from '../extensions'; +import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../extensions/default'; import { useElementFilter, useRouteRef, @@ -43,6 +37,9 @@ import { scaffolderListTaskRouteRef, scaffolderTaskRouteRef, selectedTemplateRouteRef, + FIELD_EXTENSION_KEY, + FIELD_EXTENSION_WRAPPER_KEY, + FieldExtensionOptions, } from '@backstage/plugin-scaffolder-react'; import { ListTasksPage } from './ListTasksPage'; import { LayoutOptions, LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from '../layouts'; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/CustomFieldExplorer.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/CustomFieldExplorer.tsx index 3510968acd..c7138efb97 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/CustomFieldExplorer.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/CustomFieldExplorer.tsx @@ -33,7 +33,7 @@ import { Theme as MuiTheme } from '@rjsf/material-ui'; import CodeMirror from '@uiw/react-codemirror'; import React, { useCallback, useMemo, useState } from 'react'; import yaml from 'yaml'; -import { FieldExtensionOptions } from '../../extensions'; +import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import * as fieldOverrides from '../MultistepJsonForm/FieldOverrides'; import { TemplateEditorForm } from './TemplateEditorForm'; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor.tsx index 7055e42c84..dc67f687bb 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditor.tsx @@ -15,7 +15,7 @@ */ import { makeStyles } from '@material-ui/core'; import React, { useState } from 'react'; -import { FieldExtensionOptions } from '../../extensions'; +import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import type { LayoutOptions } from '../../layouts'; import { TemplateDirectoryAccess } from '../../lib/filesystem'; import { DirectoryEditorProvider } from './DirectoryEditorContext'; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx index 192a9696cf..c62112a89c 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorForm.tsx @@ -19,9 +19,11 @@ import { makeStyles } from '@material-ui/core/styles'; import React, { Component, ReactNode, useMemo, useState } from 'react'; import useDebounce from 'react-use/lib/useDebounce'; import yaml from 'yaml'; -import { FieldExtensionOptions } from '../../extensions'; +import { + FieldExtensionOptions, + TemplateParameterSchema, +} from '@backstage/plugin-scaffolder-react'; import { LayoutOptions } from '../../layouts'; -import { TemplateParameterSchema } from '../../types'; import { MultistepJsonForm } from '../MultistepJsonForm'; import { createValidator } from '../TemplatePage'; import { useDirectoryEditor } from './DirectoryEditorContext'; diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx index 8847b85373..20691a8e85 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateEditorPage.tsx @@ -23,7 +23,7 @@ import { CustomFieldExplorer } from './CustomFieldExplorer'; import { TemplateEditorIntro } from './TemplateEditorIntro'; import { TemplateEditor } from './TemplateEditor'; import { TemplateFormPreviewer } from './TemplateFormPreviewer'; -import { FieldExtensionOptions } from '../../extensions'; +import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import type { LayoutOptions } from '../../layouts'; type Selection = diff --git a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateFormPreviewer.tsx b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateFormPreviewer.tsx index 5bc32ed581..884305bf64 100644 --- a/plugins/scaffolder/src/components/TemplateEditorPage/TemplateFormPreviewer.tsx +++ b/plugins/scaffolder/src/components/TemplateEditorPage/TemplateFormPreviewer.tsx @@ -32,7 +32,7 @@ import CloseIcon from '@material-ui/icons/Close'; import React, { useCallback, useState } from 'react'; import useAsync from 'react-use/lib/useAsync'; import yaml from 'yaml'; -import { FieldExtensionOptions } from '../../extensions'; +import { FieldExtensionOptions } from '@backstage/plugin-scaffolder-react'; import { LayoutOptions } from '../../layouts'; import { TemplateEditorForm } from './TemplateEditorForm'; import { TemplateEditorTextArea } from './TemplateEditorTextArea'; diff --git a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx index 5d02bc436d..5773691438 100644 --- a/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx +++ b/plugins/scaffolder/src/components/TemplatePage/TemplatePage.tsx @@ -20,12 +20,12 @@ import React, { ComponentType, useCallback, useContext, useState } from 'react'; import { Navigate, useNavigate } from 'react-router-dom'; import useAsync from 'react-use/lib/useAsync'; import { scaffolderApiRef } from '../../api'; -import { FieldExtensionOptions } from '../../extensions'; import { SecretsContext } from '../secrets/SecretsContext'; import { rootRouteRef, scaffolderTaskRouteRef, selectedTemplateRouteRef, + FieldExtensionOptions, } from '@backstage/plugin-scaffolder-react'; import { MultistepJsonForm } from '../MultistepJsonForm'; import { createValidator } from './createValidator'; diff --git a/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts b/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts index f549c9e7f2..177697eda0 100644 --- a/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts +++ b/plugins/scaffolder/src/components/TemplatePage/createValidator.test.ts @@ -15,7 +15,7 @@ */ import { createValidator } from './createValidator'; -import { CustomFieldValidator } from '../../extensions'; +import { CustomFieldValidator } from '@backstage/plugin-scaffolder-react'; import { ApiHolder } from '@backstage/core-plugin-api'; import { FormValidation } from '@rjsf/core'; diff --git a/plugins/scaffolder/src/components/TemplatePage/createValidator.ts b/plugins/scaffolder/src/components/TemplatePage/createValidator.ts index 9cd1489a02..4a64481fc3 100644 --- a/plugins/scaffolder/src/components/TemplatePage/createValidator.ts +++ b/plugins/scaffolder/src/components/TemplatePage/createValidator.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { CustomFieldValidator } from '../../extensions'; +import { CustomFieldValidator } from '@backstage/plugin-scaffolder-react'; import { FormValidation } from '@rjsf/core'; import { JsonObject, JsonValue } from '@backstage/types'; import { ApiHolder } from '@backstage/core-plugin-api'; diff --git a/plugins/scaffolder/src/components/fields/utils.ts b/plugins/scaffolder/src/components/fields/utils.ts index 2d3e2aab1e..7b59f1da90 100644 --- a/plugins/scaffolder/src/components/fields/utils.ts +++ b/plugins/scaffolder/src/components/fields/utils.ts @@ -19,7 +19,7 @@ import zodToJsonSchema from 'zod-to-json-schema'; import { CustomFieldExtensionSchema, FieldExtensionComponentProps, -} from '../../extensions'; +} from '@backstage/plugin-scaffolder-react'; /** * @public diff --git a/plugins/scaffolder/src/index.ts b/plugins/scaffolder/src/index.ts index c18abf92fd..a486f2ff8d 100644 --- a/plugins/scaffolder/src/index.ts +++ b/plugins/scaffolder/src/index.ts @@ -36,19 +36,8 @@ export type { ScaffolderTask, ScaffolderTaskOutput, ScaffolderTaskStatus, - TemplateParameterSchema, } from './types'; -export { - createScaffolderFieldExtension, - ScaffolderFieldExtensions, -} from './extensions'; -export type { - CustomFieldExtensionSchema, - CustomFieldValidator, - FieldExtensionOptions, - FieldExtensionComponentProps, - FieldExtensionComponent, -} from './extensions'; + export { createScaffolderLayout, ScaffolderLayouts } from './layouts'; export type { LayoutOptions, LayoutTemplate, LayoutComponent } from './layouts'; export { @@ -64,10 +53,23 @@ export { export * from './components'; export { + createScaffolderFieldExtension, + ScaffolderFieldExtensions, rootRouteRef, nextRouteRef, selectedTemplateRouteRef, nextSelectedTemplateRouteRef, + createNextScaffolderFieldExtension, + type TemplateParameterSchema, + type NextCustomFieldValidator, + type NextFieldExtensionOptions, + type NextFieldExtensionComponentProps, + type FormProps, + type CustomFieldExtensionSchema, + type CustomFieldValidator, + type FieldExtensionOptions, + type FieldExtensionComponentProps, + type FieldExtensionComponent, } from '@backstage/plugin-scaffolder-react'; export type { TaskPageProps } from './components/TaskPage'; @@ -76,10 +78,3 @@ export type { TaskPageProps } from './components/TaskPage'; export { NextScaffolderPage } from './plugin'; export type { NextRouterProps } from './next'; export type { TemplateGroupFilter } from './next'; -export type { FormProps } from './next'; -export { - createNextScaffolderFieldExtension, - type NextCustomFieldValidator, - type NextFieldExtensionOptions, - type NextFieldExtensionComponentProps, -} from './extensions'; diff --git a/plugins/scaffolder/src/next/Router/Router.test.tsx b/plugins/scaffolder/src/next/Router/Router.test.tsx index 89f8f6ecd3..4e5535be6c 100644 --- a/plugins/scaffolder/src/next/Router/Router.test.tsx +++ b/plugins/scaffolder/src/next/Router/Router.test.tsx @@ -21,7 +21,7 @@ import { renderInTestApp } from '@backstage/test-utils'; import { createScaffolderFieldExtension, ScaffolderFieldExtensions, -} from '../../extensions'; +} from '@backstage/plugin-scaffolder-react'; import { scaffolderPlugin } from '../../plugin'; jest.mock('../TemplateListPage', () => ({ diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index 97985642f9..ea620a7820 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -20,17 +20,17 @@ import { TemplateWizardPage } from '../TemplateWizardPage'; import { FIELD_EXTENSION_WRAPPER_KEY, FIELD_EXTENSION_KEY, - DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS, NextFieldExtensionOptions, FieldExtensionOptions, -} from '../../extensions'; + type FormProps, +} from '@backstage/plugin-scaffolder-react'; import { useElementFilter } from '@backstage/core-plugin-api'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { TemplateGroupFilter } from '../TemplateListPage/TemplateGroups'; import { nextSelectedTemplateRouteRef } from '@backstage/plugin-scaffolder-react'; import { SecretsContextProvider } from '../../components/secrets/SecretsContext'; -import type { FormProps } from '../types'; +import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default'; /** * The Props for the Scaffolder Router diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.test.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.test.tsx index 59c6989c0d..681aea2c6f 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.test.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.test.tsx @@ -18,7 +18,7 @@ jest.mock('./TemplateCard', () => ({ TemplateCard: jest.fn(() => null) })); import React from 'react'; import { TemplateGroup } from './TemplateGroup'; import { render } from '@testing-library/react'; -import { TemplateCard } from './TemplateCard'; +import { TemplateCard } from '@backstage/plugin-scaffolder-react'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; describe('TemplateGroup', () => { diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.tsx index 4344c195ae..cd7e9bb6c4 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroup.tsx @@ -22,7 +22,10 @@ import { Link, } from '@backstage/core-components'; import { Typography } from '@material-ui/core'; -import { TemplateCard, TemplateCardProps } from './TemplateCard'; +import { + TemplateCard, + TemplateCardProps, +} from '@backstage/plugin-scaffolder-react'; import { stringifyEntityRef } from '@backstage/catalog-model'; export interface TemplateGroupProps { diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx index 75da592bba..2bb8eb5f8b 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx +++ b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx @@ -22,7 +22,6 @@ import { InfoCard, MarkdownContent, } from '@backstage/core-components'; -import { NextFieldExtensionOptions } from '../../extensions'; import { Navigate, useNavigate } from 'react-router-dom'; import { stringifyEntityRef } from '@backstage/catalog-model'; import { @@ -35,7 +34,10 @@ import { import { scaffolderApiRef } from '../../api'; import useAsync from 'react-use/lib/useAsync'; import { makeStyles } from '@material-ui/core'; -import { Stepper } from '@backstage/plugin-scaffolder-react'; +import { + Stepper, + NextFieldExtensionOptions, +} from '@backstage/plugin-scaffolder-react'; import { BackstageTheme } from '@backstage/theme'; import { nextRouteRef, @@ -44,7 +46,7 @@ import { } from '@backstage/plugin-scaffolder-react'; import { SecretsContext } from '../../components/secrets/SecretsContext'; import { JsonValue } from '@backstage/types'; -import type { FormProps } from '../types'; +import type { FormProps } from '@backstage/plugin-scaffolder-react'; export type TemplateWizardPageProps = { customFieldExtensions: NextFieldExtensionOptions[]; diff --git a/plugins/scaffolder/src/next/index.ts b/plugins/scaffolder/src/next/index.ts index 3a874e3b41..30fbb7ff15 100644 --- a/plugins/scaffolder/src/next/index.ts +++ b/plugins/scaffolder/src/next/index.ts @@ -17,4 +17,4 @@ export * from './Router'; export * from './TemplateListPage'; export * from './TemplateWizardPage'; -export type { FormProps } from './types'; +export type { FormProps } from '@backstage/plugin-scaffolder-react'; diff --git a/plugins/scaffolder/src/plugin.tsx b/plugins/scaffolder/src/plugin.tsx index f6a8915c48..5049f8a050 100644 --- a/plugins/scaffolder/src/plugin.tsx +++ b/plugins/scaffolder/src/plugin.tsx @@ -15,6 +15,13 @@ */ import { scmIntegrationsApiRef } from '@backstage/integration-react'; +import { + nextRouteRef, + registerComponentRouteRef, + rootRouteRef, + viewTechDocRouteRef, + createScaffolderFieldExtension, +} from '@backstage/plugin-scaffolder-react'; import { scaffolderApiRef, ScaffolderClient } from './api'; import { EntityPicker, @@ -34,13 +41,6 @@ import { RepoUrlPicker, RepoUrlPickerSchema, } from './components/fields/RepoUrlPicker/RepoUrlPicker'; -import { createScaffolderFieldExtension } from './extensions'; -import { - nextRouteRef, - registerComponentRouteRef, - rootRouteRef, - viewTechDocRouteRef, -} from '@backstage/plugin-scaffolder-react'; import { createApiFactory, createPlugin, diff --git a/plugins/scaffolder/src/types.ts b/plugins/scaffolder/src/types.ts index acb0f0e114..0bde515bda 100644 --- a/plugins/scaffolder/src/types.ts +++ b/plugins/scaffolder/src/types.ts @@ -14,6 +14,7 @@ * limitations under the License. */ import { TaskSpec, TaskStep } from '@backstage/plugin-scaffolder-common'; +import { TemplateParameterSchema } from '@backstage/plugin-scaffolder-react'; import { JsonObject, JsonValue, Observable } from '@backstage/types'; import { JSONSchema7 } from 'json-schema'; @@ -71,22 +72,6 @@ export type ScaffolderTaskOutput = { [key: string]: unknown; }; -/** - * The shape of each entry of parameters which gets rendered - * as a separate step in the wizard input - * - * @public - */ -export type TemplateParameterSchema = { - title: string; - description?: string; - steps: Array<{ - title: string; - description?: string; - schema: JsonObject; - }>; -}; - /** * The shape of a `LogEvent` message from the `scaffolder-backend` * diff --git a/yarn.lock b/yarn.lock index 827fa3423a..00f8355d8b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7461,7 +7461,9 @@ __metadata: "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" "@backstage/errors": "workspace:^" + "@backstage/plugin-catalog": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" + "@backstage/plugin-catalog-react": "workspace:^" "@backstage/plugin-scaffolder-common": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" @@ -7486,6 +7488,7 @@ __metadata: json-schema-library: ^7.3.9 lodash: ^4.17.21 qs: ^6.9.4 + zen-observable: ^0.10.0 zod: ~3.18.0 zod-to-json-schema: ~3.18.0 peerDependencies: