@backstage/plugin-scaffolder 1.6.0-next.2 → 1.6.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.
@@ -7,7 +7,7 @@ import { catalogApiRef, humanizeEntityRef, useEntityTypeFilter, entityRouteRef }
7
7
  import { TextField, FormControl as FormControl$1, Box, Typography, FormControlLabel, Checkbox, makeStyles, Grid, StepButton, Paper, Button, CircularProgress } from '@material-ui/core';
8
8
  import FormControl from '@material-ui/core/FormControl';
9
9
  import Autocomplete from '@material-ui/lab/Autocomplete';
10
- import React, { useCallback, useEffect, useState, createContext, useContext, useMemo, memo } from 'react';
10
+ import React, { useCallback, useEffect, useState, createContext, useContext, useMemo, useRef, memo } from 'react';
11
11
  import useAsync from 'react-use/lib/useAsync';
12
12
  import useEffectOnce from 'react-use/lib/useEffectOnce';
13
13
  import { Autocomplete as Autocomplete$1 } from '@material-ui/lab';
@@ -15,7 +15,7 @@ import { scmIntegrationsApiRef, scmAuthApiRef } from '@backstage/integration-rea
15
15
  import FormHelperText from '@material-ui/core/FormHelperText';
16
16
  import Input from '@material-ui/core/Input';
17
17
  import InputLabel from '@material-ui/core/InputLabel';
18
- import { Select, Progress, Link, Page, Header, Content, ErrorPage, LogViewer } from '@backstage/core-components';
18
+ import { Select, Progress, DismissableBanner, Link, Page, Header, Content, ErrorPage, LogViewer } from '@backstage/core-components';
19
19
  import useDebounce from 'react-use/lib/useDebounce';
20
20
  import capitalize from 'lodash/capitalize';
21
21
  import CheckBoxIcon from '@material-ui/icons/CheckBox';
@@ -329,27 +329,32 @@ const entityNamePickerValidation = (value, validation) => {
329
329
  };
330
330
 
331
331
  const EntityTagsPicker = (props) => {
332
- var _a;
332
+ var _a, _b, _c;
333
333
  const { formData, onChange, uiSchema } = props;
334
334
  const catalogApi = useApi(catalogApiRef);
335
+ const [tagOptions, setTagOptions] = useState([]);
335
336
  const [inputValue, setInputValue] = useState("");
336
337
  const [inputError, setInputError] = useState(false);
337
338
  const tagValidator = makeValidator().isValidTag;
338
339
  const kinds = (_a = uiSchema["ui:options"]) == null ? void 0 : _a.kinds;
340
+ const showCounts = (_b = uiSchema["ui:options"]) == null ? void 0 : _b.showCounts;
341
+ const helperText = (_c = uiSchema["ui:options"]) == null ? void 0 : _c.helperText;
339
342
  const { loading, value: existingTags } = useAsync(async () => {
340
- const tagsRequest = { fields: ["metadata.tags"] };
343
+ const facet = "metadata.tags";
344
+ const tagsRequest = { facets: [facet] };
341
345
  if (kinds) {
342
346
  tagsRequest.filter = { kind: kinds };
343
347
  }
344
- const entities = await catalogApi.getEntities(tagsRequest);
345
- return [
346
- ...new Set(
347
- entities.items.flatMap((e) => {
348
- var _a2;
349
- return (_a2 = e.metadata) == null ? void 0 : _a2.tags;
350
- }).filter(Boolean)
348
+ const { facets } = await catalogApi.getEntityFacets(tagsRequest);
349
+ const tagFacets = Object.fromEntries(
350
+ facets[facet].map(({ value, count }) => [value, count])
351
+ );
352
+ setTagOptions(
353
+ Object.keys(tagFacets).sort(
354
+ (a, b) => showCounts ? tagFacets[b] - tagFacets[a] : a.localeCompare(b)
351
355
  )
352
- ].sort();
356
+ );
357
+ return tagFacets;
353
358
  });
354
359
  const setTags = (_, values) => {
355
360
  let hasError = false;
@@ -377,14 +382,15 @@ const EntityTagsPicker = (props) => {
377
382
  value: formData || [],
378
383
  inputValue,
379
384
  loading,
380
- options: existingTags || [],
385
+ options: tagOptions,
381
386
  ChipProps: { size: "small" },
387
+ renderOption: (option) => showCounts ? `${option} (${existingTags == null ? void 0 : existingTags[option]})` : option,
382
388
  renderInput: (params) => /* @__PURE__ */ React.createElement(TextField, {
383
389
  ...params,
384
390
  label: "Tags",
385
391
  onChange: (e) => setInputValue(e.target.value),
386
392
  error: inputError,
387
- helperText: "Add any relevant tags, hit 'Enter' to add new tags. Valid format: [a-z0-9+#] separated by [-], at most 63 characters"
393
+ helperText: helperText != null ? helperText : "Add any relevant tags, hit 'Enter' to add new tags. Valid format: [a-z0-9+#] separated by [-], at most 63 characters"
388
394
  })
389
395
  }));
390
396
  };
@@ -934,6 +940,20 @@ attachComponentData(
934
940
  true
935
941
  );
936
942
 
