diff --git a/app-config.yaml b/app-config.yaml index ca553afc7..0510d7db3 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -125,6 +125,11 @@ catalog: target: ../../catalog/catalog.yaml rules: - allow: [Component, Group, User] + - type: file + target: ../../catalog/templates/*.yaml + rules: + - allow: + - Template grafana: domain: https://giantswarm.grafana.net diff --git a/catalog/templates/go-project.yaml b/catalog/templates/go-project.yaml new file mode 100644 index 000000000..fd2fdfc73 --- /dev/null +++ b/catalog/templates/go-project.yaml @@ -0,0 +1,167 @@ +apiVersion: scaffolder.backstage.io/v1beta3 +kind: Template +metadata: + name: go-project + title: Go project + description: A Go project without any deployment capabilities, suited best for CLIs or libraries +spec: + owner: team-honeybadger + type: Component + + # User input parameters and form details config + parameters: + - title: Basic details + required: + - name + - description + - visibility + - owner + description: Please fill in the required details. Make sure to pick a name carefully, as it will be quite a hassle to change it later. + properties: + name: + title: Name + type: string + description: Unique name of the component and repository + pattern: "[a-z][-a-z0-9]+" + minLength: 2 + maxLength: 100 + ui:autofocus: true + description: + title: Description + type: string + description: Please give a general description in one sentence, so everybody can understand what this project and repo is for. + visibility: + title: Repository visibility + type: string + default: public + enum: + - public + - private + ui:widget: radio + owner: + type: string + ui:field: OwnerPicker + + - title: Integrations + description: Select the technical integrations you need for sure. You can always add integrations later. + properties: + circleci: + type: boolean + title: I want CircleCI checks and builds for this project + default: true + ui:autofocus: true + image_registry: + type: boolean + title: I want a container image repository for this project + default: false + renovate: + type: boolean + title: I want Renovate to help update dependencies in this project + default: true + + - title: Additional options + description: For fine-tuning our automations you can set some additional options here. These can also be modified later. + properties: + precommit: + type: boolean + default: true + title: Provide pre-commit framework configuration + ui:autofocus: true + flavors: + type: object + title: Flavours + description: Select the type of repository features you want to enable for your project. Check [the docs](https://devportal.giantswarm.io/docs/default/component/devctl/docs/flavours/) to read more. + properties: + cli: + type: boolean + description: Check this if the project will include a CLI utility. + k8sapi: + type: boolean + description: Check if the project will include a Kubernetes API definition (CRD). + + - title: Developer portal catalog + description: Specify how this project will appear in the catalog. + properties: + componentType: + type: string + title: Component type + description: The component type this project should be shown as here in the developer portal catalog-info.yaml + default: unspecified + ui:autofocus: true + enum: + - unspecified + - cli + - library + - service + # system: + # type: string + # title: System + # description: Pick the system your new component belongs to (if any). + # ui:field: EntityPicker + # default: "" + # ui:options: + # catalogFilter: + # - kind: System + + # Creation steps + steps: + - id: fetch-base + name: Fetch and adapt template + action: fetch:template + input: + url: https://github.com/giantswarm/template/tree/nunjucks-syntax + copyWithoutTemplating: + - .github/workflows/* # required to prevent the attempt to replace ${{ variables }} + values: + REPOSITORY_NAME: ${{ parameters.name }} + OWNER: ${{ parameters.owner }} + DESCRIPTION: ${{ parameters.description }} + COMPONENT_TYPE: ${{ parameters.componentType }} + SYSTEM: ${{ parameters.system }} + VISIBILITY: ${{ parameters.visibility }} + WANT_CIRCLECI: ${{ parameters.circleci }} + WANT_IMAGE_REGISTRY: ${{ parameters.image_registry }} + RENOVATE: ${{ parameters.renovate }} + FLAVOUR_CLI: ${{ parameters.flavors.cli }} + FLAVOUR_K8SAPI: ${{ parameters.flavors.k8sapi }} + + - id: overwrite-codeowners + name: Create CODEOWNERS file + action: github:codeowners:create + input: + organization: giantswarm + team: ${{ parameters.owner }} + + - id: publish + name: Publish new repository + action: publish:github + input: + repoUrl: github.com?repo=${{ parameters.name }}&owner=giantswarm + description: ${{ parameters.description }} + access: giantswarm/employees + repoVisibility: ${{ parameters.visibility }} + defaultBranch: main + protectDefaultBranch: true + protectEnforceAdmins: true + deleteBranchOnMerge: true + gitAuthorName: Developer portal + allowMergeCommit: false + allowSquashMerge: true + allowRebaseMerge: false + allowAutoMerge: true + collaborators: + - team: bots + access: push + hasProjects: false + hasWiki: false + hasIssues: false + + # Results output + output: + links: + - title: Your new repository + url: ${{ steps['publish'].output.repoContentsUrl }} + text: + - title: Next steps + content: | + **Please read your new repository's README file.** There are some instructions for you regarding how to proceed. diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 3539e32e3..1aa55cbbe 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -5,11 +5,8 @@ import { CatalogIndexPage, catalogPlugin, } from '@backstage/plugin-catalog'; -import { - CatalogImportPage, - catalogImportPlugin, -} from '@backstage/plugin-catalog-import'; -import { ScaffolderPage, scaffolderPlugin } from '@backstage/plugin-scaffolder'; +import { scaffolderPlugin } from '@backstage/plugin-scaffolder'; +import { NextScaffolderPage } from '@backstage/plugin-scaffolder/alpha'; import { orgPlugin } from '@backstage/plugin-org'; import { SearchPage } from '@backstage/plugin-search'; import { @@ -30,8 +27,6 @@ import { AlertDisplay, OAuthRequestDialog } from '@backstage/core-components'; import { createApp } from '@backstage/app-defaults'; import { AppRouter, FlatRoutes } from '@backstage/core-app-api'; import { CatalogGraphPage } from '@backstage/plugin-catalog-graph'; -import { RequirePermission } from '@backstage/plugin-permission-react'; -import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha'; import { githubAuthApiRef } from '@backstage/core-plugin-api'; import { SignInPage } from '@backstage/core-components'; @@ -59,9 +54,6 @@ const app = createApp({ createComponent: scaffolderPlugin.routes.root, viewTechDoc: techdocsPlugin.routes.docRoot, }); - bind(scaffolderPlugin.externalRoutes, { - registerComponent: catalogImportPlugin.routes.importPage, - }); bind(orgPlugin.externalRoutes, { catalogIndex: catalogPlugin.routes.catalogIndex, }); @@ -89,15 +81,7 @@ const routes = ( - } /> - - - - } - /> + } /> }> {searchPage} diff --git a/packages/app/src/components/Root/Root.tsx b/packages/app/src/components/Root/Root.tsx index e694f861a..d4982267a 100644 --- a/packages/app/src/components/Root/Root.tsx +++ b/packages/app/src/components/Root/Root.tsx @@ -1,5 +1,6 @@ import React, { PropsWithChildren } from 'react'; import { makeStyles } from '@material-ui/core'; +import CreateComponentIcon from '@material-ui/icons/AddCircleOutline'; import HomeIcon from '@material-ui/icons/Home'; import LibraryBooks from '@material-ui/icons/LibraryBooks'; import LogoFull from './LogoFull'; @@ -63,6 +64,7 @@ export const Root = ({ children }: PropsWithChildren<{}>) => ( {/* Global nav, not org-specific */} + {/* End global nav */} diff --git a/packages/backend/package.json b/packages/backend/package.json index 0f2ee5f91..e8be0a9ee 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -21,6 +21,7 @@ "@backstage/catalog-client": "^1.4.3", "@backstage/catalog-model": "^1.4.1", "@backstage/config": "^1.0.8", + "@backstage/integration": "^1.6.2", "@backstage/plugin-app-backend": "^0.3.47", "@backstage/plugin-auth-backend": "^0.18.5", "@backstage/plugin-auth-node": "^0.2.16", @@ -29,6 +30,7 @@ "@backstage/plugin-permission-node": "^0.7.10", "@backstage/plugin-proxy-backend": "^0.2.41", "@backstage/plugin-scaffolder-backend": "^1.15.1", + "@backstage/plugin-scaffolder-node": "^0.2.2", "@backstage/plugin-search-backend": "^1.3.3", "@backstage/plugin-search-backend-module-pg": "^0.5.8", "@backstage/plugin-search-backend-node": "^1.2.3", @@ -43,7 +45,8 @@ "fs-extra": "^11.1.1", "js-yaml": "^4.0.0", "pg": "^8.10.0", - "winston": "^3.2.1" + "winston": "^3.2.1", + "zod": "^3.22.2" }, "devDependencies": { "@backstage/cli": "^0.22.9", diff --git a/packages/backend/src/plugins/scaffolder.ts b/packages/backend/src/plugins/scaffolder.ts index a12fee229..3be851a05 100644 --- a/packages/backend/src/plugins/scaffolder.ts +++ b/packages/backend/src/plugins/scaffolder.ts @@ -1,7 +1,9 @@ import { CatalogClient } from '@backstage/catalog-client'; -import { createRouter } from '@backstage/plugin-scaffolder-backend'; +import { createBuiltinActions, createRouter } from '@backstage/plugin-scaffolder-backend'; +import { ScmIntegrations } from '@backstage/integration'; import { Router } from 'express'; import type { PluginEnvironment } from '../types'; +import { createCodeownersAction } from './scaffolder/actions/custom'; export default async function createPlugin( env: PluginEnvironment, @@ -10,7 +12,19 @@ export default async function createPlugin( discoveryApi: env.discovery, }); + const integrations = ScmIntegrations.fromConfig(env.config); + + const builtInActions = createBuiltinActions({ + integrations, + catalogClient, + config: env.config, + reader: env.reader, + }); + + const actions = [...builtInActions, createCodeownersAction()]; + return await createRouter({ + actions, logger: env.logger, config: env.config, database: env.database, diff --git a/packages/backend/src/plugins/scaffolder/actions/custom.ts b/packages/backend/src/plugins/scaffolder/actions/custom.ts new file mode 100644 index 000000000..3656f6950 --- /dev/null +++ b/packages/backend/src/plugins/scaffolder/actions/custom.ts @@ -0,0 +1,43 @@ +import { createTemplateAction } from '@backstage/plugin-scaffolder-node'; +import { writeFile } from 'fs'; + +export const createCodeownersAction = () => { + return createTemplateAction<{ organization: string; team: string }>({ + id: 'github:codeowners:create', + schema: { + input: { + required: ['organization', 'team'], + type: 'object', + properties: { + organization: { + type: 'string', + title: 'Organization', + description: 'The GitHub organization name', + }, + team: { + type: 'string', + title: 'Filename', + description: 'The filename of the file that will be created', + }, + }, + }, + }, + async handler(ctx) { + const { signal } = ctx; + + // Sanitize a string like 'group:default/foobar' + const parts = ctx.input.team.split("/"); + const team = parts[parts.length - 1]; + + let contents = "# generated by giantswarm/github actions - changes will be overwritten\n"; + contents += `* @${ctx.input.organization}/${team}\n`; + + await writeFile( + `${ctx.workspacePath}/CODEOWNERS`, + contents, + { signal }, + _ => {}, + ); + }, + }); +}; diff --git a/yarn.lock b/yarn.lock index f55fd1f90..383419c05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1939,6 +1939,42 @@ winston "^3.2.1" winston-transport "^4.5.0" +"@backstage/backend-app-api@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@backstage/backend-app-api/-/backend-app-api-0.5.2.tgz#a5be3250c34b0813f728f82df4c87e16534cbc1a" + integrity sha512-ecJEhPFMaT7IjSMHUvTEKo8Pvjkv35/JbmZRifPy79EAK/7DxSCb6pHekU1e/nnmcvuIWfpguLINbBeqKL5HSg== + dependencies: + "@backstage/backend-common" "^0.19.4" + "@backstage/backend-plugin-api" "^0.6.2" + "@backstage/backend-tasks" "^0.5.7" + "@backstage/cli-common" "^0.1.12" + "@backstage/cli-node" "^0.1.3" + "@backstage/config" "^1.0.8" + "@backstage/config-loader" "^1.4.0" + "@backstage/errors" "^1.2.1" + "@backstage/plugin-auth-node" "^0.2.19" + "@backstage/plugin-permission-node" "^0.7.13" + "@backstage/types" "^1.1.0" + "@manypkg/get-packages" "^1.1.3" + "@types/cors" "^2.8.6" + "@types/express" "^4.17.6" + compression "^1.7.4" + cors "^2.8.5" + express "^4.17.1" + express-promise-router "^4.1.0" + fs-extra "10.1.0" + helmet "^6.0.0" + lodash "^4.17.21" + logform "^2.3.2" + minimatch "^5.0.0" + minimist "^1.2.5" + morgan "^1.10.0" + node-forge "^1.3.1" + selfsigned "^2.0.0" + stoppable "^1.1.0" + winston "^3.2.1" + winston-transport "^4.5.0" + "@backstage/backend-common@^0.19.1": version "0.19.1" resolved "https://registry.yarnpkg.com/@backstage/backend-common/-/backend-common-0.19.1.tgz#7921e5130cf8bdca79187ecd42c94df15a40e4a2" @@ -2003,6 +2039,70 @@ yauzl "^2.10.0" yn "^4.0.0" +"@backstage/backend-common@^0.19.4": + version "0.19.4" + resolved "https://registry.yarnpkg.com/@backstage/backend-common/-/backend-common-0.19.4.tgz#c27fb52ed69c9b28d9db85318cc6b5d161ba2322" + integrity sha512-D0pXpfLVWFSPejsW9OQaebhpV3ujRtVNFlRYPGbcJRq3Q0oebnNCz+9KO/Aunv27oGi7Pl0OYDjY9hpMPH+O4w== + dependencies: + "@aws-sdk/abort-controller" "^3.347.0" + "@aws-sdk/client-s3" "^3.350.0" + "@aws-sdk/credential-providers" "^3.350.0" + "@aws-sdk/types" "^3.347.0" + "@backstage/backend-app-api" "^0.5.2" + "@backstage/backend-dev-utils" "^0.1.1" + "@backstage/backend-plugin-api" "^0.6.2" + "@backstage/cli-common" "^0.1.12" + "@backstage/config" "^1.0.8" + "@backstage/config-loader" "^1.4.0" + "@backstage/errors" "^1.2.1" + "@backstage/integration" "^1.6.2" + "@backstage/integration-aws-node" "^0.1.5" + "@backstage/types" "^1.1.0" + "@google-cloud/storage" "^6.0.0" + "@keyv/memcache" "^1.3.5" + "@keyv/redis" "^2.5.3" + "@kubernetes/client-node" "0.18.1" + "@manypkg/get-packages" "^1.1.3" + "@octokit/rest" "^19.0.3" + "@types/cors" "^2.8.6" + "@types/dockerode" "^3.3.0" + "@types/express" "^4.17.6" + "@types/luxon" "^3.0.0" + "@types/webpack-env" "^1.15.2" + archiver "^5.0.2" + base64-stream "^1.0.0" + compression "^1.7.4" + concat-stream "^2.0.0" + cors "^2.8.5" + dockerode "^3.3.1" + express "^4.17.1" + express-promise-router "^4.1.0" + fs-extra "10.1.0" + git-url-parse "^13.0.0" + helmet "^6.0.0" + isomorphic-git "^1.23.0" + jose "^4.6.0" + keyv "^4.5.2" + knex "^2.0.0" + lodash "^4.17.21" + logform "^2.3.2" + luxon "^3.0.0" + minimatch "^5.0.0" + minimist "^1.2.5" + morgan "^1.10.0" + node-fetch "^2.6.7" + node-forge "^1.3.1" + pg "^8.3.0" + raw-body "^2.4.1" + selfsigned "^2.0.0" + stoppable "^1.1.0" + tar "^6.1.12" + uuid "^8.3.2" + winston "^3.2.1" + winston-transport "^4.5.0" + yauzl "^2.10.0" + yn "^4.0.0" + "@backstage/backend-dev-utils@^0.1.1": version "0.1.1" resolved "https://registry.yarnpkg.com/@backstage/backend-dev-utils/-/backend-dev-utils-0.1.1.tgz#5a10998436df08adb86066f1d685421de5d05f1c" @@ -2022,6 +2122,20 @@ express "^4.17.1" knex "^2.0.0" +"@backstage/backend-plugin-api@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@backstage/backend-plugin-api/-/backend-plugin-api-0.6.2.tgz#bf1215d62b31c2bee9e7b51aac4237b7d3d56690" + integrity sha512-ViSENG/e4+6/19R0xcEduXc8XjBPpxXzi1FFke4J5NwR+OIOjtMugVnJLWiAfHJNMvUI2Q4Jb2zGouxqbwgBIA== + dependencies: + "@backstage/backend-tasks" "^0.5.7" + "@backstage/config" "^1.0.8" + "@backstage/plugin-auth-node" "^0.2.19" + "@backstage/plugin-permission-common" "^0.7.7" + "@backstage/types" "^1.1.0" + "@types/express" "^4.17.6" + express "^4.17.1" + knex "^2.0.0" + "@backstage/backend-tasks@^0.5.4": version "0.5.4" resolved "https://registry.yarnpkg.com/@backstage/backend-tasks/-/backend-tasks-0.5.4.tgz#31fc5af9685f81e9faa1b83f710dbac8fe6e7e33" @@ -2040,6 +2154,24 @@ winston "^3.2.1" zod "^3.21.4" +"@backstage/backend-tasks@^0.5.7": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@backstage/backend-tasks/-/backend-tasks-0.5.7.tgz#49b761bd8906fc4252a806305811e94ab6a21eb3" + integrity sha512-ksWvho3zJQz6Xrx/ecLoi4Q4poLncexXKw/Y1aNhsVFbvBtajgGn+atsjSY9vK/GWv9WjFjr7n5zg+3Bm7mW8Q== + dependencies: + "@backstage/backend-common" "^0.19.4" + "@backstage/config" "^1.0.8" + "@backstage/errors" "^1.2.1" + "@backstage/types" "^1.1.0" + "@types/luxon" "^3.0.0" + cron "^2.0.0" + knex "^2.0.0" + lodash "^4.17.21" + luxon "^3.0.0" + uuid "^8.0.0" + winston "^3.2.1" + zod "^3.21.4" + "@backstage/catalog-client@^1.4.3": version "1.4.3" resolved "https://registry.yarnpkg.com/@backstage/catalog-client/-/catalog-client-1.4.3.tgz#e7631dcae97a7620b1532666a12e92be092a9f34" @@ -2081,6 +2213,20 @@ semver "^7.5.3" zod "^3.21.4" +"@backstage/cli-node@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@backstage/cli-node/-/cli-node-0.1.3.tgz#be32582957c52c80cd421893ec3b1d85ab2419ce" + integrity sha512-3djqOzkHYosxxriWjqeqIAcLRUcVGM/YXuS1lDMLQDdZKuIEoyXJddTOm9bsaio6huDrvnMBcJ5kgkHTm3mgKA== + dependencies: + "@backstage/cli-common" "^0.1.12" + "@backstage/errors" "^1.2.1" + "@backstage/types" "^1.1.0" + "@manypkg/get-packages" "^1.1.3" + "@yarnpkg/parsers" "^3.0.0-rc.4" + fs-extra "10.1.0" + semver "^7.5.3" + zod "^3.21.4" + "@backstage/cli@^0.22.9": version "0.22.9" resolved "https://registry.yarnpkg.com/@backstage/cli/-/cli-0.22.9.tgz#4f47b23366a2f438f27a0d37ea1790aad725e0b2" @@ -2217,6 +2363,29 @@ yaml "^2.0.0" yup "^0.32.9" +"@backstage/config-loader@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@backstage/config-loader/-/config-loader-1.4.0.tgz#d2f8aaad3d2977f9bfda98239e51cdf3ecb610f6" + integrity sha512-Qk3U4fYvqpcWOPr5ClC+Q+ByXB1GCRRieiQNsgSszR2hFqWpRNVoiv0j+6YMsbvVmNX8VFO3iKJEd11Ae1RB/g== + dependencies: + "@backstage/cli-common" "^0.1.12" + "@backstage/config" "^1.0.8" + "@backstage/errors" "^1.2.1" + "@backstage/types" "^1.1.0" + "@types/json-schema" "^7.0.6" + ajv "^8.10.0" + chokidar "^3.5.2" + fs-extra "10.1.0" + json-schema "^0.4.0" + json-schema-merge-allof "^0.8.1" + json-schema-traverse "^1.0.0" + lodash "^4.17.21" + minimist "^1.2.5" + node-fetch "^2.6.7" + typescript-json-schema "^0.55.0" + yaml "^2.0.0" + yup "^0.32.9" + "@backstage/config@^1.0.7", "@backstage/config@^1.0.8": version "1.0.8" resolved "https://registry.yarnpkg.com/@backstage/config/-/config-1.0.8.tgz#283a4900c7aae216bd4e3dce4389ce060f989884" @@ -2405,6 +2574,21 @@ lodash "^4.17.21" luxon "^3.0.0" +"@backstage/integration@^1.6.2": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@backstage/integration/-/integration-1.6.2.tgz#83e70aea9d78624a2b6c0c4c3a37675752cdbede" + integrity sha512-10XNwGmzoLwcsRPieZLoYRXBBYvdkakT+TY5ucNaGw9QwxvlFZxDel1hIPLJIEctV9yFCkf1iw4ufJBiaHNJjQ== + dependencies: + "@azure/identity" "^3.2.1" + "@backstage/config" "^1.0.8" + "@backstage/errors" "^1.2.1" + "@octokit/auth-app" "^4.0.0" + "@octokit/rest" "^19.0.3" + cross-fetch "^3.1.5" + git-url-parse "^13.0.0" + lodash "^4.17.21" + luxon "^3.0.0" + "@backstage/plugin-app-backend@^0.3.47": version "0.3.47" resolved "https://registry.yarnpkg.com/@backstage/plugin-app-backend/-/plugin-app-backend-0.3.47.tgz#b5df54f7484967e462e1ffc9240c7d470c45e53c" @@ -2490,6 +2674,20 @@ node-fetch "^2.6.7" winston "^3.2.1" +"@backstage/plugin-auth-node@^0.2.19": + version "0.2.19" + resolved "https://registry.yarnpkg.com/@backstage/plugin-auth-node/-/plugin-auth-node-0.2.19.tgz#bae4befc72ad79a4a805a2e847f6d68f75dc0195" + integrity sha512-E/GuS0OzcrauE5b4ODKXOT59EEuCaNHSWnBeerXlxoqBaGSVdXodOjpfmcU7sxMHmJvT0W04G4gOR9Jc+VPLEw== + dependencies: + "@backstage/backend-common" "^0.19.4" + "@backstage/config" "^1.0.8" + "@backstage/errors" "^1.2.1" + "@types/express" "*" + express "^4.17.1" + jose "^4.6.0" + node-fetch "^2.6.7" + winston "^3.2.1" + "@backstage/plugin-catalog-backend@^1.11.0": version "1.11.0" resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-backend/-/plugin-catalog-backend-1.11.0.tgz#d625b307fdbe1dba9fbdcb625101edac8608a45b" @@ -2775,6 +2973,23 @@ zod "^3.21.4" zod-to-json-schema "^3.20.4" +"@backstage/plugin-permission-node@^0.7.13": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-node/-/plugin-permission-node-0.7.13.tgz#ac071912ac7608ee695328cf22a7007f8f4418e3" + integrity sha512-u7STVvR0IExRzrl4VHhe0iHKnVvSvxtjqwI0hJS+zy2nid9koceCDeDDVzZ+gCY0IBqX470mysbA8yGciMDywA== + dependencies: + "@backstage/backend-common" "^0.19.4" + "@backstage/backend-plugin-api" "^0.6.2" + "@backstage/config" "^1.0.8" + "@backstage/errors" "^1.2.1" + "@backstage/plugin-auth-node" "^0.2.19" + "@backstage/plugin-permission-common" "^0.7.7" + "@types/express" "^4.17.6" + express "^4.17.1" + express-promise-router "^4.1.0" + zod "^3.21.4" + zod-to-json-schema "^3.20.4" + "@backstage/plugin-permission-react@^0.4.14": version "0.4.14" resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-react/-/plugin-permission-react-0.4.14.tgz#50b1e60230a6385fbd7f5bbb175c64710114f2bd" @@ -2874,6 +3089,15 @@ "@backstage/plugin-permission-common" "^0.7.7" "@backstage/types" "^1.1.0" +"@backstage/plugin-scaffolder-common@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@backstage/plugin-scaffolder-common/-/plugin-scaffolder-common-1.4.0.tgz#e1cad29f7e4adde2e9c853854aa76ccdda0b183e" + integrity sha512-NO15B4RsQEDUzQCjcs1B7RMVlTYmUjrUgfucCfRc3bJZAeGuk+1H2WFzHzKvKYdmW3M/JrNQXrEjv0xILbfiEg== + dependencies: + "@backstage/catalog-model" "^1.4.1" + "@backstage/plugin-permission-common" "^0.7.7" + "@backstage/types" "^1.1.0" + "@backstage/plugin-scaffolder-node@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@backstage/plugin-scaffolder-node/-/plugin-scaffolder-node-0.1.5.tgz#8cc82ab47940c187d1e44fcb89390885278b0e94" @@ -2888,6 +3112,24 @@ zod "^3.21.4" zod-to-json-schema "^3.20.4" +"@backstage/plugin-scaffolder-node@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@backstage/plugin-scaffolder-node/-/plugin-scaffolder-node-0.2.2.tgz#7f8339954e4b843da2067ff85ab50825e2a0ca2f" + integrity sha512-qkDFxQQQckx5HECkVkxW1YJ2qvMCQgqSNA2ARhzLJ6gWch+jh9SwrG7CtZJbkgW6l8Xq8Q3U2uy3wTPsH8GLjA== + dependencies: + "@backstage/backend-common" "^0.19.4" + "@backstage/backend-plugin-api" "^0.6.2" + "@backstage/catalog-model" "^1.4.1" + "@backstage/errors" "^1.2.1" + "@backstage/integration" "^1.6.2" + "@backstage/plugin-scaffolder-common" "^1.4.0" + "@backstage/types" "^1.1.0" + fs-extra "10.1.0" + jsonschema "^1.2.6" + winston "^3.2.1" + zod "^3.21.4" + zod-to-json-schema "^3.20.4" + "@backstage/plugin-scaffolder-react@^1.5.1": version "1.5.1" resolved "https://registry.yarnpkg.com/@backstage/plugin-scaffolder-react/-/plugin-scaffolder-react-1.5.1.tgz#925030c3ece04438ed292ca051f117cb91d716b0" @@ -7543,7 +7785,7 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@*", "@types/react-dom@<18.0.0", "@types/react-dom@^17": +"@types/react-dom@*", "@types/react-dom@<18.0.0": version "17.0.20" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.20.tgz#e0c8901469d732b36d8473b40b679ad899da1b53" integrity sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA== @@ -21651,6 +21893,11 @@ zod@^3.21.4: resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== +zod@^3.22.2: + version "3.22.2" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.2.tgz#3add8c682b7077c05ac6f979fea6998b573e157b" + integrity sha512-wvWkphh5WQsJbVk1tbx1l1Ly4yg+XecD+Mq280uBGt9wa5BKSWf4Mhp6GmrkPixhMxmabYY7RbzlwVP32pbGCg== + zod@~3.18.0: version "3.18.0" resolved "https://registry.yarnpkg.com/zod/-/zod-3.18.0.tgz#2eed58b3cafb8d9a67aa2fee69279702f584f3bc"