@backstage/plugin-scaffolder 0.14.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +119 -0
- package/dist/esm/{Router-ba25f61c.esm.js → Router-773d053b.esm.js} +359 -47
- package/dist/esm/Router-773d053b.esm.js.map +1 -0
- package/dist/esm/{index-da137e20.esm.js → index-25fdb62e.esm.js} +39 -203
- package/dist/esm/index-25fdb62e.esm.js.map +1 -0
- package/dist/index.d.ts +137 -35
- package/dist/index.esm.js +1 -2
- package/dist/index.esm.js.map +1 -1
- package/package.json +26 -21
- package/dist/esm/Router-ba25f61c.esm.js.map +0 -1
- package/dist/esm/index-da137e20.esm.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-25fdb62e.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/RepoUrlPickerHost.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/routes.ts","../../src/plugin.ts","../../src/components/TemplateTypePicker/TemplateTypePicker.tsx","../../src/components/hooks/useEventStream.ts","../../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} 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} from './types';\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 useLongPollingLogs: boolean;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\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 }\n\n async getIntegrationsList(\n options: ScaffolderGetIntegrationsListOptions,\n ): Promise<ScaffolderGetIntegrationsListResponse> {\n const integrations = [\n ...this.scmIntegrationsApi.azure.list(),\n ...this.scmIntegrationsApi.bitbucket.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 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 || '');\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=\"normal\"\n helperText={description}\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 { GetEntitiesRequest } from '@backstage/catalog-client';\nimport { Entity, 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}\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 [inputValue, setInputValue] = useState('');\n const [inputError, setInputError] = useState(false);\n const tagValidator = makeValidator().isValidTag;\n const kinds = uiSchema['ui:options']?.kinds;\n\n const { loading, value: existingTags } = useAsync(async () => {\n const tagsRequest: GetEntitiesRequest = { fields: ['metadata.tags'] };\n if (kinds) {\n tagsRequest.filter = { kind: kinds };\n }\n\n const entities = await catalogApi.getEntities(tagsRequest);\n\n return [\n ...new Set(\n entities.items\n .flatMap((e: Entity) => e.metadata?.tags)\n .filter(Boolean) as string[],\n ),\n ].sort();\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={existingTags || []}\n ChipProps={{ size: 'small' }}\n renderInput={params => (\n <TextField\n {...params}\n label=\"Tags\"\n onChange={e => setInputValue(e.target.value)}\n error={inputError}\n helperText=\"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 </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}\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 },\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, repoName } = 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 <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !repoName}\n >\n <InputLabel htmlFor=\"repoNameInput\">Repository</InputLabel>\n <Input\n id=\"repoNameInput\"\n onChange={e => onChange({ repoName: e.target.value })}\n value={repoName}\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 */\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 state: RepoUrlPickerState;\n onChange: (state: RepoUrlPickerState) => void;\n rawErrors: string[];\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, repoName } = 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, user or project that this repo will belong to\n </FormHelperText>\n </FormControl>\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !repoName}\n >\n <InputLabel htmlFor=\"repoNameInput\">Repository</InputLabel>\n <Input\n id=\"repoNameInput\"\n onChange={e => onChange({ repoName: e.target.value })}\n value={repoName}\n />\n <FormHelperText>The name of the repository</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, repoName, 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 <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !repoName}\n >\n <InputLabel htmlFor=\"repoNameInput\">Repository</InputLabel>\n <Input\n id=\"repoNameInput\"\n onChange={e => onChange({ repoName: e.target.value })}\n value={repoName}\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 */\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 BitbucketRepoPicker = (props: {\n onChange: (state: RepoUrlPickerState) => void;\n state: RepoUrlPickerState;\n rawErrors: string[];\n}) => {\n const { onChange, rawErrors, state } = props;\n const { host, workspace, project, repoName } = state;\n return (\n <>\n {host === 'bitbucket.org' && (\n <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !workspace}\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 <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 <FormControl\n margin=\"normal\"\n required\n error={rawErrors?.length > 0 && !repoName}\n >\n <InputLabel htmlFor=\"repoNameInput\">Repository</InputLabel>\n <Input\n id=\"repoNameInput\"\n onChange={e => onChange({ repoName: e.target.value })}\n value={repoName}\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 */\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 */\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 { FieldExtensionComponentProps } from '../../../extensions';\nimport { RepoUrlPickerHost } from './RepoUrlPickerHost';\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 requestUserCredentials?: {\n secretsKey: string;\n additionalScopes?: {\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\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 === 1) {\n setState(prevState => ({ ...prevState, owner: allowedOwners[0] }));\n }\n }, [setState, allowedOwners]);\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 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 </>\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\n else {\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}\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 { 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\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 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\nexport const selectedTemplateRouteRef = createSubRouteRef({\n id: 'scaffolder/selected-template',\n parent: rootRouteRef,\n path: '/templates/:templateName',\n});\n\nexport const scaffolderTaskRouteRef = createSubRouteRef({\n id: 'scaffolder/task',\n parent: rootRouteRef,\n path: '/tasks/:taskId',\n});\n\nexport const actionsRouteRef = createSubRouteRef({\n id: 'scaffolder/actions',\n parent: rootRouteRef,\n path: '/actions',\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 { registerComponentRouteRef, rootRouteRef } from './routes';\nimport {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\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 },\n factory: ({ discoveryApi, scmIntegrationsApi, fetchApi }) =>\n new ScaffolderClient({\n discoveryApi,\n scmIntegrationsApi,\n fetchApi,\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 * 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 };\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 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 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 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 } 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, useParams } from 'react-router';\nimport useInterval from 'react-use/lib/useInterval';\nimport { rootRouteRef, selectedTemplateRouteRef } from '../../routes';\nimport { ScaffolderTaskStatus, ScaffolderTaskOutput } from '../../types';\nimport { useTaskEventStream } from '../hooks/useEventStream';\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 ({\n steps,\n currentStepId,\n onUserStepChange,\n }: {\n steps: TaskStep[];\n currentStepId: string | undefined;\n onUserStepChange: (id: string) => void;\n }) => {\n const classes = useStyles();\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 } = useParams();\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 } = parseEntityRef(\n taskStream.task!.spec.templateInfo?.entityRef,\n );\n\n navigate(\n `${templateRoute({ templateName: name })}?${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 <LogViewer text={logAsString} />\n </div>\n </Grid>\n </Grid>\n </div>\n )}\n </Content>\n </Page>\n );\n};\n"],"names":["FormControl","Autocomplete","useStyles","makeStyles","Typography","Grid"],"mappings":"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"}
|