943
+ const LAYOUTS_KEY = "scaffolder.layout.v1";
944
+ const LAYOUTS_WRAPPER_KEY = "scaffolder.layouts.wrapper.v1";
945
+ function createScaffolderLayout(options) {
946
+ return {
947
+ expose() {
948
+ const LayoutDataHolder = () => null;
949
+ attachComponentData(LayoutDataHolder, LAYOUTS_KEY, options);
950
+ return LayoutDataHolder;
951
+ }
952
+ };
953
+ }
954
+ const ScaffolderLayouts = () => null;
955
+ attachComponentData(ScaffolderLayouts, LAYOUTS_WRAPPER_KEY, true);
956
+
937
957
  const registerComponentRouteRef = createExternalRouteRef({
938
958
  id: "register-component",
939
959
  optional: true
@@ -1035,7 +1055,7 @@ const OwnerPickerFieldExtension = scaffolderPlugin.provide(
1035
1055
  const ScaffolderPage = scaffolderPlugin.provide(
1036
1056
  createRoutableExtension({
1037
1057
  name: "ScaffolderPage",
1038
- component: () => import('./Router-72bec8f5.esm.js').then((m) => m.Router),
1058
+ component: () => import('./Router-ad1d6fa2.esm.js').then((m) => m.Router),
1039
1059
  mountPoint: rootRouteRef
1040
1060
  })
1041
1061
  );
@@ -1054,7 +1074,7 @@ const EntityTagsPickerFieldExtension = scaffolderPlugin.provide(
1054
1074
  const NextScaffolderPage = scaffolderPlugin.provide(
1055
1075
  createRoutableExtension({
1056
1076
  name: "NextScaffolderPage",
1057
- component: () => import('./index-5eebaa47.esm.js').then((m) => m.Router),
1077
+ component: () => import('./index-771633ac.esm.js').then((m) => m.Router),
1058
1078
  mountPoint: nextRouteRef
1059
1079
  })
1060
1080
  );
@@ -1152,6 +1172,7 @@ function reducer(draft, action) {
1152
1172
  case "COMPLETED": {
1153
1173
  draft.completed = true;
1154
1174
  draft.output = action.data.body.output;
1175
+ draft.error = action.data.body.error;
1155
1176
  return;
1156
1177
  }
1157
1178
  case "ERROR": {
@@ -1234,6 +1255,18 @@ const useTaskEventStream = (taskId) => {
1234
1255
  return state;
1235
1256
  };
1236
1257
 
1258
+ const TaskErrors = ({ error }) => {
1259
+ const id = useRef("");
1260
+ useEffect(() => {
1261
+ id.current = String(Math.random());
1262
+ }, [error]);
1263
+ return error ? /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(DismissableBanner, {
1264
+ id: id.current,
1265
+ variant: "warning",
1266
+ message: error.message
1267
+ })) : null;
1268
+ };
1269
+
1237
1270
  const useStyles$1 = makeStyles({
1238
1271
  svgIcon: {
1239
1272
  display: "inline-block",
@@ -1515,10 +1548,12 @@ const TaskPage = ({ loadingText }) => {
1515
1548
  xs: 9
1516
1549
  }, !currentStepId && /* @__PURE__ */ React.createElement(Progress, null), /* @__PURE__ */ React.createElement("div", {
1517
1550
  style: { height: "80vh" }
1518
- }, /* @__PURE__ */ React.createElement(LogViewer, {
1551
+ }, /* @__PURE__ */ React.createElement(TaskErrors, {
1552
+ error: taskStream.error
1553
+ }), /* @__PURE__ */ React.createElement(LogViewer, {
1519
1554
  text: logAsString
1520
1555
  })))))));
1521
1556
  };
1522
1557
 
1523
- export { EntityTagsPickerFieldExtension as A, OwnerPickerFieldExtension as B, OwnedEntityPickerFieldExtension as C, RepoUrlPickerFieldExtension as D, EntityPicker as E, FIELD_EXTENSION_WRAPPER_KEY as F, ScaffolderPage as G, scaffolderPlugin as H, useTemplateSecrets as I, NextScaffolderPage as N, OwnerPicker as O, RepoUrlPicker as R, SecretsContext as S, TemplateTypePicker as T, actionsRouteRef as a, scaffolderListTaskRouteRef as b, scaffolderApiRef as c, scaffolderTaskRouteRef as d, editRouteRef as e, rootRouteRef as f, TaskStatusStepper as g, TaskPageLinks as h, FIELD_EXTENSION_KEY as i, SecretsContextProvider as j, TaskPage as k, legacySelectedTemplateRouteRef as l, EntityNamePicker as m, entityNamePickerValidation as n, EntityTagsPicker as o, repoPickerValidation as p, OwnedEntityPicker as q, registerComponentRouteRef as r, selectedTemplateRouteRef as s, nextSelectedTemplateRouteRef as t, nextRouteRef as u, ScaffolderClient as v, createScaffolderFieldExtension as w, ScaffolderFieldExtensions as x, EntityPickerFieldExtension as y, EntityNamePickerFieldExtension as z };
1524
- //# sourceMappingURL=index-6ab5f5ce.esm.js.map
1558
+ export { ScaffolderLayouts as A, EntityPickerFieldExtension as B, EntityNamePickerFieldExtension as C, EntityTagsPickerFieldExtension as D, EntityPicker as E, FIELD_EXTENSION_WRAPPER_KEY as F, OwnerPickerFieldExtension as G, OwnedEntityPickerFieldExtension as H, RepoUrlPickerFieldExtension as I, ScaffolderPage as J, scaffolderPlugin as K, LAYOUTS_WRAPPER_KEY as L, useTemplateSecrets as M, NextScaffolderPage as N, OwnerPicker as O, RepoUrlPicker as R, SecretsContext as S, TemplateTypePicker as T, actionsRouteRef as a, scaffolderListTaskRouteRef as b, scaffolderApiRef as c, scaffolderTaskRouteRef as d, editRouteRef as e, rootRouteRef as f, TaskStatusStepper as g, TaskPageLinks as h, FIELD_EXTENSION_KEY as i, LAYOUTS_KEY as j, SecretsContextProvider as k, legacySelectedTemplateRouteRef as l, TaskPage as m, EntityNamePicker as n, entityNamePickerValidation as o, EntityTagsPicker as p, repoPickerValidation as q, registerComponentRouteRef as r, selectedTemplateRouteRef as s, OwnedEntityPicker as t, nextSelectedTemplateRouteRef as u, nextRouteRef as v, ScaffolderClient as w, createScaffolderFieldExtension as x, ScaffolderFieldExtensions as y, createScaffolderLayout as z };
1559
+ //# sourceMappingURL=index-59f10b07.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-59f10b07.esm.js","sources":["../../src/api.ts","../../src/components/fields/EntityPicker/EntityPicker.tsx","../../src/components/fields/EntityNamePicker/EntityNamePicker.tsx","../../src/components/fields/EntityNamePicker/validation.ts","../../src/components/fields/EntityTagsPicker/EntityTagsPicker.tsx","../../src/components/fields/OwnerPicker/OwnerPicker.tsx","../../src/components/fields/RepoUrlPicker/GithubRepoPicker.tsx","../../src/components/fields/RepoUrlPicker/GitlabRepoPicker.tsx","../../src/components/fields/RepoUrlPicker/AzureRepoPicker.tsx","../../src/components/fields/RepoUrlPicker/BitbucketRepoPicker.tsx","../../src/components/fields/RepoUrlPicker/GerritRepoPicker.tsx","../../src/components/fields/RepoUrlPicker/RepoUrlPickerHost.tsx","../../src/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.tsx","../../src/components/fields/RepoUrlPicker/utils.ts","../../src/components/secrets/SecretsContext.tsx","../../src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx","../../src/components/fields/RepoUrlPicker/validation.ts","../../src/components/fields/OwnedEntityPicker/OwnedEntityPicker.tsx","../../src/extensions/index.tsx","../../src/layouts/index.tsx","../../src/routes.ts","../../src/plugin.ts","../../src/components/TemplateTypePicker/TemplateTypePicker.tsx","../../src/components/hooks/useEventStream.ts","../../src/components/TaskPage/TaskErrors.tsx","../../src/components/TaskPage/IconLink.tsx","../../src/components/TaskPage/TaskPageLinks.tsx","../../src/components/TaskPage/TaskPage.tsx"],"sourcesContent":["/*\n * Copyright 2020 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 { parseEntityRef } from '@backstage/catalog-model';\nimport {\n createApiRef,\n DiscoveryApi,\n FetchApi,\n IdentityApi,\n} from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { Observable } from '@backstage/types';\nimport qs from 'qs';\nimport ObservableImpl from 'zen-observable';\nimport {\n ListActionsResponse,\n LogEvent,\n ScaffolderApi,\n TemplateParameterSchema,\n ScaffolderScaffoldOptions,\n ScaffolderScaffoldResponse,\n ScaffolderStreamLogsOptions,\n ScaffolderGetIntegrationsListOptions,\n ScaffolderGetIntegrationsListResponse,\n ScaffolderTask,\n ScaffolderDryRunOptions,\n ScaffolderDryRunResponse,\n} from './types';\nimport queryString from 'qs';\n\n/**\n * Utility API reference for the {@link ScaffolderApi}.\n *\n * @public\n */\nexport const scaffolderApiRef = createApiRef<ScaffolderApi>({\n id: 'plugin.scaffolder.service',\n});\n\n/**\n * An API to interact with the scaffolder backend.\n *\n * @public\n */\nexport class ScaffolderClient implements ScaffolderApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly scmIntegrationsApi: ScmIntegrationRegistry;\n private readonly fetchApi: FetchApi;\n private readonly identityApi?: IdentityApi;\n private readonly useLongPollingLogs: boolean;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n identityApi?: IdentityApi;\n scmIntegrationsApi: ScmIntegrationRegistry;\n useLongPollingLogs?: boolean;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi ?? { fetch };\n this.scmIntegrationsApi = options.scmIntegrationsApi;\n this.useLongPollingLogs = options.useLongPollingLogs ?? false;\n this.identityApi = options.identityApi;\n }\n\n async listTasks(options: {\n filterByOwnership: 'owned' | 'all';\n }): Promise<{ tasks: ScaffolderTask[] }> {\n if (!this.identityApi) {\n throw new Error(\n 'IdentityApi is not available in the ScaffolderClient, please pass through the IdentityApi to the ScaffolderClient constructor in order to use the listTasks method',\n );\n }\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const { userEntityRef } = await this.identityApi.getBackstageIdentity();\n\n const query = queryString.stringify(\n options.filterByOwnership === 'owned' ? { createdBy: userEntityRef } : {},\n );\n\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/tasks?${query}`);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async getIntegrationsList(\n options: ScaffolderGetIntegrationsListOptions,\n ): Promise<ScaffolderGetIntegrationsListResponse> {\n const integrations = [\n ...this.scmIntegrationsApi.azure.list(),\n ...this.scmIntegrationsApi.bitbucket\n .list()\n .filter(\n item =>\n !this.scmIntegrationsApi.bitbucketCloud.byHost(item.config.host) &&\n !this.scmIntegrationsApi.bitbucketServer.byHost(item.config.host),\n ),\n ...this.scmIntegrationsApi.bitbucketCloud.list(),\n ...this.scmIntegrationsApi.bitbucketServer.list(),\n ...this.scmIntegrationsApi.gerrit.list(),\n ...this.scmIntegrationsApi.github.list(),\n ...this.scmIntegrationsApi.gitlab.list(),\n ]\n .map(c => ({ type: c.type, title: c.title, host: c.config.host }))\n .filter(c => options.allowedHosts.includes(c.host));\n\n return {\n integrations,\n };\n }\n\n async getTemplateParameterSchema(\n templateRef: string,\n ): Promise<TemplateParameterSchema> {\n const { namespace, kind, name } = parseEntityRef(templateRef, {\n defaultKind: 'template',\n });\n\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const templatePath = [namespace, kind, name]\n .map(s => encodeURIComponent(s))\n .join('/');\n\n const url = `${baseUrl}/v2/templates/${templatePath}/parameter-schema`;\n\n const response = await this.fetchApi.fetch(url);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n const schema: TemplateParameterSchema = await response.json();\n return schema;\n }\n\n /**\n * Executes the scaffolding of a component, given a template and its\n * parameter values.\n *\n * @param options - The {@link ScaffolderScaffoldOptions} the scaffolding.\n */\n async scaffold(\n options: ScaffolderScaffoldOptions,\n ): Promise<ScaffolderScaffoldResponse> {\n const { templateRef, values, secrets = {} } = options;\n const url = `${await this.discoveryApi.getBaseUrl('scaffolder')}/v2/tasks`;\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n templateRef,\n values: { ...values },\n secrets,\n }),\n });\n\n if (response.status !== 201) {\n const status = `${response.status} ${response.statusText}`;\n const body = await response.text();\n throw new Error(`Backend request failed, ${status} ${body.trim()}`);\n }\n\n const { id } = (await response.json()) as { id: string };\n return { taskId: id };\n }\n\n async getTask(taskId: string): Promise<ScaffolderTask> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}`;\n\n const response = await this.fetchApi.fetch(url);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n streamLogs(options: ScaffolderStreamLogsOptions): Observable<LogEvent> {\n if (this.useLongPollingLogs) {\n return this.streamLogsPolling(options);\n }\n\n return this.streamLogsEventStream(options);\n }\n\n async dryRun(\n options: ScaffolderDryRunOptions,\n ): Promise<ScaffolderDryRunResponse> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/dry-run`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n template: options.template,\n values: options.values,\n secrets: options.secrets,\n directoryContents: options.directoryContents,\n }),\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json();\n }\n\n private streamLogsEventStream({\n taskId,\n after,\n }: {\n taskId: string;\n after?: number;\n }): Observable<LogEvent> {\n return new ObservableImpl(subscriber => {\n const params = new URLSearchParams();\n if (after !== undefined) {\n params.set('after', String(Number(after)));\n }\n\n this.discoveryApi.getBaseUrl('scaffolder').then(\n baseUrl => {\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(\n taskId,\n )}/eventstream`;\n const eventSource = new EventSource(url, { withCredentials: true });\n eventSource.addEventListener('log', (event: any) => {\n if (event.data) {\n try {\n subscriber.next(JSON.parse(event.data));\n } catch (ex) {\n subscriber.error(ex);\n }\n }\n });\n eventSource.addEventListener('completion', (event: any) => {\n if (event.data) {\n try {\n subscriber.next(JSON.parse(event.data));\n } catch (ex) {\n subscriber.error(ex);\n }\n }\n eventSource.close();\n subscriber.complete();\n });\n eventSource.addEventListener('error', event => {\n subscriber.error(event);\n });\n },\n error => {\n subscriber.error(error);\n },\n );\n });\n }\n\n private streamLogsPolling({\n taskId,\n after: inputAfter,\n }: {\n taskId: string;\n after?: number;\n }): Observable<LogEvent> {\n let after = inputAfter;\n\n return new ObservableImpl(subscriber => {\n this.discoveryApi.getBaseUrl('scaffolder').then(async baseUrl => {\n while (!subscriber.closed) {\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(\n taskId,\n )}/events?${qs.stringify({ after })}`;\n const response = await this.fetchApi.fetch(url);\n\n if (!response.ok) {\n // wait for one second to not run into an\n await new Promise(resolve => setTimeout(resolve, 1000));\n continue;\n }\n\n const logs = (await response.json()) as LogEvent[];\n\n for (const event of logs) {\n after = Number(event.id);\n\n subscriber.next(event);\n\n if (event.type === 'completion') {\n subscriber.complete();\n return;\n }\n }\n }\n });\n });\n }\n\n async listActions(): Promise<ListActionsResponse> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/actions`);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\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 */\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n humanizeEntityRef,\n} from '@backstage/plugin-catalog-react';\nimport { TextField } from '@material-ui/core';\nimport FormControl from '@material-ui/core/FormControl';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport React, { useCallback, useEffect } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport { FieldExtensionComponentProps } from '../../../extensions';\n\n/**\n * The input props that can be specified under `ui:options` for the\n * `EntityPicker` field extension.\n *\n * @public\n */\nexport interface EntityPickerUiOptions {\n allowedKinds?: string[];\n defaultKind?: string;\n allowArbitraryValues?: boolean;\n}\n\n/**\n * The underlying component that is rendered in the form for the `EntityPicker`\n * field extension.\n *\n * @public\n */\nexport const EntityPicker = (\n props: FieldExtensionComponentProps<string, EntityPickerUiOptions>,\n) => {\n const {\n onChange,\n schema: { title = 'Entity', description = 'An entity from the catalog' },\n required,\n uiSchema,\n rawErrors,\n formData,\n idSchema,\n } = props;\n const allowedKinds = uiSchema['ui:options']?.allowedKinds;\n const defaultKind = uiSchema['ui:options']?.defaultKind;\n\n const catalogApi = useApi(catalogApiRef);\n\n const { value: entities, loading } = useAsync(() =>\n catalogApi.getEntities(\n allowedKinds ? { filter: { kind: allowedKinds } } : undefined,\n ),\n );\n\n const entityRefs = entities?.items.map(e =>\n humanizeEntityRef(e, { defaultKind }),\n );\n\n const onSelect = useCallback(\n (_: any, value: string | null) => {\n onChange(value ?? undefined);\n },\n [onChange],\n );\n\n useEffect(() => {\n if (entityRefs?.length === 1) {\n onChange(entityRefs[0]);\n }\n }, [entityRefs, onChange]);\n\n return (\n <FormControl\n margin=\"normal\"\n required={required}\n error={rawErrors?.length > 0 && !formData}\n >\n <Autocomplete\n disabled={entityRefs?.length === 1}\n id={idSchema?.$id}\n value={(formData as string) || ''}\n loading={loading}\n onChange={onSelect}\n options={entityRefs || []}\n autoSelect\n freeSolo={uiSchema['ui:options']?.allowArbitraryValues ?? true}\n renderInput={params => (\n <TextField\n {...params}\n label={title}\n margin=\"dense\"\n helperText={description}\n FormHelperTextProps={{ margin: 'dense', style: { marginLeft: 0 } }}\n variant=\"outlined\"\n required={required}\n InputProps={params.InputProps}\n />\n )}\n />\n </FormControl>\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 */\nimport React from 'react';\nimport { FieldExtensionComponentProps } from '../../../extensions';\nimport { TextField } from '@material-ui/core';\n\n/**\n * EntityName Picker\n */\nexport const EntityNamePicker = (\n props: FieldExtensionComponentProps<string>,\n) => {\n const {\n onChange,\n required,\n schema: { title = 'Name', description = 'Unique name of the component' },\n rawErrors,\n formData,\n uiSchema: { 'ui:autofocus': autoFocus },\n idSchema,\n placeholder,\n } = props;\n\n return (\n <TextField\n id={idSchema?.$id}\n label={title}\n placeholder={placeholder}\n helperText={description}\n required={required}\n value={formData ?? ''}\n onChange={({ target: { value } }) => onChange(value)}\n margin=\"normal\"\n error={rawErrors?.length > 0 && !formData}\n inputProps={{ autoFocus }}\n />\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 { FieldValidation } from '@rjsf/core';\nimport { KubernetesValidatorFunctions } from '@backstage/catalog-model';\n\nexport const entityNamePickerValidation = (\n value: string,\n validation: FieldValidation,\n) => {\n if (!KubernetesValidatorFunctions.isValidObjectName(value)) {\n validation.addError(\n 'must start and end with an alphanumeric character, and contain only alphanumeric characters, hyphens, underscores, and periods. Maximum length is 63 characters.',\n );\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 */\nimport React, { useState } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport useEffectOnce from 'react-use/lib/useEffectOnce';\nimport { GetEntityFacetsRequest } from '@backstage/catalog-client';\nimport { makeValidator } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { FormControl, TextField } from '@material-ui/core';\nimport { Autocomplete } from '@material-ui/lab';\nimport { FieldExtensionComponentProps } from '../../../extensions';\n\n/**\n * The input props that can be specified under `ui:options` for the\n * `EntityTagsPicker` field extension.\n *\n * @public\n */\nexport interface EntityTagsPickerUiOptions {\n kinds?: string[];\n showCounts?: boolean;\n helperText?: string;\n}\n\n/**\n * The underlying component that is rendered in the form for the `EntityTagsPicker`\n * field extension.\n *\n * @public\n */\nexport const EntityTagsPicker = (\n props: FieldExtensionComponentProps<string[], EntityTagsPickerUiOptions>,\n) => {\n const { formData, onChange, uiSchema } = props;\n const catalogApi = useApi(catalogApiRef);\n const [tagOptions, setTagOptions] = useState<string[]>([]);\n const [inputValue, setInputValue] = useState('');\n const [inputError, setInputError] = useState(false);\n const tagValidator = makeValidator().isValidTag;\n const kinds = uiSchema['ui:options']?.kinds;\n const showCounts = uiSchema['ui:options']?.showCounts;\n const helperText = uiSchema['ui:options']?.helperText;\n\n const { loading, value: existingTags } = useAsync(async () => {\n const facet = 'metadata.tags';\n const tagsRequest: GetEntityFacetsRequest = { facets: [facet] };\n if (kinds) {\n tagsRequest.filter = { kind: kinds };\n }\n\n const { facets } = await catalogApi.getEntityFacets(tagsRequest);\n\n const tagFacets = Object.fromEntries(\n facets[facet].map(({ value, count }) => [value, count]),\n );\n\n setTagOptions(\n Object.keys(tagFacets).sort((a, b) =>\n showCounts ? tagFacets[b] - tagFacets[a] : a.localeCompare(b),\n ),\n );\n\n return tagFacets;\n });\n\n const setTags = (_: React.ChangeEvent<{}>, values: string[] | null) => {\n // Reset error state in case all tags were removed\n let hasError = false;\n let addDuplicate = false;\n const currentTags = formData || [];\n\n // If adding a new tag\n if (values?.length && currentTags.length < values.length) {\n const newTag = (values[values.length - 1] = values[values.length - 1]\n .toLocaleLowerCase('en-US')\n .trim());\n hasError = !tagValidator(newTag);\n addDuplicate = currentTags.indexOf(newTag) !== -1;\n }\n\n setInputError(hasError);\n setInputValue(!hasError ? '' : inputValue);\n if (!hasError && !addDuplicate) {\n onChange(values || []);\n }\n };\n\n // Initialize field to always return an array\n useEffectOnce(() => onChange(formData || []));\n\n return (\n <FormControl margin=\"normal\">\n <Autocomplete\n multiple\n freeSolo\n filterSelectedOptions\n onChange={setTags}\n value={formData || []}\n inputValue={inputValue}\n loading={loading}\n options={tagOptions}\n ChipProps={{ size: 'small' }}\n renderOption={option =>\n showCounts ? `${option} (${existingTags?.[option]})` : option\n }\n renderInput={params => (\n <TextField\n {...params}\n label=\"Tags\"\n onChange={e => setInputValue(e.target.value)}\n error={inputError}\n helperText={\n helperText ??\n \"Add any relevant tags, hit 'Enter' to add new tags. Valid format: [a-z0-9+#] separated by [-], at most 63 characters\"\n }\n />\n )}\n />\n </FormControl>\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 */\nimport React from 'react';\nimport { EntityPicker } from '../EntityPicker/EntityPicker';\nimport { FieldExtensionComponentProps } from '../../../extensions';\n\n/**\n * The input props that can be specified under `ui:options` for the\n * `OwnerPicker` field extension.\n *\n * @public\n */\nexport interface OwnerPickerUiOptions {\n allowedKinds?: string[];\n allowArbitraryValues?: boolean;\n}\n\n/**\n * The underlying component that is rendered in the form for the `OwnerPicker`\n * field extension.\n *\n * @public\n */\nexport const OwnerPicker = (\n props: FieldExtensionComponentProps<string, OwnerPickerUiOptions>,\n) => {\n const {\n schema: { title = 'Owner', description = 'The owner of the component' },\n uiSchema,\n ...restProps\n } = props;\n\n const ownerUiSchema = {\n ...uiSchema,\n 'ui:options': {\n allowedKinds: (uiSchema['ui:options']?.allowedKinds || [\n 'Group',\n 'User',\n ]) as string[],\n defaultKind: 'Group',\n allowArbitraryValues:\n uiSchema['ui:options']?.allowArbitraryValues ?? true,\n },\n };\n\n return (\n <EntityPicker\n {...restProps}\n schema={{ title, description }}\n uiSchema={ownerUiSchema}\n />\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 */\nimport React from 'react';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport Input from '@material-ui/core/Input';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport { Select, SelectItem } from '@backstage/core-components';\nimport { RepoUrlPickerState } from './types';\n\nexport const GithubRepoPicker = (props: {\n allowedOwners?: string[];\n rawErrors: string[];\n state: RepoUrlPickerState;\n onChange: (state: RepoUrlPickerState) => void;\n}) => {\n const { allowedOwners = [], rawErrors, state, onChange } = props;\n const ownerItems: SelectItem[] = allowedOwners\n ? allowedOwners.map(i => ({ label: i, value: i }))\n : [{ label: 'Loading...', value: 'loading' }];\n\n const { owner } = state;\n\n return (\n <>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !owner}\n >\n {allowedOwners?.length ? (\n <Select\n native\n label=\"Owner Available\"\n onChange={s =>\n onChange({ owner: String(Array.isArray(s) ? s[0] : s) })\n }\n disabled={allowedOwners.length === 1}\n selected={owner}\n items={ownerItems}\n />\n ) : (\n <>\n <InputLabel htmlFor=\"ownerInput\">Owner</InputLabel>\n <Input\n id=\"ownerInput\"\n onChange={e => onChange({ owner: e.target.value })}\n value={owner}\n />\n </>\n )}\n <FormHelperText>\n The organization, user or project that this repo will belong to\n </FormHelperText>\n </FormControl>\n </>\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 */\nimport React from 'react';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport Input from '@material-ui/core/Input';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport { Select, SelectItem } from '@backstage/core-components';\nimport { RepoUrlPickerState } from './types';\n\nexport const GitlabRepoPicker = (props: {\n allowedOwners?: string[];\n allowedRepos?: string[];\n state: RepoUrlPickerState;\n onChange: (state: RepoUrlPickerState) => void;\n rawErrors: string[];\n}) => {\n const { allowedOwners = [], state, onChange, rawErrors } = props;\n const ownerItems: SelectItem[] = allowedOwners\n ? allowedOwners.map(i => ({ label: i, value: i }))\n : [{ label: 'Loading...', value: 'loading' }];\n\n const { owner } = state;\n\n return (\n <>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !owner}\n >\n {allowedOwners?.length ? (\n <Select\n native\n label=\"Owner Available\"\n onChange={selected =>\n onChange({\n owner: String(Array.isArray(selected) ? selected[0] : selected),\n })\n }\n disabled={allowedOwners.length === 1}\n selected={owner}\n items={ownerItems}\n />\n ) : (\n <>\n <InputLabel htmlFor=\"ownerInput\">Owner</InputLabel>\n <Input\n id=\"ownerInput\"\n onChange={e => onChange({ owner: e.target.value })}\n value={owner}\n />\n </>\n )}\n <FormHelperText>\n The organization, groups, subgroups, user, project (also known as\n namespaces in gitlab), that this repo will belong to\n </FormHelperText>\n </FormControl>\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 FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport Input from '@material-ui/core/Input';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport { RepoUrlPickerState } from './types';\n\nexport const AzureRepoPicker = (props: {\n state: RepoUrlPickerState;\n onChange: (state: RepoUrlPickerState) => void;\n rawErrors: string[];\n}) => {\n const { rawErrors, state, onChange } = props;\n const { organization, owner } = state;\n return (\n <>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !organization}\n >\n <InputLabel htmlFor=\"orgInput\">Organization</InputLabel>\n <Input\n id=\"orgInput\"\n onChange={e => onChange({ organization: e.target.value })}\n value={organization}\n />\n <FormHelperText>\n The organization that this repo will belong to\n </FormHelperText>\n </FormControl>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !owner}\n >\n <InputLabel htmlFor=\"ownerInput\">Owner</InputLabel>\n <Input\n id=\"ownerInput\"\n onChange={e => onChange({ owner: e.target.value })}\n value={owner}\n />\n <FormHelperText>The Owner that this repo will belong to</FormHelperText>\n </FormControl>\n </>\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 */\nimport React, { useEffect } from 'react';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport Input from '@material-ui/core/Input';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport { Select, SelectItem } from '@backstage/core-components';\nimport { RepoUrlPickerState } from './types';\n\nexport const BitbucketRepoPicker = (props: {\n allowedOwners?: string[];\n onChange: (state: RepoUrlPickerState) => void;\n state: RepoUrlPickerState;\n rawErrors: string[];\n}) => {\n const { allowedOwners = [], onChange, rawErrors, state } = props;\n const { host, workspace, project } = state;\n const ownerItems: SelectItem[] = allowedOwners\n ? allowedOwners?.map(i => ({ label: i, value: i }))\n : [];\n\n useEffect(() => {\n if (host === 'bitbucket.org' && allowedOwners.length) {\n onChange({ workspace: allowedOwners[0] });\n }\n }, [allowedOwners, host, onChange]);\n\n return (\n <>\n {host === 'bitbucket.org' && (\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !workspace}\n >\n {allowedOwners?.length ? (\n <Select\n native\n label=\"Allowed Workspaces\"\n onChange={s =>\n onChange({ workspace: String(Array.isArray(s) ? s[0] : s) })\n }\n disabled={allowedOwners.length === 1}\n selected={workspace}\n items={ownerItems}\n />\n ) : (\n <>\n <InputLabel htmlFor=\"workspaceInput\">Workspace</InputLabel>\n <Input\n id=\"workspaceInput\"\n onChange={e => onChange({ workspace: e.target.value })}\n value={workspace}\n />\n </>\n )}\n <FormHelperText>\n The Organization that this repo will belong to\n </FormHelperText>\n </FormControl>\n )}\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !project}\n >\n <InputLabel htmlFor=\"projectInput\">Project</InputLabel>\n <Input\n id=\"projectInput\"\n onChange={e => onChange({ project: e.target.value })}\n value={project}\n />\n <FormHelperText>\n The Project that this repo will belong to\n </FormHelperText>\n </FormControl>\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 React from 'react';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport Input from '@material-ui/core/Input';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport { RepoUrlPickerState } from './types';\n\nexport const GerritRepoPicker = (props: {\n onChange: (state: RepoUrlPickerState) => void;\n state: RepoUrlPickerState;\n rawErrors: string[];\n}) => {\n const { onChange, rawErrors, state } = props;\n const { workspace, owner } = state;\n return (\n <>\n <FormControl margin=\"normal\" error={rawErrors?.length > 0 && !workspace}>\n <InputLabel htmlFor=\"ownerInput\">Owner</InputLabel>\n <Input\n id=\"ownerInput\"\n onChange={e => onChange({ owner: e.target.value })}\n value={owner}\n />\n <FormHelperText>The owner of the project (optional)</FormHelperText>\n </FormControl>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !workspace}\n >\n <InputLabel htmlFor=\"parentInput\">Parent</InputLabel>\n <Input\n id=\"parentInput\"\n onChange={e => onChange({ workspace: e.target.value })}\n value={workspace}\n />\n <FormHelperText>\n The project parent that the repo will belong to\n </FormHelperText>\n </FormControl>\n </>\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 */\nimport React, { useEffect } from 'react';\nimport { Progress, Select, SelectItem } from '@backstage/core-components';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { scaffolderApiRef } from '../../../api';\nimport useAsync from 'react-use/lib/useAsync';\n\nexport const RepoUrlPickerHost = (props: {\n host?: string;\n hosts?: string[];\n onChange: (host: string) => void;\n rawErrors: string[];\n}) => {\n const { host, hosts, onChange, rawErrors } = props;\n const scaffolderApi = useApi(scaffolderApiRef);\n\n const { value: { integrations } = { integrations: [] }, loading } = useAsync(\n async () => {\n return await scaffolderApi.getIntegrationsList({\n allowedHosts: hosts ?? [],\n });\n },\n );\n\n useEffect(() => {\n // If there is no host chosen currently\n if (!host) {\n // Set the first of the allowedHosts option if that available\n if (hosts?.length) {\n onChange(hosts[0]);\n // if there's no hosts provided, fallback to using the first integration\n } else if (integrations?.length) {\n onChange(integrations[0].host);\n }\n }\n }, [hosts, host, onChange, integrations]);\n\n // If there are no allowedHosts provided, then show all integrations. Otherwise, only show integrations\n // that are provided in the dropdown for the user to choose from.\n const hostsOptions: SelectItem[] = integrations\n ? integrations\n .filter(i => (hosts?.length ? hosts?.includes(i.host) : true))\n .map(i => ({ label: i.title, value: i.host }))\n : [{ label: 'Loading...', value: 'loading' }];\n\n if (loading) {\n return <Progress />;\n }\n\n return (\n <>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !host}\n >\n <Select\n native\n disabled={hosts?.length === 1 ?? false}\n label=\"Host\"\n onChange={s => onChange(String(Array.isArray(s) ? s[0] : s))}\n selected={host}\n items={hostsOptions}\n data-testid=\"host-select\"\n />\n\n <FormHelperText>\n The host where the repository will be created\n </FormHelperText>\n </FormControl>\n </>\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 */\nimport React, { useEffect } from 'react';\nimport { Select, SelectItem } from '@backstage/core-components';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormHelperText from '@material-ui/core/FormHelperText';\nimport Input from '@material-ui/core/Input';\nimport InputLabel from '@material-ui/core/InputLabel';\n\nexport const RepoUrlPickerRepoName = (props: {\n repoName?: string;\n allowedRepos?: string[];\n onChange: (host: string) => void;\n rawErrors: string[];\n}) => {\n const { repoName, allowedRepos, onChange, rawErrors } = props;\n\n useEffect(() => {\n // If there is no repoName chosen currently\n if (!repoName) {\n // Set the first of the allowedRepos option if that available\n if (allowedRepos?.length) {\n onChange(allowedRepos[0]);\n }\n }\n }, [allowedRepos, repoName, onChange]);\n\n const repoItems: SelectItem[] = allowedRepos\n ? allowedRepos.map(i => ({ label: i, value: i }))\n : [{ label: 'Loading...', value: 'loading' }];\n\n return (\n <>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !repoName}\n >\n {allowedRepos?.length ? (\n <Select\n native\n label=\"Repositories Available\"\n onChange={selected =>\n String(Array.isArray(selected) ? selected[0] : selected)\n }\n disabled={allowedRepos.length === 1}\n selected={repoName}\n items={repoItems}\n />\n ) : (\n <>\n <InputLabel htmlFor=\"repoNameInput\">Repository</InputLabel>\n <Input\n id=\"repoNameInput\"\n onChange={e => onChange(String(e.target.value))}\n value={repoName}\n />\n </>\n )}\n <FormHelperText>The name of the repository</FormHelperText>\n </FormControl>\n </>\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 { RepoUrlPickerState } from './types';\n\nexport function serializeRepoPickerUrl(data: RepoUrlPickerState) {\n if (!data.host) {\n return undefined;\n }\n\n const params = new URLSearchParams();\n if (data.owner) {\n params.set('owner', data.owner);\n }\n if (data.repoName) {\n params.set('repo', data.repoName);\n }\n if (data.organization) {\n params.set('organization', data.organization);\n }\n if (data.workspace) {\n params.set('workspace', data.workspace);\n }\n if (data.project) {\n params.set('project', data.project);\n }\n\n return `${data.host}?${params.toString()}`;\n}\n\nexport function parseRepoPickerUrl(\n url: string | undefined,\n): RepoUrlPickerState {\n let host = '';\n let owner = '';\n let repoName = '';\n let organization = '';\n let workspace = '';\n let project = '';\n\n try {\n if (url) {\n const parsed = new URL(`https://${url}`);\n host = parsed.host;\n owner = parsed.searchParams.get('owner') || '';\n repoName = parsed.searchParams.get('repo') || '';\n organization = parsed.searchParams.get('organization') || '';\n workspace = parsed.searchParams.get('workspace') || '';\n project = parsed.searchParams.get('project') || '';\n }\n } catch {\n /* ok */\n }\n\n return { host, owner, repoName, organization, workspace, project };\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, {\n useState,\n useCallback,\n useContext,\n createContext,\n PropsWithChildren,\n} from 'react';\n\ntype SecretsContextContents = {\n secrets: Record<string, string>;\n setSecrets: React.Dispatch<React.SetStateAction<Record<string, string>>>;\n};\n\n/**\n * The actual context object.\n */\nexport const SecretsContext = createContext<SecretsContextContents | undefined>(\n undefined,\n);\n\n/**\n * The Context Provider that holds the state for the secrets.\n *\n * @public\n */\nexport const SecretsContextProvider = ({ children }: PropsWithChildren<{}>) => {\n const [secrets, setSecrets] = useState<Record<string, string>>({});\n\n return (\n <SecretsContext.Provider value={{ secrets, setSecrets }}>\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}\n\n/**\n * Hook to access the secrets context.\n * @public\n */\nexport const useTemplateSecrets = (): ScaffolderUseTemplateSecrets => {\n const value = useContext(SecretsContext);\n if (!value) {\n throw new Error(\n 'useTemplateSecrets must be used within a SecretsContextProvider',\n );\n }\n\n const { setSecrets: updateSecrets } = value;\n\n const setSecrets = useCallback(\n (input: Record<string, string>) => {\n updateSecrets(currentSecrets => ({ ...currentSecrets, ...input }));\n },\n [updateSecrets],\n );\n\n return { setSecrets };\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 */\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n scmIntegrationsApiRef,\n scmAuthApiRef,\n} from '@backstage/integration-react';\nimport React, { useEffect, useState, useMemo, useCallback } from 'react';\nimport { GithubRepoPicker } from './GithubRepoPicker';\nimport { GitlabRepoPicker } from './GitlabRepoPicker';\nimport { AzureRepoPicker } from './AzureRepoPicker';\nimport { BitbucketRepoPicker } from './BitbucketRepoPicker';\nimport { GerritRepoPicker } from './GerritRepoPicker';\nimport { FieldExtensionComponentProps } from '../../../extensions';\nimport { RepoUrlPickerHost } from './RepoUrlPickerHost';\nimport { RepoUrlPickerRepoName } from './RepoUrlPickerRepoName';\nimport { parseRepoPickerUrl, serializeRepoPickerUrl } from './utils';\nimport { RepoUrlPickerState } from './types';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { useTemplateSecrets } from '../../secrets';\n\n/**\n * The input props that can be specified under `ui:options` for the\n * `RepoUrlPicker` field extension.\n *\n * @public\n */\nexport interface RepoUrlPickerUiOptions {\n allowedHosts?: string[];\n allowedOwners?: string[];\n allowedRepos?: string[];\n requestUserCredentials?: {\n secretsKey: string;\n additionalScopes?: {\n gerrit?: string[];\n github?: string[];\n gitlab?: string[];\n bitbucket?: string[];\n azure?: string[];\n };\n };\n}\n\n/**\n * The underlying component that is rendered in the form for the `RepoUrlPicker`\n * field extension.\n *\n * @public\n */\nexport const RepoUrlPicker = (\n props: FieldExtensionComponentProps<string, RepoUrlPickerUiOptions>,\n) => {\n const { uiSchema, onChange, rawErrors, formData } = props;\n const [state, setState] = useState<RepoUrlPickerState>(\n parseRepoPickerUrl(formData),\n );\n const integrationApi = useApi(scmIntegrationsApiRef);\n const scmAuthApi = useApi(scmAuthApiRef);\n const { setSecrets } = useTemplateSecrets();\n const allowedHosts = useMemo(\n () => uiSchema?.['ui:options']?.allowedHosts ?? [],\n [uiSchema],\n );\n const allowedOwners = useMemo(\n () => uiSchema?.['ui:options']?.allowedOwners ?? [],\n [uiSchema],\n );\n const allowedRepos = useMemo(\n () => uiSchema?.['ui:options']?.allowedRepos ?? [],\n [uiSchema],\n );\n\n useEffect(() => {\n onChange(serializeRepoPickerUrl(state));\n }, [state, onChange]);\n\n /* we deal with calling the repo setting here instead of in each components for ease */\n useEffect(() => {\n if (allowedOwners.length > 0) {\n setState(prevState => ({\n ...prevState,\n owner: allowedOwners[0],\n }));\n }\n }, [setState, allowedOwners]);\n\n useEffect(() => {\n if (allowedRepos.length > 0) {\n setState(prevState => ({ ...prevState, repoName: allowedRepos[0] }));\n }\n }, [setState, allowedRepos]);\n\n const updateLocalState = useCallback(\n (newState: RepoUrlPickerState) => {\n setState(prevState => ({ ...prevState, ...newState }));\n },\n [setState],\n );\n\n useDebounce(\n async () => {\n const { requestUserCredentials } = uiSchema?.['ui:options'] ?? {};\n\n if (\n !requestUserCredentials ||\n !(state.host && state.owner && state.repoName)\n ) {\n return;\n }\n\n const [host, owner, repoName] = [\n state.host,\n state.owner,\n state.repoName,\n ].map(encodeURIComponent);\n\n // user has requested that we use the users credentials\n // so lets grab them using the scmAuthApi and pass through\n // any additional scopes from the ui:options\n const { token } = await scmAuthApi.getCredentials({\n url: `https://${host}/${owner}/${repoName}`,\n additionalScope: {\n repoWrite: true,\n customScopes: requestUserCredentials.additionalScopes,\n },\n });\n\n // set the secret using the key provided in the the ui:options for use\n // in the templating the manifest with ${{ secrets[secretsKey] }}\n setSecrets({ [requestUserCredentials.secretsKey]: token });\n },\n 500,\n [state, uiSchema],\n );\n\n const hostType =\n (state.host && integrationApi.byHost(state.host)?.type) ?? null;\n\n return (\n <>\n <RepoUrlPickerHost\n host={state.host}\n hosts={allowedHosts}\n onChange={host => setState(prevState => ({ ...prevState, host }))}\n rawErrors={rawErrors}\n />\n {hostType === 'github' && (\n <GithubRepoPicker\n allowedOwners={allowedOwners}\n rawErrors={rawErrors}\n state={state}\n onChange={updateLocalState}\n />\n )}\n {hostType === 'gitlab' && (\n <GitlabRepoPicker\n allowedOwners={allowedOwners}\n rawErrors={rawErrors}\n state={state}\n onChange={updateLocalState}\n />\n )}\n {hostType === 'bitbucket' && (\n <BitbucketRepoPicker\n allowedOwners={allowedOwners}\n rawErrors={rawErrors}\n state={state}\n onChange={updateLocalState}\n />\n )}\n {hostType === 'azure' && (\n <AzureRepoPicker\n rawErrors={rawErrors}\n state={state}\n onChange={updateLocalState}\n />\n )}\n {hostType === 'gerrit' && (\n <GerritRepoPicker\n rawErrors={rawErrors}\n state={state}\n onChange={updateLocalState}\n />\n )}\n <RepoUrlPickerRepoName\n repoName={state.repoName}\n allowedRepos={allowedRepos}\n onChange={repoName =>\n setState(prevState => ({ ...prevState, repoName }))\n }\n rawErrors={rawErrors}\n />\n </>\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 { FieldValidation } from '@rjsf/core';\nimport { ApiHolder } from '@backstage/core-plugin-api';\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\n\n/**\n * The validation function for the `repoUrl` that is returned from the\n * field extension. Ensures that you have all the required fields filled for\n * the different providers that exist.\n *\n * @public\n */\nexport const repoPickerValidation = (\n value: string,\n validation: FieldValidation,\n context: { apiHolder: ApiHolder },\n) => {\n try {\n const { host, searchParams } = new URL(`https://${value}`);\n\n const integrationApi = context.apiHolder.get(scmIntegrationsApiRef);\n\n if (!host) {\n validation.addError(\n 'Incomplete repository location provided, host not provided',\n );\n } else {\n if (integrationApi?.byHost(host)?.type === 'bitbucket') {\n // workspace is only applicable for bitbucket cloud\n if (host === 'bitbucket.org' && !searchParams.get('workspace')) {\n validation.addError(\n 'Incomplete repository location provided, workspace not provided',\n );\n }\n\n if (!searchParams.get('project')) {\n validation.addError(\n 'Incomplete repository location provided, project not provided',\n );\n }\n }\n // For anything other than bitbucket and gerrit\n else if (integrationApi?.byHost(host)?.type !== 'gerrit') {\n if (!searchParams.get('owner')) {\n validation.addError(\n 'Incomplete repository location provided, owner not provided',\n );\n }\n }\n\n // Do this for all hosts\n if (!searchParams.get('repo')) {\n validation.addError(\n 'Incomplete repository location provided, repo not provided',\n );\n }\n }\n } catch {\n validation.addError('Unable to parse the Repository URL');\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 */\nimport { GetEntitiesResponse } from '@backstage/catalog-client';\nimport { RELATION_OWNED_BY } from '@backstage/catalog-model';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n humanizeEntityRef,\n} from '@backstage/plugin-catalog-react';\nimport { TextField } from '@material-ui/core';\nimport FormControl from '@material-ui/core/FormControl';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport React, { useMemo } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\n\nimport { FieldExtensionComponentProps } from '../../../extensions';\n\n/**\n * The input props that can be specified under `ui:options` for the\n * `OwnedEntityPicker` field extension.\n *\n * @public\n */\nexport interface OwnedEntityPickerUiOptions {\n allowedKinds?: string[];\n defaultKind?: string;\n allowArbitraryValues?: boolean;\n}\n\n/**\n * The underlying component that is rendered in the form for the `OwnedEntityPicker`\n * field extension.\n *\n * @public\n */\nexport const OwnedEntityPicker = (\n props: FieldExtensionComponentProps<string, OwnedEntityPickerUiOptions>,\n) => {\n const {\n onChange,\n schema: { title = 'Entity', description = 'An entity from the catalog' },\n required,\n uiSchema,\n rawErrors,\n formData,\n idSchema,\n } = props;\n\n const allowedKinds = uiSchema['ui:options']?.allowedKinds;\n const defaultKind = uiSchema['ui:options']?.defaultKind;\n const allowArbitraryValues =\n uiSchema['ui:options']?.allowArbitraryValues ?? true;\n const { ownedEntities, loading } = useOwnedEntities(allowedKinds);\n\n const entityRefs = ownedEntities?.items\n .map(e => humanizeEntityRef(e, { defaultKind }))\n .filter(n => n);\n\n const onSelect = (_: any, value: string | null) => {\n onChange(value || '');\n };\n\n return (\n <FormControl\n margin=\"normal\"\n required={required}\n error={rawErrors?.length > 0 && !formData}\n >\n <Autocomplete\n id={idSchema?.$id}\n value={(formData as string) || ''}\n loading={loading}\n onChange={onSelect}\n options={entityRefs || []}\n autoSelect\n freeSolo={allowArbitraryValues}\n renderInput={params => (\n <TextField\n {...params}\n label={title}\n margin=\"normal\"\n helperText={description}\n variant=\"outlined\"\n required={required}\n InputProps={params.InputProps}\n />\n )}\n />\n </FormControl>\n );\n};\n\n/**\n * Takes the relevant parts of the Backstage identity, and translates them into\n * a list of entities which are owned by the user. Takes an optional parameter\n * to filter the entities based on allowedKinds\n *\n *\n * @param allowedKinds - Array of allowed kinds to filter the entities\n */\nfunction useOwnedEntities(allowedKinds?: string[]): {\n loading: boolean;\n ownedEntities: GetEntitiesResponse | undefined;\n} {\n const identityApi = useApi(identityApiRef);\n const catalogApi = useApi(catalogApiRef);\n\n const { loading, value: refs } = useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const identityRefs = identity.ownershipEntityRefs;\n const catalogs = await catalogApi.getEntities(\n allowedKinds\n ? {\n filter: {\n kind: allowedKinds,\n [`relations.${RELATION_OWNED_BY}`]: identityRefs || [],\n },\n }\n : {\n filter: {\n [`relations.${RELATION_OWNED_BY}`]: identityRefs || [],\n },\n },\n );\n return catalogs;\n }, []);\n\n const ownedEntities = useMemo(() => {\n return refs;\n }, [refs]);\n\n return useMemo(() => ({ loading, ownedEntities }), [loading, ownedEntities]);\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 React from 'react';\nimport {\n CustomFieldValidator,\n FieldExtensionOptions,\n FieldExtensionComponentProps,\n} from './types';\nimport { Extension, attachComponentData } from '@backstage/core-plugin-api';\n\nexport const FIELD_EXTENSION_WRAPPER_KEY = 'scaffolder.extensions.wrapper.v1';\nexport const FIELD_EXTENSION_KEY = 'scaffolder.extensions.field.v1';\n\n/**\n * A type used to wrap up the FieldExtension to embed the ReturnValue and the InputProps\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 (): JSX.Element | null => null;\n\nattachComponentData(\n ScaffolderFieldExtensions,\n FIELD_EXTENSION_WRAPPER_KEY,\n true,\n);\n\nexport type {\n CustomFieldValidator,\n FieldExtensionOptions,\n FieldExtensionComponentProps,\n};\n\nexport { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from './default';\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 { attachComponentData, Extension } from '@backstage/core-plugin-api';\nimport type { LayoutOptions } from './types';\n\nexport const LAYOUTS_KEY = 'scaffolder.layout.v1';\nexport const LAYOUTS_WRAPPER_KEY = 'scaffolder.layouts.wrapper.v1';\n\n/**\n * The type used to wrap up the Layout and embed the input props\n *\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\nexport type { LayoutOptions, LayoutTemplate } from './types';\n","/*\n * Copyright 2020 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 createExternalRouteRef,\n createRouteRef,\n createSubRouteRef,\n} from '@backstage/core-plugin-api';\n\nexport const registerComponentRouteRef = createExternalRouteRef({\n id: 'register-component',\n optional: true,\n});\n\nexport const rootRouteRef = createRouteRef({\n id: 'scaffolder',\n});\n\n/**\n * @deprecated This is the old template route, can be deleted before next major release\n */\nexport const legacySelectedTemplateRouteRef = createSubRouteRef({\n id: 'scaffolder/legacy/selected-template',\n parent: rootRouteRef,\n path: '/templates/:templateName',\n});\n\nexport const nextRouteRef = createRouteRef({\n id: 'scaffolder/next',\n});\n\nexport const selectedTemplateRouteRef = createSubRouteRef({\n id: 'scaffolder/selected-template',\n parent: rootRouteRef,\n path: '/templates/:namespace/:templateName',\n});\n\nexport const nextSelectedTemplateRouteRef = createSubRouteRef({\n id: 'scaffolder/next/selected-template',\n parent: nextRouteRef,\n path: '/templates/:namespace/:templateName',\n});\n\nexport const scaffolderTaskRouteRef = createSubRouteRef({\n id: 'scaffolder/task',\n parent: rootRouteRef,\n path: '/tasks/:taskId',\n});\n\nexport const scaffolderListTaskRouteRef = createSubRouteRef({\n id: 'scaffolder/list-tasks',\n parent: rootRouteRef,\n path: '/tasks',\n});\n\nexport const actionsRouteRef = createSubRouteRef({\n id: 'scaffolder/actions',\n parent: rootRouteRef,\n path: '/actions',\n});\n\nexport const editRouteRef = createSubRouteRef({\n id: 'scaffolder/edit',\n parent: rootRouteRef,\n path: '/edit',\n});\n","/*\n * Copyright 2020 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 { scmIntegrationsApiRef } from '@backstage/integration-react';\nimport { scaffolderApiRef, ScaffolderClient } from './api';\nimport { EntityPicker } from './components/fields/EntityPicker/EntityPicker';\nimport { entityNamePickerValidation } from './components/fields/EntityNamePicker';\nimport { EntityNamePicker } from './components/fields/EntityNamePicker/EntityNamePicker';\nimport { OwnerPicker } from './components/fields/OwnerPicker/OwnerPicker';\nimport { repoPickerValidation } from './components/fields/RepoUrlPicker';\nimport { RepoUrlPicker } from './components/fields/RepoUrlPicker/RepoUrlPicker';\nimport { createScaffolderFieldExtension } from './extensions';\nimport {\n nextRouteRef,\n registerComponentRouteRef,\n rootRouteRef,\n} from './routes';\nimport {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\nimport { OwnedEntityPicker } from './components/fields/OwnedEntityPicker/OwnedEntityPicker';\nimport { EntityTagsPicker } from './components/fields/EntityTagsPicker/EntityTagsPicker';\n\n/**\n * The main plugin export for the scaffolder.\n * @public\n */\nexport const scaffolderPlugin = createPlugin({\n id: 'scaffolder',\n apis: [\n createApiFactory({\n api: scaffolderApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n scmIntegrationsApi: scmIntegrationsApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, scmIntegrationsApi, fetchApi, identityApi }) =>\n new ScaffolderClient({\n discoveryApi,\n scmIntegrationsApi,\n fetchApi,\n identityApi,\n }),\n }),\n ],\n routes: {\n root: rootRouteRef,\n },\n externalRoutes: {\n registerComponent: registerComponentRouteRef,\n },\n});\n\n/**\n * A field extension for selecting an Entity that exists in the Catalog.\n *\n * @public\n */\nexport const EntityPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: EntityPicker,\n name: 'EntityPicker',\n }),\n);\n\n/**\n * The field extension for selecting a name for a new Entity in the Catalog.\n *\n * @public\n */\nexport const EntityNamePickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: EntityNamePicker,\n name: 'EntityNamePicker',\n validation: entityNamePickerValidation,\n }),\n);\n\n/**\n * The field extension which provides the ability to select a RepositoryUrl.\n * Currently this is an encoded URL that looks something like the following `github.com?repo=myRepoName&owner=backstage`.\n *\n * @public\n */\nexport const RepoUrlPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: RepoUrlPicker,\n name: 'RepoUrlPicker',\n validation: repoPickerValidation,\n }),\n);\n\n/**\n * A field extension for picking users and groups out of the Catalog.\n *\n * @public\n */\nexport const OwnerPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: OwnerPicker,\n name: 'OwnerPicker',\n }),\n);\n\n/**\n * The Router and main entrypoint to the Scaffolder plugin.\n *\n * @public\n */\nexport const ScaffolderPage = scaffolderPlugin.provide(\n createRoutableExtension({\n name: 'ScaffolderPage',\n component: () => import('./components/Router').then(m => m.Router),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * A field extension to show all the Entities that are owned by the current logged-in User for use in templates.\n *\n * @public\n */\nexport const OwnedEntityPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: OwnedEntityPicker,\n name: 'OwnedEntityPicker',\n }),\n);\n\n/**\n * EntityTagsPickerFieldExtension\n * @public\n */\nexport const EntityTagsPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: EntityTagsPicker,\n name: 'EntityTagsPicker',\n }),\n);\n\n/**\n * @alpha\n * The Router and main entrypoint to the Alpha Scaffolder plugin.\n */\nexport const NextScaffolderPage = scaffolderPlugin.provide(\n createRoutableExtension({\n name: 'NextScaffolderPage',\n component: () => import('./next/Router').then(m => m.Router),\n mountPoint: nextRouteRef,\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 React from 'react';\nimport capitalize from 'lodash/capitalize';\nimport { Progress } from '@backstage/core-components';\nimport {\n Box,\n Checkbox,\n FormControlLabel,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { Autocomplete } from '@material-ui/lab';\nimport { useEntityTypeFilter } from '@backstage/plugin-catalog-react';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\n/**\n * The component to select the `type` of `Template` that you will see in the table.\n *\n * @public\n */\nexport const TemplateTypePicker = () => {\n const alertApi = useApi(alertApiRef);\n const { error, loading, availableTypes, selectedTypes, setSelectedTypes } =\n useEntityTypeFilter();\n\n if (loading) return <Progress />;\n\n if (!availableTypes) return null;\n\n if (error) {\n alertApi.post({\n message: `Failed to load entity types`,\n severity: 'error',\n });\n return null;\n }\n\n return (\n <Box pb={1} pt={1}>\n <Typography variant=\"button\">Categories</Typography>\n <Autocomplete\n multiple\n aria-label=\"Categories\"\n options={availableTypes}\n value={selectedTypes}\n onChange={(_: object, value: string[]) => setSelectedTypes(value)}\n renderOption={(option, { selected }) => (\n <FormControlLabel\n control={\n <Checkbox\n icon={icon}\n checkedIcon={checkedIcon}\n checked={selected}\n />\n }\n label={capitalize(option)}\n />\n )}\n size=\"small\"\n popupIcon={<ExpandMoreIcon data-testid=\"categories-picker-expand\" />}\n renderInput={params => <TextField {...params} variant=\"outlined\" />}\n />\n </Box>\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 */\nimport { useImmerReducer } from 'use-immer';\nimport { useEffect } from 'react';\nimport { scaffolderApiRef } from '../../api';\nimport {\n ScaffolderTask,\n ScaffolderTaskStatus,\n ScaffolderTaskOutput,\n LogEvent,\n} from '../../types';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { Subscription } from '@backstage/types';\n\ntype Step = {\n id: string;\n status: ScaffolderTaskStatus;\n endedAt?: string;\n startedAt?: string;\n};\n\nexport type TaskStream = {\n loading: boolean;\n error?: Error;\n stepLogs: { [stepId in string]: string[] };\n completed: boolean;\n task?: ScaffolderTask;\n steps: { [stepId in string]: Step };\n output?: ScaffolderTaskOutput;\n};\n\ntype ReducerLogEntry = {\n createdAt: string;\n body: {\n stepId?: string;\n status?: ScaffolderTaskStatus;\n message: string;\n output?: ScaffolderTaskOutput;\n error?: Error;\n };\n};\n\ntype ReducerAction =\n | { type: 'INIT'; data: ScaffolderTask }\n | { type: 'LOGS'; data: ReducerLogEntry[] }\n | { type: 'COMPLETED'; data: ReducerLogEntry }\n | { type: 'ERROR'; data: Error };\n\nfunction reducer(draft: TaskStream, action: ReducerAction) {\n switch (action.type) {\n case 'INIT': {\n draft.steps = action.data.spec.steps.reduce((current, next) => {\n current[next.id] = { status: 'open', id: next.id };\n return current;\n }, {} as { [stepId in string]: Step });\n draft.stepLogs = action.data.spec.steps.reduce((current, next) => {\n current[next.id] = [];\n return current;\n }, {} as { [stepId in string]: string[] });\n draft.loading = false;\n draft.error = undefined;\n draft.completed = false;\n draft.task = action.data;\n return;\n }\n\n case 'LOGS': {\n const entries = action.data;\n const logLines = [];\n\n for (const entry of entries) {\n const logLine = `${entry.createdAt} ${entry.body.message}`;\n logLines.push(logLine);\n\n if (!entry.body.stepId || !draft.steps?.[entry.body.stepId]) {\n continue;\n }\n\n const currentStepLog = draft.stepLogs?.[entry.body.stepId];\n const currentStep = draft.steps?.[entry.body.stepId];\n\n if (entry.body.status && entry.body.status !== currentStep.status) {\n currentStep.status = entry.body.status;\n\n if (currentStep.status === 'processing') {\n currentStep.startedAt = entry.createdAt;\n }\n\n if (\n ['cancelled', 'failed', 'completed'].includes(currentStep.status)\n ) {\n currentStep.endedAt = entry.createdAt;\n }\n }\n\n currentStepLog?.push(logLine);\n }\n\n return;\n }\n\n case 'COMPLETED': {\n draft.completed = true;\n draft.output = action.data.body.output;\n draft.error = action.data.body.error;\n\n return;\n }\n\n case 'ERROR': {\n draft.error = action.data;\n draft.loading = false;\n draft.completed = true;\n return;\n }\n\n default:\n return;\n }\n}\n\nexport const useTaskEventStream = (taskId: string): TaskStream => {\n const scaffolderApi = useApi(scaffolderApiRef);\n const [state, dispatch] = useImmerReducer(reducer, {\n loading: true,\n completed: false,\n stepLogs: {} as { [stepId in string]: string[] },\n steps: {} as { [stepId in string]: Step },\n });\n\n useEffect(() => {\n let didCancel = false;\n let subscription: Subscription | undefined;\n let logPusher: NodeJS.Timeout | undefined;\n\n scaffolderApi.getTask(taskId).then(\n task => {\n if (didCancel) {\n return;\n }\n dispatch({ type: 'INIT', data: task });\n\n // TODO(blam): Use a normal fetch to fetch the current log for the event stream\n // and use that for an INIT_EVENTs dispatch event, and then\n // use the last event ID to subscribe using after option to\n // stream logs. Without this, if you have a lot of logs, it can look like the\n // task is being rebuilt on load as it progresses through the steps at a slower\n // rate whilst it builds the status from the event logs\n const observable = scaffolderApi.streamLogs({ taskId });\n\n const collectedLogEvents = new Array<LogEvent>();\n\n function emitLogs() {\n if (collectedLogEvents.length) {\n const logs = collectedLogEvents.splice(\n 0,\n collectedLogEvents.length,\n );\n dispatch({ type: 'LOGS', data: logs });\n }\n }\n\n logPusher = setInterval(emitLogs, 500);\n\n subscription = observable.subscribe({\n next: event => {\n switch (event.type) {\n case 'log':\n return collectedLogEvents.push(event);\n case 'completion':\n emitLogs();\n dispatch({ type: 'COMPLETED', data: event });\n return undefined;\n default:\n throw new Error(\n `Unhandled event type ${event.type} in observer`,\n );\n }\n },\n error: error => {\n emitLogs();\n dispatch({ type: 'ERROR', data: error });\n },\n });\n },\n error => {\n if (!didCancel) {\n dispatch({ type: 'ERROR', data: error });\n }\n },\n );\n\n return () => {\n didCancel = true;\n if (subscription) {\n subscription.unsubscribe();\n }\n if (logPusher) {\n clearInterval(logPusher);\n }\n };\n }, [scaffolderApi, dispatch, taskId]);\n\n return state;\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 { Box } from '@material-ui/core';\nimport React, { useEffect, useRef } from 'react';\nimport { DismissableBanner } from '@backstage/core-components';\n\ntype TaskErrorsProps = {\n error?: Error;\n};\n\nexport const TaskErrors = ({ error }: TaskErrorsProps) => {\n const id = useRef('');\n\n useEffect(() => {\n id.current = String(Math.random());\n }, [error]);\n return error ? (\n <Box>\n <DismissableBanner\n id={id.current}\n variant=\"warning\"\n message={error.message}\n />\n </Box>\n ) : null;\n};\n","/*\n * Copyright 2020 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 { Grid, LinkProps, makeStyles, Typography } from '@material-ui/core';\nimport LanguageIcon from '@material-ui/icons/Language';\n\nimport { IconComponent } from '@backstage/core-plugin-api';\nimport { Link } from '@backstage/core-components';\n\nconst useStyles = makeStyles({\n svgIcon: {\n display: 'inline-block',\n '& svg': {\n display: 'inline-block',\n fontSize: 'inherit',\n verticalAlign: 'baseline',\n },\n },\n});\n\nexport const IconLink = (\n props: {\n href: string;\n text?: string;\n Icon?: IconComponent;\n } & LinkProps,\n) => {\n const { href, text, Icon, ...linkProps } = props;\n\n const classes = useStyles();\n\n return (\n <Grid container direction=\"row\" spacing={1}>\n <Grid item>\n <Typography component=\"div\" className={classes.svgIcon}>\n {Icon ? <Icon /> : <LanguageIcon />}\n </Typography>\n </Grid>\n <Grid item>\n <Link to={href} {...linkProps}>\n {text || href}\n </Link>\n </Grid>\n </Grid>\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 { parseEntityRef } from '@backstage/catalog-model';\nimport { entityRouteRef } from '@backstage/plugin-catalog-react';\nimport { Box } from '@material-ui/core';\nimport LanguageIcon from '@material-ui/icons/Language';\nimport React from 'react';\nimport { ScaffolderTaskOutput } from '../../types';\nimport { IconLink } from './IconLink';\nimport { IconComponent, useApp, useRouteRef } from '@backstage/core-plugin-api';\n\ntype TaskPageLinksProps = {\n output: ScaffolderTaskOutput;\n};\n\nexport const TaskPageLinks = ({ output }: TaskPageLinksProps) => {\n const { links = [] } = output;\n const app = useApp();\n const entityRoute = useRouteRef(entityRouteRef);\n\n const iconResolver = (key?: string): IconComponent =>\n key ? app.getSystemIcon(key) ?? LanguageIcon : LanguageIcon;\n\n return (\n <Box px={3} pb={3}>\n {links\n .filter(({ url, entityRef }) => url || entityRef)\n .map(({ url, entityRef, title, icon }) => {\n if (entityRef) {\n const entityName = parseEntityRef(entityRef, {\n defaultKind: '<unknown>',\n defaultNamespace: '<unknown>',\n });\n const target = entityRoute(entityName);\n return { title, icon, url: target };\n }\n return { title, icon, url: url! };\n })\n .map(({ url, title, icon }, i) => (\n <IconLink\n key={`output-link-${i}`}\n href={url}\n text={title ?? url}\n Icon={iconResolver(icon)}\n target=\"_blank\"\n />\n ))}\n </Box>\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 { parseEntityRef } from '@backstage/catalog-model';\nimport {\n Content,\n ErrorPage,\n Header,\n Page,\n LogViewer,\n Progress,\n} from '@backstage/core-components';\nimport { useRouteRef, useRouteRefParams } from '@backstage/core-plugin-api';\nimport { BackstageTheme } from '@backstage/theme';\nimport {\n Button,\n CircularProgress,\n Paper,\n StepButton,\n StepIconProps,\n} from '@material-ui/core';\nimport Grid from '@material-ui/core/Grid';\nimport Step from '@material-ui/core/Step';\nimport StepLabel from '@material-ui/core/StepLabel';\nimport Stepper from '@material-ui/core/Stepper';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport Cancel from '@material-ui/icons/Cancel';\nimport Check from '@material-ui/icons/Check';\nimport FiberManualRecordIcon from '@material-ui/icons/FiberManualRecord';\nimport classNames from 'classnames';\nimport { DateTime, Interval } from 'luxon';\nimport qs from 'qs';\nimport React, { memo, useEffect, useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router';\nimport useInterval from 'react-use/lib/useInterval';\nimport {\n rootRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n} from '../../routes';\nimport { ScaffolderTaskStatus, ScaffolderTaskOutput } from '../../types';\nimport { useTaskEventStream } from '../hooks/useEventStream';\nimport { TaskErrors } from './TaskErrors';\nimport { TaskPageLinks } from './TaskPageLinks';\n\n// typings are wrong for this library, so fallback to not parsing types.\nconst humanizeDuration = require('humanize-duration');\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n },\n button: {\n marginBottom: theme.spacing(2),\n marginLeft: theme.spacing(2),\n },\n actionsContainer: {\n marginBottom: theme.spacing(2),\n },\n resetContainer: {\n padding: theme.spacing(3),\n },\n labelWrapper: {\n display: 'flex',\n flex: 1,\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n stepWrapper: {\n width: '100%',\n },\n }),\n);\n\ntype TaskStep = {\n id: string;\n name: string;\n status: ScaffolderTaskStatus;\n startedAt?: string;\n endedAt?: string;\n};\n\nconst StepTimeTicker = ({ step }: { step: TaskStep }) => {\n const [time, setTime] = useState('');\n\n useInterval(() => {\n if (!step.startedAt) {\n setTime('');\n return;\n }\n\n const end = step.endedAt\n ? DateTime.fromISO(step.endedAt)\n : DateTime.local();\n\n const startedAt = DateTime.fromISO(step.startedAt);\n const formatted = Interval.fromDateTimes(startedAt, end)\n .toDuration()\n .valueOf();\n\n setTime(humanizeDuration(formatted, { round: true }));\n }, 1000);\n\n return <Typography variant=\"caption\">{time}</Typography>;\n};\n\nconst useStepIconStyles = makeStyles((theme: BackstageTheme) =>\n createStyles({\n root: {\n color: theme.palette.text.disabled,\n display: 'flex',\n height: 22,\n alignItems: 'center',\n },\n completed: {\n color: theme.palette.status.ok,\n },\n error: {\n color: theme.palette.status.error,\n },\n }),\n);\n\nfunction TaskStepIconComponent(props: StepIconProps) {\n const classes = useStepIconStyles();\n const { active, completed, error } = props;\n\n const getMiddle = () => {\n if (active) {\n return <CircularProgress size=\"24px\" />;\n }\n if (completed) {\n return <Check />;\n }\n if (error) {\n return <Cancel />;\n }\n return <FiberManualRecordIcon />;\n };\n\n return (\n <div\n className={classNames(classes.root, {\n [classes.completed]: completed,\n [classes.error]: error,\n })}\n >\n {getMiddle()}\n </div>\n );\n}\n\nexport const TaskStatusStepper = memo(\n (props: {\n steps: TaskStep[];\n currentStepId: string | undefined;\n onUserStepChange: (id: string) => void;\n classes?: {\n root?: string;\n };\n }) => {\n const { steps, currentStepId, onUserStepChange } = props;\n const classes = useStyles(props);\n\n return (\n <div className={classes.root}>\n <Stepper\n activeStep={steps.findIndex(s => s.id === currentStepId)}\n orientation=\"vertical\"\n nonLinear\n >\n {steps.map((step, index) => {\n const isCompleted = step.status === 'completed';\n const isFailed = step.status === 'failed';\n const isActive = step.status === 'processing';\n const isSkipped = step.status === 'skipped';\n\n return (\n <Step key={String(index)} expanded>\n <StepButton onClick={() => onUserStepChange(step.id)}>\n <StepLabel\n StepIconProps={{\n completed: isCompleted,\n error: isFailed,\n active: isActive,\n }}\n StepIconComponent={TaskStepIconComponent}\n className={classes.stepWrapper}\n >\n <div className={classes.labelWrapper}>\n <Typography variant=\"subtitle2\">{step.name}</Typography>\n {isSkipped ? (\n <Typography variant=\"caption\">Skipped</Typography>\n ) : (\n <StepTimeTicker step={step} />\n )}\n </div>\n </StepLabel>\n </StepButton>\n </Step>\n );\n })}\n </Stepper>\n </div>\n );\n },\n);\n\nconst hasLinks = ({ links = [] }: ScaffolderTaskOutput): boolean =>\n links.length > 0;\n\n/**\n * TaskPageProps for constructing a TaskPage\n * @param loadingText - Optional loading text shown before a task begins executing.\n *\n * @public\n */\nexport type TaskPageProps = {\n loadingText?: string;\n};\n\n/**\n * TaskPage for showing the status of the taskId provided as a param\n * @param loadingText - Optional loading text shown before a task begins executing.\n *\n * @public\n */\nexport const TaskPage = ({ loadingText }: TaskPageProps) => {\n const classes = useStyles();\n const navigate = useNavigate();\n const rootPath = useRouteRef(rootRouteRef);\n const templateRoute = useRouteRef(selectedTemplateRouteRef);\n const [userSelectedStepId, setUserSelectedStepId] = useState<\n string | undefined\n >(undefined);\n const [lastActiveStepId, setLastActiveStepId] = useState<string | undefined>(\n undefined,\n );\n const { taskId } = useRouteRefParams(scaffolderTaskRouteRef);\n const taskStream = useTaskEventStream(taskId);\n const completed = taskStream.completed;\n const steps = useMemo(\n () =>\n taskStream.task?.spec.steps.map(step => ({\n ...step,\n ...taskStream?.steps?.[step.id],\n })) ?? [],\n [taskStream],\n );\n\n useEffect(() => {\n const mostRecentFailedOrActiveStep = steps.find(step =>\n ['failed', 'processing'].includes(step.status),\n );\n if (completed && !mostRecentFailedOrActiveStep) {\n setLastActiveStepId(steps[steps.length - 1]?.id);\n return;\n }\n\n setLastActiveStepId(mostRecentFailedOrActiveStep?.id);\n }, [steps, completed]);\n\n const currentStepId = userSelectedStepId ?? lastActiveStepId;\n\n const logAsString = useMemo(() => {\n if (!currentStepId) {\n return loadingText ? loadingText : 'Loading...';\n }\n const log = taskStream.stepLogs[currentStepId];\n\n if (!log?.length) {\n return 'Waiting for logs...';\n }\n return log.join('\\n');\n }, [taskStream.stepLogs, currentStepId, loadingText]);\n\n const taskNotFound =\n taskStream.completed === true &&\n taskStream.loading === false &&\n !taskStream.task;\n\n const { output } = taskStream;\n\n const handleStartOver = () => {\n if (!taskStream.task || !taskStream.task?.spec.templateInfo?.entityRef) {\n navigate(rootPath());\n return;\n }\n\n const formData = taskStream.task!.spec.parameters;\n\n const { name, namespace } = parseEntityRef(\n taskStream.task!.spec.templateInfo?.entityRef,\n );\n\n navigate(\n `${templateRoute({ templateName: name, namespace })}?${qs.stringify({\n formData: JSON.stringify(formData),\n })}`,\n );\n };\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={`Task ${taskId}`}\n title=\"Task Activity\"\n subtitle={`Activity for task: ${taskId}`}\n />\n <Content>\n {taskNotFound ? (\n <ErrorPage\n status=\"404\"\n statusMessage=\"Task not found\"\n additionalInfo=\"No task found with this ID\"\n />\n ) : (\n <div>\n <Grid container>\n <Grid item xs={3}>\n <Paper>\n <TaskStatusStepper\n steps={steps}\n currentStepId={currentStepId}\n onUserStepChange={setUserSelectedStepId}\n />\n {output && hasLinks(output) && (\n <TaskPageLinks output={output} />\n )}\n <Button\n className={classes.button}\n onClick={handleStartOver}\n disabled={!completed}\n variant=\"contained\"\n color=\"primary\"\n >\n Start Over\n </Button>\n </Paper>\n </Grid>\n <Grid item xs={9}>\n {!currentStepId && <Progress />}\n\n <div style={{ height: '80vh' }}>\n <TaskErrors error={taskStream.error} />\n <LogViewer text={logAsString} />\n </div>\n </Grid>\n </Grid>\n </div>\n )}\n </Content>\n </Page>\n );\n};\n"],"names":["queryString","FormControl","Autocomplete","_a","_b","useStyles","makeStyles","Typography","Grid"],"mappings":"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"}
@@ -16,13 +16,13 @@ import { Link } from 'react-router-dom';
16
16
  import AddCircleOutline from '@material-ui/icons/AddCircleOutline';
17
17
  import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';
18
18
  import { usePermission } from '@backstage/plugin-permission-react';
19
- import { t as nextSelectedTemplateRouteRef, r as registerComponentRouteRef, u as nextRouteRef, s as selectedTemplateRouteRef, c as scaffolderApiRef, F as FIELD_EXTENSION_WRAPPER_KEY, i as FIELD_EXTENSION_KEY, j as SecretsContextProvider } from './index-6ab5f5ce.esm.js';
19
+ import { u as nextSelectedTemplateRouteRef, r as registerComponentRouteRef, v as nextRouteRef, s as selectedTemplateRouteRef, c as scaffolderApiRef, F as FIELD_EXTENSION_WRAPPER_KEY, i as FIELD_EXTENSION_KEY, k as SecretsContextProvider } from './index-59f10b07.esm.js';
20
20
  import { RELATION_OWNED_BY, parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';
21
21
  import useAsync from 'react-use/lib/useAsync';
22
22
  import { withTheme } from '@rjsf/core';
23
23
  import { Theme } from '@rjsf/material-ui';
24
24
  import { Draft07 } from 'json-schema-library';
25
- import { D as DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from './default-7c2e7b25.esm.js';
25
+ import { D as DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from './default-e3b0d980.esm.js';
26
26
  import '@backstage/errors';
27
27
  import 'qs';
28
28
  import 'zen-observable';
@@ -688,4 +688,4 @@ const Router = (props) => {
688
688
  };
689
689
 
690
690
  export { Router };
691
- //# sourceMappingURL=index-5eebaa47.esm.js.map
691
+ //# sourceMappingURL=index-771633ac.esm.js.map