diff --git a/plugins/scaffolder/src/components/Router.tsx b/plugins/scaffolder/src/components/Router.tsx
index aeb90b37d4..fab5eb50c8 100644
--- a/plugins/scaffolder/src/components/Router.tsx
+++ b/plugins/scaffolder/src/components/Router.tsx
@@ -21,7 +21,7 @@ import { TemplatePage } from './TemplatePage';
import { TaskPage } from './TaskPage';
import { ActionsPage } from './ActionsPage';
-export const Router = ({ children }: React.PropsWithChildren<{}>) => {
+export const Router = () => {
return (
<>
@@ -30,7 +30,6 @@ export const Router = ({ children }: React.PropsWithChildren<{}>) => {
} />
} />
- {children}
>
);
};
diff --git a/plugins/scaffolder/src/extensions/index.tsx b/plugins/scaffolder/src/extensions/index.tsx
index d448a89960..acc3de38a0 100644
--- a/plugins/scaffolder/src/extensions/index.tsx
+++ b/plugins/scaffolder/src/extensions/index.tsx
@@ -13,29 +13,29 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import { JsonValue } from '@backstage/config';
-import { Extension, useApi } from '@backstage/core';
-import { FieldValidation, Field } from '@rjsf/core';
-import { scaffolderApiRef } from '../api';
+import { Extension, attachComponentData } from '@backstage/core';
+import { FieldValidation, FieldProps } from '@rjsf/core';
-export type FieldExtensionOptions = {
+export type FieldExtensionOptions = {
name: string;
- component: Field;
- validation: (data: JsonValue, field: FieldValidation) => void;
+ component: (props: FieldProps) => JSX.Element | null;
+ validation?: (data: T, field: FieldValidation) => void;
};
-export function createScaffolderFieldExtension(
- options: FieldExtensionOptions,
-): Extension {
- const WrappingRegister = () => {
- const scaffolderApi = useApi(scaffolderApiRef);
- scaffolderApi.registerCustomField(options);
- return null;
- };
-
+export function createScaffolderFieldExtension(
+ options: FieldExtensionOptions,
+): Extension {
return {
expose() {
- return WrappingRegister;
+ const FieldExtensionDataHolder: any = () => null;
+
+ attachComponentData(
+ FieldExtensionDataHolder,
+ 'scaffolder.extensions.field.v1',
+ options,
+ );
+
+ return FieldExtensionDataHolder;
},
};
}
diff --git a/plugins/scaffolder/src/plugin.ts b/plugins/scaffolder/src/plugin.ts
index 85456b7e2e..0177425098 100644
--- a/plugins/scaffolder/src/plugin.ts
+++ b/plugins/scaffolder/src/plugin.ts
@@ -22,8 +22,8 @@ import {
discoveryApiRef,
identityApiRef,
} from '@backstage/core';
-import { OwnerPicker as OwnerPickerComponent } from './components/fields/OwnerPicker';
-import { RepoUrlPicker as RepoUrlPickerComponent } from './components/fields/RepoUrlPicker';
+import { OwnerPicker } from './components/fields/OwnerPicker';
+import { RepoUrlPicker } from './components/fields/RepoUrlPicker';
import { scmIntegrationsApiRef } from '@backstage/integration-react';
import { scaffolderApiRef, ScaffolderClient } from './api';
import { createScaffolderFieldExtension } from './extensions';
@@ -51,12 +51,12 @@ export const scaffolderPlugin = createPlugin({
},
});
-export const RepoUrlPicker = scaffolderPlugin.provide(
- createScaffolderFieldExtension({
- // TODO: work out how to type this component part so we can enforce FieldComponent from RJSF
- component: RepoUrlPickerComponent,
+export const RepoUrlPickerFieldExtension = scaffolderPlugin.provide(
+ createScaffolderFieldExtension({
+ // TODO(blam): work out how to fix these types properly.
+ component: RepoUrlPicker,
name: 'RepoUrlPicker',
- validation: (value: JsonValue, validation) => {
+ validation: (value, validation) => {
try {
const { host, searchParams } = new URL(`https://${value}`);
if (!host || !searchParams.get('owner') || !searchParams.get('repo')) {
@@ -69,11 +69,11 @@ export const RepoUrlPicker = scaffolderPlugin.provide(
}),
);
-export const OwnerPicker = scaffolderPlugin.provide(
- createScaffolderFieldExtension({
- component: OwnerPickerComponent,
+export const OwnerPickerFieldExtension = scaffolderPlugin.provide(
+ createScaffolderFieldExtension({
+ // TODO(blam): work out how to fix these types properly.
+ component: OwnerPicker,
name: 'OwnerPicker',
- validation: () => {},
}),
);
export const ScaffolderPage = scaffolderPlugin.provide(