@backstage/plugin-scaffolder-react 1.0.0 → 1.1.0-next.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 +16 -0
- package/alpha/package.json +1 -1
- package/dist/index.alpha.d.ts +85 -4
- package/dist/index.beta.d.ts +60 -2
- package/dist/index.d.ts +60 -2
- package/dist/index.esm.js +164 -50
- package/dist/index.esm.js.map +1 -1
- package/package.json +12 -11
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @backstage/plugin-scaffolder-react
|
|
2
2
|
|
|
3
|
+
## 1.1.0-next.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 8c2966536b: Embed scaffolder workflow in other components
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- cbab8ac107: lock versions of `@rjsf/*-beta` packages
|
|
12
|
+
- d2ddde2108: Add `ScaffolderLayouts` to `NextScaffolderPage`
|
|
13
|
+
- Updated dependencies
|
|
14
|
+
- @backstage/plugin-catalog-react@1.3.0-next.0
|
|
15
|
+
- @backstage/catalog-model@1.1.6-next.0
|
|
16
|
+
- @backstage/catalog-client@1.3.1-next.0
|
|
17
|
+
- @backstage/plugin-scaffolder-common@1.2.5-next.0
|
|
18
|
+
|
|
3
19
|
## 1.0.0
|
|
4
20
|
|
|
5
21
|
### Major Changes
|
package/alpha/package.json
CHANGED
package/dist/index.alpha.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ import { JsonValue } from '@backstage/types';
|
|
|
16
16
|
import { Observable } from '@backstage/types';
|
|
17
17
|
import { PropsWithChildren } from 'react';
|
|
18
18
|
import { default as React_2 } from 'react';
|
|
19
|
+
import { ReactNode } from 'react';
|
|
19
20
|
import { SetStateAction } from 'react';
|
|
20
21
|
import { TaskSpec } from '@backstage/plugin-scaffolder-common';
|
|
21
22
|
import { TaskStep } from '@backstage/plugin-scaffolder-common';
|
|
@@ -68,6 +69,13 @@ export declare function createNextScaffolderFieldExtension<TReturnValue = unknow
|
|
|
68
69
|
*/
|
|
69
70
|
export declare function createScaffolderFieldExtension<TReturnValue = unknown, TInputProps = unknown>(options: FieldExtensionOptions<TReturnValue, TInputProps>): Extension<FieldExtensionComponent<TReturnValue, TInputProps>>;
|
|
70
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Method for creating custom Layouts that can be used in the scaffolder frontend form
|
|
74
|
+
*
|
|
75
|
+
* @public
|
|
76
|
+
*/
|
|
77
|
+
export declare function createScaffolderLayout<TInputProps = unknown>(options: LayoutOptions): Extension<LayoutComponent<TInputProps>>;
|
|
78
|
+
|
|
71
79
|
/**
|
|
72
80
|
* Type for the Custom Field Extension schema.
|
|
73
81
|
*
|
|
@@ -87,6 +95,11 @@ export declare type CustomFieldValidator<TFieldReturnValue> = (data: TFieldRetur
|
|
|
87
95
|
apiHolder: ApiHolder;
|
|
88
96
|
}) => void | Promise<void>;
|
|
89
97
|
|
|
98
|
+
/**
|
|
99
|
+
* @alpha
|
|
100
|
+
*/
|
|
101
|
+
export declare const EmbeddableWorkflow: (props: WorkflowProps) => JSX.Element;
|
|
102
|
+
|
|
90
103
|
/**
|
|
91
104
|
* Takes a step from a Backstage Template Manifest and converts it to a JSON Schema and UI Schema for rjsf
|
|
92
105
|
* @alpha
|
|
@@ -97,7 +110,8 @@ export declare const extractSchemaFromStep: (inputStep: JsonObject) => {
|
|
|
97
110
|
};
|
|
98
111
|
|
|
99
112
|
/**
|
|
100
|
-
*
|
|
113
|
+
* The type used to wrap up the Layout and embed the input props
|
|
114
|
+
*
|
|
101
115
|
* @public
|
|
102
116
|
*/
|
|
103
117
|
export declare type FieldExtensionComponent<_TReturnValue, _TInputProps> = () => null;
|
|
@@ -130,10 +144,33 @@ export declare type FieldExtensionOptions<TFieldReturnValue = unknown, TInputPro
|
|
|
130
144
|
/**
|
|
131
145
|
* Any `@rjsf/core` form properties that are publicly exposed to the `NextScaffolderpage`
|
|
132
146
|
*
|
|
133
|
-
* @
|
|
147
|
+
* @public
|
|
134
148
|
*/
|
|
135
149
|
export declare type FormProps = Pick<FormProps_2, 'transformErrors' | 'noHtml5Validate'>;
|
|
136
150
|
|
|
151
|
+
/**
|
|
152
|
+
* A type used to wrap up the FieldExtension to embed the ReturnValue and the InputProps
|
|
153
|
+
* @public
|
|
154
|
+
*/
|
|
155
|
+
export declare type LayoutComponent<_TInputProps> = () => null;
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* The type of layouts that is passed to the TemplateForms
|
|
159
|
+
*
|
|
160
|
+
* @public
|
|
161
|
+
*/
|
|
162
|
+
export declare interface LayoutOptions<P = any> {
|
|
163
|
+
name: string;
|
|
164
|
+
component: LayoutTemplate<P>;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* The field template from `@rjsf/core` which is a react component that gets passed `@rjsf/core` field related props.
|
|
169
|
+
*
|
|
170
|
+
* @public
|
|
171
|
+
*/
|
|
172
|
+
export declare type LayoutTemplate<T = any> = NonNullable<FormProps_2<T>['uiSchema']>['ui:ObjectFieldTemplate'];
|
|
173
|
+
|
|
137
174
|
/**
|
|
138
175
|
* The response shape for the `listActions` call to the `scaffolder-backend`
|
|
139
176
|
*
|
|
@@ -303,6 +340,13 @@ export declare interface ScaffolderGetIntegrationsListResponse {
|
|
|
303
340
|
}[];
|
|
304
341
|
}
|
|
305
342
|
|
|
343
|
+
/**
|
|
344
|
+
* The wrapping component for defining scaffolder layouts as children
|
|
345
|
+
*
|
|
346
|
+
* @public
|
|
347
|
+
*/
|
|
348
|
+
export declare const ScaffolderLayouts: React.ComponentType;
|
|
349
|
+
|
|
306
350
|
/** @public */
|
|
307
351
|
export declare type ScaffolderOutputLink = {
|
|
308
352
|
title?: string;
|
|
@@ -387,7 +431,7 @@ export declare const SecretsContextProvider: ({ children }: PropsWithChildren<{}
|
|
|
387
431
|
* The `Stepper` component is the Wizard that is rendered when a user selects a template
|
|
388
432
|
* @alpha
|
|
389
433
|
*/
|
|
390
|
-
export declare const Stepper: (
|
|
434
|
+
export declare const Stepper: (stepperProps: StepperProps) => JSX.Element;
|
|
391
435
|
|
|
392
436
|
/**
|
|
393
437
|
* The Props for {@link Stepper} component
|
|
@@ -399,7 +443,13 @@ export declare type StepperProps = {
|
|
|
399
443
|
templateName?: string;
|
|
400
444
|
FormProps?: FormProps;
|
|
401
445
|
initialState?: Record<string, JsonValue>;
|
|
402
|
-
|
|
446
|
+
onCreate: (values: Record<string, JsonValue>) => Promise<void>;
|
|
447
|
+
components?: {
|
|
448
|
+
ReviewStateComponent?: (props: ReviewStateProps) => JSX.Element;
|
|
449
|
+
createButtonText?: ReactNode;
|
|
450
|
+
reviewButtonText?: ReactNode;
|
|
451
|
+
};
|
|
452
|
+
layouts?: LayoutOptions[];
|
|
403
453
|
};
|
|
404
454
|
|
|
405
455
|
/**
|
|
@@ -470,12 +520,27 @@ export declare type TemplateParameterSchema = {
|
|
|
470
520
|
*/
|
|
471
521
|
export declare const useCustomFieldExtensions: <TComponentDataType = FieldExtensionOptions<unknown, unknown>>(outlet: React.ReactNode) => TComponentDataType[];
|
|
472
522
|
|
|
523
|
+
/**
|
|
524
|
+
* Hook that returns all custom field extensions from the current outlet.
|
|
525
|
+
* @public
|
|
526
|
+
*/
|
|
527
|
+
export declare const useCustomLayouts: <TComponentDataType = LayoutOptions<any>>(outlet: React.ReactNode) => TComponentDataType[];
|
|
528
|
+
|
|
473
529
|
/**
|
|
474
530
|
* This hook is used to get the formData from the query string.
|
|
475
531
|
* @alpha
|
|
476
532
|
*/
|
|
477
533
|
export declare const useFormDataFromQuery: (initialState?: Record<string, JsonValue>) => [Record<string, any>, Dispatch<SetStateAction<Record<string, any>>>];
|
|
478
534
|
|
|
535
|
+
/**
|
|
536
|
+
* @alpha
|
|
537
|
+
*/
|
|
538
|
+
export declare const useTemplateParameterSchema: (templateRef: string) => {
|
|
539
|
+
manifest: TemplateParameterSchema | undefined;
|
|
540
|
+
loading: boolean;
|
|
541
|
+
error: Error | undefined;
|
|
542
|
+
};
|
|
543
|
+
|
|
479
544
|
/**
|
|
480
545
|
* This hook will parse the template schema and return the steps with the
|
|
481
546
|
* parsed schema and uiSchema. Filtering out any steps or properties that
|
|
@@ -493,4 +558,20 @@ export declare const useTemplateSchema: (manifest: TemplateParameterSchema) => {
|
|
|
493
558
|
*/
|
|
494
559
|
export declare const useTemplateSecrets: () => ScaffolderUseTemplateSecrets;
|
|
495
560
|
|
|
561
|
+
/**
|
|
562
|
+
* @alpha
|
|
563
|
+
*/
|
|
564
|
+
export declare const Workflow: (workflowProps: WorkflowProps) => JSX.Element | null;
|
|
565
|
+
|
|
566
|
+
/**
|
|
567
|
+
* @alpha
|
|
568
|
+
*/
|
|
569
|
+
export declare type WorkflowProps = {
|
|
570
|
+
title?: string;
|
|
571
|
+
description?: string;
|
|
572
|
+
namespace: string;
|
|
573
|
+
templateName: string;
|
|
574
|
+
onError(error: Error | undefined): JSX.Element | null;
|
|
575
|
+
} & Pick<StepperProps, 'extensions' | 'FormProps' | 'components' | 'onCreate' | 'initialState' | 'layouts'>;
|
|
576
|
+
|
|
496
577
|
export { }
|
package/dist/index.beta.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ import { JsonValue } from '@backstage/types';
|
|
|
16
16
|
import { Observable } from '@backstage/types';
|
|
17
17
|
import { PropsWithChildren } from 'react';
|
|
18
18
|
import { default as React_2 } from 'react';
|
|
19
|
+
import { ReactNode } from 'react';
|
|
19
20
|
import { SetStateAction } from 'react';
|
|
20
21
|
import { TaskSpec } from '@backstage/plugin-scaffolder-common';
|
|
21
22
|
import { TaskStep } from '@backstage/plugin-scaffolder-common';
|
|
@@ -59,6 +60,13 @@ export declare type ActionExample = {
|
|
|
59
60
|
*/
|
|
60
61
|
export declare function createScaffolderFieldExtension<TReturnValue = unknown, TInputProps = unknown>(options: FieldExtensionOptions<TReturnValue, TInputProps>): Extension<FieldExtensionComponent<TReturnValue, TInputProps>>;
|
|
61
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Method for creating custom Layouts that can be used in the scaffolder frontend form
|
|
65
|
+
*
|
|
66
|
+
* @public
|
|
67
|
+
*/
|
|
68
|
+
export declare function createScaffolderLayout<TInputProps = unknown>(options: LayoutOptions): Extension<LayoutComponent<TInputProps>>;
|
|
69
|
+
|
|
62
70
|
/**
|
|
63
71
|
* Type for the Custom Field Extension schema.
|
|
64
72
|
*
|
|
@@ -78,10 +86,13 @@ export declare type CustomFieldValidator<TFieldReturnValue> = (data: TFieldRetur
|
|
|
78
86
|
apiHolder: ApiHolder;
|
|
79
87
|
}) => void | Promise<void>;
|
|
80
88
|
|
|
89
|
+
/* Excluded from this release type: EmbeddableWorkflow */
|
|
90
|
+
|
|
81
91
|
/* Excluded from this release type: extractSchemaFromStep */
|
|
82
92
|
|
|
83
93
|
/**
|
|
84
|
-
*
|
|
94
|
+
* The type used to wrap up the Layout and embed the input props
|
|
95
|
+
*
|
|
85
96
|
* @public
|
|
86
97
|
*/
|
|
87
98
|
export declare type FieldExtensionComponent<_TReturnValue, _TInputProps> = () => null;
|
|
@@ -111,7 +122,35 @@ export declare type FieldExtensionOptions<TFieldReturnValue = unknown, TInputPro
|
|
|
111
122
|
schema?: CustomFieldExtensionSchema;
|
|
112
123
|
};
|
|
113
124
|
|
|
114
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Any `@rjsf/core` form properties that are publicly exposed to the `NextScaffolderpage`
|
|
127
|
+
*
|
|
128
|
+
* @public
|
|
129
|
+
*/
|
|
130
|
+
export declare type FormProps = Pick<FormProps_2, 'transformErrors' | 'noHtml5Validate'>;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* A type used to wrap up the FieldExtension to embed the ReturnValue and the InputProps
|
|
134
|
+
* @public
|
|
135
|
+
*/
|
|
136
|
+
export declare type LayoutComponent<_TInputProps> = () => null;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* The type of layouts that is passed to the TemplateForms
|
|
140
|
+
*
|
|
141
|
+
* @public
|
|
142
|
+
*/
|
|
143
|
+
export declare interface LayoutOptions<P = any> {
|
|
144
|
+
name: string;
|
|
145
|
+
component: LayoutTemplate<P>;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* The field template from `@rjsf/core` which is a react component that gets passed `@rjsf/core` field related props.
|
|
150
|
+
*
|
|
151
|
+
* @public
|
|
152
|
+
*/
|
|
153
|
+
export declare type LayoutTemplate<T = any> = NonNullable<FormProps_2<T>['uiSchema']>['ui:ObjectFieldTemplate'];
|
|
115
154
|
|
|
116
155
|
/**
|
|
117
156
|
* The response shape for the `listActions` call to the `scaffolder-backend`
|
|
@@ -233,6 +272,13 @@ export declare interface ScaffolderGetIntegrationsListResponse {
|
|
|
233
272
|
}[];
|
|
234
273
|
}
|
|
235
274
|
|
|
275
|
+
/**
|
|
276
|
+
* The wrapping component for defining scaffolder layouts as children
|
|
277
|
+
*
|
|
278
|
+
* @public
|
|
279
|
+
*/
|
|
280
|
+
export declare const ScaffolderLayouts: React.ComponentType;
|
|
281
|
+
|
|
236
282
|
/** @public */
|
|
237
283
|
export declare type ScaffolderOutputLink = {
|
|
238
284
|
title?: string;
|
|
@@ -347,8 +393,16 @@ export declare type TemplateParameterSchema = {
|
|
|
347
393
|
*/
|
|
348
394
|
export declare const useCustomFieldExtensions: <TComponentDataType = FieldExtensionOptions<unknown, unknown>>(outlet: React.ReactNode) => TComponentDataType[];
|
|
349
395
|
|
|
396
|
+
/**
|
|
397
|
+
* Hook that returns all custom field extensions from the current outlet.
|
|
398
|
+
* @public
|
|
399
|
+
*/
|
|
400
|
+
export declare const useCustomLayouts: <TComponentDataType = LayoutOptions<any>>(outlet: React.ReactNode) => TComponentDataType[];
|
|
401
|
+
|
|
350
402
|
/* Excluded from this release type: useFormDataFromQuery */
|
|
351
403
|
|
|
404
|
+
/* Excluded from this release type: useTemplateParameterSchema */
|
|
405
|
+
|
|
352
406
|
/* Excluded from this release type: useTemplateSchema */
|
|
353
407
|
|
|
354
408
|
/**
|
|
@@ -358,4 +412,8 @@ export declare const useCustomFieldExtensions: <TComponentDataType = FieldExtens
|
|
|
358
412
|
*/
|
|
359
413
|
export declare const useTemplateSecrets: () => ScaffolderUseTemplateSecrets;
|
|
360
414
|
|
|
415
|
+
/* Excluded from this release type: Workflow */
|
|
416
|
+
|
|
417
|
+
/* Excluded from this release type: WorkflowProps */
|
|
418
|
+
|
|
361
419
|
export { }
|
package/dist/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ import { JsonValue } from '@backstage/types';
|
|
|
16
16
|
import { Observable } from '@backstage/types';
|
|
17
17
|
import { PropsWithChildren } from 'react';
|
|
18
18
|
import { default as React_2 } from 'react';
|
|
19
|
+
import { ReactNode } from 'react';
|
|
19
20
|
import { SetStateAction } from 'react';
|
|
20
21
|
import { TaskSpec } from '@backstage/plugin-scaffolder-common';
|
|
21
22
|
import { TaskStep } from '@backstage/plugin-scaffolder-common';
|
|
@@ -59,6 +60,13 @@ export declare type ActionExample = {
|
|
|
59
60
|
*/
|
|
60
61
|
export declare function createScaffolderFieldExtension<TReturnValue = unknown, TInputProps = unknown>(options: FieldExtensionOptions<TReturnValue, TInputProps>): Extension<FieldExtensionComponent<TReturnValue, TInputProps>>;
|
|
61
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Method for creating custom Layouts that can be used in the scaffolder frontend form
|
|
65
|
+
*
|
|
66
|
+
* @public
|
|
67
|
+
*/
|
|
68
|
+
export declare function createScaffolderLayout<TInputProps = unknown>(options: LayoutOptions): Extension<LayoutComponent<TInputProps>>;
|
|
69
|
+
|
|
62
70
|
/**
|
|
63
71
|
* Type for the Custom Field Extension schema.
|
|
64
72
|
*
|
|
@@ -78,10 +86,13 @@ export declare type CustomFieldValidator<TFieldReturnValue> = (data: TFieldRetur
|
|
|
78
86
|
apiHolder: ApiHolder;
|
|
79
87
|
}) => void | Promise<void>;
|
|
80
88
|
|
|
89
|
+
/* Excluded from this release type: EmbeddableWorkflow */
|
|
90
|
+
|
|
81
91
|
/* Excluded from this release type: extractSchemaFromStep */
|
|
82
92
|
|
|
83
93
|
/**
|
|
84
|
-
*
|
|
94
|
+
* The type used to wrap up the Layout and embed the input props
|
|
95
|
+
*
|
|
85
96
|
* @public
|
|
86
97
|
*/
|
|
87
98
|
export declare type FieldExtensionComponent<_TReturnValue, _TInputProps> = () => null;
|
|
@@ -111,7 +122,35 @@ export declare type FieldExtensionOptions<TFieldReturnValue = unknown, TInputPro
|
|
|
111
122
|
schema?: CustomFieldExtensionSchema;
|
|
112
123
|
};
|
|
113
124
|
|
|
114
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Any `@rjsf/core` form properties that are publicly exposed to the `NextScaffolderpage`
|
|
127
|
+
*
|
|
128
|
+
* @public
|
|
129
|
+
*/
|
|
130
|
+
export declare type FormProps = Pick<FormProps_2, 'transformErrors' | 'noHtml5Validate'>;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* A type used to wrap up the FieldExtension to embed the ReturnValue and the InputProps
|
|
134
|
+
* @public
|
|
135
|
+
*/
|
|
136
|
+
export declare type LayoutComponent<_TInputProps> = () => null;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* The type of layouts that is passed to the TemplateForms
|
|
140
|
+
*
|
|
141
|
+
* @public
|
|
142
|
+
*/
|
|
143
|
+
export declare interface LayoutOptions<P = any> {
|
|
144
|
+
name: string;
|
|
145
|
+
component: LayoutTemplate<P>;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* The field template from `@rjsf/core` which is a react component that gets passed `@rjsf/core` field related props.
|
|
150
|
+
*
|
|
151
|
+
* @public
|
|
152
|
+
*/
|
|
153
|
+
export declare type LayoutTemplate<T = any> = NonNullable<FormProps_2<T>['uiSchema']>['ui:ObjectFieldTemplate'];
|
|
115
154
|
|
|
116
155
|
/**
|
|
117
156
|
* The response shape for the `listActions` call to the `scaffolder-backend`
|
|
@@ -233,6 +272,13 @@ export declare interface ScaffolderGetIntegrationsListResponse {
|
|
|
233
272
|
}[];
|
|
234
273
|
}
|
|
235
274
|
|
|
275
|
+
/**
|
|
276
|
+
* The wrapping component for defining scaffolder layouts as children
|
|
277
|
+
*
|
|
278
|
+
* @public
|
|
279
|
+
*/
|
|
280
|
+
export declare const ScaffolderLayouts: React.ComponentType;
|
|
281
|
+
|
|
236
282
|
/** @public */
|
|
237
283
|
export declare type ScaffolderOutputLink = {
|
|
238
284
|
title?: string;
|
|
@@ -347,8 +393,16 @@ export declare type TemplateParameterSchema = {
|
|
|
347
393
|
*/
|
|
348
394
|
export declare const useCustomFieldExtensions: <TComponentDataType = FieldExtensionOptions<unknown, unknown>>(outlet: React.ReactNode) => TComponentDataType[];
|
|
349
395
|
|
|
396
|
+
/**
|
|
397
|
+
* Hook that returns all custom field extensions from the current outlet.
|
|
398
|
+
* @public
|
|
399
|
+
*/
|
|
400
|
+
export declare const useCustomLayouts: <TComponentDataType = LayoutOptions<any>>(outlet: React.ReactNode) => TComponentDataType[];
|
|
401
|
+
|
|
350
402
|
/* Excluded from this release type: useFormDataFromQuery */
|
|
351
403
|
|
|
404
|
+
/* Excluded from this release type: useTemplateParameterSchema */
|
|
405
|
+
|
|
352
406
|
/* Excluded from this release type: useTemplateSchema */
|
|
353
407
|
|
|
354
408
|
/**
|
|
@@ -358,4 +412,8 @@ export declare const useCustomFieldExtensions: <TComponentDataType = FieldExtens
|
|
|
358
412
|
*/
|
|
359
413
|
export declare const useTemplateSecrets: () => ScaffolderUseTemplateSecrets;
|
|
360
414
|
|
|
415
|
+
/* Excluded from this release type: Workflow */
|
|
416
|
+
|
|
417
|
+
/* Excluded from this release type: WorkflowProps */
|
|
418
|
+
|
|
361
419
|
export { }
|
package/dist/index.esm.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { attachComponentData, createApiRef, useElementFilter, useApi, featureFlagsApiRef, useAnalytics, useApiHolder, useApp } from '@backstage/core-plugin-api';
|
|
1
|
+
import { attachComponentData, createApiRef, useElementFilter, useApi, featureFlagsApiRef, useAnalytics, useApiHolder, useApp, errorApiRef } from '@backstage/core-plugin-api';
|
|
2
2
|
import { createVersionedContext, createVersionedValueMap, getOrCreateGlobalSingleton } from '@backstage/version-bridge';
|
|
3
|
-
import React, { useState, useContext, useCallback, useMemo } from 'react';
|
|
3
|
+
import React, { useState, useContext, useCallback, useMemo, useEffect } from 'react';
|
|
4
4
|
import { makeStyles, Stepper as Stepper$1, Step, StepLabel, Button, useTheme, Card, CardContent, Grid, Box, Divider, Chip, CardActions, Typography } from '@material-ui/core';
|
|
5
5
|
import { withTheme } from '@rjsf/core-v5';
|
|
6
6
|
import { Draft07 } from 'json-schema-library';
|
|
7
|
-
import { StructuredMetadataTable, ItemCardHeader, Link, MarkdownContent, UserIcon, Content, ItemCardGrid, ContentHeader } from '@backstage/core-components';
|
|
7
|
+
import { StructuredMetadataTable, ItemCardHeader, Link, MarkdownContent, UserIcon, Content, ItemCardGrid, ContentHeader, Progress, InfoCard } from '@backstage/core-components';
|
|
8
8
|
import validator from '@rjsf/validator-ajv6';
|
|
9
9
|
import qs from 'qs';
|
|
10
|
+
import useAsync from 'react-use/lib/useAsync';
|
|
10
11
|
import { RELATION_OWNED_BY, stringifyEntityRef } from '@backstage/catalog-model';
|
|
11
12
|
import { FavoriteEntity, getEntityRelations, EntityRefLinks } from '@backstage/plugin-catalog-react';
|
|
12
13
|
import LanguageIcon from '@material-ui/icons/Language';
|
|
@@ -81,6 +82,20 @@ const useCustomFieldExtensions = (outlet) => {
|
|
|
81
82
|
);
|
|
82
83
|
};
|
|
83
84
|
|
|
85
|
+
const LAYOUTS_KEY = "scaffolder.layout.v1";
|
|
86
|
+
const LAYOUTS_WRAPPER_KEY = "scaffolder.layouts.wrapper.v1";
|
|
87
|
+
|
|
88
|
+
const useCustomLayouts = (outlet) => {
|
|
89
|
+
return useElementFilter(
|
|
90
|
+
outlet,
|
|
91
|
+
(elements) => elements.selectByComponentData({
|
|
92
|
+
key: LAYOUTS_WRAPPER_KEY
|
|
93
|
+
}).findComponentData({
|
|
94
|
+
key: LAYOUTS_KEY
|
|
95
|
+
})
|
|
96
|
+
);
|
|
97
|
+
};
|
|
98
|
+
|
|
84
99
|
function isObject(value) {
|
|
85
100
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
86
101
|
}
|
|
@@ -197,6 +212,37 @@ const createAsyncValidators = (rootSchema, validators, context) => {
|
|
|
197
212
|
};
|
|
198
213
|
};
|
|
199
214
|
|
|
215
|
+
const ReviewState = (props) => {
|
|
216
|
+
const reviewData = Object.fromEntries(
|
|
217
|
+
Object.entries(props.formState).map(([key, value]) => {
|
|
218
|
+
var _a;
|
|
219
|
+
for (const step of props.schemas) {
|
|
220
|
+
const parsedSchema = new Draft07(step.mergedSchema);
|
|
221
|
+
const definitionInSchema = parsedSchema.getSchema(
|
|
222
|
+
`#/${key}`,
|
|
223
|
+
props.formState
|
|
224
|
+
);
|
|
225
|
+
if (definitionInSchema) {
|
|
226
|
+
const backstageReviewOptions = (_a = definitionInSchema["ui:backstage"]) == null ? void 0 : _a.review;
|
|
227
|
+
if (backstageReviewOptions) {
|
|
228
|
+
if (backstageReviewOptions.mask) {
|
|
229
|
+
return [key, backstageReviewOptions.mask];
|
|
230
|
+
}
|
|
231
|
+
if (backstageReviewOptions.show === false) {
|
|
232
|
+
return [];
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (definitionInSchema["ui:widget"] === "password") {
|
|
236
|
+
return [key, "******"];
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return [key, value];
|
|
241
|
+
})
|
|
242
|
+
);
|
|
243
|
+
return /* @__PURE__ */ React.createElement(StructuredMetadataTable, { metadata: reviewData });
|
|
244
|
+
};
|
|
245
|
+
|
|
200
246
|
const useTemplateSchema = (manifest) => {
|
|
201
247
|
const featureFlags = useApi(featureFlagsApiRef);
|
|
202
248
|
const steps = manifest.steps.map(({ title, description, schema }) => ({
|
|
@@ -231,37 +277,6 @@ const useTemplateSchema = (manifest) => {
|
|
|
231
277
|
};
|
|
232
278
|
};
|
|
233
279
|
|
|
234
|
-
const ReviewState = (props) => {
|
|
235
|
-
const reviewData = Object.fromEntries(
|
|
236
|
-
Object.entries(props.formState).map(([key, value]) => {
|
|
237
|
-
var _a;
|
|
238
|
-
for (const step of props.schemas) {
|
|
239
|
-
const parsedSchema = new Draft07(step.mergedSchema);
|
|
240
|
-
const definitionInSchema = parsedSchema.getSchema(
|
|
241
|
-
`#/${key}`,
|
|
242
|
-
props.formState
|
|
243
|
-
);
|
|
244
|
-
if (definitionInSchema) {
|
|
245
|
-
const backstageReviewOptions = (_a = definitionInSchema["ui:backstage"]) == null ? void 0 : _a.review;
|
|
246
|
-
if (backstageReviewOptions) {
|
|
247
|
-
if (backstageReviewOptions.mask) {
|
|
248
|
-
return [key, backstageReviewOptions.mask];
|
|
249
|
-
}
|
|
250
|
-
if (backstageReviewOptions.show === false) {
|
|
251
|
-
return [];
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
if (definitionInSchema["ui:widget"] === "password") {
|
|
255
|
-
return [key, "******"];
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
return [key, value];
|
|
260
|
-
})
|
|
261
|
-
);
|
|
262
|
-
return /* @__PURE__ */ React.createElement(StructuredMetadataTable, { metadata: reviewData });
|
|
263
|
-
};
|
|
264
|
-
|
|
265
280
|
const useFormDataFromQuery = (initialState) => {
|
|
266
281
|
return useState(() => {
|
|
267
282
|
if (initialState) {
|
|
@@ -278,7 +293,38 @@ const useFormDataFromQuery = (initialState) => {
|
|
|
278
293
|
});
|
|
279
294
|
};
|
|
280
295
|
|
|
281
|
-
const
|
|
296
|
+
const useTemplateParameterSchema = (templateRef) => {
|
|
297
|
+
const scaffolderApi = useApi(scaffolderApiRef);
|
|
298
|
+
const { value, loading, error } = useAsync(
|
|
299
|
+
() => scaffolderApi.getTemplateParameterSchema(templateRef),
|
|
300
|
+
[scaffolderApi, templateRef]
|
|
301
|
+
);
|
|
302
|
+
return { manifest: value, loading, error };
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
const useTransformSchemaToProps = (step, options = {}) => {
|
|
306
|
+
var _a;
|
|
307
|
+
const { layouts = [] } = options;
|
|
308
|
+
const objectFieldTemplate = step == null ? void 0 : step.uiSchema["ui:ObjectFieldTemplate"];
|
|
309
|
+
if (typeof objectFieldTemplate !== "string") {
|
|
310
|
+
return step;
|
|
311
|
+
}
|
|
312
|
+
const Layout = (_a = layouts.find(
|
|
313
|
+
(layout) => layout.name === objectFieldTemplate
|
|
314
|
+
)) == null ? void 0 : _a.component;
|
|
315
|
+
if (!Layout) {
|
|
316
|
+
return step;
|
|
317
|
+
}
|
|
318
|
+
return {
|
|
319
|
+
...step,
|
|
320
|
+
uiSchema: {
|
|
321
|
+
...step.uiSchema,
|
|
322
|
+
["ui:ObjectFieldTemplate"]: Layout
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
const useStyles$4 = makeStyles((theme) => ({
|
|
282
328
|
backButton: {
|
|
283
329
|
marginRight: theme.spacing(1)
|
|
284
330
|
},
|
|
@@ -292,15 +338,21 @@ const useStyles$3 = makeStyles((theme) => ({
|
|
|
292
338
|
}
|
|
293
339
|
}));
|
|
294
340
|
const Form = withTheme(require("@rjsf/material-ui-v5").Theme);
|
|
295
|
-
const Stepper = (
|
|
341
|
+
const Stepper = (stepperProps) => {
|
|
296
342
|
var _a;
|
|
343
|
+
const { layouts = [], components = {}, ...props } = stepperProps;
|
|
344
|
+
const {
|
|
345
|
+
ReviewStateComponent = ReviewState,
|
|
346
|
+
createButtonText = "Create",
|
|
347
|
+
reviewButtonText = "Review"
|
|
348
|
+
} = components;
|
|
297
349
|
const analytics = useAnalytics();
|
|
298
350
|
const { steps } = useTemplateSchema(props.manifest);
|
|
299
351
|
const apiHolder = useApiHolder();
|
|
300
352
|
const [activeStep, setActiveStep] = useState(0);
|
|
301
353
|
const [formState, setFormState] = useFormDataFromQuery(props.initialState);
|
|
302
354
|
const [errors, setErrors] = useState();
|
|
303
|
-
const styles = useStyles$
|
|
355
|
+
const styles = useStyles$4();
|
|
304
356
|
const extensions = useMemo(() => {
|
|
305
357
|
return Object.fromEntries(
|
|
306
358
|
props.extensions.map(({ name, component }) => [name, component])
|
|
@@ -347,6 +399,7 @@ const Stepper = (props) => {
|
|
|
347
399
|
}
|
|
348
400
|
setFormState((current) => ({ ...current, ...formData }));
|
|
349
401
|
};
|
|
402
|
+
const currentStep = useTransformSchemaToProps(steps[activeStep], { layouts });
|
|
350
403
|
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Stepper$1, { activeStep, alternativeLabel: true, variant: "elevation" }, steps.map((step, index) => /* @__PURE__ */ React.createElement(Step, { key: index }, /* @__PURE__ */ React.createElement(StepLabel, null, step.title))), /* @__PURE__ */ React.createElement(Step, null, /* @__PURE__ */ React.createElement(StepLabel, null, "Review"))), /* @__PURE__ */ React.createElement("div", { className: styles.formWrapper }, activeStep < steps.length ? /* @__PURE__ */ React.createElement(
|
|
351
404
|
Form,
|
|
352
405
|
{
|
|
@@ -354,8 +407,8 @@ const Stepper = (props) => {
|
|
|
354
407
|
extraErrors: errors,
|
|
355
408
|
formData: formState,
|
|
356
409
|
formContext: { formData: formState },
|
|
357
|
-
schema:
|
|
358
|
-
uiSchema:
|
|
410
|
+
schema: currentStep.schema,
|
|
411
|
+
uiSchema: currentStep.uiSchema,
|
|
359
412
|
onSubmit: handleNext,
|
|
360
413
|
fields: extensions,
|
|
361
414
|
showErrorList: false,
|
|
@@ -370,8 +423,8 @@ const Stepper = (props) => {
|
|
|
370
423
|
disabled: activeStep < 1
|
|
371
424
|
},
|
|
372
425
|
"Back"
|
|
373
|
-
), /* @__PURE__ */ React.createElement(Button, { variant: "contained", color: "primary", type: "submit" }, activeStep === steps.length - 1 ?
|
|
374
|
-
) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
|
|
426
|
+
), /* @__PURE__ */ React.createElement(Button, { variant: "contained", color: "primary", type: "submit" }, activeStep === steps.length - 1 ? reviewButtonText : "Next"))
|
|
427
|
+
) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ReviewStateComponent, { formState, schemas: steps }), /* @__PURE__ */ React.createElement("div", { className: styles.footer }, /* @__PURE__ */ React.createElement(
|
|
375
428
|
Button,
|
|
376
429
|
{
|
|
377
430
|
onClick: handleBack,
|
|
@@ -385,7 +438,7 @@ const Stepper = (props) => {
|
|
|
385
438
|
variant: "contained",
|
|
386
439
|
onClick: () => {
|
|
387
440
|
var _a2;
|
|
388
|
-
props.
|
|
441
|
+
props.onCreate(formState);
|
|
389
442
|
const name = typeof formState.name === "string" ? formState.name : void 0;
|
|
390
443
|
analytics.captureEvent(
|
|
391
444
|
"create",
|
|
@@ -393,11 +446,11 @@ const Stepper = (props) => {
|
|
|
393
446
|
);
|
|
394
447
|
}
|
|
395
448
|
},
|
|
396
|
-
|
|
449
|
+
createButtonText
|
|
397
450
|
)))));
|
|
398
451
|
};
|
|
399
452
|
|
|
400
|
-
const useStyles$
|
|
453
|
+
const useStyles$3 = makeStyles(
|
|
401
454
|
() => ({
|
|
402
455
|
header: {
|
|
403
456
|
backgroundImage: ({ cardBackgroundImage }) => cardBackgroundImage
|
|
@@ -417,7 +470,7 @@ const CardHeader = (props) => {
|
|
|
417
470
|
} = props;
|
|
418
471
|
const { getPageTheme } = useTheme();
|
|
419
472
|
const themeForType = getPageTheme({ themeId: type });
|
|
420
|
-
const styles = useStyles$
|
|
473
|
+
const styles = useStyles$3({
|
|
421
474
|
cardBackgroundImage: themeForType.backgroundImage
|
|
422
475
|
});
|
|
423
476
|
const SubtitleComponent = /* @__PURE__ */ React.createElement("div", { className: styles.subtitleWrapper }, /* @__PURE__ */ React.createElement("div", null, type), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(FavoriteEntity, { entity: props.template, style: { padding: 0 } })));
|
|
@@ -431,18 +484,18 @@ const CardHeader = (props) => {
|
|
|
431
484
|
);
|
|
432
485
|
};
|
|
433
486
|
|
|
434
|
-
const useStyles$
|
|
487
|
+
const useStyles$2 = makeStyles(() => ({
|
|
435
488
|
linkText: {
|
|
436
489
|
display: "inline-flex",
|
|
437
490
|
alignItems: "center"
|
|
438
491
|
}
|
|
439
492
|
}));
|
|
440
493
|
const CardLink = ({ icon: Icon, text, url }) => {
|
|
441
|
-
const styles = useStyles$
|
|
494
|
+
const styles = useStyles$2();
|
|
442
495
|
return /* @__PURE__ */ React.createElement("div", { className: styles.linkText }, /* @__PURE__ */ React.createElement(Icon, { fontSize: "small" }), /* @__PURE__ */ React.createElement(Link, { style: { marginLeft: "8px" }, to: url }, text || url));
|
|
443
496
|
};
|
|
444
497
|
|
|
445
|
-
const useStyles = makeStyles((theme) => ({
|
|
498
|
+
const useStyles$1 = makeStyles((theme) => ({
|
|
446
499
|
box: {
|
|
447
500
|
overflow: "hidden",
|
|
448
501
|
textOverflow: "ellipsis",
|
|
@@ -480,7 +533,7 @@ const useStyles = makeStyles((theme) => ({
|
|
|
480
533
|
const TemplateCard = (props) => {
|
|
481
534
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
482
535
|
const { template } = props;
|
|
483
|
-
const styles = useStyles();
|
|
536
|
+
const styles = useStyles$1();
|
|
484
537
|
const ownedByRelations = getEntityRelations(template, RELATION_OWNED_BY);
|
|
485
538
|
const app = useApp();
|
|
486
539
|
const iconResolver = (key) => {
|
|
@@ -553,6 +606,55 @@ const TemplateGroup = (props) => {
|
|
|
553
606
|
))));
|
|
554
607
|
};
|
|
555
608
|
|
|
609
|
+
const useStyles = makeStyles(() => ({
|
|
610
|
+
markdown: {
|
|
611
|
+
/** to make the styles for React Markdown not leak into the description */
|
|
612
|
+
"& :first-child": {
|
|
613
|
+
marginTop: 0
|
|
614
|
+
},
|
|
615
|
+
"& :last-child": {
|
|
616
|
+
marginBottom: 0
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
}));
|
|
620
|
+
const Workflow = (workflowProps) => {
|
|
621
|
+
var _a;
|
|
622
|
+
const { title, description, namespace, templateName, ...props } = workflowProps;
|
|
623
|
+
const styles = useStyles();
|
|
624
|
+
const templateRef = stringifyEntityRef({
|
|
625
|
+
kind: "Template",
|
|
626
|
+
namespace,
|
|
627
|
+
name: templateName
|
|
628
|
+
});
|
|
629
|
+
const errorApi = useApi(errorApiRef);
|
|
630
|
+
const { loading, manifest, error } = useTemplateParameterSchema(templateRef);
|
|
631
|
+
useEffect(() => {
|
|
632
|
+
if (error) {
|
|
633
|
+
errorApi.post(new Error(`Failed to load template, ${error}`));
|
|
634
|
+
}
|
|
635
|
+
}, [error, errorApi]);
|
|
636
|
+
if (error) {
|
|
637
|
+
return props.onError(error);
|
|
638
|
+
}
|
|
639
|
+
return /* @__PURE__ */ React.createElement(Content, null, loading && /* @__PURE__ */ React.createElement(Progress, null), manifest && /* @__PURE__ */ React.createElement(
|
|
640
|
+
InfoCard,
|
|
641
|
+
{
|
|
642
|
+
title: title != null ? title : manifest.title,
|
|
643
|
+
subheader: /* @__PURE__ */ React.createElement(
|
|
644
|
+
MarkdownContent,
|
|
645
|
+
{
|
|
646
|
+
className: styles.markdown,
|
|
647
|
+
content: (_a = description != null ? description : manifest.description) != null ? _a : "No description"
|
|
648
|
+
}
|
|
649
|
+
),
|
|
650
|
+
noPadding: true,
|
|
651
|
+
titleTypographyProps: { component: "h2" }
|
|
652
|
+
},
|
|
653
|
+
/* @__PURE__ */ React.createElement(Stepper, { manifest, ...props })
|
|
654
|
+
));
|
|
655
|
+
};
|
|
656
|
+
const EmbeddableWorkflow = (props) => /* @__PURE__ */ React.createElement(SecretsContextProvider, null, /* @__PURE__ */ React.createElement(Workflow, { ...props }));
|
|
657
|
+
|
|
556
658
|
function createNextScaffolderFieldExtension(options) {
|
|
557
659
|
return {
|
|
558
660
|
expose() {
|
|
@@ -567,5 +669,17 @@ function createNextScaffolderFieldExtension(options) {
|
|
|
567
669
|
};
|
|
568
670
|
}
|
|
569
671
|
|
|
570
|
-
|
|
672
|
+
function createScaffolderLayout(options) {
|
|
673
|
+
return {
|
|
674
|
+
expose() {
|
|
675
|
+
const LayoutDataHolder = () => null;
|
|
676
|
+
attachComponentData(LayoutDataHolder, LAYOUTS_KEY, options);
|
|
677
|
+
return LayoutDataHolder;
|
|
678
|
+
}
|
|
679
|
+
};
|
|
680
|
+
}
|
|
681
|
+
const ScaffolderLayouts = () => null;
|
|
682
|
+
attachComponentData(ScaffolderLayouts, LAYOUTS_WRAPPER_KEY, true);
|
|
683
|
+
|
|
684
|
+
export { EmbeddableWorkflow, ReviewState, ScaffolderFieldExtensions, ScaffolderLayouts, SecretsContextProvider, Stepper, TemplateCard, TemplateGroup, Workflow, createFieldValidation, createNextScaffolderFieldExtension, createScaffolderFieldExtension, createScaffolderLayout, extractSchemaFromStep, scaffolderApiRef, useCustomFieldExtensions, useCustomLayouts, useFormDataFromQuery, useTemplateParameterSchema, useTemplateSchema, useTemplateSecrets };
|
|
571
685
|
//# sourceMappingURL=index.esm.js.map
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/extensions/keys.ts","../src/extensions/index.tsx","../src/secrets/SecretsContext.tsx","../src/api/ref.ts","../src/hooks/useCustomFieldExtensions.ts","../src/next/lib/schema.ts","../src/next/components/Stepper/createAsyncValidators.ts","../src/next/hooks/useTemplateSchema.ts","../src/next/components/ReviewState/ReviewState.tsx","../src/next/hooks/useFormDataFromQuery.ts","../src/next/components/Stepper/Stepper.tsx","../src/next/components/TemplateCard/CardHeader.tsx","../src/next/components/TemplateCard/CardLink.tsx","../src/next/components/TemplateCard/TemplateCard.tsx","../src/next/components/TemplateGroup/TemplateGroup.tsx","../src/next/extensions/index.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 */\n\nexport const FIELD_EXTENSION_WRAPPER_KEY = 'scaffolder.extensions.wrapper.v1';\n/**\n * The key used to store the field extension data for any `<FieldExtension />` component\n */\nexport const FIELD_EXTENSION_KEY = 'scaffolder.extensions.field.v1';\n","/*\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 */\n\nimport React from 'react';\nimport {\n CustomFieldExtensionSchema,\n CustomFieldValidator,\n FieldExtensionOptions,\n FieldExtensionComponentProps,\n} from './types';\nimport { Extension, attachComponentData } from '@backstage/core-plugin-api';\nimport { FIELD_EXTENSION_KEY, FIELD_EXTENSION_WRAPPER_KEY } from './keys';\n\n/**\n * A type used to wrap up the FieldExtension to embed the ReturnValue and the InputProps\n * @public\n */\nexport type FieldExtensionComponent<_TReturnValue, _TInputProps> = () => null;\n\n/**\n * Method for creating field extensions that can be used in the scaffolder\n * frontend form.\n * @public\n */\nexport function createScaffolderFieldExtension<\n TReturnValue = unknown,\n TInputProps = unknown,\n>(\n options: FieldExtensionOptions<TReturnValue, TInputProps>,\n): Extension<FieldExtensionComponent<TReturnValue, TInputProps>> {\n return {\n expose() {\n const FieldExtensionDataHolder: any = () => null;\n\n attachComponentData(\n FieldExtensionDataHolder,\n FIELD_EXTENSION_KEY,\n options,\n );\n\n return FieldExtensionDataHolder;\n },\n };\n}\n\n/**\n * The Wrapping component for defining fields extensions inside\n *\n * @public\n */\nexport const ScaffolderFieldExtensions: React.ComponentType<\n React.PropsWithChildren<{}>\n> = (): JSX.Element | null => null;\n\nattachComponentData(\n ScaffolderFieldExtensions,\n FIELD_EXTENSION_WRAPPER_KEY,\n true,\n);\n\nexport type {\n CustomFieldExtensionSchema,\n CustomFieldValidator,\n FieldExtensionOptions,\n FieldExtensionComponentProps,\n};\n","/*\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 */\nimport {\n createVersionedContext,\n createVersionedValueMap,\n} from '@backstage/version-bridge';\nimport React, {\n useState,\n useCallback,\n useContext,\n PropsWithChildren,\n} from 'react';\n\n/**\n * The contents of the `SecretsContext`\n */\ntype SecretsContextContents = {\n secrets: Record<string, string>;\n setSecrets: React.Dispatch<React.SetStateAction<Record<string, string>>>;\n};\n\n/**\n * The context to hold the Secrets.\n */\nconst SecretsContext = createVersionedContext<{\n 1: SecretsContextContents;\n}>('secrets-context');\n\n/**\n * The Context Provider that holds the state for the secrets.\n * @public\n */\nexport const SecretsContextProvider = ({ children }: PropsWithChildren<{}>) => {\n const [secrets, setSecrets] = useState<Record<string, string>>({});\n\n return (\n <SecretsContext.Provider\n value={createVersionedValueMap({ 1: { secrets, setSecrets } })}\n >\n {children}\n </SecretsContext.Provider>\n );\n};\n\n/**\n * The return type from the useTemplateSecrets hook.\n * @public\n */\nexport interface ScaffolderUseTemplateSecrets {\n setSecrets: (input: Record<string, string>) => void;\n secrets: Record<string, string>;\n}\n\n/**\n * Hook to access the secrets context to be able to set secrets that are\n * passed to the Scaffolder backend.\n * @public\n */\nexport const useTemplateSecrets = (): ScaffolderUseTemplateSecrets => {\n const value = useContext(SecretsContext)?.atVersion(1);\n\n if (!value) {\n throw new Error(\n 'useTemplateSecrets must be used within a SecretsContextProvider',\n );\n }\n\n const { setSecrets: updateSecrets, secrets = {} } = value;\n\n const setSecrets = useCallback(\n (input: Record<string, string>) => {\n updateSecrets(currentSecrets => ({ ...currentSecrets, ...input }));\n },\n [updateSecrets],\n );\n\n return { setSecrets, secrets };\n};\n","/*\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 { createApiRef } from '@backstage/core-plugin-api';\nimport { ScaffolderApi } from './types';\nimport { getOrCreateGlobalSingleton } from '@backstage/version-bridge';\n\n/** @public */\nexport const scaffolderApiRef = getOrCreateGlobalSingleton(\n 'scaffolder:scaffolder-api-ref',\n () =>\n createApiRef<ScaffolderApi>({\n id: 'plugin.scaffolder.service',\n }),\n);\n","/*\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 { useElementFilter } from '@backstage/core-plugin-api';\nimport { FieldExtensionOptions } from '../extensions';\nimport {\n FIELD_EXTENSION_KEY,\n FIELD_EXTENSION_WRAPPER_KEY,\n} from '../extensions/keys';\n\n/**\n * Hook that returns all custom field extensions from the current outlet.\n * @public\n */\nexport const useCustomFieldExtensions = <\n TComponentDataType = FieldExtensionOptions,\n>(\n outlet: React.ReactNode,\n) => {\n return useElementFilter(outlet, elements =>\n elements\n .selectByComponentData({\n key: FIELD_EXTENSION_WRAPPER_KEY,\n })\n .findComponentData<TComponentDataType>({\n key: FIELD_EXTENSION_KEY,\n }),\n );\n};\n","/*\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 */\nimport { JsonObject } from '@backstage/types';\nimport { FieldValidation, UiSchema } from '@rjsf/utils';\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction extractUiSchema(schema: JsonObject, uiSchema: JsonObject) {\n if (!isObject(schema)) {\n return;\n }\n\n const { properties, items, anyOf, oneOf, allOf, dependencies } = schema;\n\n for (const propName in schema) {\n if (!schema.hasOwnProperty(propName)) {\n continue;\n }\n\n if (propName.startsWith('ui:')) {\n uiSchema[propName] = schema[propName];\n delete schema[propName];\n }\n }\n\n if (isObject(properties)) {\n for (const propName in properties) {\n if (!properties.hasOwnProperty(propName)) {\n continue;\n }\n\n const schemaNode = properties[propName];\n if (!isObject(schemaNode)) {\n continue;\n }\n const innerUiSchema = {};\n uiSchema[propName] = innerUiSchema;\n extractUiSchema(schemaNode, innerUiSchema);\n }\n }\n\n if (isObject(items)) {\n const innerUiSchema = {};\n uiSchema.items = innerUiSchema;\n extractUiSchema(items, innerUiSchema);\n }\n\n if (Array.isArray(anyOf)) {\n for (const schemaNode of anyOf) {\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n\n if (Array.isArray(oneOf)) {\n for (const schemaNode of oneOf) {\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n\n if (Array.isArray(allOf)) {\n for (const schemaNode of allOf) {\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n\n if (isObject(dependencies)) {\n for (const depName of Object.keys(dependencies)) {\n const schemaNode = dependencies[depName];\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n}\n\n/**\n * Takes a step from a Backstage Template Manifest and converts it to a JSON Schema and UI Schema for rjsf\n * @alpha\n */\nexport const extractSchemaFromStep = (\n inputStep: JsonObject,\n): { uiSchema: UiSchema; schema: JsonObject } => {\n const uiSchema: UiSchema = {};\n const returnSchema: JsonObject = JSON.parse(JSON.stringify(inputStep));\n extractUiSchema(returnSchema, uiSchema);\n return { uiSchema, schema: returnSchema };\n};\n\n/**\n * Creates a field validation object for use in react jsonschema form\n * @alpha\n */\nexport const createFieldValidation = (): FieldValidation => {\n const fieldValidation: FieldValidation = {\n __errors: [] as string[],\n addError: (message: string) => {\n fieldValidation.__errors?.push(message);\n },\n };\n\n return fieldValidation;\n};\n","/*\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 { JsonObject } from '@backstage/types';\nimport { ApiHolder } from '@backstage/core-plugin-api';\nimport { Draft07 as JSONSchema } from 'json-schema-library';\nimport { createFieldValidation } from '../../lib';\nimport { NextCustomFieldValidator } from '../../extensions';\n\nexport const createAsyncValidators = (\n rootSchema: JsonObject,\n validators: Record<string, undefined | NextCustomFieldValidator<unknown>>,\n context: {\n apiHolder: ApiHolder;\n },\n) => {\n async function validate(formData: JsonObject, pathPrefix: string = '#') {\n const parsedSchema = new JSONSchema(rootSchema);\n const formValidation: Record<string, FieldValidation> = {};\n for (const [key, value] of Object.entries(formData)) {\n const definitionInSchema = parsedSchema.getSchema(\n `${pathPrefix}/${key}`,\n formData,\n );\n\n if (definitionInSchema && 'ui:field' in definitionInSchema) {\n const validator = validators[definitionInSchema['ui:field']];\n if (validator) {\n const fieldValidation = createFieldValidation();\n try {\n await validator(value, fieldValidation, { ...context, formData });\n } catch (ex) {\n fieldValidation.addError(ex.message);\n }\n formValidation[key] = fieldValidation;\n }\n }\n }\n\n return formValidation;\n }\n\n return async (formData: JsonObject) => {\n return await validate(formData);\n };\n};\n","/*\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 */\nimport { featureFlagsApiRef, useApi } from '@backstage/core-plugin-api';\nimport { JsonObject } from '@backstage/types';\nimport { UiSchema } from '@rjsf/utils';\nimport { TemplateParameterSchema } from '../../types';\nimport { extractSchemaFromStep } from '../lib';\n\n/**\n * This is the parsed template schema that is returned from the {@link useTemplateSchema} hook.\n * @alpha\n */\nexport interface ParsedTemplateSchema {\n uiSchema: UiSchema;\n mergedSchema: JsonObject;\n schema: JsonObject;\n title: string;\n description?: string;\n}\n\n/**\n * This hook will parse the template schema and return the steps with the\n * parsed schema and uiSchema. Filtering out any steps or properties that\n * are not enabled with feature flags.\n * @alpha\n */\nexport const useTemplateSchema = (\n manifest: TemplateParameterSchema,\n): { steps: ParsedTemplateSchema[] } => {\n const featureFlags = useApi(featureFlagsApiRef);\n const steps = manifest.steps.map(({ title, description, schema }) => ({\n title,\n description,\n mergedSchema: schema,\n ...extractSchemaFromStep(schema),\n }));\n\n const returningSteps = steps\n // Filter out steps that are not enabled with the feature flags\n .filter(step => {\n const stepFeatureFlag = step.uiSchema['ui:backstage']?.featureFlag;\n return stepFeatureFlag ? featureFlags.isActive(stepFeatureFlag) : true;\n })\n // Then filter out the properties that are not enabled with feature flag\n .map(step => ({\n ...step,\n schema: {\n ...step.schema,\n // Title is rendered at the top of the page, so let's ignore this from jsonschemaform\n title: undefined,\n properties: Object.fromEntries(\n Object.entries(step.schema.properties as JsonObject).filter(\n ([key]) => {\n const stepFeatureFlag =\n step.uiSchema[key]?.['ui:backstage']?.featureFlag;\n return stepFeatureFlag\n ? featureFlags.isActive(stepFeatureFlag)\n : true;\n },\n ),\n ),\n },\n }));\n\n return {\n steps: returningSteps,\n };\n};\n","/*\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 */\nimport React from 'react';\nimport { StructuredMetadataTable } from '@backstage/core-components';\nimport { JsonObject } from '@backstage/types';\nimport { Draft07 as JSONSchema } from 'json-schema-library';\nimport { ParsedTemplateSchema } from '../../hooks/useTemplateSchema';\n\n/**\n * The props for the {@link ReviewState} component.\n * @alpha\n */\nexport type ReviewStateProps = {\n schemas: ParsedTemplateSchema[];\n formState: JsonObject;\n};\n\n/**\n * The component used by the {@link Stepper} to render the review step.\n * @alpha\n */\nexport const ReviewState = (props: ReviewStateProps) => {\n const reviewData = Object.fromEntries(\n Object.entries(props.formState).map(([key, value]) => {\n for (const step of props.schemas) {\n const parsedSchema = new JSONSchema(step.mergedSchema);\n const definitionInSchema = parsedSchema.getSchema(\n `#/${key}`,\n props.formState,\n );\n if (definitionInSchema) {\n const backstageReviewOptions =\n definitionInSchema['ui:backstage']?.review;\n\n if (backstageReviewOptions) {\n if (backstageReviewOptions.mask) {\n return [key, backstageReviewOptions.mask];\n }\n if (backstageReviewOptions.show === false) {\n return [];\n }\n }\n\n if (definitionInSchema['ui:widget'] === 'password') {\n return [key, '******'];\n }\n }\n }\n return [key, value];\n }),\n );\n return <StructuredMetadataTable metadata={reviewData} />;\n};\n","/*\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 { JsonValue } from '@backstage/types';\nimport qs from 'qs';\nimport { useState } from 'react';\n\n/**\n * This hook is used to get the formData from the query string.\n * @alpha\n */\nexport const useFormDataFromQuery = (\n initialState?: Record<string, JsonValue>,\n) => {\n return useState<Record<string, any>>(() => {\n if (initialState) {\n return initialState;\n }\n\n const query = qs.parse(window.location.search, {\n ignoreQueryPrefix: true,\n });\n\n try {\n return JSON.parse(query.formData as string);\n } catch (e) {\n return {};\n }\n });\n};\n","/*\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 */\nimport { useAnalytics, useApiHolder } from '@backstage/core-plugin-api';\nimport { JsonValue } from '@backstage/types';\nimport {\n Stepper as MuiStepper,\n Step as MuiStep,\n StepLabel as MuiStepLabel,\n Button,\n makeStyles,\n} from '@material-ui/core';\nimport { type IChangeEvent, withTheme } from '@rjsf/core-v5';\nimport { ErrorSchema, FieldValidation } from '@rjsf/utils';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport { NextFieldExtensionOptions } from '../../extensions';\nimport { TemplateParameterSchema } from '../../../types';\nimport { createAsyncValidators } from './createAsyncValidators';\nimport { useTemplateSchema } from '../../hooks/useTemplateSchema';\nimport { ReviewState } from '../ReviewState';\nimport validator from '@rjsf/validator-ajv6';\n\nimport { useFormDataFromQuery } from '../../hooks';\nimport { FormProps } from '../../types';\n\nconst useStyles = makeStyles(theme => ({\n backButton: {\n marginRight: theme.spacing(1),\n },\n\n footer: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'right',\n },\n formWrapper: {\n padding: theme.spacing(2),\n },\n}));\n\n/**\n * The Props for {@link Stepper} component\n * @alpha\n */\nexport type StepperProps = {\n manifest: TemplateParameterSchema;\n extensions: NextFieldExtensionOptions<any, any>[];\n templateName?: string;\n FormProps?: FormProps;\n initialState?: Record<string, JsonValue>;\n\n onComplete: (values: Record<string, JsonValue>) => Promise<void>;\n};\n\n// TODO(blam): We require here, as the types in this package depend on @rjsf/core explicitly\n// which is what we're using here as the default types, it needs to depend on @rjsf/core-v5 because\n// of the re-writing we're doing. Once we've migrated, we can import this the exact same as before.\nconst Form = withTheme(require('@rjsf/material-ui-v5').Theme);\n\n/**\n * The `Stepper` component is the Wizard that is rendered when a user selects a template\n * @alpha\n */\nexport const Stepper = (props: StepperProps) => {\n const analytics = useAnalytics();\n const { steps } = useTemplateSchema(props.manifest);\n const apiHolder = useApiHolder();\n const [activeStep, setActiveStep] = useState(0);\n const [formState, setFormState] = useFormDataFromQuery(props.initialState);\n\n const [errors, setErrors] = useState<\n undefined | Record<string, FieldValidation>\n >();\n const styles = useStyles();\n\n const extensions = useMemo(() => {\n return Object.fromEntries(\n props.extensions.map(({ name, component }) => [name, component]),\n );\n }, [props.extensions]);\n\n const validators = useMemo(() => {\n return Object.fromEntries(\n props.extensions.map(({ name, validation }) => [name, validation]),\n );\n }, [props.extensions]);\n\n const validation = useMemo(() => {\n return createAsyncValidators(steps[activeStep]?.mergedSchema, validators, {\n apiHolder,\n });\n }, [steps, activeStep, validators, apiHolder]);\n\n const handleBack = () => {\n setActiveStep(prevActiveStep => prevActiveStep - 1);\n };\n\n const handleChange = useCallback(\n (e: IChangeEvent) =>\n setFormState(current => ({ ...current, ...e.formData })),\n [setFormState],\n );\n\n const handleNext = async ({\n formData,\n }: {\n formData: Record<string, JsonValue>;\n }) => {\n // TODO(blam): What do we do about loading states, does each field extension get a chance\n // to display it's own loading? Or should we grey out the entire form.\n setErrors(undefined);\n\n const returnedValidation = await validation(formData);\n\n const hasErrors = Object.values(returnedValidation).some(\n i => i.__errors?.length,\n );\n\n if (hasErrors) {\n setErrors(returnedValidation);\n } else {\n setErrors(undefined);\n setActiveStep(prevActiveStep => {\n const stepNum = prevActiveStep + 1;\n analytics.captureEvent('click', `Next Step (${stepNum})`);\n return stepNum;\n });\n }\n setFormState(current => ({ ...current, ...formData }));\n };\n\n return (\n <>\n <MuiStepper activeStep={activeStep} alternativeLabel variant=\"elevation\">\n {steps.map((step, index) => (\n <MuiStep key={index}>\n <MuiStepLabel>{step.title}</MuiStepLabel>\n </MuiStep>\n ))}\n <MuiStep>\n <MuiStepLabel>Review</MuiStepLabel>\n </MuiStep>\n </MuiStepper>\n <div className={styles.formWrapper}>\n {activeStep < steps.length ? (\n <Form\n validator={validator}\n extraErrors={errors as unknown as ErrorSchema}\n formData={formState}\n formContext={{ formData: formState }}\n schema={steps[activeStep].schema}\n uiSchema={steps[activeStep].uiSchema}\n onSubmit={handleNext}\n fields={extensions}\n showErrorList={false}\n onChange={handleChange}\n {...(props.FormProps ?? {})}\n >\n <div className={styles.footer}>\n <Button\n onClick={handleBack}\n className={styles.backButton}\n disabled={activeStep < 1}\n >\n Back\n </Button>\n <Button variant=\"contained\" color=\"primary\" type=\"submit\">\n {activeStep === steps.length - 1 ? 'Review' : 'Next'}\n </Button>\n </div>\n </Form>\n ) : (\n <>\n <ReviewState formState={formState} schemas={steps} />\n <div className={styles.footer}>\n <Button\n onClick={handleBack}\n className={styles.backButton}\n disabled={activeStep < 1}\n >\n Back\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => {\n props.onComplete(formState);\n const name =\n typeof formState.name === 'string'\n ? formState.name\n : undefined;\n analytics.captureEvent(\n 'create',\n name ?? props.templateName ?? 'unknown',\n );\n }}\n >\n Create\n </Button>\n </div>\n </>\n )}\n </div>\n </>\n );\n};\n","/*\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 React from 'react';\nimport { makeStyles, useTheme } from '@material-ui/core';\nimport { ItemCardHeader } from '@backstage/core-components';\nimport { BackstageTheme } from '@backstage/theme';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { FavoriteEntity } from '@backstage/plugin-catalog-react';\n\nconst useStyles = makeStyles<BackstageTheme, { cardBackgroundImage: string }>(\n () => ({\n header: {\n backgroundImage: ({ cardBackgroundImage }) => cardBackgroundImage,\n },\n subtitleWrapper: {\n display: 'flex',\n justifyContent: 'space-between',\n },\n }),\n);\n\n/**\n * Props for the CardHeader component\n */\nexport interface CardHeaderProps {\n template: TemplateEntityV1beta3;\n}\n\n/**\n * The Card Header with the background for the TemplateCard.\n */\nexport const CardHeader = (props: CardHeaderProps) => {\n const {\n template: {\n metadata: { title, name },\n spec: { type },\n },\n } = props;\n const { getPageTheme } = useTheme<BackstageTheme>();\n const themeForType = getPageTheme({ themeId: type });\n\n const styles = useStyles({\n cardBackgroundImage: themeForType.backgroundImage,\n });\n\n const SubtitleComponent = (\n <div className={styles.subtitleWrapper}>\n <div>{type}</div>\n <div>\n <FavoriteEntity entity={props.template} style={{ padding: 0 }} />\n </div>\n </div>\n );\n\n return (\n <ItemCardHeader\n title={title ?? name}\n subtitle={SubtitleComponent}\n classes={{ root: styles.header }}\n />\n );\n};\n","/*\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 */\nimport { IconComponent } from '@backstage/core-plugin-api';\nimport { BackstageTheme } from '@backstage/theme';\nimport { Link } from '@backstage/core-components';\nimport { makeStyles } from '@material-ui/core';\nimport React from 'react';\n\ninterface CardLinkProps {\n icon: IconComponent;\n text: string;\n url: string;\n}\n\nconst useStyles = makeStyles<BackstageTheme>(() => ({\n linkText: {\n display: 'inline-flex',\n alignItems: 'center',\n },\n}));\n\nexport const CardLink = ({ icon: Icon, text, url }: CardLinkProps) => {\n const styles = useStyles();\n\n return (\n <div className={styles.linkText}>\n <Icon fontSize=\"small\" />\n <Link style={{ marginLeft: '8px' }} to={url}>\n {text || url}\n </Link>\n </div>\n );\n};\n","/*\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 */\nimport { RELATION_OWNED_BY } from '@backstage/catalog-model';\nimport { MarkdownContent, UserIcon } from '@backstage/core-components';\nimport { IconComponent, useApp } from '@backstage/core-plugin-api';\nimport {\n EntityRefLinks,\n getEntityRelations,\n} from '@backstage/plugin-catalog-react';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { BackstageTheme } from '@backstage/theme';\nimport {\n Box,\n Card,\n CardActions,\n CardContent,\n Chip,\n Divider,\n Button,\n Grid,\n makeStyles,\n} from '@material-ui/core';\nimport LanguageIcon from '@material-ui/icons/Language';\nimport React from 'react';\nimport { CardHeader } from './CardHeader';\nimport { CardLink } from './CardLink';\n\nconst useStyles = makeStyles<BackstageTheme>(theme => ({\n box: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: '-webkit-box',\n '-webkit-line-clamp': 10,\n '-webkit-box-orient': 'vertical',\n },\n markdown: {\n /** to make the styles for React Markdown not leak into the description */\n '& :first-child': {\n margin: 0,\n },\n },\n label: {\n color: theme.palette.text.secondary,\n textTransform: 'uppercase',\n fontWeight: 'bold',\n letterSpacing: 0.5,\n lineHeight: 1,\n fontSize: '0.75rem',\n },\n footer: {\n display: 'flex',\n justifyContent: 'space-between',\n flex: 1,\n alignItems: 'center',\n },\n ownedBy: {\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n color: theme.palette.link,\n },\n}));\n\n/**\n * The Props for the {@link TemplateCard} component\n * @alpha\n */\nexport interface TemplateCardProps {\n template: TemplateEntityV1beta3;\n additionalLinks?: {\n icon: IconComponent;\n text: string;\n url: string;\n }[];\n\n onSelected?: (template: TemplateEntityV1beta3) => void;\n}\n\n/**\n * The `TemplateCard` component that is rendered in a list for each template\n * @alpha\n */\nexport const TemplateCard = (props: TemplateCardProps) => {\n const { template } = props;\n const styles = useStyles();\n const ownedByRelations = getEntityRelations(template, RELATION_OWNED_BY);\n const app = useApp();\n const iconResolver = (key?: string): IconComponent =>\n key ? app.getSystemIcon(key) ?? LanguageIcon : LanguageIcon;\n\n return (\n <Card>\n <CardHeader template={template} />\n <CardContent>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Box className={styles.box}>\n <MarkdownContent\n className={styles.markdown}\n content={template.metadata.description ?? 'No description'}\n />\n </Box>\n </Grid>\n {(template.metadata.tags?.length ?? 0) > 0 && (\n <>\n <Grid item xs={12}>\n <Divider />\n </Grid>\n <Grid item xs={12}>\n <Grid container spacing={2}>\n {template.metadata.tags?.map(tag => (\n <Grid item>\n <Chip\n style={{ margin: 0 }}\n size=\"small\"\n label={tag}\n key={tag}\n />\n </Grid>\n ))}\n </Grid>\n </Grid>\n </>\n )}\n {(props.additionalLinks || template.metadata.links?.length) && (\n <>\n <Grid item xs={12}>\n <Divider />\n </Grid>\n <Grid item xs={12}>\n <Grid container spacing={2}>\n {props.additionalLinks?.map(({ icon, text, url }) => (\n <Grid className={styles.linkText} item xs={6}>\n <CardLink icon={icon} text={text} url={url} />\n </Grid>\n ))}\n {template.metadata.links?.map(({ url, icon, title }) => (\n <Grid className={styles.linkText} item xs={6}>\n <CardLink\n icon={iconResolver(icon)}\n text={title || url}\n url={url}\n />\n </Grid>\n ))}\n </Grid>\n </Grid>\n </>\n )}\n </Grid>\n </CardContent>\n <CardActions style={{ padding: '16px' }}>\n <div className={styles.footer}>\n <div className={styles.ownedBy}>\n {ownedByRelations.length > 0 && (\n <>\n <UserIcon fontSize=\"small\" />\n <EntityRefLinks\n style={{ marginLeft: '8px' }}\n entityRefs={ownedByRelations}\n defaultKind=\"Group\"\n />\n </>\n )}\n </div>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color=\"primary\"\n onClick={() => props.onSelected?.(template)}\n >\n Choose\n </Button>\n </div>\n </CardActions>\n </Card>\n );\n};\n","/*\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 */\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport React from 'react';\nimport {\n Content,\n ContentHeader,\n ItemCardGrid,\n Link,\n} from '@backstage/core-components';\nimport { Typography } from '@material-ui/core';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { TemplateCardProps, TemplateCard } from '../TemplateCard';\nimport { IconComponent } from '@backstage/core-plugin-api';\n\n/**\n * The props for the {@link TemplateGroup} component.\n * @alpha\n */\nexport interface TemplateGroupProps {\n templates: {\n template: TemplateEntityV1beta3;\n additionalLinks?: {\n icon: IconComponent;\n text: string;\n url: string;\n }[];\n }[];\n onSelected: (template: TemplateEntityV1beta3) => void;\n title: React.ReactNode;\n components?: {\n CardComponent?: React.ComponentType<TemplateCardProps>;\n };\n}\n\n/**\n * The `TemplateGroup` component is used to display a group of templates with a title.\n * @alpha\n */\nexport const TemplateGroup = (props: TemplateGroupProps) => {\n const {\n templates,\n title,\n components: { CardComponent } = {},\n onSelected,\n } = props;\n const titleComponent =\n typeof title === 'string' ? <ContentHeader title={title} /> : title;\n\n if (templates.length === 0) {\n return (\n <Content>\n {titleComponent}\n <Typography variant=\"body2\">\n No templates found that match your filter. Learn more about{' '}\n <Link to=\"https://backstage.io/docs/features/software-templates/adding-templates\">\n adding templates\n </Link>\n .\n </Typography>\n </Content>\n );\n }\n\n const Card = CardComponent || TemplateCard;\n\n return (\n <Content>\n {titleComponent}\n <ItemCardGrid>\n {templates.map(({ template, additionalLinks }) => (\n <Card\n key={stringifyEntityRef(template)}\n additionalLinks={additionalLinks}\n template={template}\n onSelected={onSelected}\n />\n ))}\n </ItemCardGrid>\n </Content>\n );\n};\n","/*\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 */\n\nimport {\n NextCustomFieldValidator,\n NextFieldExtensionOptions,\n NextFieldExtensionComponentProps,\n} from './types';\nimport { Extension, attachComponentData } from '@backstage/core-plugin-api';\nimport { UIOptionsType } from '@rjsf/utils';\nimport { FieldExtensionComponent } from '../../extensions';\nimport { FIELD_EXTENSION_KEY } from '../../extensions/keys';\n\n/**\n * Method for creating field extensions that can be used in the scaffolder\n * frontend form.\n * @alpha\n */\nexport function createNextScaffolderFieldExtension<\n TReturnValue = unknown,\n TInputProps extends UIOptionsType = {},\n>(\n options: NextFieldExtensionOptions<TReturnValue, TInputProps>,\n): Extension<FieldExtensionComponent<TReturnValue, TInputProps>> {\n return {\n expose() {\n const FieldExtensionDataHolder: any = () => null;\n\n attachComponentData(\n FieldExtensionDataHolder,\n FIELD_EXTENSION_KEY,\n options,\n );\n\n return FieldExtensionDataHolder;\n },\n };\n}\n\nexport type {\n NextCustomFieldValidator,\n NextFieldExtensionOptions,\n NextFieldExtensionComponentProps,\n};\n"],"names":["JSONSchema","useStyles","validation","_a","MuiStepper","MuiStep","MuiStepLabel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/extensions/keys.ts","../src/extensions/index.tsx","../src/secrets/SecretsContext.tsx","../src/api/ref.ts","../src/hooks/useCustomFieldExtensions.ts","../src/next/layouts/keys.ts","../src/hooks/useCustomLayouts.ts","../src/next/lib/schema.ts","../src/next/components/Stepper/createAsyncValidators.ts","../src/next/components/ReviewState/ReviewState.tsx","../src/next/hooks/useTemplateSchema.ts","../src/next/hooks/useFormDataFromQuery.ts","../src/next/hooks/useTemplateParameterSchema.ts","../src/next/hooks/useTransformSchemaToProps.ts","../src/next/components/Stepper/Stepper.tsx","../src/next/components/TemplateCard/CardHeader.tsx","../src/next/components/TemplateCard/CardLink.tsx","../src/next/components/TemplateCard/TemplateCard.tsx","../src/next/components/TemplateGroup/TemplateGroup.tsx","../src/next/components/Workflow/Workflow.tsx","../src/next/extensions/index.tsx","../src/next/layouts/index.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 */\n\nexport const FIELD_EXTENSION_WRAPPER_KEY = 'scaffolder.extensions.wrapper.v1';\n/**\n * The key used to store the field extension data for any `<FieldExtension />` component\n */\nexport const FIELD_EXTENSION_KEY = 'scaffolder.extensions.field.v1';\n","/*\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 */\n\nimport React from 'react';\nimport {\n CustomFieldExtensionSchema,\n CustomFieldValidator,\n FieldExtensionOptions,\n FieldExtensionComponentProps,\n} from './types';\nimport { Extension, attachComponentData } from '@backstage/core-plugin-api';\nimport { FIELD_EXTENSION_KEY, FIELD_EXTENSION_WRAPPER_KEY } from './keys';\n\n/**\n * The type used to wrap up the Layout and embed the input props\n *\n * @public\n */\nexport type FieldExtensionComponent<_TReturnValue, _TInputProps> = () => null;\n\n/**\n * Method for creating field extensions that can be used in the scaffolder\n * frontend form.\n * @public\n */\nexport function createScaffolderFieldExtension<\n TReturnValue = unknown,\n TInputProps = unknown,\n>(\n options: FieldExtensionOptions<TReturnValue, TInputProps>,\n): Extension<FieldExtensionComponent<TReturnValue, TInputProps>> {\n return {\n expose() {\n const FieldExtensionDataHolder: any = () => null;\n\n attachComponentData(\n FieldExtensionDataHolder,\n FIELD_EXTENSION_KEY,\n options,\n );\n\n return FieldExtensionDataHolder;\n },\n };\n}\n\n/**\n * The Wrapping component for defining fields extensions inside\n *\n * @public\n */\nexport const ScaffolderFieldExtensions: React.ComponentType<\n React.PropsWithChildren<{}>\n> = (): JSX.Element | null => null;\n\nattachComponentData(\n ScaffolderFieldExtensions,\n FIELD_EXTENSION_WRAPPER_KEY,\n true,\n);\n\nexport type {\n CustomFieldExtensionSchema,\n CustomFieldValidator,\n FieldExtensionOptions,\n FieldExtensionComponentProps,\n};\n","/*\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 */\nimport {\n createVersionedContext,\n createVersionedValueMap,\n} from '@backstage/version-bridge';\nimport React, {\n useState,\n useCallback,\n useContext,\n PropsWithChildren,\n} from 'react';\n\n/**\n * The contents of the `SecretsContext`\n */\ntype SecretsContextContents = {\n secrets: Record<string, string>;\n setSecrets: React.Dispatch<React.SetStateAction<Record<string, string>>>;\n};\n\n/**\n * The context to hold the Secrets.\n */\nconst SecretsContext = createVersionedContext<{\n 1: SecretsContextContents;\n}>('secrets-context');\n\n/**\n * The Context Provider that holds the state for the secrets.\n * @public\n */\nexport const SecretsContextProvider = ({ children }: PropsWithChildren<{}>) => {\n const [secrets, setSecrets] = useState<Record<string, string>>({});\n\n return (\n <SecretsContext.Provider\n value={createVersionedValueMap({ 1: { secrets, setSecrets } })}\n >\n {children}\n </SecretsContext.Provider>\n );\n};\n\n/**\n * The return type from the useTemplateSecrets hook.\n * @public\n */\nexport interface ScaffolderUseTemplateSecrets {\n setSecrets: (input: Record<string, string>) => void;\n secrets: Record<string, string>;\n}\n\n/**\n * Hook to access the secrets context to be able to set secrets that are\n * passed to the Scaffolder backend.\n * @public\n */\nexport const useTemplateSecrets = (): ScaffolderUseTemplateSecrets => {\n const value = useContext(SecretsContext)?.atVersion(1);\n\n if (!value) {\n throw new Error(\n 'useTemplateSecrets must be used within a SecretsContextProvider',\n );\n }\n\n const { setSecrets: updateSecrets, secrets = {} } = value;\n\n const setSecrets = useCallback(\n (input: Record<string, string>) => {\n updateSecrets(currentSecrets => ({ ...currentSecrets, ...input }));\n },\n [updateSecrets],\n );\n\n return { setSecrets, secrets };\n};\n","/*\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 { createApiRef } from '@backstage/core-plugin-api';\nimport { ScaffolderApi } from './types';\nimport { getOrCreateGlobalSingleton } from '@backstage/version-bridge';\n\n/** @public */\nexport const scaffolderApiRef = getOrCreateGlobalSingleton(\n 'scaffolder:scaffolder-api-ref',\n () =>\n createApiRef<ScaffolderApi>({\n id: 'plugin.scaffolder.service',\n }),\n);\n","/*\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 { useElementFilter } from '@backstage/core-plugin-api';\nimport { FieldExtensionOptions } from '../extensions';\nimport {\n FIELD_EXTENSION_KEY,\n FIELD_EXTENSION_WRAPPER_KEY,\n} from '../extensions/keys';\n\n/**\n * Hook that returns all custom field extensions from the current outlet.\n * @public\n */\nexport const useCustomFieldExtensions = <\n TComponentDataType = FieldExtensionOptions,\n>(\n outlet: React.ReactNode,\n) => {\n return useElementFilter(outlet, elements =>\n elements\n .selectByComponentData({\n key: FIELD_EXTENSION_WRAPPER_KEY,\n })\n .findComponentData<TComponentDataType>({\n key: FIELD_EXTENSION_KEY,\n }),\n );\n};\n","/*\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 */\nexport const LAYOUTS_KEY = 'scaffolder.layout.v1';\nexport const LAYOUTS_WRAPPER_KEY = 'scaffolder.layouts.wrapper.v1';\n","/*\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 { useElementFilter } from '@backstage/core-plugin-api';\nimport { LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from '../next/layouts/keys';\nimport { type LayoutOptions } from '../next/types';\n\n/**\n * Hook that returns all custom field extensions from the current outlet.\n * @public\n */\nexport const useCustomLayouts = <TComponentDataType = LayoutOptions>(\n outlet: React.ReactNode,\n) => {\n return useElementFilter(outlet, elements =>\n elements\n .selectByComponentData({\n key: LAYOUTS_WRAPPER_KEY,\n })\n .findComponentData<TComponentDataType>({\n key: LAYOUTS_KEY,\n }),\n );\n};\n","/*\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 */\nimport { JsonObject } from '@backstage/types';\nimport { FieldValidation, UiSchema } from '@rjsf/utils';\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction extractUiSchema(schema: JsonObject, uiSchema: JsonObject) {\n if (!isObject(schema)) {\n return;\n }\n\n const { properties, items, anyOf, oneOf, allOf, dependencies } = schema;\n\n for (const propName in schema) {\n if (!schema.hasOwnProperty(propName)) {\n continue;\n }\n\n if (propName.startsWith('ui:')) {\n uiSchema[propName] = schema[propName];\n delete schema[propName];\n }\n }\n\n if (isObject(properties)) {\n for (const propName in properties) {\n if (!properties.hasOwnProperty(propName)) {\n continue;\n }\n\n const schemaNode = properties[propName];\n if (!isObject(schemaNode)) {\n continue;\n }\n const innerUiSchema = {};\n uiSchema[propName] = innerUiSchema;\n extractUiSchema(schemaNode, innerUiSchema);\n }\n }\n\n if (isObject(items)) {\n const innerUiSchema = {};\n uiSchema.items = innerUiSchema;\n extractUiSchema(items, innerUiSchema);\n }\n\n if (Array.isArray(anyOf)) {\n for (const schemaNode of anyOf) {\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n\n if (Array.isArray(oneOf)) {\n for (const schemaNode of oneOf) {\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n\n if (Array.isArray(allOf)) {\n for (const schemaNode of allOf) {\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n\n if (isObject(dependencies)) {\n for (const depName of Object.keys(dependencies)) {\n const schemaNode = dependencies[depName];\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n}\n\n/**\n * Takes a step from a Backstage Template Manifest and converts it to a JSON Schema and UI Schema for rjsf\n * @alpha\n */\nexport const extractSchemaFromStep = (\n inputStep: JsonObject,\n): { uiSchema: UiSchema; schema: JsonObject } => {\n const uiSchema: UiSchema = {};\n const returnSchema: JsonObject = JSON.parse(JSON.stringify(inputStep));\n extractUiSchema(returnSchema, uiSchema);\n return { uiSchema, schema: returnSchema };\n};\n\n/**\n * Creates a field validation object for use in react jsonschema form\n * @alpha\n */\nexport const createFieldValidation = (): FieldValidation => {\n const fieldValidation: FieldValidation = {\n __errors: [] as string[],\n addError: (message: string) => {\n fieldValidation.__errors?.push(message);\n },\n };\n\n return fieldValidation;\n};\n","/*\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 { JsonObject } from '@backstage/types';\nimport { ApiHolder } from '@backstage/core-plugin-api';\nimport { Draft07 as JSONSchema } from 'json-schema-library';\nimport { createFieldValidation } from '../../lib';\nimport { NextCustomFieldValidator } from '../../extensions';\n\nexport const createAsyncValidators = (\n rootSchema: JsonObject,\n validators: Record<string, undefined | NextCustomFieldValidator<unknown>>,\n context: {\n apiHolder: ApiHolder;\n },\n) => {\n async function validate(formData: JsonObject, pathPrefix: string = '#') {\n const parsedSchema = new JSONSchema(rootSchema);\n const formValidation: Record<string, FieldValidation> = {};\n for (const [key, value] of Object.entries(formData)) {\n const definitionInSchema = parsedSchema.getSchema(\n `${pathPrefix}/${key}`,\n formData,\n );\n\n if (definitionInSchema && 'ui:field' in definitionInSchema) {\n const validator = validators[definitionInSchema['ui:field']];\n if (validator) {\n const fieldValidation = createFieldValidation();\n try {\n await validator(value, fieldValidation, { ...context, formData });\n } catch (ex) {\n fieldValidation.addError(ex.message);\n }\n formValidation[key] = fieldValidation;\n }\n }\n }\n\n return formValidation;\n }\n\n return async (formData: JsonObject) => {\n return await validate(formData);\n };\n};\n","/*\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 */\nimport React from 'react';\nimport { StructuredMetadataTable } from '@backstage/core-components';\nimport { JsonObject } from '@backstage/types';\nimport { Draft07 as JSONSchema } from 'json-schema-library';\nimport { ParsedTemplateSchema } from '../../hooks/useTemplateSchema';\n\n/**\n * The props for the {@link ReviewState} component.\n * @alpha\n */\nexport type ReviewStateProps = {\n schemas: ParsedTemplateSchema[];\n formState: JsonObject;\n};\n\n/**\n * The component used by the {@link Stepper} to render the review step.\n * @alpha\n */\nexport const ReviewState = (props: ReviewStateProps) => {\n const reviewData = Object.fromEntries(\n Object.entries(props.formState).map(([key, value]) => {\n for (const step of props.schemas) {\n const parsedSchema = new JSONSchema(step.mergedSchema);\n const definitionInSchema = parsedSchema.getSchema(\n `#/${key}`,\n props.formState,\n );\n if (definitionInSchema) {\n const backstageReviewOptions =\n definitionInSchema['ui:backstage']?.review;\n\n if (backstageReviewOptions) {\n if (backstageReviewOptions.mask) {\n return [key, backstageReviewOptions.mask];\n }\n if (backstageReviewOptions.show === false) {\n return [];\n }\n }\n\n if (definitionInSchema['ui:widget'] === 'password') {\n return [key, '******'];\n }\n }\n }\n return [key, value];\n }),\n );\n return <StructuredMetadataTable metadata={reviewData} />;\n};\n","/*\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 */\nimport { featureFlagsApiRef, useApi } from '@backstage/core-plugin-api';\nimport { JsonObject } from '@backstage/types';\nimport { UiSchema } from '@rjsf/utils';\nimport { TemplateParameterSchema } from '../../types';\nimport { extractSchemaFromStep } from '../lib';\n\n/**\n * This is the parsed template schema that is returned from the {@link useTemplateSchema} hook.\n * @alpha\n */\nexport interface ParsedTemplateSchema {\n uiSchema: UiSchema;\n mergedSchema: JsonObject;\n schema: JsonObject;\n title: string;\n description?: string;\n}\n\n/**\n * This hook will parse the template schema and return the steps with the\n * parsed schema and uiSchema. Filtering out any steps or properties that\n * are not enabled with feature flags.\n * @alpha\n */\nexport const useTemplateSchema = (\n manifest: TemplateParameterSchema,\n): { steps: ParsedTemplateSchema[] } => {\n const featureFlags = useApi(featureFlagsApiRef);\n const steps = manifest.steps.map(({ title, description, schema }) => ({\n title,\n description,\n mergedSchema: schema,\n ...extractSchemaFromStep(schema),\n }));\n\n const returningSteps = steps\n // Filter out steps that are not enabled with the feature flags\n .filter(step => {\n const stepFeatureFlag = step.uiSchema['ui:backstage']?.featureFlag;\n return stepFeatureFlag ? featureFlags.isActive(stepFeatureFlag) : true;\n })\n // Then filter out the properties that are not enabled with feature flag\n .map(step => ({\n ...step,\n schema: {\n ...step.schema,\n // Title is rendered at the top of the page, so let's ignore this from jsonschemaform\n title: undefined,\n properties: Object.fromEntries(\n Object.entries(step.schema.properties as JsonObject).filter(\n ([key]) => {\n const stepFeatureFlag =\n step.uiSchema[key]?.['ui:backstage']?.featureFlag;\n return stepFeatureFlag\n ? featureFlags.isActive(stepFeatureFlag)\n : true;\n },\n ),\n ),\n },\n }));\n\n return {\n steps: returningSteps,\n };\n};\n","/*\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 { JsonValue } from '@backstage/types';\nimport qs from 'qs';\nimport { useState } from 'react';\n\n/**\n * This hook is used to get the formData from the query string.\n * @alpha\n */\nexport const useFormDataFromQuery = (\n initialState?: Record<string, JsonValue>,\n) => {\n return useState<Record<string, any>>(() => {\n if (initialState) {\n return initialState;\n }\n\n const query = qs.parse(window.location.search, {\n ignoreQueryPrefix: true,\n });\n\n try {\n return JSON.parse(query.formData as string);\n } catch (e) {\n return {};\n }\n });\n};\n","import { useApi } from '@backstage/core-plugin-api';\n\n/*\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 useAsync from 'react-use/lib/useAsync';\nimport { scaffolderApiRef } from '../../api/ref';\n\n/**\n * @alpha\n */\nexport const useTemplateParameterSchema = (templateRef: string) => {\n const scaffolderApi = useApi(scaffolderApiRef);\n const { value, loading, error } = useAsync(\n () => scaffolderApi.getTemplateParameterSchema(templateRef),\n [scaffolderApi, templateRef],\n );\n\n return { manifest: value, loading, error };\n};\n","/*\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 { type ParsedTemplateSchema } from './useTemplateSchema';\nimport { type LayoutOptions } from '../types';\n\ninterface Options {\n layouts?: LayoutOptions[];\n}\n\nexport const useTransformSchemaToProps = (\n step: ParsedTemplateSchema,\n options: Options = {},\n): ParsedTemplateSchema => {\n const { layouts = [] } = options;\n const objectFieldTemplate = step?.uiSchema['ui:ObjectFieldTemplate'] as\n | string\n | undefined;\n\n if (typeof objectFieldTemplate !== 'string') {\n return step;\n }\n\n const Layout = layouts.find(\n layout => layout.name === objectFieldTemplate,\n )?.component;\n\n if (!Layout) {\n return step;\n }\n\n return {\n ...step,\n uiSchema: {\n ...step.uiSchema,\n ['ui:ObjectFieldTemplate']: Layout,\n },\n };\n};\n","/*\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 */\nimport { useAnalytics, useApiHolder } from '@backstage/core-plugin-api';\nimport { JsonValue } from '@backstage/types';\nimport {\n Stepper as MuiStepper,\n Step as MuiStep,\n StepLabel as MuiStepLabel,\n Button,\n makeStyles,\n} from '@material-ui/core';\nimport { type IChangeEvent, withTheme } from '@rjsf/core-v5';\nimport { ErrorSchema, FieldValidation } from '@rjsf/utils';\nimport React, { useCallback, useMemo, useState, type ReactNode } from 'react';\nimport { NextFieldExtensionOptions } from '../../extensions';\nimport { TemplateParameterSchema } from '../../../types';\nimport { createAsyncValidators } from './createAsyncValidators';\nimport { ReviewState, type ReviewStateProps } from '../ReviewState';\nimport { useTemplateSchema } from '../../hooks/useTemplateSchema';\nimport validator from '@rjsf/validator-ajv6';\nimport { useFormDataFromQuery } from '../../hooks';\nimport type { FormProps, LayoutOptions } from '../../types';\nimport { useTransformSchemaToProps } from '../../hooks/useTransformSchemaToProps';\n\nconst useStyles = makeStyles(theme => ({\n backButton: {\n marginRight: theme.spacing(1),\n },\n\n footer: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'right',\n },\n formWrapper: {\n padding: theme.spacing(2),\n },\n}));\n\n/**\n * The Props for {@link Stepper} component\n * @alpha\n */\nexport type StepperProps = {\n manifest: TemplateParameterSchema;\n extensions: NextFieldExtensionOptions<any, any>[];\n templateName?: string;\n FormProps?: FormProps;\n initialState?: Record<string, JsonValue>;\n onCreate: (values: Record<string, JsonValue>) => Promise<void>;\n components?: {\n ReviewStateComponent?: (props: ReviewStateProps) => JSX.Element;\n createButtonText?: ReactNode;\n reviewButtonText?: ReactNode;\n };\n layouts?: LayoutOptions[];\n};\n\n// TODO(blam): We require here, as the types in this package depend on @rjsf/core explicitly\n// which is what we're using here as the default types, it needs to depend on @rjsf/core-v5 because\n// of the re-writing we're doing. Once we've migrated, we can import this the exact same as before.\nconst Form = withTheme(require('@rjsf/material-ui-v5').Theme);\n\n/**\n * The `Stepper` component is the Wizard that is rendered when a user selects a template\n * @alpha\n */\nexport const Stepper = (stepperProps: StepperProps) => {\n const { layouts = [], components = {}, ...props } = stepperProps;\n const {\n ReviewStateComponent = ReviewState,\n createButtonText = 'Create',\n reviewButtonText = 'Review',\n } = components;\n const analytics = useAnalytics();\n const { steps } = useTemplateSchema(props.manifest);\n const apiHolder = useApiHolder();\n const [activeStep, setActiveStep] = useState(0);\n const [formState, setFormState] = useFormDataFromQuery(props.initialState);\n\n const [errors, setErrors] = useState<\n undefined | Record<string, FieldValidation>\n >();\n const styles = useStyles();\n\n const extensions = useMemo(() => {\n return Object.fromEntries(\n props.extensions.map(({ name, component }) => [name, component]),\n );\n }, [props.extensions]);\n\n const validators = useMemo(() => {\n return Object.fromEntries(\n props.extensions.map(({ name, validation }) => [name, validation]),\n );\n }, [props.extensions]);\n\n const validation = useMemo(() => {\n return createAsyncValidators(steps[activeStep]?.mergedSchema, validators, {\n apiHolder,\n });\n }, [steps, activeStep, validators, apiHolder]);\n\n const handleBack = () => {\n setActiveStep(prevActiveStep => prevActiveStep - 1);\n };\n\n const handleChange = useCallback(\n (e: IChangeEvent) =>\n setFormState(current => ({ ...current, ...e.formData })),\n [setFormState],\n );\n\n const handleNext = async ({\n formData,\n }: {\n formData: Record<string, JsonValue>;\n }) => {\n // TODO(blam): What do we do about loading states, does each field extension get a chance\n // to display it's own loading? Or should we grey out the entire form.\n setErrors(undefined);\n\n const returnedValidation = await validation(formData);\n\n const hasErrors = Object.values(returnedValidation).some(\n i => i.__errors?.length,\n );\n\n if (hasErrors) {\n setErrors(returnedValidation);\n } else {\n setErrors(undefined);\n setActiveStep(prevActiveStep => {\n const stepNum = prevActiveStep + 1;\n analytics.captureEvent('click', `Next Step (${stepNum})`);\n return stepNum;\n });\n }\n setFormState(current => ({ ...current, ...formData }));\n };\n\n const currentStep = useTransformSchemaToProps(steps[activeStep], { layouts });\n\n return (\n <>\n <MuiStepper activeStep={activeStep} alternativeLabel variant=\"elevation\">\n {steps.map((step, index) => (\n <MuiStep key={index}>\n <MuiStepLabel>{step.title}</MuiStepLabel>\n </MuiStep>\n ))}\n <MuiStep>\n <MuiStepLabel>Review</MuiStepLabel>\n </MuiStep>\n </MuiStepper>\n <div className={styles.formWrapper}>\n {activeStep < steps.length ? (\n <Form\n validator={validator}\n extraErrors={errors as unknown as ErrorSchema}\n formData={formState}\n formContext={{ formData: formState }}\n schema={currentStep.schema}\n uiSchema={currentStep.uiSchema}\n onSubmit={handleNext}\n fields={extensions}\n showErrorList={false}\n onChange={handleChange}\n {...(props.FormProps ?? {})}\n >\n <div className={styles.footer}>\n <Button\n onClick={handleBack}\n className={styles.backButton}\n disabled={activeStep < 1}\n >\n Back\n </Button>\n <Button variant=\"contained\" color=\"primary\" type=\"submit\">\n {activeStep === steps.length - 1 ? reviewButtonText : 'Next'}\n </Button>\n </div>\n </Form>\n ) : (\n <>\n <ReviewStateComponent formState={formState} schemas={steps} />\n <div className={styles.footer}>\n <Button\n onClick={handleBack}\n className={styles.backButton}\n disabled={activeStep < 1}\n >\n Back\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => {\n props.onCreate(formState);\n const name =\n typeof formState.name === 'string'\n ? formState.name\n : undefined;\n analytics.captureEvent(\n 'create',\n name ?? props.templateName ?? 'unknown',\n );\n }}\n >\n {createButtonText}\n </Button>\n </div>\n </>\n )}\n </div>\n </>\n );\n};\n","/*\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 React from 'react';\nimport { makeStyles, useTheme } from '@material-ui/core';\nimport { ItemCardHeader } from '@backstage/core-components';\nimport { BackstageTheme } from '@backstage/theme';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { FavoriteEntity } from '@backstage/plugin-catalog-react';\n\nconst useStyles = makeStyles<BackstageTheme, { cardBackgroundImage: string }>(\n () => ({\n header: {\n backgroundImage: ({ cardBackgroundImage }) => cardBackgroundImage,\n },\n subtitleWrapper: {\n display: 'flex',\n justifyContent: 'space-between',\n },\n }),\n);\n\n/**\n * Props for the CardHeader component\n */\nexport interface CardHeaderProps {\n template: TemplateEntityV1beta3;\n}\n\n/**\n * The Card Header with the background for the TemplateCard.\n */\nexport const CardHeader = (props: CardHeaderProps) => {\n const {\n template: {\n metadata: { title, name },\n spec: { type },\n },\n } = props;\n const { getPageTheme } = useTheme<BackstageTheme>();\n const themeForType = getPageTheme({ themeId: type });\n\n const styles = useStyles({\n cardBackgroundImage: themeForType.backgroundImage,\n });\n\n const SubtitleComponent = (\n <div className={styles.subtitleWrapper}>\n <div>{type}</div>\n <div>\n <FavoriteEntity entity={props.template} style={{ padding: 0 }} />\n </div>\n </div>\n );\n\n return (\n <ItemCardHeader\n title={title ?? name}\n subtitle={SubtitleComponent}\n classes={{ root: styles.header }}\n />\n );\n};\n","/*\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 */\nimport { IconComponent } from '@backstage/core-plugin-api';\nimport { BackstageTheme } from '@backstage/theme';\nimport { Link } from '@backstage/core-components';\nimport { makeStyles } from '@material-ui/core';\nimport React from 'react';\n\ninterface CardLinkProps {\n icon: IconComponent;\n text: string;\n url: string;\n}\n\nconst useStyles = makeStyles<BackstageTheme>(() => ({\n linkText: {\n display: 'inline-flex',\n alignItems: 'center',\n },\n}));\n\nexport const CardLink = ({ icon: Icon, text, url }: CardLinkProps) => {\n const styles = useStyles();\n\n return (\n <div className={styles.linkText}>\n <Icon fontSize=\"small\" />\n <Link style={{ marginLeft: '8px' }} to={url}>\n {text || url}\n </Link>\n </div>\n );\n};\n","/*\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 */\nimport { RELATION_OWNED_BY } from '@backstage/catalog-model';\nimport { MarkdownContent, UserIcon } from '@backstage/core-components';\nimport { IconComponent, useApp } from '@backstage/core-plugin-api';\nimport {\n EntityRefLinks,\n getEntityRelations,\n} from '@backstage/plugin-catalog-react';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { BackstageTheme } from '@backstage/theme';\nimport {\n Box,\n Card,\n CardActions,\n CardContent,\n Chip,\n Divider,\n Button,\n Grid,\n makeStyles,\n} from '@material-ui/core';\nimport LanguageIcon from '@material-ui/icons/Language';\nimport React from 'react';\nimport { CardHeader } from './CardHeader';\nimport { CardLink } from './CardLink';\n\nconst useStyles = makeStyles<BackstageTheme>(theme => ({\n box: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: '-webkit-box',\n '-webkit-line-clamp': 10,\n '-webkit-box-orient': 'vertical',\n },\n markdown: {\n /** to make the styles for React Markdown not leak into the description */\n '& :first-child': {\n margin: 0,\n },\n },\n label: {\n color: theme.palette.text.secondary,\n textTransform: 'uppercase',\n fontWeight: 'bold',\n letterSpacing: 0.5,\n lineHeight: 1,\n fontSize: '0.75rem',\n },\n footer: {\n display: 'flex',\n justifyContent: 'space-between',\n flex: 1,\n alignItems: 'center',\n },\n ownedBy: {\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n color: theme.palette.link,\n },\n}));\n\n/**\n * The Props for the {@link TemplateCard} component\n * @alpha\n */\nexport interface TemplateCardProps {\n template: TemplateEntityV1beta3;\n additionalLinks?: {\n icon: IconComponent;\n text: string;\n url: string;\n }[];\n\n onSelected?: (template: TemplateEntityV1beta3) => void;\n}\n\n/**\n * The `TemplateCard` component that is rendered in a list for each template\n * @alpha\n */\nexport const TemplateCard = (props: TemplateCardProps) => {\n const { template } = props;\n const styles = useStyles();\n const ownedByRelations = getEntityRelations(template, RELATION_OWNED_BY);\n const app = useApp();\n const iconResolver = (key?: string): IconComponent =>\n key ? app.getSystemIcon(key) ?? LanguageIcon : LanguageIcon;\n\n return (\n <Card>\n <CardHeader template={template} />\n <CardContent>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Box className={styles.box}>\n <MarkdownContent\n className={styles.markdown}\n content={template.metadata.description ?? 'No description'}\n />\n </Box>\n </Grid>\n {(template.metadata.tags?.length ?? 0) > 0 && (\n <>\n <Grid item xs={12}>\n <Divider />\n </Grid>\n <Grid item xs={12}>\n <Grid container spacing={2}>\n {template.metadata.tags?.map(tag => (\n <Grid item>\n <Chip\n style={{ margin: 0 }}\n size=\"small\"\n label={tag}\n key={tag}\n />\n </Grid>\n ))}\n </Grid>\n </Grid>\n </>\n )}\n {(props.additionalLinks || template.metadata.links?.length) && (\n <>\n <Grid item xs={12}>\n <Divider />\n </Grid>\n <Grid item xs={12}>\n <Grid container spacing={2}>\n {props.additionalLinks?.map(({ icon, text, url }) => (\n <Grid className={styles.linkText} item xs={6}>\n <CardLink icon={icon} text={text} url={url} />\n </Grid>\n ))}\n {template.metadata.links?.map(({ url, icon, title }) => (\n <Grid className={styles.linkText} item xs={6}>\n <CardLink\n icon={iconResolver(icon)}\n text={title || url}\n url={url}\n />\n </Grid>\n ))}\n </Grid>\n </Grid>\n </>\n )}\n </Grid>\n </CardContent>\n <CardActions style={{ padding: '16px' }}>\n <div className={styles.footer}>\n <div className={styles.ownedBy}>\n {ownedByRelations.length > 0 && (\n <>\n <UserIcon fontSize=\"small\" />\n <EntityRefLinks\n style={{ marginLeft: '8px' }}\n entityRefs={ownedByRelations}\n defaultKind=\"Group\"\n />\n </>\n )}\n </div>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color=\"primary\"\n onClick={() => props.onSelected?.(template)}\n >\n Choose\n </Button>\n </div>\n </CardActions>\n </Card>\n );\n};\n","/*\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 */\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport React from 'react';\nimport {\n Content,\n ContentHeader,\n ItemCardGrid,\n Link,\n} from '@backstage/core-components';\nimport { Typography } from '@material-ui/core';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { TemplateCardProps, TemplateCard } from '../TemplateCard';\nimport { IconComponent } from '@backstage/core-plugin-api';\n\n/**\n * The props for the {@link TemplateGroup} component.\n * @alpha\n */\nexport interface TemplateGroupProps {\n templates: {\n template: TemplateEntityV1beta3;\n additionalLinks?: {\n icon: IconComponent;\n text: string;\n url: string;\n }[];\n }[];\n onSelected: (template: TemplateEntityV1beta3) => void;\n title: React.ReactNode;\n components?: {\n CardComponent?: React.ComponentType<TemplateCardProps>;\n };\n}\n\n/**\n * The `TemplateGroup` component is used to display a group of templates with a title.\n * @alpha\n */\nexport const TemplateGroup = (props: TemplateGroupProps) => {\n const {\n templates,\n title,\n components: { CardComponent } = {},\n onSelected,\n } = props;\n const titleComponent =\n typeof title === 'string' ? <ContentHeader title={title} /> : title;\n\n if (templates.length === 0) {\n return (\n <Content>\n {titleComponent}\n <Typography variant=\"body2\">\n No templates found that match your filter. Learn more about{' '}\n <Link to=\"https://backstage.io/docs/features/software-templates/adding-templates\">\n adding templates\n </Link>\n .\n </Typography>\n </Content>\n );\n }\n\n const Card = CardComponent || TemplateCard;\n\n return (\n <Content>\n {titleComponent}\n <ItemCardGrid>\n {templates.map(({ template, additionalLinks }) => (\n <Card\n key={stringifyEntityRef(template)}\n additionalLinks={additionalLinks}\n template={template}\n onSelected={onSelected}\n />\n ))}\n </ItemCardGrid>\n </Content>\n );\n};\n","/*\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 */\nimport React, { useEffect } from 'react';\nimport {\n Content,\n InfoCard,\n MarkdownContent,\n Progress,\n} from '@backstage/core-components';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { makeStyles } from '@material-ui/core';\nimport { BackstageTheme } from '@backstage/theme';\nimport { errorApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useTemplateParameterSchema } from '../../hooks/useTemplateParameterSchema';\nimport { Stepper, type StepperProps } from '../Stepper/Stepper';\nimport { SecretsContextProvider } from '../../../secrets/SecretsContext';\n\nconst useStyles = makeStyles<BackstageTheme>(() => ({\n markdown: {\n /** to make the styles for React Markdown not leak into the description */\n '& :first-child': {\n marginTop: 0,\n },\n '& :last-child': {\n marginBottom: 0,\n },\n },\n}));\n\n/**\n * @alpha\n */\nexport type WorkflowProps = {\n title?: string;\n description?: string;\n namespace: string;\n templateName: string;\n onError(error: Error | undefined): JSX.Element | null;\n} & Pick<\n StepperProps,\n | 'extensions'\n | 'FormProps'\n | 'components'\n | 'onCreate'\n | 'initialState'\n | 'layouts'\n>;\n\n/**\n * @alpha\n */\nexport const Workflow = (workflowProps: WorkflowProps): JSX.Element | null => {\n const { title, description, namespace, templateName, ...props } =\n workflowProps;\n\n const styles = useStyles();\n const templateRef = stringifyEntityRef({\n kind: 'Template',\n namespace: namespace,\n name: templateName,\n });\n\n const errorApi = useApi(errorApiRef);\n\n const { loading, manifest, error } = useTemplateParameterSchema(templateRef);\n\n useEffect(() => {\n if (error) {\n errorApi.post(new Error(`Failed to load template, ${error}`));\n }\n }, [error, errorApi]);\n\n if (error) {\n return props.onError(error);\n }\n\n return (\n <Content>\n {loading && <Progress />}\n {manifest && (\n <InfoCard\n title={title ?? manifest.title}\n subheader={\n <MarkdownContent\n className={styles.markdown}\n content={description ?? manifest.description ?? 'No description'}\n />\n }\n noPadding\n titleTypographyProps={{ component: 'h2' }}\n >\n <Stepper manifest={manifest} {...props} />\n </InfoCard>\n )}\n </Content>\n );\n};\n\n/**\n * @alpha\n */\nexport const EmbeddableWorkflow = (props: WorkflowProps) => (\n <SecretsContextProvider>\n <Workflow {...props} />\n </SecretsContextProvider>\n);\n","/*\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 */\n\nimport {\n NextCustomFieldValidator,\n NextFieldExtensionOptions,\n NextFieldExtensionComponentProps,\n} from './types';\nimport { Extension, attachComponentData } from '@backstage/core-plugin-api';\nimport { UIOptionsType } from '@rjsf/utils';\nimport { FieldExtensionComponent } from '../../extensions';\nimport { FIELD_EXTENSION_KEY } from '../../extensions/keys';\n\n/**\n * Method for creating field extensions that can be used in the scaffolder\n * frontend form.\n * @alpha\n */\nexport function createNextScaffolderFieldExtension<\n TReturnValue = unknown,\n TInputProps extends UIOptionsType = {},\n>(\n options: NextFieldExtensionOptions<TReturnValue, TInputProps>,\n): Extension<FieldExtensionComponent<TReturnValue, TInputProps>> {\n return {\n expose() {\n const FieldExtensionDataHolder: any = () => null;\n\n attachComponentData(\n FieldExtensionDataHolder,\n FIELD_EXTENSION_KEY,\n options,\n );\n\n return FieldExtensionDataHolder;\n },\n };\n}\n\nexport type {\n NextCustomFieldValidator,\n NextFieldExtensionOptions,\n NextFieldExtensionComponentProps,\n};\n","import { LayoutOptions } from '../types';\nimport { LAYOUTS_KEY, LAYOUTS_WRAPPER_KEY } from './keys';\n\n/*\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 { attachComponentData, Extension } from '@backstage/core-plugin-api';\n\n/**\n * A type used to wrap up the FieldExtension to embed the ReturnValue and the InputProps\n * @public\n */\nexport type LayoutComponent<_TInputProps> = () => null;\n\n/**\n * Method for creating custom Layouts that can be used in the scaffolder frontend form\n *\n * @public\n */\nexport function createScaffolderLayout<TInputProps = unknown>(\n options: LayoutOptions,\n): Extension<LayoutComponent<TInputProps>> {\n return {\n expose() {\n const LayoutDataHolder: any = () => null;\n\n attachComponentData(LayoutDataHolder, LAYOUTS_KEY, options);\n\n return LayoutDataHolder;\n },\n };\n}\n\n/**\n * The wrapping component for defining scaffolder layouts as children\n *\n * @public\n */\nexport const ScaffolderLayouts: React.ComponentType = (): JSX.Element | null =>\n null;\n\nattachComponentData(ScaffolderLayouts, LAYOUTS_WRAPPER_KEY, true);\n"],"names":["JSONSchema","useStyles","validation","_a","MuiStepper","MuiStep","MuiStepLabel"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-scaffolder-react",
|
|
3
3
|
"description": "A frontend library that helps other Backstage plugins interact with the Scaffolder",
|
|
4
|
-
"version": "1.0.0",
|
|
4
|
+
"version": "1.1.0-next.0",
|
|
5
5
|
"main": "dist/index.esm.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "Apache-2.0",
|
|
@@ -33,13 +33,13 @@
|
|
|
33
33
|
"start": "backstage-cli package start"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@backstage/catalog-client": "^1.3.0",
|
|
37
|
-
"@backstage/catalog-model": "^1.1.
|
|
36
|
+
"@backstage/catalog-client": "^1.3.1-next.0",
|
|
37
|
+
"@backstage/catalog-model": "^1.1.6-next.0",
|
|
38
38
|
"@backstage/core-components": "^0.12.3",
|
|
39
39
|
"@backstage/core-plugin-api": "^1.3.0",
|
|
40
40
|
"@backstage/errors": "^1.1.4",
|
|
41
|
-
"@backstage/plugin-catalog-react": "^1.
|
|
42
|
-
"@backstage/plugin-scaffolder-common": "^1.2.
|
|
41
|
+
"@backstage/plugin-catalog-react": "^1.3.0-next.0",
|
|
42
|
+
"@backstage/plugin-scaffolder-common": "^1.2.5-next.0",
|
|
43
43
|
"@backstage/theme": "^0.2.16",
|
|
44
44
|
"@backstage/types": "^1.0.2",
|
|
45
45
|
"@backstage/version-bridge": "^1.0.3",
|
|
@@ -47,17 +47,18 @@
|
|
|
47
47
|
"@material-ui/icons": "^4.9.1",
|
|
48
48
|
"@material-ui/lab": "4.0.0-alpha.57",
|
|
49
49
|
"@rjsf/core": "^3.2.1",
|
|
50
|
-
"@rjsf/core-v5": "npm:@rjsf/core
|
|
50
|
+
"@rjsf/core-v5": "npm:@rjsf/core@5.0.0-beta.16",
|
|
51
51
|
"@rjsf/material-ui": "^3.2.1",
|
|
52
|
-
"@rjsf/material-ui-v5": "npm:@rjsf/material-ui
|
|
53
|
-
"@rjsf/utils": "
|
|
54
|
-
"@rjsf/validator-ajv6": "
|
|
52
|
+
"@rjsf/material-ui-v5": "npm:@rjsf/material-ui@5.0.0-beta.16",
|
|
53
|
+
"@rjsf/utils": "5.0.0-beta.16",
|
|
54
|
+
"@rjsf/validator-ajv6": "5.0.0-beta.16",
|
|
55
55
|
"@types/json-schema": "^7.0.9",
|
|
56
56
|
"classnames": "^2.2.6",
|
|
57
57
|
"json-schema": "^0.4.0",
|
|
58
58
|
"json-schema-library": "^7.3.9",
|
|
59
59
|
"lodash": "^4.17.21",
|
|
60
60
|
"qs": "^6.9.4",
|
|
61
|
+
"react-use": "^17.2.4",
|
|
61
62
|
"zen-observable": "^0.10.0",
|
|
62
63
|
"zod": "~3.18.0",
|
|
63
64
|
"zod-to-json-schema": "~3.18.0"
|
|
@@ -70,8 +71,8 @@
|
|
|
70
71
|
"devDependencies": {
|
|
71
72
|
"@backstage/cli": "^0.22.1",
|
|
72
73
|
"@backstage/core-app-api": "^1.4.0",
|
|
73
|
-
"@backstage/plugin-catalog": "^1.7.
|
|
74
|
-
"@backstage/plugin-catalog-common": "^1.0.
|
|
74
|
+
"@backstage/plugin-catalog": "^1.7.3-next.0",
|
|
75
|
+
"@backstage/plugin-catalog-common": "^1.0.11-next.0",
|
|
75
76
|
"@backstage/test-utils": "^1.2.4",
|
|
76
77
|
"@testing-library/jest-dom": "^5.10.1",
|
|
77
78
|
"@testing-library/react": "^12.1.3",
|