@backstage/create-app 0.5.12-next.2 → 0.5.12

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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # @backstage/create-app
2
2
 
3
+ ## 0.5.12
4
+
5
+ ### Patch Changes
6
+
7
+ - 4cca80f: Bumped create-app version.
8
+ - 8db51ca: Bumped create-app version.
9
+ - 778bc48: Bumped create-app version.
10
+ - 1bd4596: Removed the `ts-node` dev dependency.
11
+ - 829a249: Migrated the backend of the create app template to use the new backend system. For information on how to migrate your existing backend, see the [migration guide](https://backstage.io/docs/backend-system/building-backends/migrating).
12
+ - Updated dependencies
13
+ - @backstage/cli-common@0.1.13
14
+
3
15
  ## 0.5.12-next.2
4
16
 
5
17
  ### Patch Changes
@@ -24,15 +24,6 @@ const isLocal = require('fs').existsSync(path.resolve(__dirname, '../src'));
24
24
  if (!isLocal || process.env.BACKSTAGE_E2E_CLI_TEST) {
25
25
  require('..');
26
26
  } else {
27
- // Only used for development, so should be a devDependency
28
- // eslint-disable-next-line @backstage/no-undeclared-imports
29
- require('ts-node').register({
30
- transpileOnly: true,
31
- project: path.resolve(__dirname, '../../../tsconfig.json'),
32
- compilerOptions: {
33
- module: 'CommonJS',
34
- },
35
- });
36
-
27
+ require('@backstage/cli/config/nodeTransform.cjs');
37
28
  require('../src');
38
29
  }
package/dist/index.cjs.js CHANGED
@@ -67,138 +67,153 @@ ${chalk__default["default"].red(`${error}`)}
67
67
  }
68
68
  }
69
69
 
70
- var version$O = "1.24.0-next.2";
70
+ var version$T = "1.24.0";
71
71
 
72
- var version$N = "1.5.1-next.2";
72
+ var version$S = "1.5.1";
73
73
 
74
- var version$M = "0.21.4-next.2";
74
+ var version$R = "0.21.4";
75
75
 
76
- var version$L = "0.5.19-next.2";
76
+ var version$Q = "0.2.14";
77
77
 
78
- var version$K = "1.6.1-next.1";
78
+ var version$P = "0.5.19";
79
79
 
80
- var version$J = "1.4.5-next.0";
80
+ var version$O = "1.6.1";
81
81
 
82
- var version$I = "0.25.3-next.2";
82
+ var version$N = "1.4.5";
83
83
 
84
- var version$H = "1.2.0-next.1";
84
+ var version$M = "0.26.0";
85
85
 
86
- var version$G = "1.12.1-next.1";
86
+ var version$L = "1.2.0";
87
87
 
88
- var version$F = "0.14.1-next.2";
88
+ var version$K = "1.12.1";
89
89
 
90
- var version$E = "1.9.1-next.1";
90
+ var version$J = "0.14.1";
91
91
 
92
- var version$D = "0.1.1";
92
+ var version$I = "1.9.1";
93
93
 
94
- var version$C = "1.2.4-next.0";
94
+ var version$H = "0.1.1";
95
95
 
96
- var version$B = "1.1.25-next.2";
96
+ var version$G = "1.2.4";
97
97
 
98
- var version$A = "1.5.1-next.1";
98
+ var version$F = "1.1.25";
99
99
 
100
- var version$z = "0.5.2-next.0";
100
+ var version$E = "1.5.1";
101
101
 
102
- var version$y = "0.11.1-next.2";
102
+ var version$D = "0.5.2";
103
103
 
104
- var version$x = "0.3.62-next.2";
104
+ var version$C = "0.11.1";
105
105
 
106
- var version$w = "0.22.0-next.2";
106
+ var version$B = "0.3.62";
107
107
 
108
- var version$v = "0.4.9-next.2";
108
+ var version$A = "0.22.0";
109
109
 
110
- var version$u = "1.18.0-next.2";
110
+ var version$z = "0.1.11";
111
111
 
112
- var version$t = "1.0.22-next.1";
112
+ var version$y = "0.1.0";
113
113
 
114
- var version$s = "1.11.0-next.2";
114
+ var version$x = "0.4.9";
115
115
 
116
- var version$r = "1.18.0-next.2";
116
+ var version$w = "1.18.0";
117
117
 
118
- var version$q = "0.1.11-next.2";
118
+ var version$v = "1.0.22";
119
119
 
120
- var version$p = "0.4.1-next.2";
120
+ var version$u = "1.11.0";
121
121
 
122
- var version$o = "0.10.7-next.2";
122
+ var version$t = "1.18.0";
123
123
 
124
- var version$n = "0.4.17-next.2";
124
+ var version$s = "0.1.11";
125
125
 
126
- var version$m = "0.6.12-next.2";
126
+ var version$r = "0.4.1";
127
127
 
128
- var version$l = "0.4.16-next.2";
128
+ var version$q = "0.10.7";
129
129
 
130
- var version$k = "0.6.21-next.2";
130
+ var version$p = "0.4.17";
131
131
 
132
- var version$j = "0.7.13-next.1";
132
+ var version$o = "0.6.12";
133
133
 
134
- var version$i = "0.4.21-next.1";
134
+ var version$n = "0.4.16";
135
135
 
136
- var version$h = "0.7.25-next.2";
136
+ var version$m = "0.6.21";
137
137
 
138
- var version$g = "0.4.12-next.2";
138
+ var version$l = "0.5.37";
139
139
 
140
- var version$f = "0.1.59-next.2";
140
+ var version$k = "0.1.11";
141
141
 
142
- var version$e = "1.19.0-next.2";
142
+ var version$j = "0.7.13";
143
143
 
144
- var version$d = "1.22.0-next.2";
144
+ var version$i = "0.4.21";
145
145
 
146
- var version$c = "1.4.7-next.2";
146
+ var version$h = "0.7.25";
147
147
 
148
- var version$b = "1.7.7-next.2";
148
+ var version$g = "0.4.12";
149
149
 
150
- var version$a = "1.5.4-next.2";
150
+ var version$f = "0.1.59";
151
151
 
152
- var version$9 = "0.1.18-next.2";
152
+ var version$e = "1.19.0";
153
153
 
154
- var version$8 = "0.5.23-next.2";
154
+ var version$d = "1.22.0";
155
155
 
156
- var version$7 = "0.1.18-next.2";
156
+ var version$c = "1.4.7";
157
157
 
158
- var version$6 = "1.2.18-next.2";
158
+ var version$b = "1.7.7";
159
159
 
160
- var version$5 = "0.7.0-next.2";
160
+ var version$a = "1.5.4";
161
161
 
162
- var version$4 = "1.10.1-next.2";
162
+ var version$9 = "0.1.18";
163
163
 
164
- var version$3 = "1.2.0-next.2";
164
+ var version$8 = "0.5.23";
165
165
 
166
- var version$2 = "1.1.6-next.2";
166
+ var version$7 = "0.1.18";
167
167
 
168
- var version$1 = "1.10.0-next.2";
168
+ var version$6 = "1.2.18";
169
169
 
170
- var version = "0.8.2-next.2";
170
+ var version$5 = "0.7.0";
171
+
172
+ var version$4 = "1.10.1";
173
+
174
+ var version$3 = "1.2.0";
175
+
176
+ var version$2 = "1.1.6";
177
+
178
+ var version$1 = "1.10.0";
179
+
180
+ var version = "0.8.2";
171
181
 
