From cfa7d685660f5c44dc65100bc674cc31b7ae780f Mon Sep 17 00:00:00 2001 From: Tim Hansen Date: Wed, 18 Dec 2024 15:40:25 -0700 Subject: [PATCH 1/5] Add ApiBlueprint for form-decorators Signed-off-by: Tim Hansen --- .../src/alpha/api/FormDecoratorsApi.ts | 31 +++++++++++++++++++ plugins/scaffolder/src/alpha/api/index.ts | 2 +- plugins/scaffolder/src/alpha/plugin.tsx | 2 ++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts b/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts index 13c4b6d1a2..bc48ee3436 100644 --- a/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts +++ b/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts @@ -14,8 +14,14 @@ * limitations under the License. */ +import { + ApiBlueprint, + createApiFactory, + createExtensionInput, +} from '@backstage/frontend-plugin-api'; import { ScaffolderFormDecoratorsApi } from './types'; import { ScaffolderFormDecorator } from '@backstage/plugin-scaffolder-react/alpha'; +import { formDecoratorsApiRef } from './ref'; /** @alpha */ export class DefaultScaffolderFormDecoratorsApi @@ -37,3 +43,28 @@ export class DefaultScaffolderFormDecoratorsApi return this.options.decorators; } } + +/** @alpha */ +export const formDecoratorsApi = ApiBlueprint.makeWithOverrides({ + name: 'form-decorators', + inputs: { + // TODO: this should come from the inputs that the form decorators use + formDecorators: createExtensionInput([]), + }, + factory(originalFactory, { inputs }) { + // TODO: this should come from the inputs that the form decorators use + const formDecorators = + inputs.formDecorators as unknown as ScaffolderFormDecorator[]; + + return originalFactory({ + factory: createApiFactory({ + api: formDecoratorsApiRef, + deps: {}, + factory: () => + DefaultScaffolderFormDecoratorsApi.create({ + decorators: formDecorators, + }), + }), + }); + }, +}); diff --git a/plugins/scaffolder/src/alpha/api/index.ts b/plugins/scaffolder/src/alpha/api/index.ts index 07d4b65a3b..b6161dd252 100644 --- a/plugins/scaffolder/src/alpha/api/index.ts +++ b/plugins/scaffolder/src/alpha/api/index.ts @@ -16,4 +16,4 @@ export { formDecoratorsApiRef } from './ref'; export type { ScaffolderFormDecoratorsApi } from './types'; -export { DefaultScaffolderFormDecoratorsApi } from './FormDecoratorsApi'; +export * from './FormDecoratorsApi'; diff --git a/plugins/scaffolder/src/alpha/plugin.tsx b/plugins/scaffolder/src/alpha/plugin.tsx index 44ec1f5d4c..e281f51b0f 100644 --- a/plugins/scaffolder/src/alpha/plugin.tsx +++ b/plugins/scaffolder/src/alpha/plugin.tsx @@ -33,6 +33,7 @@ import { scaffolderApi, } from './extensions'; import { formFieldsApi } from '@backstage/plugin-scaffolder-react/alpha'; +import { formDecoratorsApi } from './api'; /** @alpha */ export default createFrontendPlugin({ @@ -53,6 +54,7 @@ export default createFrontendPlugin({ scaffolderApi, scaffolderPage, scaffolderNavItem, + formDecoratorsApi, formFieldsApi, repoUrlPickerFormField, ], From 6bb6a7c7c31ee35611461e7508f984d5617eace8 Mon Sep 17 00:00:00 2001 From: Tim Hansen Date: Fri, 20 Dec 2024 08:04:26 -0700 Subject: [PATCH 2/5] Add FormDecoratorBlueprint Signed-off-by: Tim Hansen Co-authored-by: blam --- .../blueprints/FormDecoratorBlueprint.tsx | 41 +++++++++++++++++++ .../src/next/blueprints/index.ts | 1 + .../src/alpha/api/FormDecoratorsApi.ts | 12 +++--- 3 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx diff --git a/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx b/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx new file mode 100644 index 0000000000..73e55948bb --- /dev/null +++ b/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx @@ -0,0 +1,41 @@ +/* + * Copyright 2024 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. + */ +import { + createExtensionBlueprint, + createExtensionDataRef, +} from '@backstage/frontend-plugin-api'; +import { ScaffolderFormDecorator } from '../extensions'; + +const formDecoratorExtensionDataRef = + createExtensionDataRef().with({ + id: 'scaffolder.form-decorator-loader', + }); + +/** + * @alpha + * Creates extensions that are Field Extensions for the Scaffolder + * */ +export const FormDecoratorBlueprint = createExtensionBlueprint({ + kind: 'scaffolder-form-decorator', + attachTo: { id: 'api:scaffolder/form-decorator', input: 'formDecorators' }, + dataRefs: { + formDecoratorLoader: formDecoratorExtensionDataRef, + }, + output: [formDecoratorExtensionDataRef], + *factory(params: { decorator: ScaffolderFormDecorator }) { + yield formDecoratorExtensionDataRef(params.decorator); + }, +}); diff --git a/plugins/scaffolder-react/src/next/blueprints/index.ts b/plugins/scaffolder-react/src/next/blueprints/index.ts index 165c583ac8..d9d0d2e0b3 100644 --- a/plugins/scaffolder-react/src/next/blueprints/index.ts +++ b/plugins/scaffolder-react/src/next/blueprints/index.ts @@ -14,5 +14,6 @@ * limitations under the License. */ +export * from './FormDecoratorBlueprint'; export * from './FormFieldBlueprint'; export * from './types'; diff --git a/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts b/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts index bc48ee3436..41bf91dba0 100644 --- a/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts +++ b/plugins/scaffolder/src/alpha/api/FormDecoratorsApi.ts @@ -22,6 +22,7 @@ import { import { ScaffolderFormDecoratorsApi } from './types'; import { ScaffolderFormDecorator } from '@backstage/plugin-scaffolder-react/alpha'; import { formDecoratorsApiRef } from './ref'; +import { FormDecoratorBlueprint } from '@backstage/plugin-scaffolder-react/alpha'; /** @alpha */ export class DefaultScaffolderFormDecoratorsApi @@ -48,13 +49,14 @@ export class DefaultScaffolderFormDecoratorsApi export const formDecoratorsApi = ApiBlueprint.makeWithOverrides({ name: 'form-decorators', inputs: { - // TODO: this should come from the inputs that the form decorators use - formDecorators: createExtensionInput([]), + formDecorators: createExtensionInput([ + FormDecoratorBlueprint.dataRefs.formDecoratorLoader, + ]), }, factory(originalFactory, { inputs }) { - // TODO: this should come from the inputs that the form decorators use - const formDecorators = - inputs.formDecorators as unknown as ScaffolderFormDecorator[]; + const formDecorators = inputs.formDecorators.map(e => + e.get(FormDecoratorBlueprint.dataRefs.formDecoratorLoader), + ); return originalFactory({ factory: createApiFactory({ From 528e51e258a3d2cb5d948b1ebd1f2dd287fed503 Mon Sep 17 00:00:00 2001 From: Tim Hansen Date: Wed, 8 Jan 2025 15:30:12 -0700 Subject: [PATCH 3/5] Fix attachTo Signed-off-by: Tim Hansen --- .../src/next/blueprints/FormDecoratorBlueprint.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx b/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx index 73e55948bb..436b1df85c 100644 --- a/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx +++ b/plugins/scaffolder-react/src/next/blueprints/FormDecoratorBlueprint.tsx @@ -30,7 +30,7 @@ const formDecoratorExtensionDataRef = * */ export const FormDecoratorBlueprint = createExtensionBlueprint({ kind: 'scaffolder-form-decorator', - attachTo: { id: 'api:scaffolder/form-decorator', input: 'formDecorators' }, + attachTo: { id: 'api:scaffolder/form-decorators', input: 'formDecorators' }, dataRefs: { formDecoratorLoader: formDecoratorExtensionDataRef, }, From 47562876499fe4f34acdc1c1c4f1bb337df1682f Mon Sep 17 00:00:00 2001 From: Tim Hansen Date: Wed, 8 Jan 2025 15:35:25 -0700 Subject: [PATCH 4/5] changeset Signed-off-by: Tim Hansen --- .changeset/strong-schools-fix.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/strong-schools-fix.md diff --git a/.changeset/strong-schools-fix.md b/.changeset/strong-schools-fix.md new file mode 100644 index 0000000000..117d33a3eb --- /dev/null +++ b/.changeset/strong-schools-fix.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-scaffolder': patch +--- + +Added support for `FormDecoratorBlueprint` to create form decorators in the Scaffolder plugin From c830134b470dae7d2634d0e2bfa9028e605d5ca6 Mon Sep 17 00:00:00 2001 From: Tim Hansen Date: Thu, 9 Jan 2025 07:51:32 -0700 Subject: [PATCH 5/5] api-reports Signed-off-by: Tim Hansen --- plugins/scaffolder-react/report-alpha.api.md | 24 +++++++++ plugins/scaffolder/report-alpha.api.md | 52 ++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/plugins/scaffolder-react/report-alpha.api.md b/plugins/scaffolder-react/report-alpha.api.md index 4f9f86d1ac..4cddb48602 100644 --- a/plugins/scaffolder-react/report-alpha.api.md +++ b/plugins/scaffolder-react/report-alpha.api.md @@ -132,6 +132,30 @@ export const Form: ( props: PropsWithChildren, ) => React_2.JSX.Element; +// @alpha +export const FormDecoratorBlueprint: ExtensionBlueprint<{ + kind: 'scaffolder-form-decorator'; + name: undefined; + params: { + decorator: ScaffolderFormDecorator; + }; + output: ConfigurableExtensionDataRef< + ScaffolderFormDecorator, + 'scaffolder.form-decorator-loader', + {} + >; + inputs: {}; + config: {}; + configInput: {}; + dataRefs: { + formDecoratorLoader: ConfigurableExtensionDataRef< + ScaffolderFormDecorator, + 'scaffolder.form-decorator-loader', + {} + >; + }; +}>; + // @alpha export const FormFieldBlueprint: ExtensionBlueprint<{ kind: 'scaffolder-form-field'; diff --git a/plugins/scaffolder/report-alpha.api.md b/plugins/scaffolder/report-alpha.api.md index e272b57655..7623350d96 100644 --- a/plugins/scaffolder/report-alpha.api.md +++ b/plugins/scaffolder/report-alpha.api.md @@ -80,6 +80,33 @@ const _default: FrontendPlugin< factory: AnyApiFactory; }; }>; + 'api:scaffolder/form-decorators': ExtensionDefinition<{ + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef< + AnyApiFactory, + 'core.api.factory', + {} + >; + inputs: { + formDecorators: ExtensionInput< + ConfigurableExtensionDataRef< + ScaffolderFormDecorator, + 'scaffolder.form-decorator-loader', + {} + >, + { + singleton: false; + optional: false; + } + >; + }; + kind: 'api'; + name: 'form-decorators'; + params: { + factory: AnyApiFactory; + }; + }>; 'page:scaffolder': ExtensionDefinition<{ kind: 'page'; name: undefined; @@ -173,6 +200,31 @@ export class DefaultScaffolderFormDecoratorsApi getFormDecorators(): Promise; } +// @alpha (undocumented) +export const formDecoratorsApi: ExtensionDefinition<{ + config: {}; + configInput: {}; + output: ConfigurableExtensionDataRef; + inputs: { + formDecorators: ExtensionInput< + ConfigurableExtensionDataRef< + ScaffolderFormDecorator, + 'scaffolder.form-decorator-loader', + {} + >, + { + singleton: false; + optional: false; + } + >; + }; + kind: 'api'; + name: 'form-decorators'; + params: { + factory: AnyApiFactory; + }; +}>; + // @alpha (undocumented) export const formDecoratorsApiRef: ApiRef;