172
182
  const packageVersions = {
173
- root: version$O,
174
- "@backstage/app-defaults": version$N,
175
- "@backstage/backend-common": version$M,
176
- "@backstage/backend-tasks": version$L,
177
- "@backstage/catalog-client": version$K,
178
- "@backstage/catalog-model": version$J,
179
- "@backstage/cli": version$I,
180
- "@backstage/config": version$H,
181
- "@backstage/core-app-api": version$G,
182
- "@backstage/core-components": version$F,
183
- "@backstage/core-plugin-api": version$E,
184
- "@backstage/e2e-test-utils": version$D,
185
- "@backstage/errors": version$C,
186
- "@backstage/integration-react": version$B,
187
- "@backstage/plugin-api-docs": version$y,
188
- "@backstage/plugin-app-backend": version$x,
189
- "@backstage/plugin-auth-backend": version$w,
190
- "@backstage/plugin-auth-node": version$v,
191
- "@backstage/plugin-catalog": version$u,
192
- "@backstage/plugin-catalog-common": version$t,
193
- "@backstage/plugin-catalog-react": version$s,
194
- "@backstage/plugin-catalog-backend": version$r,
195
- "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": version$q,
196
- "@backstage/plugin-catalog-graph": version$p,
197
- "@backstage/plugin-catalog-import": version$o,
198
- "@backstage/plugin-explore": version$n,
199
- "@backstage/plugin-github-actions": version$m,
200
- "@backstage/plugin-lighthouse": version$l,
201
- "@backstage/plugin-org": version$k,
183
+ root: version$T,
184
+ "@backstage/app-defaults": version$S,
185
+ "@backstage/backend-common": version$R,
186
+ "@backstage/backend-defaults": version$Q,
187
+ "@backstage/backend-tasks": version$P,
188
+ "@backstage/catalog-client": version$O,
189
+ "@backstage/catalog-model": version$N,
190
+ "@backstage/cli": version$M,
191
+ "@backstage/config": version$L,
192
+ "@backstage/core-app-api": version$K,
193
+ "@backstage/core-components": version$J,
194
+ "@backstage/core-plugin-api": version$I,
195
+ "@backstage/e2e-test-utils": version$H,
196
+ "@backstage/errors": version$G,
197
+ "@backstage/integration-react": version$F,
198
+ "@backstage/plugin-api-docs": version$C,
199
+ "@backstage/plugin-app-backend": version$B,
200
+ "@backstage/plugin-auth-backend": version$A,
201
+ "@backstage/plugin-auth-backend-module-github-provider": version$z,
202
+ "@backstage/plugin-auth-backend-module-guest-provider": version$y,
203
+ "@backstage/plugin-auth-node": version$x,
204
+ "@backstage/plugin-catalog": version$w,
205
+ "@backstage/plugin-catalog-common": version$v,
206
+ "@backstage/plugin-catalog-react": version$u,
207
+ "@backstage/plugin-catalog-backend": version$t,
208
+ "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": version$s,
209
+ "@backstage/plugin-catalog-graph": version$r,
210
+ "@backstage/plugin-catalog-import": version$q,
211
+ "@backstage/plugin-explore": version$p,
212
+ "@backstage/plugin-github-actions": version$o,
213
+ "@backstage/plugin-lighthouse": version$n,
214
+ "@backstage/plugin-org": version$m,
215
+ "@backstage/plugin-permission-backend": version$l,
216
+ "@backstage/plugin-permission-backend-module-allow-all-policy": version$k,
202
217
  "@backstage/plugin-permission-common": version$j,
203
218
  "@backstage/plugin-permission-node": version$h,
204
219
  "@backstage/plugin-permission-react": version$i,
@@ -219,8 +234,8 @@ const packageVersions = {
219
234
  "@backstage/plugin-techdocs-module-addons-contrib": version$2,
220
235
  "@backstage/plugin-techdocs-backend": version$1,
221
236
  "@backstage/plugin-user-settings": version,
222
- "@backstage/test-utils": version$A,
223
- "@backstage/theme": version$z
237
+ "@backstage/test-utils": version$E,
238
+ "@backstage/theme": version$D
224
239
  };
225
240
 
226
241
  const TASK_NAME_MAX_LENGTH = 14;
@@ -553,7 +568,7 @@ var createApp = async (opts) => {
553
568
  };
554
569
 
555
570
  const main = (argv) => {
556
- commander.program.name("backstage-create-app").version(version$O).description("Creates a new app in a new directory or specified path").option(
571
+ commander.program.name("backstage-create-app").version(version$T).description("Creates a new app in a new directory or specified path").option(
557
572
  "--path [directory]",
558
573
  "Location to store the app defaulting to a new folder with the app name"
559
574
  ).option(
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/lib/errors.ts","../src/lib/versions.ts","../src/lib/tasks.ts","../src/createApp.ts","../src/index.ts"],"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 chalk from 'chalk';\n\nexport class CustomError extends Error {\n get name(): string {\n return this.constructor.name;\n }\n}\n\nexport class ExitCodeError extends CustomError {\n readonly code: number;\n\n constructor(code: number, command?: string) {\n if (command) {\n super(`Command '${command}' exited with code ${code}`);\n } else {\n super(`Child exited with code ${code}`);\n }\n this.code = code;\n }\n}\n\nexport function exitWithError(error: Error): never {\n if (error instanceof ExitCodeError) {\n process.stderr.write(`\\n${chalk.red(error.message)}\\n\\n`);\n process.exit(error.code);\n } else {\n process.stderr.write(`\\n${chalk.red(`${error}`)}\\n\\n`);\n process.exit(1);\n }\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\n/* eslint-disable @backstage/no-relative-monorepo-imports */\n\n/*\nThis is a list of all packages used by the template. If dependencies are added or removed,\nthis list should be updated as well.\n\nThere is a release step that ensures that this package is always bumped with every\nrelease, meaning these version will always be up to date.\n\nThis does not create an actual dependency on these packages and does not bring in any code.\nRelative imports are used rather than package imports to make sure the packages aren't externalized.\nRollup will extract the value of the version field in each package at build time without\nleaving any imports in place.\n*/\n\nimport { version as root } from '../../../../package.json';\n\nimport { version as appDefaults } from '../../../app-defaults/package.json';\nimport { version as backendCommon } from '../../../backend-common/package.json';\nimport { version as backendTasks } from '../../../backend-tasks/package.json';\nimport { version as catalogClient } from '../../../catalog-client/package.json';\nimport { version as catalogModel } from '../../../catalog-model/package.json';\nimport { version as cli } from '../../../cli/package.json';\nimport { version as config } from '../../../config/package.json';\nimport { version as coreAppApi } from '../../../core-app-api/package.json';\nimport { version as coreComponents } from '../../../core-components/package.json';\nimport { version as corePluginApi } from '../../../core-plugin-api/package.json';\nimport { version as e2eTestUtils } from '../../../e2e-test-utils/package.json';\nimport { version as errors } from '../../../errors/package.json';\nimport { version as integrationReact } from '../../../integration-react/package.json';\nimport { version as testUtils } from '../../../test-utils/package.json';\nimport { version as theme } from '../../../theme/package.json';\n\nimport { version as pluginApiDocs } from '../../../../plugins/api-docs/package.json';\nimport { version as pluginAppBackend } from '../../../../plugins/app-backend/package.json';\nimport { version as pluginAuthBackend } from '../../../../plugins/auth-backend/package.json';\nimport { version as pluginAuthNode } from '../../../../plugins/auth-node/package.json';\nimport { version as pluginCatalog } from '../../../../plugins/catalog/package.json';\nimport { version as pluginCatalogCommon } from '../../../../plugins/catalog-common/package.json';\nimport { version as pluginCatalogReact } from '../../../../plugins/catalog-react/package.json';\nimport { version as pluginCatalogBackend } from '../../../../plugins/catalog-backend/package.json';\nimport { version as pluginCatalogBackendModuleScaffolderEntityModel } from '../../../../plugins/catalog-backend-module-scaffolder-entity-model/package.json';\nimport { version as pluginCatalogGraph } from '../../../../plugins/catalog-graph/package.json';\nimport { version as pluginCatalogImport } from '../../../../plugins/catalog-import/package.json';\nimport { version as pluginExplore } from '../../../../plugins/explore/package.json';\nimport { version as pluginGithubActions } from '../../../../plugins/github-actions/package.json';\nimport { version as pluginLighthouse } from '../../../../plugins/lighthouse/package.json';\nimport { version as pluginOrg } from '../../../../plugins/org/package.json';\nimport { version as pluginPermissionCommon } from '../../../../plugins/permission-common/package.json';\nimport { version as pluginPermissionReact } from '../../../../plugins/permission-react/package.json';\nimport { version as pluginPermissionNode } from '../../../../plugins/permission-node/package.json';\nimport { version as pluginProxyBackend } from '../../../../plugins/proxy-backend/package.json';\nimport { version as pluginRollbarBackend } from '../../../../plugins/rollbar-backend/package.json';\nimport { version as pluginScaffolder } from '../../../../plugins/scaffolder/package.json';\nimport { version as pluginScaffolderBackend } from '../../../../plugins/scaffolder-backend/package.json';\nimport { version as pluginSearch } from '../../../../plugins/search/package.json';\nimport { version as pluginSearchReact } from '../../../../plugins/search-react/package.json';\nimport { version as pluginSearchBackend } from '../../../../plugins/search-backend/package.json';\nimport { version as pluginSearchBackendModuleCatalog } from '../../../../plugins/search-backend-module-catalog/package.json';\nimport { version as pluginSearchBackendModulePg } from '../../../../plugins/search-backend-module-pg/package.json';\nimport { version as pluginSearchBackendModuleTechdocs } from '../../../../plugins/search-backend-module-techdocs/package.json';\nimport { version as pluginSearchBackendNode } from '../../../../plugins/search-backend-node/package.json';\nimport { version as pluginTechRadar } from '../../../../plugins/tech-radar/package.json';\nimport { version as pluginTechdocs } from '../../../../plugins/techdocs/package.json';\nimport { version as pluginTechdocsReact } from '../../../../plugins/techdocs-react/package.json';\nimport { version as pluginTechdocsModuleAddonsContrib } from '../../../../plugins/techdocs-module-addons-contrib/package.json';\nimport { version as pluginTechdocsBackend } from '../../../../plugins/techdocs-backend/package.json';\nimport { version as pluginUserSettings } from '../../../../plugins/user-settings/package.json';\n\nexport const packageVersions = {\n root,\n '@backstage/app-defaults': appDefaults,\n '@backstage/backend-common': backendCommon,\n '@backstage/backend-tasks': backendTasks,\n '@backstage/catalog-client': catalogClient,\n '@backstage/catalog-model': catalogModel,\n '@backstage/cli': cli,\n '@backstage/config': config,\n '@backstage/core-app-api': coreAppApi,\n '@backstage/core-components': coreComponents,\n '@backstage/core-plugin-api': corePluginApi,\n '@backstage/e2e-test-utils': e2eTestUtils,\n '@backstage/errors': errors,\n '@backstage/integration-react': integrationReact,\n '@backstage/plugin-api-docs': pluginApiDocs,\n '@backstage/plugin-app-backend': pluginAppBackend,\n '@backstage/plugin-auth-backend': pluginAuthBackend,\n '@backstage/plugin-auth-node': pluginAuthNode,\n '@backstage/plugin-catalog': pluginCatalog,\n '@backstage/plugin-catalog-common': pluginCatalogCommon,\n '@backstage/plugin-catalog-react': pluginCatalogReact,\n '@backstage/plugin-catalog-backend': pluginCatalogBackend,\n '@backstage/plugin-catalog-backend-module-scaffolder-entity-model':\n pluginCatalogBackendModuleScaffolderEntityModel,\n '@backstage/plugin-catalog-graph': pluginCatalogGraph,\n '@backstage/plugin-catalog-import': pluginCatalogImport,\n '@backstage/plugin-explore': pluginExplore,\n '@backstage/plugin-github-actions': pluginGithubActions,\n '@backstage/plugin-lighthouse': pluginLighthouse,\n '@backstage/plugin-org': pluginOrg,\n '@backstage/plugin-permission-common': pluginPermissionCommon,\n '@backstage/plugin-permission-node': pluginPermissionNode,\n '@backstage/plugin-permission-react': pluginPermissionReact,\n '@backstage/plugin-proxy-backend': pluginProxyBackend,\n '@backstage/plugin-rollbar-backend': pluginRollbarBackend,\n '@backstage/plugin-scaffolder': pluginScaffolder,\n '@backstage/plugin-scaffolder-backend': pluginScaffolderBackend,\n '@backstage/plugin-search': pluginSearch,\n '@backstage/plugin-search-react': pluginSearchReact,\n '@backstage/plugin-search-backend': pluginSearchBackend,\n '@backstage/plugin-search-backend-module-catalog':\n pluginSearchBackendModuleCatalog,\n '@backstage/plugin-search-backend-module-pg': pluginSearchBackendModulePg,\n '@backstage/plugin-search-backend-module-techdocs':\n pluginSearchBackendModuleTechdocs,\n '@backstage/plugin-search-backend-node': pluginSearchBackendNode,\n '@backstage/plugin-tech-radar': pluginTechRadar,\n '@backstage/plugin-techdocs': pluginTechdocs,\n '@backstage/plugin-techdocs-react': pluginTechdocsReact,\n '@backstage/plugin-techdocs-module-addons-contrib':\n pluginTechdocsModuleAddonsContrib,\n '@backstage/plugin-techdocs-backend': pluginTechdocsBackend,\n '@backstage/plugin-user-settings': pluginUserSettings,\n '@backstage/test-utils': testUtils,\n '@backstage/theme': theme,\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 chalk from 'chalk';\nimport fs from 'fs-extra';\nimport handlebars from 'handlebars';\nimport ora from 'ora';\nimport recursive from 'recursive-readdir';\nimport {\n basename,\n dirname,\n resolve as resolvePath,\n relative as relativePath,\n} from 'path';\nimport fetch from 'node-fetch';\nimport { exec as execCb } from 'child_process';\nimport { packageVersions } from './versions';\nimport { promisify } from 'util';\nimport os from 'os';\n\nconst TASK_NAME_MAX_LENGTH = 14;\nconst TEN_MINUTES_MS = 1000 * 60 * 10;\nconst exec = promisify(execCb);\n\nexport type GitConfig = {\n defaultBranch?: string;\n};\n\nexport class Task {\n static log(name: string = '') {\n process.stdout.write(`${chalk.green(name)}\\n`);\n }\n\n static error(message: string = '') {\n process.stdout.write(`\\n${chalk.red(message)}\\n\\n`);\n }\n\n static section(name: string) {\n const title = chalk.green(`${name}:`);\n process.stdout.write(`\\n ${title}\\n`);\n }\n\n static exit(code: number = 0) {\n process.exit(code);\n }\n\n static async forItem(\n task: string,\n item: string,\n taskFunc: () => Promise<void>,\n ): Promise<void> {\n const paddedTask = chalk.green(task.padEnd(TASK_NAME_MAX_LENGTH));\n\n const spinner = ora({\n prefixText: chalk.green(` ${paddedTask}${chalk.cyan(item)}`),\n spinner: 'arc',\n color: 'green',\n }).start();\n\n try {\n await taskFunc();\n spinner.succeed();\n } catch (error) {\n spinner.fail();\n throw error;\n }\n }\n}\n\n/**\n * Generate a templated backstage project\n *\n * @param templateDir - location containing template files\n * @param destinationDir - location to save templated project\n * @param context - template parameters\n */\nexport async function templatingTask(\n templateDir: string,\n destinationDir: string,\n context: any,\n) {\n const files = await recursive(templateDir).catch(error => {\n throw new Error(`Failed to read template directory: ${error.message}`);\n });\n\n for (const file of files) {\n const destinationFile = resolvePath(\n destinationDir,\n relativePath(templateDir, file),\n );\n await fs.ensureDir(dirname(destinationFile));\n\n if (file.endsWith('.hbs')) {\n await Task.forItem('templating', basename(file), async () => {\n const destination = destinationFile.replace(/\\.hbs$/, '');\n\n const template = await fs.readFile(file);\n const compiled = handlebars.compile(template.toString());\n const contents = compiled(\n { name: basename(destination), ...context },\n {\n helpers: {\n version(name: keyof typeof packageVersions) {\n if (name in packageVersions) {\n return packageVersions[name];\n }\n throw new Error(`No version available for package ${name}`);\n },\n },\n },\n );\n\n await fs.writeFile(destination, contents).catch(error => {\n throw new Error(\n `Failed to create file: ${destination}: ${error.message}`,\n );\n });\n });\n } else {\n await Task.forItem('copying', basename(file), async () => {\n await fs.copyFile(file, destinationFile).catch(error => {\n const destination = destinationFile;\n throw new Error(\n `Failed to copy file to ${destination} : ${error.message}`,\n );\n });\n });\n }\n }\n}\n\n/**\n * Verify that application target does not already exist\n *\n * @param rootDir - The directory to create application folder `name`\n * @param name - The specified name of the application\n * @Throws Error - If directory with name of `destination` already exists\n */\nexport async function checkAppExistsTask(rootDir: string, name: string) {\n await Task.forItem('checking', name, async () => {\n const destination = resolvePath(rootDir, name);\n\n if (await fs.pathExists(destination)) {\n const existing = chalk.cyan(destination.replace(`${rootDir}/`, ''));\n throw new Error(\n `A directory with the same name already exists: ${existing}\\nPlease try again with a different app name`,\n );\n }\n });\n}\n\n/**\n * Verify that application `path` exists, otherwise create the directory\n *\n * @param path - target to create directory\n * @throws if `path` is a file, or `fs.mkdir` fails\n */\nexport async function checkPathExistsTask(path: string) {\n await Task.forItem('checking', path, async () => {\n try {\n await fs.mkdirs(path);\n } catch (error) {\n // will fail if a file already exists at given `path`\n throw new Error(`Failed to create app directory: ${error.message}`);\n }\n });\n}\n\n/**\n * Run `yarn install` and `run tsc` in application directory\n *\n * @param appDir - location of application to build\n */\nexport async function buildAppTask(appDir: string) {\n process.chdir(appDir);\n\n await Task.forItem('determining', 'yarn version', async () => {\n const result = await exec('yarn --version');\n const yarnVersion = result.stdout?.trim();\n\n if (yarnVersion && !yarnVersion.startsWith('1.')) {\n throw new Error(\n `@backstage/create-app requires Yarn v1, found '${yarnVersion}'. You can migrate the project to Yarn 3 after creation using https://backstage.io/docs/tutorials/yarn-migration`,\n );\n }\n });\n\n const runCmd = async (cmd: string) => {\n await Task.forItem('executing', cmd, async () => {\n await exec(cmd).catch(error => {\n process.stdout.write(error.stderr);\n process.stdout.write(error.stdout);\n throw new Error(`Could not execute command ${chalk.cyan(cmd)}`);\n });\n });\n };\n\n const installTimeout = setTimeout(() => {\n Task.error(\n \"\\n⏱️ It's taking a long time to install dependencies, you may want to exit (Ctrl-C) and run 'yarn install' and 'yarn tsc' manually\",\n );\n }, TEN_MINUTES_MS);\n\n await runCmd('yarn install').finally(() => clearTimeout(installTimeout));\n await runCmd('yarn tsc');\n}\n\n/**\n * Move temporary directory to destination application folder\n *\n * @param tempDir - source path to copy files from\n * @param destination - target path to copy files\n * @param id - item ID\n * @throws if `fs.move` fails\n */\nexport async function moveAppTask(\n tempDir: string,\n destination: string,\n id: string,\n) {\n await Task.forItem('moving', id, async () => {\n await fs\n .move(tempDir, destination)\n .catch(error => {\n throw new Error(\n `Failed to move app from ${tempDir} to ${destination}: ${error.message}`,\n );\n })\n .finally(() => {\n // remove temporary files on both success and failure\n fs.removeSync(tempDir);\n });\n });\n}\n\n/**\n * Read git configs by creating a temp folder and initializing a repo\n *\n * @throws if `exec` fails\n */\nexport async function readGitConfig(): Promise<GitConfig | undefined> {\n const tempDir = await fs.mkdtemp(resolvePath(os.tmpdir(), 'git-temp-dir-'));\n\n try {\n await exec('git init', { cwd: tempDir });\n await exec('git commit --allow-empty -m \"Initial commit\"', {\n cwd: tempDir,\n });\n\n const getDefaultBranch = await exec(\n 'git branch --format=\"%(refname:short)\"',\n { cwd: tempDir },\n );\n\n return {\n defaultBranch: getDefaultBranch.stdout?.trim() || undefined,\n };\n } catch (error) {\n return undefined;\n } finally {\n await fs.rm(tempDir, { recursive: true });\n }\n}\n\n/**\n * Initializes a git repository in the destination folder if possible\n *\n * @param dir - source path to initialize git repository in\n * @returns true if git repository was initialized\n */\nexport async function tryInitGitRepository(dir: string) {\n try {\n // Check if we're already in a git repo\n await exec('git rev-parse --is-inside-work-tree', { cwd: dir });\n return false;\n } catch {\n /* ignored */\n }\n\n try {\n await exec('git init', { cwd: dir });\n await exec('git add .', { cwd: dir });\n await exec('git commit -m \"Initial commit\"', { cwd: dir });\n return true;\n } catch (error) {\n try {\n await fs.rm(resolvePath(dir, '.git'), { recursive: true, force: true });\n } catch {\n throw new Error('Failed to remove .git folder');\n }\n\n return false;\n }\n}\n\n/**\n * This fetches the yarn.lock seed file at https://github.com/backstage/backstage/blob/master/packages/create-app/seed-yarn.lock\n * Its purpose is to lock individual dependencies with broken releases to known working versions.\n * This flow is decoupled from the release of the create-app package in order to avoid\n * the need to re-publish the create-app package whenever we want to update the seed file.\n *\n * @returns true if the yarn.lock seed file was fetched successfully\n */\nexport async function fetchYarnLockSeedTask(dir: string) {\n try {\n await Task.forItem('fetching', 'yarn.lock seed', async () => {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n const res = await fetch(\n 'https://raw.githubusercontent.com/backstage/backstage/master/packages/create-app/seed-yarn.lock',\n {\n signal: controller.signal,\n },\n );\n clearTimeout(timeout);\n\n if (!res.ok) {\n throw new Error(\n `Request failed with status ${res.status} ${res.statusText}`,\n );\n }\n\n const initialYarnLockContent = await res.text();\n\n await fs.writeFile(\n resolvePath(dir, 'yarn.lock'),\n initialYarnLockContent\n .split('\\n')\n .filter(l => !l.startsWith('//'))\n .join('\\n'),\n 'utf8',\n );\n });\n return true;\n } catch {\n return false;\n }\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 chalk from 'chalk';\nimport { OptionValues } from 'commander';\nimport inquirer, { Answers } from 'inquirer';\nimport { resolve as resolvePath } from 'path';\nimport { findPaths } from '@backstage/cli-common';\nimport os from 'os';\nimport fs from 'fs-extra';\nimport {\n Task,\n buildAppTask,\n checkAppExistsTask,\n checkPathExistsTask,\n moveAppTask,\n templatingTask,\n tryInitGitRepository,\n readGitConfig,\n fetchYarnLockSeedTask,\n} from './lib/tasks';\n\nconst DEFAULT_BRANCH = 'master';\n\nexport default async (opts: OptionValues): Promise<void> => {\n /* eslint-disable-next-line no-restricted-syntax */\n const paths = findPaths(__dirname);\n const answers: Answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n default: 'backstage',\n message: chalk.blue('Enter a name for the app [required]'),\n validate: (value: any) => {\n if (!value) {\n return chalk.red('Please enter a name for the app');\n } else if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(value)) {\n return chalk.red(\n 'App name must be lowercase and contain only letters, digits, and dashes.',\n );\n }\n return true;\n },\n when: (a: Answers) => {\n const envName = process.env.BACKSTAGE_APP_NAME;\n if (envName) {\n a.name = envName;\n return false;\n }\n return true;\n },\n },\n ]);\n\n const templateDir = opts.templatePath\n ? paths.resolveTarget(opts.templatePath)\n : paths.resolveOwn('templates/default-app');\n\n // Use `--path` argument as application directory when specified, otherwise\n // create a directory using `answers.name`\n const appDir = opts.path\n ? resolvePath(paths.targetDir, opts.path)\n : resolvePath(paths.targetDir, answers.name);\n\n Task.log();\n Task.log('Creating the app...');\n\n try {\n const gitConfig = await readGitConfig();\n\n if (opts.path) {\n // Template directly to specified path\n\n Task.section('Checking that supplied path exists');\n await checkPathExistsTask(appDir);\n\n Task.section('Preparing files');\n await templatingTask(templateDir, opts.path, {\n ...answers,\n defaultBranch: gitConfig?.defaultBranch ?? DEFAULT_BRANCH,\n });\n } else {\n // Template to temporary location, and then move files\n\n Task.section('Checking if the directory is available');\n await checkAppExistsTask(paths.targetDir, answers.name);\n\n Task.section('Creating a temporary app directory');\n const tempDir = await fs.mkdtemp(resolvePath(os.tmpdir(), answers.name));\n\n Task.section('Preparing files');\n await templatingTask(templateDir, tempDir, {\n ...answers,\n defaultBranch: gitConfig?.defaultBranch ?? DEFAULT_BRANCH,\n });\n\n Task.section('Moving to final location');\n await moveAppTask(tempDir, appDir, answers.name);\n }\n\n const fetchedYarnLockSeed = await fetchYarnLockSeedTask(appDir);\n\n if (gitConfig) {\n if (await tryInitGitRepository(appDir)) {\n // Since we don't know whether we were able to init git before we\n // try, we can't track the actual task execution\n Task.forItem('init', 'git repository', async () => {});\n }\n }\n\n if (!opts.skipInstall) {\n Task.section('Installing dependencies');\n await buildAppTask(appDir);\n }\n\n Task.log();\n Task.log(\n chalk.green(`🥇 Successfully created ${chalk.cyan(answers.name)}`),\n );\n Task.log();\n\n if (!fetchedYarnLockSeed) {\n Task.log(\n chalk.yellow(\n [\n 'Warning: Failed to fetch the yarn.lock seed file.',\n ' You may end up with incompatible dependencies that break the app.',\n ' If you run into any errors, please search the issues at',\n ' https://github.com/backstage/backstage/issues for potential solutions',\n ].join('\\n'),\n ),\n );\n }\n\n Task.section('All set! Now you might want to');\n if (opts.skipInstall) {\n Task.log(\n ` Install the dependencies: ${chalk.cyan(\n `cd ${opts.path ?? answers.name} && yarn install`,\n )}`,\n );\n }\n Task.log(\n ` Run the app: ${chalk.cyan(\n `cd ${opts.path ?? answers.name} && yarn dev`,\n )}`,\n );\n Task.log(\n ' Set up the software catalog: https://backstage.io/docs/features/software-catalog/configuration',\n );\n Task.log(' Add authentication: https://backstage.io/docs/auth/');\n Task.log();\n Task.exit();\n } catch (error) {\n Task.error(String(error));\n\n Task.log('It seems that something went wrong when creating the app 🤔');\n\n Task.error('🔥 Failed to create app!');\n Task.exit(1);\n }\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\n/**\n * A CLI that helps you create your own Backstage app\n *\n * @packageDocumentation\n */\n\nimport { program } from 'commander';\nimport { exitWithError } from './lib/errors';\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport { version } from '../../../package.json';\nimport createApp from './createApp';\n\nconst main = (argv: string[]) => {\n program\n .name('backstage-create-app')\n .version(version)\n .description('Creates a new app in a new directory or specified path')\n .option(\n '--path [directory]',\n 'Location to store the app defaulting to a new folder with the app name',\n )\n .option(\n '--skip-install',\n 'Skip the install and builds steps after creating the app',\n )\n .option(\n '--template-path [directory]',\n 'Use an external application template instead of the default template',\n )\n .action(cmd => createApp(cmd));\n\n program.parse(argv);\n};\n\nprocess.on('unhandledRejection', rejection => {\n if (rejection instanceof Error) {\n exitWithError(rejection);\n } else {\n exitWithError(new Error(`Unknown rejection: '${rejection}'`));\n }\n});\n\nmain(process.argv);\n"],"names":["chalk","root","appDefaults","backendCommon","backendTasks","catalogClient","catalogModel","cli","config","coreAppApi","coreComponents","corePluginApi","e2eTestUtils","errors","integrationReact","pluginApiDocs","pluginAppBackend","pluginAuthBackend","pluginAuthNode","pluginCatalog","pluginCatalogCommon","pluginCatalogReact","pluginCatalogBackend","pluginCatalogBackendModuleScaffolderEntityModel","pluginCatalogGraph","pluginCatalogImport","pluginExplore","pluginGithubActions","pluginLighthouse","pluginOrg","pluginPermissionCommon","pluginPermissionNode","pluginPermissionReact","pluginProxyBackend","pluginRollbarBackend","pluginScaffolder","pluginScaffolderBackend","pluginSearch","pluginSearchReact","pluginSearchBackend","pluginSearchBackendModuleCatalog","pluginSearchBackendModulePg","pluginSearchBackendModuleTechdocs","pluginSearchBackendNode","pluginTechRadar","pluginTechdocs","pluginTechdocsReact","pluginTechdocsModuleAddonsContrib","pluginTechdocsBackend","pluginUserSettings","testUtils","theme","promisify","execCb","ora","recursive","resolvePath","relativePath","fs","dirname","basename","handlebars","os","fetch","findPaths","inquirer","program","version"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/lib/errors.ts","../src/lib/versions.ts","../src/lib/tasks.ts","../src/createApp.ts","../src/index.ts"],"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 chalk from 'chalk';\n\nexport class CustomError extends Error {\n get name(): string {\n return this.constructor.name;\n }\n}\n\nexport class ExitCodeError extends CustomError {\n readonly code: number;\n\n constructor(code: number, command?: string) {\n if (command) {\n super(`Command '${command}' exited with code ${code}`);\n } else {\n super(`Child exited with code ${code}`);\n }\n this.code = code;\n }\n}\n\nexport function exitWithError(error: Error): never {\n if (error instanceof ExitCodeError) {\n process.stderr.write(`\\n${chalk.red(error.message)}\\n\\n`);\n process.exit(error.code);\n } else {\n process.stderr.write(`\\n${chalk.red(`${error}`)}\\n\\n`);\n process.exit(1);\n }\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\n/* eslint-disable @backstage/no-relative-monorepo-imports */\n\n/*\nThis is a list of all packages used by the template. If dependencies are added or removed,\nthis list should be updated as well.\n\nThere is a release step that ensures that this package is always bumped with every\nrelease, meaning these version will always be up to date.\n\nThis does not create an actual dependency on these packages and does not bring in any code.\nRelative imports are used rather than package imports to make sure the packages aren't externalized.\nRollup will extract the value of the version field in each package at build time without\nleaving any imports in place.\n*/\n\nimport { version as root } from '../../../../package.json';\n\nimport { version as appDefaults } from '../../../app-defaults/package.json';\nimport { version as backendCommon } from '../../../backend-common/package.json';\nimport { version as backendDefaults } from '../../../backend-defaults/package.json';\nimport { version as backendTasks } from '../../../backend-tasks/package.json';\nimport { version as catalogClient } from '../../../catalog-client/package.json';\nimport { version as catalogModel } from '../../../catalog-model/package.json';\nimport { version as cli } from '../../../cli/package.json';\nimport { version as config } from '../../../config/package.json';\nimport { version as coreAppApi } from '../../../core-app-api/package.json';\nimport { version as coreComponents } from '../../../core-components/package.json';\nimport { version as corePluginApi } from '../../../core-plugin-api/package.json';\nimport { version as e2eTestUtils } from '../../../e2e-test-utils/package.json';\nimport { version as errors } from '../../../errors/package.json';\nimport { version as integrationReact } from '../../../integration-react/package.json';\nimport { version as testUtils } from '../../../test-utils/package.json';\nimport { version as theme } from '../../../theme/package.json';\n\nimport { version as pluginApiDocs } from '../../../../plugins/api-docs/package.json';\nimport { version as pluginAppBackend } from '../../../../plugins/app-backend/package.json';\nimport { version as pluginAuthBackend } from '../../../../plugins/auth-backend/package.json';\nimport { version as pluginAuthBackendModuleGithubProvider } from '../../../../plugins/auth-backend-module-github-provider/package.json';\nimport { version as pluginAuthBackendModuleGuestProvider } from '../../../../plugins/auth-backend-module-guest-provider/package.json';\nimport { version as pluginAuthNode } from '../../../../plugins/auth-node/package.json';\nimport { version as pluginCatalog } from '../../../../plugins/catalog/package.json';\nimport { version as pluginCatalogCommon } from '../../../../plugins/catalog-common/package.json';\nimport { version as pluginCatalogReact } from '../../../../plugins/catalog-react/package.json';\nimport { version as pluginCatalogBackend } from '../../../../plugins/catalog-backend/package.json';\nimport { version as pluginCatalogBackendModuleScaffolderEntityModel } from '../../../../plugins/catalog-backend-module-scaffolder-entity-model/package.json';\nimport { version as pluginCatalogGraph } from '../../../../plugins/catalog-graph/package.json';\nimport { version as pluginCatalogImport } from '../../../../plugins/catalog-import/package.json';\nimport { version as pluginExplore } from '../../../../plugins/explore/package.json';\nimport { version as pluginGithubActions } from '../../../../plugins/github-actions/package.json';\nimport { version as pluginLighthouse } from '../../../../plugins/lighthouse/package.json';\nimport { version as pluginOrg } from '../../../../plugins/org/package.json';\nimport { version as pluginPermissionBackend } from '../../../../plugins/permission-backend/package.json';\nimport { version as pluginPermissionBackendModulePolicyAllowAll } from '../../../../plugins/permission-backend-module-policy-allow-all/package.json';\nimport { version as pluginPermissionCommon } from '../../../../plugins/permission-common/package.json';\nimport { version as pluginPermissionReact } from '../../../../plugins/permission-react/package.json';\nimport { version as pluginPermissionNode } from '../../../../plugins/permission-node/package.json';\nimport { version as pluginProxyBackend } from '../../../../plugins/proxy-backend/package.json';\nimport { version as pluginRollbarBackend } from '../../../../plugins/rollbar-backend/package.json';\nimport { version as pluginScaffolder } from '../../../../plugins/scaffolder/package.json';\nimport { version as pluginScaffolderBackend } from '../../../../plugins/scaffolder-backend/package.json';\nimport { version as pluginSearch } from '../../../../plugins/search/package.json';\nimport { version as pluginSearchReact } from '../../../../plugins/search-react/package.json';\nimport { version as pluginSearchBackend } from '../../../../plugins/search-backend/package.json';\nimport { version as pluginSearchBackendModuleCatalog } from '../../../../plugins/search-backend-module-catalog/package.json';\nimport { version as pluginSearchBackendModulePg } from '../../../../plugins/search-backend-module-pg/package.json';\nimport { version as pluginSearchBackendModuleTechdocs } from '../../../../plugins/search-backend-module-techdocs/package.json';\nimport { version as pluginSearchBackendNode } from '../../../../plugins/search-backend-node/package.json';\nimport { version as pluginTechRadar } from '../../../../plugins/tech-radar/package.json';\nimport { version as pluginTechdocs } from '../../../../plugins/techdocs/package.json';\nimport { version as pluginTechdocsReact } from '../../../../plugins/techdocs-react/package.json';\nimport { version as pluginTechdocsModuleAddonsContrib } from '../../../../plugins/techdocs-module-addons-contrib/package.json';\nimport { version as pluginTechdocsBackend } from '../../../../plugins/techdocs-backend/package.json';\nimport { version as pluginUserSettings } from '../../../../plugins/user-settings/package.json';\n\nexport const packageVersions = {\n root,\n '@backstage/app-defaults': appDefaults,\n '@backstage/backend-common': backendCommon,\n '@backstage/backend-defaults': backendDefaults,\n '@backstage/backend-tasks': backendTasks,\n '@backstage/catalog-client': catalogClient,\n '@backstage/catalog-model': catalogModel,\n '@backstage/cli': cli,\n '@backstage/config': config,\n '@backstage/core-app-api': coreAppApi,\n '@backstage/core-components': coreComponents,\n '@backstage/core-plugin-api': corePluginApi,\n '@backstage/e2e-test-utils': e2eTestUtils,\n '@backstage/errors': errors,\n '@backstage/integration-react': integrationReact,\n '@backstage/plugin-api-docs': pluginApiDocs,\n '@backstage/plugin-app-backend': pluginAppBackend,\n '@backstage/plugin-auth-backend': pluginAuthBackend,\n '@backstage/plugin-auth-backend-module-github-provider':\n pluginAuthBackendModuleGithubProvider,\n '@backstage/plugin-auth-backend-module-guest-provider':\n pluginAuthBackendModuleGuestProvider,\n '@backstage/plugin-auth-node': pluginAuthNode,\n '@backstage/plugin-catalog': pluginCatalog,\n '@backstage/plugin-catalog-common': pluginCatalogCommon,\n '@backstage/plugin-catalog-react': pluginCatalogReact,\n '@backstage/plugin-catalog-backend': pluginCatalogBackend,\n '@backstage/plugin-catalog-backend-module-scaffolder-entity-model':\n pluginCatalogBackendModuleScaffolderEntityModel,\n '@backstage/plugin-catalog-graph': pluginCatalogGraph,\n '@backstage/plugin-catalog-import': pluginCatalogImport,\n '@backstage/plugin-explore': pluginExplore,\n '@backstage/plugin-github-actions': pluginGithubActions,\n '@backstage/plugin-lighthouse': pluginLighthouse,\n '@backstage/plugin-org': pluginOrg,\n '@backstage/plugin-permission-backend': pluginPermissionBackend,\n '@backstage/plugin-permission-backend-module-allow-all-policy':\n pluginPermissionBackendModulePolicyAllowAll,\n '@backstage/plugin-permission-common': pluginPermissionCommon,\n '@backstage/plugin-permission-node': pluginPermissionNode,\n '@backstage/plugin-permission-react': pluginPermissionReact,\n '@backstage/plugin-proxy-backend': pluginProxyBackend,\n '@backstage/plugin-rollbar-backend': pluginRollbarBackend,\n '@backstage/plugin-scaffolder': pluginScaffolder,\n '@backstage/plugin-scaffolder-backend': pluginScaffolderBackend,\n '@backstage/plugin-search': pluginSearch,\n '@backstage/plugin-search-react': pluginSearchReact,\n '@backstage/plugin-search-backend': pluginSearchBackend,\n '@backstage/plugin-search-backend-module-catalog':\n pluginSearchBackendModuleCatalog,\n '@backstage/plugin-search-backend-module-pg': pluginSearchBackendModulePg,\n '@backstage/plugin-search-backend-module-techdocs':\n pluginSearchBackendModuleTechdocs,\n '@backstage/plugin-search-backend-node': pluginSearchBackendNode,\n '@backstage/plugin-tech-radar': pluginTechRadar,\n '@backstage/plugin-techdocs': pluginTechdocs,\n '@backstage/plugin-techdocs-react': pluginTechdocsReact,\n '@backstage/plugin-techdocs-module-addons-contrib':\n pluginTechdocsModuleAddonsContrib,\n '@backstage/plugin-techdocs-backend': pluginTechdocsBackend,\n '@backstage/plugin-user-settings': pluginUserSettings,\n '@backstage/test-utils': testUtils,\n '@backstage/theme': theme,\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 chalk from 'chalk';\nimport fs from 'fs-extra';\nimport handlebars from 'handlebars';\nimport ora from 'ora';\nimport recursive from 'recursive-readdir';\nimport {\n basename,\n dirname,\n resolve as resolvePath,\n relative as relativePath,\n} from 'path';\nimport fetch from 'node-fetch';\nimport { exec as execCb } from 'child_process';\nimport { packageVersions } from './versions';\nimport { promisify } from 'util';\nimport os from 'os';\n\nconst TASK_NAME_MAX_LENGTH = 14;\nconst TEN_MINUTES_MS = 1000 * 60 * 10;\nconst exec = promisify(execCb);\n\nexport type GitConfig = {\n defaultBranch?: string;\n};\n\nexport class Task {\n static log(name: string = '') {\n process.stdout.write(`${chalk.green(name)}\\n`);\n }\n\n static error(message: string = '') {\n process.stdout.write(`\\n${chalk.red(message)}\\n\\n`);\n }\n\n static section(name: string) {\n const title = chalk.green(`${name}:`);\n process.stdout.write(`\\n ${title}\\n`);\n }\n\n static exit(code: number = 0) {\n process.exit(code);\n }\n\n static async forItem(\n task: string,\n item: string,\n taskFunc: () => Promise<void>,\n ): Promise<void> {\n const paddedTask = chalk.green(task.padEnd(TASK_NAME_MAX_LENGTH));\n\n const spinner = ora({\n prefixText: chalk.green(` ${paddedTask}${chalk.cyan(item)}`),\n spinner: 'arc',\n color: 'green',\n }).start();\n\n try {\n await taskFunc();\n spinner.succeed();\n } catch (error) {\n spinner.fail();\n throw error;\n }\n }\n}\n\n/**\n * Generate a templated backstage project\n *\n * @param templateDir - location containing template files\n * @param destinationDir - location to save templated project\n * @param context - template parameters\n */\nexport async function templatingTask(\n templateDir: string,\n destinationDir: string,\n context: any,\n) {\n const files = await recursive(templateDir).catch(error => {\n throw new Error(`Failed to read template directory: ${error.message}`);\n });\n\n for (const file of files) {\n const destinationFile = resolvePath(\n destinationDir,\n relativePath(templateDir, file),\n );\n await fs.ensureDir(dirname(destinationFile));\n\n if (file.endsWith('.hbs')) {\n await Task.forItem('templating', basename(file), async () => {\n const destination = destinationFile.replace(/\\.hbs$/, '');\n\n const template = await fs.readFile(file);\n const compiled = handlebars.compile(template.toString());\n const contents = compiled(\n { name: basename(destination), ...context },\n {\n helpers: {\n version(name: keyof typeof packageVersions) {\n if (name in packageVersions) {\n return packageVersions[name];\n }\n throw new Error(`No version available for package ${name}`);\n },\n },\n },\n );\n\n await fs.writeFile(destination, contents).catch(error => {\n throw new Error(\n `Failed to create file: ${destination}: ${error.message}`,\n );\n });\n });\n } else {\n await Task.forItem('copying', basename(file), async () => {\n await fs.copyFile(file, destinationFile).catch(error => {\n const destination = destinationFile;\n throw new Error(\n `Failed to copy file to ${destination} : ${error.message}`,\n );\n });\n });\n }\n }\n}\n\n/**\n * Verify that application target does not already exist\n *\n * @param rootDir - The directory to create application folder `name`\n * @param name - The specified name of the application\n * @Throws Error - If directory with name of `destination` already exists\n */\nexport async function checkAppExistsTask(rootDir: string, name: string) {\n await Task.forItem('checking', name, async () => {\n const destination = resolvePath(rootDir, name);\n\n if (await fs.pathExists(destination)) {\n const existing = chalk.cyan(destination.replace(`${rootDir}/`, ''));\n throw new Error(\n `A directory with the same name already exists: ${existing}\\nPlease try again with a different app name`,\n );\n }\n });\n}\n\n/**\n * Verify that application `path` exists, otherwise create the directory\n *\n * @param path - target to create directory\n * @throws if `path` is a file, or `fs.mkdir` fails\n */\nexport async function checkPathExistsTask(path: string) {\n await Task.forItem('checking', path, async () => {\n try {\n await fs.mkdirs(path);\n } catch (error) {\n // will fail if a file already exists at given `path`\n throw new Error(`Failed to create app directory: ${error.message}`);\n }\n });\n}\n\n/**\n * Run `yarn install` and `run tsc` in application directory\n *\n * @param appDir - location of application to build\n */\nexport async function buildAppTask(appDir: string) {\n process.chdir(appDir);\n\n await Task.forItem('determining', 'yarn version', async () => {\n const result = await exec('yarn --version');\n const yarnVersion = result.stdout?.trim();\n\n if (yarnVersion && !yarnVersion.startsWith('1.')) {\n throw new Error(\n `@backstage/create-app requires Yarn v1, found '${yarnVersion}'. You can migrate the project to Yarn 3 after creation using https://backstage.io/docs/tutorials/yarn-migration`,\n );\n }\n });\n\n const runCmd = async (cmd: string) => {\n await Task.forItem('executing', cmd, async () => {\n await exec(cmd).catch(error => {\n process.stdout.write(error.stderr);\n process.stdout.write(error.stdout);\n throw new Error(`Could not execute command ${chalk.cyan(cmd)}`);\n });\n });\n };\n\n const installTimeout = setTimeout(() => {\n Task.error(\n \"\\n⏱️ It's taking a long time to install dependencies, you may want to exit (Ctrl-C) and run 'yarn install' and 'yarn tsc' manually\",\n );\n }, TEN_MINUTES_MS);\n\n await runCmd('yarn install').finally(() => clearTimeout(installTimeout));\n await runCmd('yarn tsc');\n}\n\n/**\n * Move temporary directory to destination application folder\n *\n * @param tempDir - source path to copy files from\n * @param destination - target path to copy files\n * @param id - item ID\n * @throws if `fs.move` fails\n */\nexport async function moveAppTask(\n tempDir: string,\n destination: string,\n id: string,\n) {\n await Task.forItem('moving', id, async () => {\n await fs\n .move(tempDir, destination)\n .catch(error => {\n throw new Error(\n `Failed to move app from ${tempDir} to ${destination}: ${error.message}`,\n );\n })\n .finally(() => {\n // remove temporary files on both success and failure\n fs.removeSync(tempDir);\n });\n });\n}\n\n/**\n * Read git configs by creating a temp folder and initializing a repo\n *\n * @throws if `exec` fails\n */\nexport async function readGitConfig(): Promise<GitConfig | undefined> {\n const tempDir = await fs.mkdtemp(resolvePath(os.tmpdir(), 'git-temp-dir-'));\n\n try {\n await exec('git init', { cwd: tempDir });\n await exec('git commit --allow-empty -m \"Initial commit\"', {\n cwd: tempDir,\n });\n\n const getDefaultBranch = await exec(\n 'git branch --format=\"%(refname:short)\"',\n { cwd: tempDir },\n );\n\n return {\n defaultBranch: getDefaultBranch.stdout?.trim() || undefined,\n };\n } catch (error) {\n return undefined;\n } finally {\n await fs.rm(tempDir, { recursive: true });\n }\n}\n\n/**\n * Initializes a git repository in the destination folder if possible\n *\n * @param dir - source path to initialize git repository in\n * @returns true if git repository was initialized\n */\nexport async function tryInitGitRepository(dir: string) {\n try {\n // Check if we're already in a git repo\n await exec('git rev-parse --is-inside-work-tree', { cwd: dir });\n return false;\n } catch {\n /* ignored */\n }\n\n try {\n await exec('git init', { cwd: dir });\n await exec('git add .', { cwd: dir });\n await exec('git commit -m \"Initial commit\"', { cwd: dir });\n return true;\n } catch (error) {\n try {\n await fs.rm(resolvePath(dir, '.git'), { recursive: true, force: true });\n } catch {\n throw new Error('Failed to remove .git folder');\n }\n\n return false;\n }\n}\n\n/**\n * This fetches the yarn.lock seed file at https://github.com/backstage/backstage/blob/master/packages/create-app/seed-yarn.lock\n * Its purpose is to lock individual dependencies with broken releases to known working versions.\n * This flow is decoupled from the release of the create-app package in order to avoid\n * the need to re-publish the create-app package whenever we want to update the seed file.\n *\n * @returns true if the yarn.lock seed file was fetched successfully\n */\nexport async function fetchYarnLockSeedTask(dir: string) {\n try {\n await Task.forItem('fetching', 'yarn.lock seed', async () => {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 3000);\n const res = await fetch(\n 'https://raw.githubusercontent.com/backstage/backstage/master/packages/create-app/seed-yarn.lock',\n {\n signal: controller.signal,\n },\n );\n clearTimeout(timeout);\n\n if (!res.ok) {\n throw new Error(\n `Request failed with status ${res.status} ${res.statusText}`,\n );\n }\n\n const initialYarnLockContent = await res.text();\n\n await fs.writeFile(\n resolvePath(dir, 'yarn.lock'),\n initialYarnLockContent\n .split('\\n')\n .filter(l => !l.startsWith('//'))\n .join('\\n'),\n 'utf8',\n );\n });\n return true;\n } catch {\n return false;\n }\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 chalk from 'chalk';\nimport { OptionValues } from 'commander';\nimport inquirer, { Answers } from 'inquirer';\nimport { resolve as resolvePath } from 'path';\nimport { findPaths } from '@backstage/cli-common';\nimport os from 'os';\nimport fs from 'fs-extra';\nimport {\n Task,\n buildAppTask,\n checkAppExistsTask,\n checkPathExistsTask,\n moveAppTask,\n templatingTask,\n tryInitGitRepository,\n readGitConfig,\n fetchYarnLockSeedTask,\n} from './lib/tasks';\n\nconst DEFAULT_BRANCH = 'master';\n\nexport default async (opts: OptionValues): Promise<void> => {\n /* eslint-disable-next-line no-restricted-syntax */\n const paths = findPaths(__dirname);\n const answers: Answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n default: 'backstage',\n message: chalk.blue('Enter a name for the app [required]'),\n validate: (value: any) => {\n if (!value) {\n return chalk.red('Please enter a name for the app');\n } else if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(value)) {\n return chalk.red(\n 'App name must be lowercase and contain only letters, digits, and dashes.',\n );\n }\n return true;\n },\n when: (a: Answers) => {\n const envName = process.env.BACKSTAGE_APP_NAME;\n if (envName) {\n a.name = envName;\n return false;\n }\n return true;\n },\n },\n ]);\n\n const templateDir = opts.templatePath\n ? paths.resolveTarget(opts.templatePath)\n : paths.resolveOwn('templates/default-app');\n\n // Use `--path` argument as application directory when specified, otherwise\n // create a directory using `answers.name`\n const appDir = opts.path\n ? resolvePath(paths.targetDir, opts.path)\n : resolvePath(paths.targetDir, answers.name);\n\n Task.log();\n Task.log('Creating the app...');\n\n try {\n const gitConfig = await readGitConfig();\n\n if (opts.path) {\n // Template directly to specified path\n\n Task.section('Checking that supplied path exists');\n await checkPathExistsTask(appDir);\n\n Task.section('Preparing files');\n await templatingTask(templateDir, opts.path, {\n ...answers,\n defaultBranch: gitConfig?.defaultBranch ?? DEFAULT_BRANCH,\n });\n } else {\n // Template to temporary location, and then move files\n\n Task.section('Checking if the directory is available');\n await checkAppExistsTask(paths.targetDir, answers.name);\n\n Task.section('Creating a temporary app directory');\n const tempDir = await fs.mkdtemp(resolvePath(os.tmpdir(), answers.name));\n\n Task.section('Preparing files');\n await templatingTask(templateDir, tempDir, {\n ...answers,\n defaultBranch: gitConfig?.defaultBranch ?? DEFAULT_BRANCH,\n });\n\n Task.section('Moving to final location');\n await moveAppTask(tempDir, appDir, answers.name);\n }\n\n const fetchedYarnLockSeed = await fetchYarnLockSeedTask(appDir);\n\n if (gitConfig) {\n if (await tryInitGitRepository(appDir)) {\n // Since we don't know whether we were able to init git before we\n // try, we can't track the actual task execution\n Task.forItem('init', 'git repository', async () => {});\n }\n }\n\n if (!opts.skipInstall) {\n Task.section('Installing dependencies');\n await buildAppTask(appDir);\n }\n\n Task.log();\n Task.log(\n chalk.green(`🥇 Successfully created ${chalk.cyan(answers.name)}`),\n );\n Task.log();\n\n if (!fetchedYarnLockSeed) {\n Task.log(\n chalk.yellow(\n [\n 'Warning: Failed to fetch the yarn.lock seed file.',\n ' You may end up with incompatible dependencies that break the app.',\n ' If you run into any errors, please search the issues at',\n ' https://github.com/backstage/backstage/issues for potential solutions',\n ].join('\\n'),\n ),\n );\n }\n\n Task.section('All set! Now you might want to');\n if (opts.skipInstall) {\n Task.log(\n ` Install the dependencies: ${chalk.cyan(\n `cd ${opts.path ?? answers.name} && yarn install`,\n )}`,\n );\n }\n Task.log(\n ` Run the app: ${chalk.cyan(\n `cd ${opts.path ?? answers.name} && yarn dev`,\n )}`,\n );\n Task.log(\n ' Set up the software catalog: https://backstage.io/docs/features/software-catalog/configuration',\n );\n Task.log(' Add authentication: https://backstage.io/docs/auth/');\n Task.log();\n Task.exit();\n } catch (error) {\n Task.error(String(error));\n\n Task.log('It seems that something went wrong when creating the app 🤔');\n\n Task.error('🔥 Failed to create app!');\n Task.exit(1);\n }\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\n/**\n * A CLI that helps you create your own Backstage app\n *\n * @packageDocumentation\n */\n\nimport { program } from 'commander';\nimport { exitWithError } from './lib/errors';\n// eslint-disable-next-line @backstage/no-relative-monorepo-imports\nimport { version } from '../../../package.json';\nimport createApp from './createApp';\n\nconst main = (argv: string[]) => {\n program\n .name('backstage-create-app')\n .version(version)\n .description('Creates a new app in a new directory or specified path')\n .option(\n '--path [directory]',\n 'Location to store the app defaulting to a new folder with the app name',\n )\n .option(\n '--skip-install',\n 'Skip the install and builds steps after creating the app',\n )\n .option(\n '--template-path [directory]',\n 'Use an external application template instead of the default template',\n )\n .action(cmd => createApp(cmd));\n\n program.parse(argv);\n};\n\nprocess.on('unhandledRejection', rejection => {\n if (rejection instanceof Error) {\n exitWithError(rejection);\n } else {\n exitWithError(new Error(`Unknown rejection: '${rejection}'`));\n }\n});\n\nmain(process.argv);\n"],"names":["chalk","root","appDefaults","backendCommon","backendDefaults","backendTasks","catalogClient","catalogModel","cli","config","coreAppApi","coreComponents","corePluginApi","e2eTestUtils","errors","integrationReact","pluginApiDocs","pluginAppBackend","pluginAuthBackend","pluginAuthBackendModuleGithubProvider","pluginAuthBackendModuleGuestProvider","pluginAuthNode","pluginCatalog","pluginCatalogCommon","pluginCatalogReact","pluginCatalogBackend","pluginCatalogBackendModuleScaffolderEntityModel","pluginCatalogGraph","pluginCatalogImport","pluginExplore","pluginGithubActions","pluginLighthouse","pluginOrg","pluginPermissionBackend","pluginPermissionBackendModulePolicyAllowAll","pluginPermissionCommon","pluginPermissionNode","pluginPermissionReact","pluginProxyBackend","pluginRollbarBackend","pluginScaffolder","pluginScaffolderBackend","pluginSearch","pluginSearchReact","pluginSearchBackend","pluginSearchBackendModuleCatalog","pluginSearchBackendModulePg","pluginSearchBackendModuleTechdocs","pluginSearchBackendNode","pluginTechRadar","pluginTechdocs","pluginTechdocsReact","pluginTechdocsModuleAddonsContrib","pluginTechdocsBackend","pluginUserSettings","testUtils","theme","promisify","execCb","ora","recursive","resolvePath","relativePath","fs","dirname","basename","handlebars","os","fetch","findPaths","inquirer","program","version"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@backstage/create-app",
3
3
  "description": "A CLI that helps you create your own Backstage app",
4
- "version": "0.5.12-next.2",
4
+ "version": "0.5.12",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -44,16 +44,15 @@
44
44
  "recursive-readdir": "^2.2.2"
45
45
  },
46
46
  "devDependencies": {
47
- "@backstage/backend-test-utils": "^0.3.4-next.2",
48
- "@backstage/cli": "^0.25.3-next.2",
47
+ "@backstage/backend-test-utils": "^0.3.4",
48
+ "@backstage/cli": "^0.26.0",
49
49
  "@types/command-exists": "^1.2.0",
50
50
  "@types/fs-extra": "^11.0.0",
51
51
  "@types/inquirer": "^8.1.3",
52
52
  "@types/node": "^18.17.8",
53
53
  "@types/recursive-readdir": "^2.2.0",
54
54
  "msw": "^1.0.0",
55
- "nodemon": "^3.0.1",
56
- "ts-node": "^10.0.0"
55
+ "nodemon": "^3.0.1"
57
56
  },
58
57
  "nodemonConfig": {
59
58
  "watch": "./src",
@@ -28,6 +28,10 @@ backend:
28
28
  # ca: # if you have a CA file and want to verify it you can uncomment this section
29
29
  # $file: <file-path>/ca/server.crt
30
30
 
31
+ auth:
32
+ providers:
33
+ guest: null
34
+
31
35
  catalog:
32
36
  # Overrides the default list locations from app-config.yaml as these contain example data.
33
37
  # See https://backstage.io/docs/features/software-catalog/#adding-components-to-the-catalog for more details
@@ -36,7 +36,7 @@ integrations:
36
36
  github:
37
37
  - host: github.com
38
38
  # This is a Personal Access Token or PAT from GitHub. You can find out how to generate this token, and more information
39
- # about setting up the GitHub integration here: https://backstage.io/docs/getting-started/configuration#setting-up-a-github-integration
39
+ # about setting up the GitHub integration here: https://backstage.io/docs/integrations/github/locations#configuration
40
40
  token: ${GITHUB_TOKEN}
41
41
  ### Example for how to add your GitHub Enterprise instance using the API:
42
42
  # - host: ghe.example.net
@@ -64,7 +64,9 @@ techdocs:
64
64
 
65
65
  auth:
66
66
  # see https://backstage.io/docs/auth/ to learn about auth providers
67
- providers: {}
67
+ providers:
68
+ # See https://backstage.io/docs/auth/guest/provider
69
+ guest: {}
68
70
 
69
71
  scaffolder:
70
72
  # see https://backstage.io/docs/features/software-templates/configuration for software template options
@@ -19,5 +19,9 @@ import { test, expect } from '@playwright/test';
19
19
  test('App should render the welcome page', async ({ page }) => {
20
20
  await page.goto('/');
21
21
 
22
+ const enterButton = page.getByRole('button', { name: 'Enter' });
23
+ await expect(enterButton).toBeVisible();
24
+ await enterButton.click();
25
+
22
26
  await expect(page.getByText('My Company Catalog')).toBeVisible();
23
27
  });
@@ -27,7 +27,11 @@ import { entityPage } from './components/catalog/EntityPage';
27
27
  import { searchPage } from './components/search/SearchPage';
28
28
  import { Root } from './components/Root';
29
29
 
30
- import { AlertDisplay, OAuthRequestDialog } from '@backstage/core-components';
30
+ import {
31
+ AlertDisplay,
32
+ OAuthRequestDialog,
33
+ SignInPage,
34
+ } from '@backstage/core-components';
31
35
  import { createApp } from '@backstage/app-defaults';
32
36
  import { AppRouter, FlatRoutes } from '@backstage/core-app-api';
33
37
  import { CatalogGraphPage } from '@backstage/plugin-catalog-graph';
@@ -53,6 +57,9 @@ const app = createApp({
53
57
  catalogIndex: catalogPlugin.routes.catalogIndex,
54
58
  });
55
59
  },
60
+ components: {
61
+ SignInPage: props => <SignInPage {...props} auto providers={['guest']} />,
62
+ },
56
63
  });
57
64
 
58
65
  const routes = (
@@ -17,30 +17,30 @@
17
17
  },
18
18
  "dependencies": {
19
19
  "@backstage/backend-common": "^{{version '@backstage/backend-common'}}",
20
+ "@backstage/backend-defaults": "^{{version '@backstage/backend-defaults'}}",
20
21
  "@backstage/backend-tasks": "^{{version '@backstage/backend-tasks'}}",
21
- "@backstage/catalog-client": "^{{version '@backstage/catalog-client'}}",
22
- "@backstage/catalog-model": "^{{version '@backstage/catalog-model'}}",
23
22
  "@backstage/config": "^{{version '@backstage/config'}}",
24
23
  "@backstage/plugin-app-backend": "^{{version '@backstage/plugin-app-backend'}}",
25
24
  "@backstage/plugin-auth-backend": "^{{version '@backstage/plugin-auth-backend'}}",
25
+ "@backstage/plugin-auth-backend-module-github-provider": "^{{version '@backstage/plugin-auth-backend-module-github-provider'}}",
26
+ "@backstage/plugin-auth-backend-module-guest-provider": "^{{version '@backstage/plugin-auth-backend-module-guest-provider'}}",
26
27
  "@backstage/plugin-auth-node": "^{{version '@backstage/plugin-auth-node'}}",
27
28
  "@backstage/plugin-catalog-backend": "^{{version '@backstage/plugin-catalog-backend'}}",
28
29
  "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "^{{version '@backstage/plugin-catalog-backend-module-scaffolder-entity-model'}}",
30
+ "@backstage/plugin-permission-backend": "^{{version '@backstage/plugin-permission-backend'}}",
31
+ "@backstage/plugin-permission-backend-module-allow-all-policy": "^{{version '@backstage/plugin-permission-backend-module-allow-all-policy'}}",
29
32
  "@backstage/plugin-permission-common": "^{{version '@backstage/plugin-permission-common'}}",
30
33
  "@backstage/plugin-permission-node": "^{{version '@backstage/plugin-permission-node'}}",
31
34
  "@backstage/plugin-proxy-backend": "^{{version '@backstage/plugin-proxy-backend'}}",
32
35
  "@backstage/plugin-scaffolder-backend": "^{{version '@backstage/plugin-scaffolder-backend'}}",
33
36
  "@backstage/plugin-search-backend": "^{{version '@backstage/plugin-search-backend'}}",
34
37
  "@backstage/plugin-search-backend-module-catalog": "^{{version '@backstage/plugin-search-backend-module-catalog'}}",
35
- "@backstage/plugin-search-backend-module-pg": "^{{version '@backstage/plugin-search-backend-module-pg'}}",
36
38
  "@backstage/plugin-search-backend-module-techdocs": "^{{version '@backstage/plugin-search-backend-module-techdocs'}}",
37
39
  "@backstage/plugin-search-backend-node": "^{{version '@backstage/plugin-search-backend-node'}}",
38
40
  "@backstage/plugin-techdocs-backend": "^{{version '@backstage/plugin-techdocs-backend'}}",
39
41
  "app": "link:../app",
40
42
  "better-sqlite3": "^9.0.0",
41
43
  "dockerode": "^3.3.1",
42
- "express": "^4.17.1",
43
- "express-promise-router": "^4.1.0",
44
44
  "node-gyp": "^9.0.0",
45
45
  "pg": "^8.11.3",
46
46
  "winston": "^3.2.1"
@@ -6,110 +6,36 @@
6
6
  * Happy hacking!
7
7
  */
8
8
 
9
- import Router from 'express-promise-router';
10
- import {
11
- createServiceBuilder,
12
- loadBackendConfig,
13
- getRootLogger,
14
- useHotMemoize,
15
- notFoundHandler,
16
- CacheManager,
17
- DatabaseManager,
18
- HostDiscovery,
19
- UrlReaders,
20
- ServerTokenManager,
21
- } from '@backstage/backend-common';
22
- import { TaskScheduler } from '@backstage/backend-tasks';
23
- import { Config } from '@backstage/config';
24
- import app from './plugins/app';
25
- import auth from './plugins/auth';
26
- import catalog from './plugins/catalog';
27
- import scaffolder from './plugins/scaffolder';
28
- import proxy from './plugins/proxy';
29
- import techdocs from './plugins/techdocs';
30
- import search from './plugins/search';
31
- import { PluginEnvironment } from './types';
32
- import { ServerPermissionClient } from '@backstage/plugin-permission-node';
33
- import { DefaultIdentityClient } from '@backstage/plugin-auth-node';
34
-
35
- function makeCreateEnv(config: Config) {
36
- const root = getRootLogger();
37
- const reader = UrlReaders.default({ logger: root, config });
38
- const discovery = HostDiscovery.fromConfig(config);
39
- const cacheManager = CacheManager.fromConfig(config);
40
- const databaseManager = DatabaseManager.fromConfig(config, { logger: root });
41
- const tokenManager = ServerTokenManager.noop();
42
- const taskScheduler = TaskScheduler.fromConfig(config, { databaseManager });
43
-
44
- const identity = DefaultIdentityClient.create({
45
- discovery,
46
- });
47
- const permissions = ServerPermissionClient.fromConfig(config, {
48
- discovery,
49
- tokenManager,
50
- });
51
-
52
- root.info(`Created UrlReader ${reader}`);
53
-
54
- return (plugin: string): PluginEnvironment => {
55
- const logger = root.child({ type: 'plugin', plugin });
56
- const database = databaseManager.forPlugin(plugin);
57
- const cache = cacheManager.forPlugin(plugin);
58
- const scheduler = taskScheduler.forPlugin(plugin);
59
- return {
60
- logger,
61
- database,
62
- cache,
63
- config,
64
- reader,
65
- discovery,
66
- tokenManager,
67
- scheduler,
68
- permissions,
69
- identity,
70
- };
71
- };
72
- }
73
-
74
- async function main() {
75
- const config = await loadBackendConfig({
76
- argv: process.argv,
77
- logger: getRootLogger(),
78
- });
79
- const createEnv = makeCreateEnv(config);
80
-
81
- const catalogEnv = useHotMemoize(module, () => createEnv('catalog'));
82
- const scaffolderEnv = useHotMemoize(module, () => createEnv('scaffolder'));
83
- const authEnv = useHotMemoize(module, () => createEnv('auth'));
84
- const proxyEnv = useHotMemoize(module, () => createEnv('proxy'));
85
- const techdocsEnv = useHotMemoize(module, () => createEnv('techdocs'));
86
- const searchEnv = useHotMemoize(module, () => createEnv('search'));
87
- const appEnv = useHotMemoize(module, () => createEnv('app'));
88
-
89
- const apiRouter = Router();
90
- apiRouter.use('/catalog', await catalog(catalogEnv));
91
- apiRouter.use('/scaffolder', await scaffolder(scaffolderEnv));
92
- apiRouter.use('/auth', await auth(authEnv));
93
- apiRouter.use('/techdocs', await techdocs(techdocsEnv));
94
- apiRouter.use('/proxy', await proxy(proxyEnv));
95
- apiRouter.use('/search', await search(searchEnv));
96
-
97
- // Add backends ABOVE this line; this 404 handler is the catch-all fallback
98
- apiRouter.use(notFoundHandler());
99
-
100
- const service = createServiceBuilder(module)
101
- .loadConfig(config)
102
- .addRouter('/api', apiRouter)
103
- .addRouter('', await app(appEnv));
104
-
105
- await service.start().catch(err => {
106
- console.log(err);
107
- process.exit(1);
108
- });
109
- }
110
-
111
- module.hot?.accept();
112
- main().catch(error => {
113
- console.error('Backend failed to start up', error);
114
- process.exit(1);
115
- });
9
+ import { createBackend } from '@backstage/backend-defaults';
10
+
11
+ const backend = createBackend();
12
+
13
+ backend.add(import('@backstage/plugin-app-backend/alpha'));
14
+ backend.add(import('@backstage/plugin-proxy-backend/alpha'));
15
+ backend.add(import('@backstage/plugin-scaffolder-backend/alpha'));
16
+ backend.add(import('@backstage/plugin-techdocs-backend/alpha'));
17
+
18
+ // auth plugin
19
+ backend.add(import('@backstage/plugin-auth-backend'));
20
+ // See https://backstage.io/docs/backend-system/building-backends/migrating#the-auth-plugin
21
+ backend.add(import('@backstage/plugin-auth-backend-module-guest-provider'));
22
+ // See https://github.com/backstage/backstage/blob/master/docs/auth/guest/provider.md
23
+
24
+ // catalog plugin
25
+ backend.add(import('@backstage/plugin-catalog-backend/alpha'));
26
+ backend.add(
27
+ import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model'),
28
+ );
29
+
30
+ // permission plugin
31
+ backend.add(import('@backstage/plugin-permission-backend/alpha'));
32
+ backend.add(
33
+ import('@backstage/plugin-permission-backend-module-allow-all-policy'),
34
+ );
35
+
36
+ // search plugin
37
+ backend.add(import('@backstage/plugin-search-backend/alpha'));
38
+ backend.add(import('@backstage/plugin-search-backend-module-catalog/alpha'));
39
+ backend.add(import('@backstage/plugin-search-backend-module-techdocs/alpha'));
40
+
41
+ backend.start();
@@ -32,7 +32,7 @@ export default defineConfig({
32
32
  ? []
33
33
  : [
34
34
  {
35
- command: 'yarn start',
35
+ command: 'yarn dev',
36
36
  port: 3000,
37
37
  reuseExistingServer: true,
38
38
  timeout: 60_000,
@@ -1,14 +0,0 @@
1
- import { createRouter } from '@backstage/plugin-app-backend';
2
- import { Router } from 'express';
3
- import { PluginEnvironment } from '../types';
4
-
5
- export default async function createPlugin(
6
- env: PluginEnvironment,
7
- ): Promise<Router> {
8
- return await createRouter({
9
- logger: env.logger,
10
- config: env.config,
11
- database: env.database,
12
- appPackageName: 'app',
13
- });
14
- }
@@ -1,54 +0,0 @@
1
- import {
2
- createRouter,
3
- providers,
4
- defaultAuthProviderFactories,
5
- } from '@backstage/plugin-auth-backend';
6
- import { Router } from 'express';
7
- import { PluginEnvironment } from '../types';
8
-
9
- export default async function createPlugin(
10
- env: PluginEnvironment,
11
- ): Promise<Router> {
12
- return await createRouter({
13
- logger: env.logger,
14
- config: env.config,
15
- database: env.database,
16
- discovery: env.discovery,
17
- tokenManager: env.tokenManager,
18
- providerFactories: {
19
- ...defaultAuthProviderFactories,
20
-
21
- // This replaces the default GitHub auth provider with a customized one.
22
- // The `signIn` option enables sign-in for this provider, using the
23
- // identity resolution logic that's provided in the `resolver` callback.
24
- //
25
- // This particular resolver makes all users share a single "guest" identity.
26
- // It should only be used for testing and trying out Backstage.
27
- //
28
- // If you want to use a production ready resolver you can switch to
29
- // the one that is commented out below, it looks up a user entity in the
30
- // catalog using the GitHub username of the authenticated user.
31
- // That resolver requires you to have user entities populated in the catalog,
32
- // for example using https://backstage.io/docs/integrations/github/org
33
- //
34
- // There are other resolvers to choose from, and you can also create
35
- // your own, see the auth documentation for more details:
36
- //
37
- // https://backstage.io/docs/auth/identity-resolver
38
- github: providers.github.create({
39
- signIn: {
40
- resolver(_, ctx) {
41
- const userRef = 'user:default/guest'; // Must be a full entity reference
42
- return ctx.issueToken({
43
- claims: {
44
- sub: userRef, // The user's own identity
45
- ent: [userRef], // A list of identities that the user claims ownership through
46
- },
47
- });
48
- },
49
- // resolver: providers.github.resolvers.usernameMatchingUserEntityName(),
50
- },
51
- }),
52
- },
53
- });
54
- }
@@ -1,14 +0,0 @@
1
- import { CatalogBuilder } from '@backstage/plugin-catalog-backend';
2
- import { ScaffolderEntitiesProcessor } from '@backstage/plugin-catalog-backend-module-scaffolder-entity-model';
3
- import { Router } from 'express';
4
- import { PluginEnvironment } from '../types';
5
-
6
- export default async function createPlugin(
7
- env: PluginEnvironment,
8
- ): Promise<Router> {
9
- const builder = await CatalogBuilder.create(env);
10
- builder.addProcessor(new ScaffolderEntitiesProcessor());
11
- const { processingEngine, router } = await builder.build();
12
- await processingEngine.start();
13
- return router;
14
- }
@@ -1,13 +0,0 @@
1
- import { createRouter } from '@backstage/plugin-proxy-backend';
2
- import { Router } from 'express';
3
- import { PluginEnvironment } from '../types';
4
-
5
- export default async function createPlugin(
6
- env: PluginEnvironment,
7
- ): Promise<Router> {
8
- return await createRouter({
9
- logger: env.logger,
10
- config: env.config,
11
- discovery: env.discovery,
12
- });
13
- }
@@ -1,22 +0,0 @@
1
- import { CatalogClient } from '@backstage/catalog-client';
2
- import { createRouter } from '@backstage/plugin-scaffolder-backend';
3
- import { Router } from 'express';
4
- import type { PluginEnvironment } from '../types';
5
-
6
- export default async function createPlugin(
7
- env: PluginEnvironment,
8
- ): Promise<Router> {
9
- const catalogClient = new CatalogClient({
10
- discoveryApi: env.discovery,
11
- });
12
-
13
- return await createRouter({
14
- logger: env.logger,
15
- config: env.config,
16
- database: env.database,
17
- reader: env.reader,
18
- catalogClient,
19
- identity: env.identity,
20
- permissions: env.permissions,
21
- });
22
- }
@@ -1,66 +0,0 @@
1
- import { useHotCleanup } from '@backstage/backend-common';
2
- import { createRouter } from '@backstage/plugin-search-backend';
3
- import {
4
- IndexBuilder,
5
- LunrSearchEngine,
6
- } from '@backstage/plugin-search-backend-node';
7
- import { PluginEnvironment } from '../types';
8
- import { DefaultCatalogCollatorFactory } from '@backstage/plugin-search-backend-module-catalog';
9
- import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-search-backend-module-techdocs';
10
- import { Router } from 'express';
11
-
12
- export default async function createPlugin(
13
- env: PluginEnvironment,
14
- ): Promise<Router> {
15
- // Initialize a connection to a search engine.
16
- const searchEngine = new LunrSearchEngine({
17
- logger: env.logger,
18
- });
19
- const indexBuilder = new IndexBuilder({
20
- logger: env.logger,
21
- searchEngine,
22
- });
23
-
24
- const schedule = env.scheduler.createScheduledTaskRunner({
25
- frequency: { minutes: 10 },
26
- timeout: { minutes: 15 },
27
- // A 3 second delay gives the backend server a chance to initialize before
28
- // any collators are executed, which may attempt requests against the API.
29
- initialDelay: { seconds: 3 },
30
- });
31
-
32
- // Collators are responsible for gathering documents known to plugins. This
33
- // collator gathers entities from the software catalog.
34
- indexBuilder.addCollator({
35
- schedule,
36
- factory: DefaultCatalogCollatorFactory.fromConfig(env.config, {
37
- discovery: env.discovery,
38
- tokenManager: env.tokenManager,
39
- }),
40
- });
41
-
42
- // collator gathers entities from techdocs.
43
- indexBuilder.addCollator({
44
- schedule,
45
- factory: DefaultTechDocsCollatorFactory.fromConfig(env.config, {
46
- discovery: env.discovery,
47
- logger: env.logger,
48
- tokenManager: env.tokenManager,
49
- }),
50
- });
51
-
52
- // The scheduler controls when documents are gathered from collators and sent
53
- // to the search engine for indexing.
54
- const { scheduler } = await indexBuilder.build();
55
- scheduler.start();
56
-
57
- useHotCleanup(module, () => scheduler.stop());
58
-
59
- return await createRouter({
60
- engine: indexBuilder.getSearchEngine(),
61
- types: indexBuilder.getDocumentTypes(),
62
- permissions: env.permissions,
63
- config: env.config,
64
- logger: env.logger,
65
- });
66
- }
@@ -1,51 +0,0 @@
1
- import { DockerContainerRunner } from '@backstage/backend-common';
2
- import {
3
- createRouter,
4
- Generators,
5
- Preparers,
6
- Publisher,
7
- } from '@backstage/plugin-techdocs-backend';
8
- import Docker from 'dockerode';
9
- import { Router } from 'express';
10
- import { PluginEnvironment } from '../types';
11
-
12
- export default async function createPlugin(
13
- env: PluginEnvironment,
14
- ): Promise<Router> {
15
- // Preparers are responsible for fetching source files for documentation.
16
- const preparers = await Preparers.fromConfig(env.config, {
17
- logger: env.logger,
18
- reader: env.reader,
19
- });
20
-
21
- // Docker client (conditionally) used by the generators, based on techdocs.generators config.
22
- const dockerClient = new Docker();
23
- const containerRunner = new DockerContainerRunner({ dockerClient });
24
-
25
- // Generators are used for generating documentation sites.
26
- const generators = await Generators.fromConfig(env.config, {
27
- logger: env.logger,
28
- containerRunner,
29
- });
30
-
31
- // Publisher is used for
32
- // 1. Publishing generated files to storage
33
- // 2. Fetching files from storage and passing them to TechDocs frontend.
34
- const publisher = await Publisher.fromConfig(env.config, {
35
- logger: env.logger,
36
- discovery: env.discovery,
37
- });
38
-
39
- // checks if the publisher is working and logs the result
40
- await publisher.getReadiness();
41
-
42
- return await createRouter({
43
- preparers,
44
- generators,
45
- publisher,
46
- logger: env.logger,
47
- config: env.config,
48
- discovery: env.discovery,
49
- cache: env.cache,
50
- });
51
- }