@backstage/create-app 0.4.25 → 0.4.27-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,10 +1,486 @@
1
1
  # @backstage/create-app
2
2
 
3
- ## 0.4.25
3
+ ## 0.4.27-next.0
4
4
 
5
5
  ### Patch Changes
6
6
 
7
- - Added resolutions for `@types/react` and `@types/react-dom` to make sure that React v17 types are installed.
7
+ - 3983940a21: Optimized the command order in `packages/backend/Dockerfile` as well as added the `--no-install-recommends` to the `apt-get install` and tweaked the installed packages.
8
+
9
+ To apply this change to an existing app, update your `packages/backend/Dockerfile` to match the documented `Dockerfile` at https://backstage.io/docs/deployment/docker#host-build.
10
+
11
+ - 28bbf5aff6: Added some instruction comments to the generated config files, to clarify the
12
+ usage of `backend.baseUrl` and `backend.listen.host`. Importantly, it also per
13
+ default now listens on all IPv4 interfaces, to make it easier to take the step
14
+ over to production. If you want to do the same, update your
15
+ `app-config.production.yaml` as follows:
16
+
17
+ ```diff
18
+ backend:
19
+ listen:
20
+ port: 7007
21
+ + host: 0.0.0.0
22
+ ```
23
+
24
+ Also, updated the builtin backend Dockerfile to honor the
25
+ `app-config.production.yaml` file. If you want to do the same, change
26
+ `packages/backend/Dockerfile` as follows:
27
+
28
+ ```diff
29
+ -COPY packages/backend/dist/bundle.tar.gz app-config.yaml ./
30
+ +COPY packages/backend/dist/bundle.tar.gz app-config*.yaml ./
31
+ RUN tar xzf bundle.tar.gz && rm bundle.tar.gz
32
+
33
+ -CMD ["node", "packages/backend", "--config", "app-config.yaml"]
34
+ +CMD ["node", "packages/backend", "--config", "app-config.yaml", "--config", "app-config.production.yaml"]
35
+ ```
36
+
37
+ If you look carefully, this adds a glob match on app-config files. For those
38
+ that try out the build flows locally, you also want to make sure that the docker
39
+ daemon does NOT pick up any local/private config files that might contain
40
+ secrets. You should therefore also update your local `.dockerignore` file at the
41
+ same time:
42
+
43
+ ```diff
44
+ +*.local.yaml
45
+ ```
46
+
47
+ - cfc0f19699: Updated dependency `fs-extra` to `10.1.0`.
48
+ - 344ea56acc: Bump `commander` to version 9.1.0
49
+ - 806427545f: Added a link to the `${GITHUB_TOKEN}` to document how to generate a token
50
+
51
+ ## 0.4.26
52
+
53
+ ### Patch Changes
54
+
55
+ - 1691c6c5c2: Made `User` and `Group` entity kinds not permitted by the default
56
+ `catalog.rules` config.
57
+
58
+ The effect of this is that after creating a new Backstage repository, its
59
+ catalog no longer permits regular users to register `User` or `Group` entities
60
+ using the Backstage interface. Additionally, if you have config locations that
61
+ result in `User` or `Group` entities, you need to add those kinds to its own
62
+ specific rules:
63
+
64
+ ```yaml
65
+ catalog:
66
+ locations:
67
+ # This applies for example to url type locations
68
+ - type: url
69
+ target: https://example.com/org.yaml
70
+ rules:
71
+ - allow: [User, Group]
72
+ # But also note that this applies to ALL org location types!
73
+ - type: github-org
74
+ target: https://github.com/my-org-name
75
+ rules:
76
+ - allow: [User, Group]
77
+ ```
78
+
79
+ This rule change does NOT affect entity providers, only things that are emitted
80
+ by entity processors.
81
+
82
+ We recommend that this change is applied to your own Backstage repository, since
83
+ it makes it impossible for regular end users to affect your org data through
84
+ e.g. YAML files. To do so, remove the two kinds from the default rules in your config:
85
+
86
+ ```diff
87
+ catalog:
88
+ rules:
89
+ - - allow: [Component, System, API, Group, User, Resource, Location]
90
+ + - allow: [Component, System, API, Resource, Location]
91
+ ```
92
+
93
+ And for any location that in any way results in org data being ingested, add the corresponding rule to it:
94
+
95
+ ```diff
96
+ catalog:
97
+ locations:
98
+ - type: github-org
99
+ target: https://github.com/my-org-name
100
+ + rules:
101
+ + - allow: [User, Group]
102
+ ```
103
+
104
+ - 0e911394d2: Remove the `knex` package that is installed in the `packages/backend` as it's provided by the `@backstage/*` packages for you automatically. You can make the following change in your `packages/backend/package.json` if you wish to apply this change.
105
+
106
+ ```diff
107
+ "lint": "backstage-cli package lint",
108
+ "test": "backstage-cli package test",
109
+ "clean": "backstage-cli package clean",
110
+ - "migrate:create": "knex migrate:make -x ts"
111
+ ```
112
+
113
+ ```diff
114
+ "express": "^4.17.1",
115
+ "express-promise-router": "^4.1.0",
116
+ - "knex": "^0.21.6",
117
+ "pg": "^8.3.0",
118
+ ```
119
+
120
+ - 520e21aaea: imports `useSearch` hook from new `@backstage/plugin-search-react` package.
121
+
122
+ To upgrade existing Apps:
123
+
124
+ 1. Change the import to the following:
125
+
126
+ `packages/app/src/components/search/SearchPage.tsx`
127
+
128
+ ```diff
129
+ import {
130
+ ...
131
+ SearchType,
132
+ - useSearch,
133
+ } from '@backstage/plugin-search';
134
+ +import { useSearch } from '@backstage/plugin-search-react';
135
+ ```
136
+
137
+ 2. Add `@backstage/plugin-search-react` as a dependency to the app.
138
+
139
+ - 43759dd789: Removed `@octokit/rest` and `@gitbeaker/node` from backend dependencies as these are unused in the default app.
140
+
141
+ To apply these changes to your existing app, remove the following lines from the `dependencies` section of `packages/backend/package.json`
142
+
143
+ ```diff
144
+ "@backstage/plugin-techdocs-backend": "^1.0.0",
145
+ - "@gitbeaker/node": "^34.6.0",
146
+ - "@octokit/rest": "^18.5.3",
147
+ ```
148
+
149
+ - e838a7060a: Add type resolutions for `@types/react` and `types/react-dom`.
150
+
151
+ The reason for this is the usage of `"@types/react": "*"` as a dependency which is very common practice in react packages. This recently resolves to react 18 which introduces several breaking changes in both internal and external packages.
152
+
153
+ To apply these changes to your existing installation, add a resolutions block to your `package.json`
154
+
155
+ ```json
156
+ "resolutions": {
157
+ "@types/react": "^17",
158
+ "@types/react-dom": "^17"
159
+ },
160
+ ```
161
+
162
+ If your existing app depends on react 16, use this resolution block instead.
163
+
164
+ ```json
165
+ "resolutions": {
166
+ "@types/react": "^16",
167
+ "@types/react-dom": "^16"
168
+ },
169
+ ```
170
+
171
+ - 0a63e99a26: **BREAKING**: `IndexBuilder.addCollator()` now requires a `schedule` parameter (replacing `defaultRefreshIntervalSeconds`) which is expected to be a `TaskRunner` that is configured with the desired search indexing schedule for the given collator.
172
+
173
+ `Scheduler.addToSchedule()` now takes a new parameter object (`ScheduleTaskParameters`) with two new options `id` and `scheduledRunner` in addition to the migrated `task` argument.
174
+
175
+ NOTE: The search backend plugin now creates a dedicated database for coordinating indexing tasks.
176
+
177
+ To make this change to an existing app, make the following changes to `packages/backend/src/plugins/search.ts`:
178
+
179
+ ```diff
180
+ +import { Duration } from 'luxon';
181
+
182
+ /* ... */
183
+
184
+ + const schedule = env.scheduler.createScheduledTaskRunner({
185
+ + frequency: Duration.fromObject({ minutes: 10 }),
186
+ + timeout: Duration.fromObject({ minutes: 15 }),
187
+ + initialDelay: Duration.fromObject({ seconds: 3 }),
188
+ + });
189
+
190
+ indexBuilder.addCollator({
191
+ - defaultRefreshIntervalSeconds: 600,
192
+ + schedule,
193
+ factory: DefaultCatalogCollatorFactory.fromConfig(env.config, {
194
+ discovery: env.discovery,
195
+ tokenManager: env.tokenManager,
196
+ }),
197
+ });
198
+
199
+ indexBuilder.addCollator({
200
+ - defaultRefreshIntervalSeconds: 600,
201
+ + schedule,
202
+ factory: DefaultTechDocsCollatorFactory.fromConfig(env.config, {
203
+ discovery: env.discovery,
204
+ tokenManager: env.tokenManager,
205
+ }),
206
+ });
207
+
208
+ const { scheduler } = await indexBuilder.build();
209
+ - setTimeout(() => scheduler.start(), 3000);
210
+ + scheduler.start();
211
+ /* ... */
212
+ ```
213
+
214
+ NOTE: For scenarios where the `lunr` search engine is used in a multi-node configuration, a non-distributed `TaskRunner` like the following should be implemented to ensure consistency across nodes (alternatively, you can configure
215
+ the search plugin to use a non-distributed DB such as [SQLite](https://backstage.io/docs/tutorials/configuring-plugin-databases#postgresql-and-sqlite-3)):
216
+
217
+ ```diff
218
+ +import { TaskInvocationDefinition, TaskRunner } from '@backstage/backend-tasks';
219
+
220
+ /* ... */
221
+
222
+ + const schedule: TaskRunner = {
223
+ + run: async (task: TaskInvocationDefinition) => {
224
+ + const startRefresh = async () => {
225
+ + while (!task.signal?.aborted) {
226
+ + try {
227
+ + await task.fn(task.signal);
228
+ + } catch {
229
+ + // ignore intentionally
230
+ + }
231
+ +
232
+ + await new Promise(resolve => setTimeout(resolve, 600 * 1000));
233
+ + }
234
+ + };
235
+ + startRefresh();
236
+ + },
237
+ + };
238
+
239
+ indexBuilder.addCollator({
240
+ - defaultRefreshIntervalSeconds: 600,
241
+ + schedule,
242
+ factory: DefaultCatalogCollatorFactory.fromConfig(env.config, {
243
+ discovery: env.discovery,
244
+ tokenManager: env.tokenManager,
245
+ }),
246
+ });
247
+
248
+ /* ... */
249
+ ```
250
+
251
+ - c07d9f9e1c: Add helpful README.md files in the original `packages` and `plugins` folders
252
+ - 230ad0826f: Bump to using `@types/node` v16
253
+ - 1882dbda2b: Accept `PermissionEvaluator` instead of the deprecated `PermissionAuthorizer`.
254
+
255
+ Apply the following to `packages/backend/src/types.ts`:
256
+
257
+ ```diff
258
+ - import { PermissionAuthorizer } from '@backstage/plugin-permission-common';
259
+ + import { PermissionEvaluator } from '@backstage/plugin-permission-common';
260
+
261
+ export type PluginEnvironment = {
262
+ ...
263
+ discovery: PluginEndpointDiscovery;
264
+ tokenManager: TokenManager;
265
+ scheduler: PluginTaskScheduler;
266
+ - permissions: PermissionAuthorizer;
267
+ + permissions: PermissionEvaluator;
268
+ };
269
+ ```
270
+
271
+ - e80cca164d: Tweaked `.eslintrc.js` files in the template to avoid having them apply during development. This change does not affect create apps.
272
+
273
+ ## 0.4.26-next.2
274
+
275
+ ### Patch Changes
276
+
277
+ - 43759dd789: Removed `@octokit/rest` and `@gitbeaker/node` from backend dependencies as these are unused in the default app.
278
+
279
+ To apply these changes to your existing app, remove the following lines from the `dependencies` section of `packages/backend/package.json`
280
+
281
+ ```diff
282
+ "@backstage/plugin-techdocs-backend": "^1.0.0",
283
+ - "@gitbeaker/node": "^34.6.0",
284
+ - "@octokit/rest": "^18.5.3",
285
+ ```
286
+
287
+ - e838a7060a: Add type resolutions for `@types/react` and `types/react-dom`.
288
+
289
+ The reason for this is the usage of `"@types/react": "*"` as a dependency which is very common practice in react packages. This recently resolves to react 18 which introduces several breaking changes in both internal and external packages.
290
+
291
+ To apply these changes to your existing installation, add a resolutions block to your `package.json`
292
+
293
+ ```json
294
+ "resolutions": {
295
+ "@types/react": "^17",
296
+ "@types/react-dom": "^17"
297
+ },
298
+ ```
299
+
300
+ If your existing app depends on react 16, use this resolution block instead.
301
+
302
+ ```json
303
+ "resolutions": {
304
+ "@types/react": "^16",
305
+ "@types/react-dom": "^16"
306
+ },
307
+ ```
308
+
309
+ - 0a63e99a26: **BREAKING**: `IndexBuilder.addCollator()` now requires a `schedule` parameter (replacing `defaultRefreshIntervalSeconds`) which is expected to be a `TaskRunner` that is configured with the desired search indexing schedule for the given collator.
310
+
311
+ `Scheduler.addToSchedule()` now takes a new parameter object (`ScheduleTaskParameters`) with two new options `id` and `scheduledRunner` in addition to the migrated `task` argument.
312
+
313
+ NOTE: The search backend plugin now creates a dedicated database for coordinating indexing tasks.
314
+
315
+ To make this change to an existing app, make the following changes to `packages/backend/src/plugins/search.ts`:
316
+
317
+ ```diff
318
+ +import { Duration } from 'luxon';
319
+
320
+ /* ... */
321
+
322
+ + const schedule = env.scheduler.createScheduledTaskRunner({
323
+ + frequency: Duration.fromObject({ minutes: 10 }),
324
+ + timeout: Duration.fromObject({ minutes: 15 }),
325
+ + initialDelay: Duration.fromObject({ seconds: 3 }),
326
+ + });
327
+
328
+ indexBuilder.addCollator({
329
+ - defaultRefreshIntervalSeconds: 600,
330
+ + schedule,
331
+ factory: DefaultCatalogCollatorFactory.fromConfig(env.config, {
332
+ discovery: env.discovery,
333
+ tokenManager: env.tokenManager,
334
+ }),
335
+ });
336
+
337
+ indexBuilder.addCollator({
338
+ - defaultRefreshIntervalSeconds: 600,
339
+ + schedule,
340
+ factory: DefaultTechDocsCollatorFactory.fromConfig(env.config, {
341
+ discovery: env.discovery,
342
+ tokenManager: env.tokenManager,
343
+ }),
344
+ });
345
+
346
+ const { scheduler } = await indexBuilder.build();
347
+ - setTimeout(() => scheduler.start(), 3000);
348
+ + scheduler.start();
349
+ /* ... */
350
+ ```
351
+
352
+ NOTE: For scenarios where the `lunr` search engine is used in a multi-node configuration, a non-distributed `TaskRunner` like the following should be implemented to ensure consistency across nodes (alternatively, you can configure
353
+ the search plugin to use a non-distributed DB such as [SQLite](https://backstage.io/docs/tutorials/configuring-plugin-databases#postgresql-and-sqlite-3)):
354
+
355
+ ```diff
356
+ +import { TaskInvocationDefinition, TaskRunner } from '@backstage/backend-tasks';
357
+
358
+ /* ... */
359
+
360
+ + const schedule: TaskRunner = {
361
+ + run: async (task: TaskInvocationDefinition) => {
362
+ + const startRefresh = async () => {
363
+ + while (!task.signal?.aborted) {
364
+ + try {
365
+ + await task.fn(task.signal);
366
+ + } catch {
367
+ + // ignore intentionally
368
+ + }
369
+ +
370
+ + await new Promise(resolve => setTimeout(resolve, 600 * 1000));
371
+ + }
372
+ + };
373
+ + startRefresh();
374
+ + },
375
+ + };
376
+
377
+ indexBuilder.addCollator({
378
+ - defaultRefreshIntervalSeconds: 600,
379
+ + schedule,
380
+ factory: DefaultCatalogCollatorFactory.fromConfig(env.config, {
381
+ discovery: env.discovery,
382
+ tokenManager: env.tokenManager,
383
+ }),
384
+ });
385
+
386
+ /* ... */
387
+ ```
388
+
389
+ - 230ad0826f: Bump to using `@types/node` v16
390
+ - 1882dbda2b: Accept `PermissionEvaluator` instead of the deprecated `PermissionAuthorizer`.
391
+
392
+ Apply the following to `packages/backend/src/types.ts`:
393
+
394
+ ```diff
395
+ - import { PermissionAuthorizer } from '@backstage/plugin-permission-common';
396
+ + import { PermissionEvaluator } from '@backstage/plugin-permission-common';
397
+
398
+ export type PluginEnvironment = {
399
+ ...
400
+ discovery: PluginEndpointDiscovery;
401
+ tokenManager: TokenManager;
402
+ scheduler: PluginTaskScheduler;
403
+ - permissions: PermissionAuthorizer;
404
+ + permissions: PermissionEvaluator;
405
+ };
406
+ ```
407
+
408
+ ## 0.4.25-next.1
409
+
410
+ ### Patch Changes
411
+
412
+ - e80cca164d: Tweaked `.eslintrc.js` files in the template to avoid having them apply during development. This change does not affect create apps.
413
+
414
+ ## 0.4.25-next.0
415
+
416
+ ### Patch Changes
417
+
418
+ - 1691c6c5c2: Made `User` and `Group` entity kinds not permitted by the default
419
+ `catalog.rules` config.
420
+
421
+ The effect of this is that after creating a new Backstage repository, its
422
+ catalog no longer permits regular users to register `User` or `Group` entities
423
+ using the Backstage interface. Additionally, if you have config locations that
424
+ result in `User` or `Group` entities, you need to add those kinds to its own
425
+ specific rules:
426
+
427
+ ```yaml
428
+ catalog:
429
+ locations:
430
+ # This applies for example to url type locations
431
+ - type: url
432
+ target: https://example.com/org.yaml
433
+ rules:
434
+ - allow: [User, Group]
435
+ # But also note that this applies to ALL org location types!
436
+ - type: github-org
437
+ target: https://github.com/my-org-name
438
+ rules:
439
+ - allow: [User, Group]
440
+ ```
441
+
442
+ This rule change does NOT affect entity providers, only things that are emitted
443
+ by entity processors.
444
+
445
+ We recommend that this change is applied to your own Backstage repository, since
446
+ it makes it impossible for regular end users to affect your org data through
447
+ e.g. YAML files. To do so, remove the two kinds from the default rules in your config:
448
+
449
+ ```diff
450
+ catalog:
451
+ rules:
452
+ - - allow: [Component, System, API, Group, User, Resource, Location]
453
+ + - allow: [Component, System, API, Resource, Location]
454
+ ```
455
+
456
+ And for any location that in any way results in org data being ingested, add the corresponding rule to it:
457
+
458
+ ```diff
459
+ catalog:
460
+ locations:
461
+ - type: github-org
462
+ target: https://github.com/my-org-name
463
+ + rules:
464
+ + - allow: [User, Group]
465
+ ```
466
+
467
+ - 0e911394d2: Remove the `knex` package that is installed in the `packages/backend` as it's provided by the `@backstage/*` packages for you automatically. You can make the following change in your `packages/backend/package.json` if you wish to apply this change.
468
+
469
+ ```diff
470
+ "lint": "backstage-cli package lint",
471
+ "test": "backstage-cli package test",
472
+ "clean": "backstage-cli package clean",
473
+ - "migrate:create": "knex migrate:make -x ts"
474
+ ```
475
+
476
+ ```diff
477
+ "express": "^4.17.1",
478
+ "express-promise-router": "^4.1.0",
479
+ - "knex": "^0.21.6",
480
+ "pg": "^8.3.0",
481
+ ```
482
+
483
+ - c07d9f9e1c: Add helpful README.md files in the original `packages` and `plugins` folders
8
484
 
9
485
  ## 0.4.24
10
486
 
package/dist/index.cjs.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var program = require('commander');
3
+ var commander = require('commander');
4
4
  var chalk = require('chalk');
5
5
  var inquirer = require('inquirer');
6
6
  var path = require('path');
@@ -15,7 +15,6 @@ var util = require('util');
15
15
 
16
16
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
17
17
 
18
- var program__default = /*#__PURE__*/_interopDefaultLegacy(program);
19
18
  var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
20
19
  var inquirer__default = /*#__PURE__*/_interopDefaultLegacy(inquirer);
21
20
  var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
@@ -31,10 +30,13 @@ class CustomError extends Error {
31
30
  }
32
31
  class ExitCodeError extends CustomError {
33
32
  constructor(code, command) {
33
+ var __super = (...args) => {
34
+ super(...args);
35
+ };
34
36
  if (command) {
35
- super(`Command '${command}' exited with code ${code}`);
37
+ __super(`Command '${command}' exited with code ${code}`);
36
38
  } else {
37
- super(`Child exited with code ${code}`);
39
+ __super(`Child exited with code ${code}`);
38
40
  }
39
41
  this.code = code;
40
42
  }
@@ -55,132 +57,135 @@ ${chalk__default["default"].red(`${error}`)}
55
57
  }
56
58
  }
57
59
 
58
- var version$I = "0.4.25";
60
+ var version$J = "0.4.27-next.0";
59
61
 
60
- var version$H = "1.0.3";
62
+ var version$I = "1.2.0-next.0";
61
63
 
62
- var version$G = "1.0.0";
64
+ var version$H = "1.0.1";
63
65
 
64
- var version$F = "0.13.1";
66
+ var version$G = "0.13.3-next.0";
65
67
 
66
- var version$E = "0.2.1";
68
+ var version$F = "0.3.1-next.0";
67
69
 
68
- var version$D = "1.0.0";
70
+ var version$E = "1.0.1";
69
71
 
70
- var version$C = "1.0.0";
72
+ var version$D = "1.0.1";
71
73
 
72
- var version$B = "0.16.0";
74
+ var version$C = "0.17.1-next.0";
73
75
 
74
- var version$A = "1.0.0";
76
+ var version$B = "1.0.0";
75
77
 
76
- var version$z = "1.0.0";
78
+ var version$A = "1.0.1";
77
79
 
78
- var version$y = "0.9.2";
80
+ var version$z = "0.9.3";
81
+
82
+ var version$y = "1.0.1";
79
83
 
80
84
  var version$x = "1.0.0";
81
85
 
82
- var version$w = "1.0.0";
86
+ var version$w = "1.1.0-next.0";
83
87
 
84
- var version$v = "1.0.0";
88
+ var version$v = "1.0.2-next.0";
85
89
 
86
- var version$u = "1.0.0";
90
+ var version$u = "0.2.15";
87
91
 
88
- var version$t = "0.2.15";
92
+ var version$t = "0.8.5-next.0";
89
93
 
90
- var version$s = "0.8.3";
94
+ var version$s = "0.3.32-next.0";
91
95
 
92
- var version$r = "0.3.30";
96
+ var version$r = "0.13.1-next.0";
93
97
 
94
- var version$q = "0.12.3";
98
+ var version$q = "1.2.0-next.0";
95
99
 
96
- var version$p = "1.0.0";
100
+ var version$p = "1.0.1";
97
101
 
98
- var version$o = "1.0.0";
102
+ var version$o = "1.1.0-next.0";
99
103
 
100
- var version$n = "1.0.0";
104
+ var version$n = "1.1.2-next.0";
101
105
 
102
- var version$m = "1.0.0";
106
+ var version$m = "0.2.17-next.0";
103
107
 
104
- var version$l = "0.2.15";
108
+ var version$l = "0.8.8-next.0";
105
109
 
106
- var version$k = "0.8.6";
110
+ var version$k = "0.3.5-next.0";
107
111
 
108
- var version$j = "0.3.3";
112
+ var version$j = "0.3.36-next.0";
109
113
 
110
- var version$i = "0.3.34";
114
+ var version$i = "0.5.5-next.0";
111
115
 
112
- var version$h = "0.5.3";
116
+ var version$h = "0.3.5-next.0";
113
117
 
114
- var version$g = "0.3.3";
118
+ var version$g = "0.5.5-next.0";
115
119
 
116
- var version$f = "0.5.3";
120
+ var version$f = "0.6.0";
117
121
 
118
- var version$e = "0.5.3";
122
+ var version$e = "0.4.0";
119
123
 
120
- var version$d = "0.3.4";
124
+ var version$d = "0.6.1-next.0";
121
125
 
122
- var version$c = "0.5.5";
126
+ var version$c = "0.2.26-next.0";
123
127
 
124
- var version$b = "0.2.24";
128
+ var version$b = "0.1.29-next.0";
125
129
 
126
- var version$a = "0.1.27";
130
+ var version$a = "1.2.0-next.0";
127
131
 
128
- var version$9 = "1.0.1";
132
+ var version$9 = "1.2.0-next.0";
129
133
 
130
- var version$8 = "1.0.0";
134
+ var version$8 = "0.8.1-next.0";
131
135
 
132
- var version$7 = "0.7.4";
136
+ var version$7 = "0.1.1-next.0";
133
137
 
134
- var version$6 = "0.4.8";
138
+ var version$6 = "0.5.2-next.0";
135
139
 
136
- var version$5 = "0.3.1";
140
+ var version$5 = "0.3.3-next.0";
137
141
 
138
- var version$4 = "0.5.2";
142
+ var version$4 = "0.6.1-next.0";
139
143
 
140
- var version$3 = "0.5.10";
144
+ var version$3 = "0.5.11";
141
145
 
142
- var version$2 = "1.0.1";
146
+ var version$2 = "1.1.1-next.0";
143
147
 
144
- var version$1 = "1.0.0";
148
+ var version$1 = "1.1.1-next.0";
145
149
 
146
- var version = "0.4.2";
150
+ var version = "0.4.3";
147
151
 
148
152
  const packageVersions = {
149
- root: version$H,
150
- "@backstage/app-defaults": version$G,
151
- "@backstage/backend-common": version$F,
152
- "@backstage/backend-tasks": version$E,
153
- "@backstage/catalog-client": version$D,
154
- "@backstage/catalog-model": version$C,
155
- "@backstage/cli": version$B,
156
- "@backstage/config": version$A,
157
- "@backstage/core-app-api": version$z,
158
- "@backstage/core-components": version$y,
159
- "@backstage/core-plugin-api": version$x,
160
- "@backstage/errors": version$w,
161
- "@backstage/integration-react": version$v,
162
- "@backstage/plugin-api-docs": version$s,
163
- "@backstage/plugin-app-backend": version$r,
164
- "@backstage/plugin-auth-backend": version$q,
165
- "@backstage/plugin-catalog": version$p,
166
- "@backstage/plugin-catalog-common": version$o,
167
- "@backstage/plugin-catalog-react": version$n,
168
- "@backstage/plugin-catalog-backend": version$m,
169
- "@backstage/plugin-catalog-graph": version$l,
170
- "@backstage/plugin-catalog-import": version$k,
171
- "@backstage/plugin-circleci": version$j,
172
- "@backstage/plugin-explore": version$i,
173
- "@backstage/plugin-github-actions": version$h,
174
- "@backstage/plugin-lighthouse": version$g,
175
- "@backstage/plugin-org": version$f,
176
- "@backstage/plugin-permission-common": version$e,
177
- "@backstage/plugin-permission-node": version$c,
178
- "@backstage/plugin-permission-react": version$d,
179
- "@backstage/plugin-proxy-backend": version$b,
180
- "@backstage/plugin-rollbar-backend": version$a,
181
- "@backstage/plugin-scaffolder": version$9,
182
- "@backstage/plugin-scaffolder-backend": version$8,
183
- "@backstage/plugin-search": version$7,
153
+ root: version$I,
154
+ "@backstage/app-defaults": version$H,
155
+ "@backstage/backend-common": version$G,
156
+ "@backstage/backend-tasks": version$F,
157
+ "@backstage/catalog-client": version$E,
158
+ "@backstage/catalog-model": version$D,
159
+ "@backstage/cli": version$C,
160
+ "@backstage/config": version$B,
161
+ "@backstage/core-app-api": version$A,
162
+ "@backstage/core-components": version$z,
163
+ "@backstage/core-plugin-api": version$y,
164
+ "@backstage/errors": version$x,
165
+ "@backstage/integration-react": version$w,
166
+ "@backstage/plugin-api-docs": version$t,
167
+ "@backstage/plugin-app-backend": version$s,
168
+ "@backstage/plugin-auth-backend": version$r,
169
+ "@backstage/plugin-catalog": version$q,
170
+ "@backstage/plugin-catalog-common": version$p,
171
+ "@backstage/plugin-catalog-react": version$o,
172
+ "@backstage/plugin-catalog-backend": version$n,
173
+ "@backstage/plugin-catalog-graph": version$m,
174
+ "@backstage/plugin-catalog-import": version$l,
175
+ "@backstage/plugin-circleci": version$k,
176
+ "@backstage/plugin-explore": version$j,
177
+ "@backstage/plugin-github-actions": version$i,
178
+ "@backstage/plugin-lighthouse": version$h,
179
+ "@backstage/plugin-org": version$g,
180
+ "@backstage/plugin-permission-common": version$f,
181
+ "@backstage/plugin-permission-node": version$d,
182
+ "@backstage/plugin-permission-react": version$e,
183
+ "@backstage/plugin-proxy-backend": version$c,
184
+ "@backstage/plugin-rollbar-backend": version$b,
185
+ "@backstage/plugin-scaffolder": version$a,
186
+ "@backstage/plugin-scaffolder-backend": version$9,
187
+ "@backstage/plugin-search": version$8,
188
+ "@backstage/plugin-search-react": version$7,
184
189
  "@backstage/plugin-search-backend": version$6,
185
190
  "@backstage/plugin-search-backend-module-pg": version$5,
186
191
  "@backstage/plugin-search-backend-node": version$4,
@@ -188,8 +193,8 @@ const packageVersions = {
188
193
  "@backstage/plugin-techdocs": version$2,
189
194
  "@backstage/plugin-techdocs-backend": version$1,
190
195
  "@backstage/plugin-user-settings": version,
191
- "@backstage/test-utils": version$u,
192
- "@backstage/theme": version$t
196
+ "@backstage/test-utils": version$v,
197
+ "@backstage/theme": version$u
193
198
  };
194
199
 
195
200
  const TASK_NAME_MAX_LENGTH = 14;
@@ -318,7 +323,7 @@ async function moveAppTask(tempDir, destination, id) {
318
323
  });
319
324
  }
320
325
 
321
- var createApp = async (cmd) => {
326
+ var createApp = async (opts) => {
322
327
  const paths = cliCommon.findPaths(__dirname);
323
328
  const answers = await inquirer__default["default"].prompt([
324
329
  {
@@ -345,15 +350,15 @@ var createApp = async (cmd) => {
345
350
  answers.dbTypeSqlite = answers.dbType === "SQLite";
346
351
  const templateDir = paths.resolveOwn("templates/default-app");
347
352
  const tempDir = path.resolve(os__default["default"].tmpdir(), answers.name);
348
- const appDir = cmd.path ? path.resolve(paths.targetDir, cmd.path) : path.resolve(paths.targetDir, answers.name);
353
+ const appDir = opts.path ? path.resolve(paths.targetDir, opts.path) : path.resolve(paths.targetDir, answers.name);
349
354
  Task.log();
350
355
  Task.log("Creating the app...");
351
356
  try {
352
- if (cmd.path) {
357
+ if (opts.path) {
353
358
  Task.section("Checking that supplied path exists");
354
359
  await checkPathExistsTask(appDir);
355
360
  Task.section("Preparing files");
356
- await templatingTask(templateDir, cmd.path, answers);
361
+ await templatingTask(templateDir, opts.path, answers);
357
362
  } else {
358
363
  Task.section("Checking if the directory is available");
359
364
  await checkAppExistsTask(paths.targetDir, answers.name);
@@ -364,7 +369,7 @@ var createApp = async (cmd) => {
364
369
  Task.section("Moving to final location");
365
370
  await moveAppTask(tempDir, appDir, answers.name);
366
371
  }
367
- if (!cmd.skipInstall) {
372
+ if (!opts.skipInstall) {
368
373
  Task.section("Building the app");
369
374
  await buildAppTask(appDir);
370
375
  }
@@ -386,8 +391,8 @@ var createApp = async (cmd) => {
386
391
  };
387
392
 
388
393
  const main = (argv) => {
389
- program__default["default"].name("backstage-create-app").version(version$I).description("Creates a new app in a new directory or specified path").option("--path [directory]", "Location to store the app defaulting to a new folder with the app name").option("--skip-install", "Skip the install and builds steps after creating the app").action((cmd) => createApp(cmd));
390
- program__default["default"].parse(argv);
394
+ commander.program.name("backstage-create-app").version(version$J).description("Creates a new app in a new directory or specified path").option("--path [directory]", "Location to store the app defaulting to a new folder with the app name").option("--skip-install", "Skip the install and builds steps after creating the app").action((cmd) => createApp(cmd));
395
+ commander.program.parse(argv);
391
396
  };
392
397
  process.on("unhandledRejection", (rejection) => {
393
398
  if (rejection instanceof Error) {
@@ -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 monorepo/no-relative-import */\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\nThe list, and the accompanying peerDependencies entries, are here to ensure correct versioning\nand bumping of this package. Without this list the version would not be bumped unless we\nmanually trigger a release.\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 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 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 pluginCatalogGraph } from '../../../../plugins/catalog-graph/package.json';\nimport { version as pluginCatalogImport } from '../../../../plugins/catalog-import/package.json';\nimport { version as pluginCircleci } from '../../../../plugins/circleci/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 pluginSearchBackend } from '../../../../plugins/search-backend/package.json';\nimport { version as pluginSearchBackendModulePg } from '../../../../plugins/search-backend-module-pg/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 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/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-catalog': pluginCatalog,\n '@backstage/plugin-catalog-common': pluginCatalogCommon,\n '@backstage/plugin-catalog-react': pluginCatalogReact,\n '@backstage/plugin-catalog-backend': pluginCatalogBackend,\n '@backstage/plugin-catalog-graph': pluginCatalogGraph,\n '@backstage/plugin-catalog-import': pluginCatalogImport,\n '@backstage/plugin-circleci': pluginCircleci,\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-backend': pluginSearchBackend,\n '@backstage/plugin-search-backend-module-pg': pluginSearchBackendModulePg,\n '@backstage/plugin-search-backend-node': pluginSearchBackendNode,\n '@backstage/plugin-tech-radar': pluginTechRadar,\n '@backstage/plugin-techdocs': pluginTechdocs,\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 { exec as execCb } from 'child_process';\nimport { packageVersions } from './versions';\nimport { promisify } from 'util';\n\nconst TASK_NAME_MAX_LENGTH = 14;\nconst exec = promisify(execCb);\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 * Create a folder to store templated files\n *\n * @param tempDir - target temporary directory\n * @throws if `fs.mkdir` fails\n */\nexport async function createTemporaryAppFolderTask(tempDir: string) {\n await Task.forItem('creating', 'temporary directory', async () => {\n try {\n await fs.mkdir(tempDir);\n } catch (error) {\n throw new Error(`Failed to create temporary app directory, ${error}`);\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 const runCmd = async (cmd: string) => {\n await Task.forItem('executing', cmd, async () => {\n process.chdir(appDir);\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 await runCmd('yarn install');\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 * 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 { Command } from 'commander';\nimport inquirer, { Answers } from 'inquirer';\nimport { resolve as resolvePath } from 'path';\nimport { findPaths } from '@backstage/cli-common';\nimport os from 'os';\nimport {\n Task,\n buildAppTask,\n checkAppExistsTask,\n checkPathExistsTask,\n createTemporaryAppFolderTask,\n moveAppTask,\n templatingTask,\n} from './lib/tasks';\n\nexport default async (cmd: Command): Promise<void> => {\n /* eslint-disable-next-line no-restricted-syntax */\n const paths = findPaths(__dirname);\n\n const answers: Answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\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 },\n {\n type: 'list',\n name: 'dbType',\n message: chalk.blue('Select database for the backend [required]'),\n choices: ['SQLite', 'PostgreSQL'],\n },\n ]);\n answers.dbTypePG = answers.dbType === 'PostgreSQL';\n answers.dbTypeSqlite = answers.dbType === 'SQLite';\n\n const templateDir = paths.resolveOwn('templates/default-app');\n const tempDir = resolvePath(os.tmpdir(), answers.name);\n\n // Use `--path` argument as application directory when specified, otherwise\n // create a directory using `answers.name`\n const appDir = cmd.path\n ? resolvePath(paths.targetDir, cmd.path)\n : resolvePath(paths.targetDir, answers.name);\n\n Task.log();\n Task.log('Creating the app...');\n\n try {\n if (cmd.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, cmd.path, answers);\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 await createTemporaryAppFolderTask(tempDir);\n\n Task.section('Preparing files');\n await templatingTask(templateDir, tempDir, answers);\n\n Task.section('Moving to final location');\n await moveAppTask(tempDir, appDir, answers.name);\n }\n\n if (!cmd.skipInstall) {\n Task.section('Building the app');\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 Task.section('All set! Now you might want to');\n Task.log(` Run the app: ${chalk.cyan(`cd ${answers.name} && yarn dev`)}`);\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';\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 .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","errors","integrationReact","pluginApiDocs","pluginAppBackend","pluginAuthBackend","pluginCatalog","pluginCatalogCommon","pluginCatalogReact","pluginCatalogBackend","pluginCatalogGraph","pluginCatalogImport","pluginCircleci","pluginExplore","pluginGithubActions","pluginLighthouse","pluginOrg","pluginPermissionCommon","pluginPermissionNode","pluginPermissionReact","pluginProxyBackend","pluginRollbarBackend","pluginScaffolder","pluginScaffolderBackend","pluginSearch","pluginSearchBackend","pluginSearchBackendModulePg","pluginSearchBackendNode","pluginTechRadar","pluginTechdocs","pluginTechdocsBackend","pluginUserSettings","testUtils","theme","promisify","execCb","ora","recursive","resolvePath","relativePath","fs","dirname","basename","handlebars","findPaths","inquirer","os","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 monorepo/no-relative-import */\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\nThe list, and the accompanying peerDependencies entries, are here to ensure correct versioning\nand bumping of this package. Without this list the version would not be bumped unless we\nmanually trigger a release.\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 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 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 pluginCatalogGraph } from '../../../../plugins/catalog-graph/package.json';\nimport { version as pluginCatalogImport } from '../../../../plugins/catalog-import/package.json';\nimport { version as pluginCircleci } from '../../../../plugins/circleci/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 pluginSearchBackendModulePg } from '../../../../plugins/search-backend-module-pg/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 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/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-catalog': pluginCatalog,\n '@backstage/plugin-catalog-common': pluginCatalogCommon,\n '@backstage/plugin-catalog-react': pluginCatalogReact,\n '@backstage/plugin-catalog-backend': pluginCatalogBackend,\n '@backstage/plugin-catalog-graph': pluginCatalogGraph,\n '@backstage/plugin-catalog-import': pluginCatalogImport,\n '@backstage/plugin-circleci': pluginCircleci,\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-pg': pluginSearchBackendModulePg,\n '@backstage/plugin-search-backend-node': pluginSearchBackendNode,\n '@backstage/plugin-tech-radar': pluginTechRadar,\n '@backstage/plugin-techdocs': pluginTechdocs,\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 { exec as execCb } from 'child_process';\nimport { packageVersions } from './versions';\nimport { promisify } from 'util';\n\nconst TASK_NAME_MAX_LENGTH = 14;\nconst exec = promisify(execCb);\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 * Create a folder to store templated files\n *\n * @param tempDir - target temporary directory\n * @throws if `fs.mkdir` fails\n */\nexport async function createTemporaryAppFolderTask(tempDir: string) {\n await Task.forItem('creating', 'temporary directory', async () => {\n try {\n await fs.mkdir(tempDir);\n } catch (error) {\n throw new Error(`Failed to create temporary app directory, ${error}`);\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 const runCmd = async (cmd: string) => {\n await Task.forItem('executing', cmd, async () => {\n process.chdir(appDir);\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 await runCmd('yarn install');\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 * 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 {\n Task,\n buildAppTask,\n checkAppExistsTask,\n checkPathExistsTask,\n createTemporaryAppFolderTask,\n moveAppTask,\n templatingTask,\n} from './lib/tasks';\n\nexport default async (opts: OptionValues): Promise<void> => {\n /* eslint-disable-next-line no-restricted-syntax */\n const paths = findPaths(__dirname);\n\n const answers: Answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'name',\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 },\n {\n type: 'list',\n name: 'dbType',\n message: chalk.blue('Select database for the backend [required]'),\n choices: ['SQLite', 'PostgreSQL'],\n },\n ]);\n answers.dbTypePG = answers.dbType === 'PostgreSQL';\n answers.dbTypeSqlite = answers.dbType === 'SQLite';\n\n const templateDir = paths.resolveOwn('templates/default-app');\n const tempDir = resolvePath(os.tmpdir(), answers.name);\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 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, answers);\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 await createTemporaryAppFolderTask(tempDir);\n\n Task.section('Preparing files');\n await templatingTask(templateDir, tempDir, answers);\n\n Task.section('Moving to final location');\n await moveAppTask(tempDir, appDir, answers.name);\n }\n\n if (!opts.skipInstall) {\n Task.section('Building the app');\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 Task.section('All set! Now you might want to');\n Task.log(` Run the app: ${chalk.cyan(`cd ${answers.name} && yarn dev`)}`);\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';\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 .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","errors","integrationReact","pluginApiDocs","pluginAppBackend","pluginAuthBackend","pluginCatalog","pluginCatalogCommon","pluginCatalogReact","pluginCatalogBackend","pluginCatalogGraph","pluginCatalogImport","pluginCircleci","pluginExplore","pluginGithubActions","pluginLighthouse","pluginOrg","pluginPermissionCommon","pluginPermissionNode","pluginPermissionReact","pluginProxyBackend","pluginRollbarBackend","pluginScaffolder","pluginScaffolderBackend","pluginSearch","pluginSearchReact","pluginSearchBackend","pluginSearchBackendModulePg","pluginSearchBackendNode","pluginTechRadar","pluginTechdocs","pluginTechdocsBackend","pluginUserSettings","testUtils","theme","promisify","execCb","ora","recursive","resolvePath","relativePath","fs","dirname","basename","handlebars","findPaths","inquirer","os","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.4.25",
4
+ "version": "0.4.27-next.0",
5
5
  "private": false,
6
6
  "publishConfig": {
7
7
  "access": "public"
@@ -35,8 +35,8 @@
35
35
  "dependencies": {
36
36
  "@backstage/cli-common": "^0.1.8",
37
37
  "chalk": "^4.0.0",
38
- "commander": "^6.1.0",
39
- "fs-extra": "10.0.1",
38
+ "commander": "^9.1.0",
39
+ "fs-extra": "10.1.0",
40
40
  "handlebars": "^4.7.3",
41
41
  "inquirer": "^8.2.0",
42
42
  "ora": "^5.3.0",
@@ -45,7 +45,7 @@
45
45
  "devDependencies": {
46
46
  "@types/fs-extra": "^9.0.1",
47
47
  "@types/inquirer": "^8.1.3",
48
- "@types/node": "^14.14.32",
48
+ "@types/node": "^16.11.26",
49
49
  "@types/recursive-readdir": "^2.2.0",
50
50
  "mock-fs": "^5.1.1",
51
51
  "ts-node": "^10.0.0"
@@ -60,5 +60,5 @@
60
60
  "dist",
61
61
  "templates"
62
62
  ],
63
- "gitHead": "4027e4e0d3e60ab59cbb806920c2a35f26124b1f"
63
+ "gitHead": "88ee375f5ee44b7a7917297785ddf88691fe3381"
64
64
  }
@@ -3,3 +3,4 @@ node_modules
3
3
  packages
4
4
  !packages/backend/dist
5
5
  plugins
6
+ *.local.yaml
@@ -1,8 +1,19 @@
1
1
  app:
2
- # Should be the same as backend.baseUrl when using the `app-backend` plugin
2
+ # Should be the same as backend.baseUrl when using the `app-backend` plugin.
3
3
  baseUrl: http://localhost:7007
4
4
 
5
5
  backend:
6
+ # Note that the baseUrl should be the URL that the browser and other clients
7
+ # should use when communicating with the backend, i.e. it needs to be
8
+ # reachable not just from within the backend host, but from all of your
9
+ # callers. When its value is "http://localhost:7007", it's strictly private
10
+ # and can't be reached by others.
6
11
  baseUrl: http://localhost:7007
7
12
  listen:
8
13
  port: 7007
14
+ # The following host directive binds to all IPv4 interfaces when its value
15
+ # is "0.0.0.0". This is the most permissive setting. The right value depends
16
+ # on your specific deployment. If you remove the host line entirely, the
17
+ # backend will bind on the interface that corresponds to the backend.baseUrl
18
+ # hostname.
19
+ host: 0.0.0.0
@@ -15,6 +15,9 @@ backend:
15
15
  baseUrl: http://localhost:7007
16
16
  listen:
17
17
  port: 7007
18
+ # Uncomment the following host directive to bind to all IPv4 interfaces and
19
+ # not just the baseUrl hostname.
20
+ # host: 0.0.0.0
18
21
  csp:
19
22
  connect-src: ["'self'", 'http:', 'https:']
20
23
  # Content-Security-Policy directives follow the Helmet format: https://helmetjs.github.io/#reference
@@ -51,6 +54,8 @@ backend:
51
54
  integrations:
52
55
  github:
53
56
  - host: github.com
57
+ # This is a Personal Access Token or PAT from GitHub. You can find out how to generate this token, and more information
58
+ # about setting up the GitHub integration here: https://backstage.io/docs/getting-started/configuration#setting-up-a-github-integration
54
59
  token: ${GITHUB_TOKEN}
55
60
  ### Example for how to add your GitHub Enterprise instance using the API:
56
61
  # - host: ghe.example.net
@@ -85,7 +90,7 @@ catalog:
85
90
  entityFilename: catalog-info.yaml
86
91
  pullRequestBranchName: backstage-integration
87
92
  rules:
88
- - allow: [Component, System, API, Group, User, Resource, Location]
93
+ - allow: [Component, System, API, Resource, Location]
89
94
  locations:
90
95
  # Backstage example components
91
96
  - type: url
@@ -0,0 +1,9 @@
1
+ # The Packages Folder
2
+
3
+ This is where your own applications and centrally managed libraries live, each
4
+ in a separate folder of its own.
5
+
6
+ From the start there's an `app` folder (for the frontend) and a `backend` folder
7
+ (for the Node backend), but you can also add more modules in here that house
8
+ your core additions and adaptations, such as themes, common React component
9
+ libraries, utilities, and similar.
@@ -25,6 +25,7 @@
25
25
  "@backstage/plugin-permission-react": "^{{version '@backstage/plugin-permission-react'}}",
26
26
  "@backstage/plugin-scaffolder": "^{{version '@backstage/plugin-scaffolder'}}",
27
27
  "@backstage/plugin-search": "^{{version '@backstage/plugin-search'}}",
28
+ "@backstage/plugin-search-react": "^{{version '@backstage/plugin-search-react'}}",
28
29
  "@backstage/plugin-tech-radar": "^{{version '@backstage/plugin-tech-radar'}}",
29
30
  "@backstage/plugin-techdocs": "^{{version '@backstage/plugin-techdocs'}}",
30
31
  "@backstage/plugin-user-settings": "^{{version '@backstage/plugin-user-settings'}}",
@@ -14,8 +14,8 @@ import {
14
14
  SearchResult,
15
15
  SearchType,
16
16
  DefaultResultListItem,
17
- useSearch,
18
17
  } from '@backstage/plugin-search';
18
+ import { useSearch } from '@backstage/plugin-search-react';
19
19
  import {
20
20
  CatalogIcon,
21
21
  Content,
@@ -13,22 +13,22 @@ FROM node:16-bullseye-slim
13
13
 
14
14
  WORKDIR /app
15
15
 
16
+ # install sqlite3 dependencies, you can skip this if you don't use sqlite3 in the image
17
+ RUN apt-get update && \
18
+ apt-get install -y --no-install-recommends libsqlite3-dev python3 build-essential && \
19
+ rm -rf /var/lib/apt/lists/* && \
20
+ yarn config set python /usr/bin/python3
21
+
16
22
  # Copy repo skeleton first, to avoid unnecessary docker cache invalidation.
17
23
  # The skeleton contains the package.json of each package in the monorepo,
18
24
  # and along with yarn.lock and the root package.json, that's enough to run yarn install.
19
25
  COPY yarn.lock package.json packages/backend/dist/skeleton.tar.gz ./
20
26
  RUN tar xzf skeleton.tar.gz && rm skeleton.tar.gz
21
27
 
22
- # install sqlite3 dependencies
23
- RUN apt-get update && \
24
- apt-get install -y libsqlite3-dev python3 cmake g++ && \
25
- rm -rf /var/lib/apt/lists/* && \
26
- yarn config set python /usr/bin/python3
27
-
28
28
  RUN yarn install --frozen-lockfile --production --network-timeout 300000 && rm -rf "$(yarn cache dir)"
29
29
 
30
30
  # Then copy the rest of the backend bundle, along with any other files we might want.
31
- COPY packages/backend/dist/bundle.tar.gz app-config.yaml ./
31
+ COPY packages/backend/dist/bundle.tar.gz app-config*.yaml ./
32
32
  RUN tar xzf bundle.tar.gz && rm bundle.tar.gz
33
33
 
34
- CMD ["node", "packages/backend", "--config", "app-config.yaml"]
34
+ CMD ["node", "packages/backend", "--config", "app-config.yaml", "--config", "app-config.production.yaml"]
@@ -13,8 +13,7 @@
13
13
  "lint": "backstage-cli package lint",
14
14
  "test": "backstage-cli package test",
15
15
  "clean": "backstage-cli package clean",
16
- "build-image": "docker build ../.. -f Dockerfile --tag backstage",
17
- "migrate:create": "knex migrate:make -x ts"
16
+ "build-image": "docker build ../.. -f Dockerfile --tag backstage"
18
17
  },
19
18
  "dependencies": {
20
19
  "app": "link:../app",
@@ -36,12 +35,10 @@
36
35
  {{/if}}
37
36
  "@backstage/plugin-search-backend-node": "^{{version '@backstage/plugin-search-backend-node'}}",
38
37
  "@backstage/plugin-techdocs-backend": "^{{version '@backstage/plugin-techdocs-backend'}}",
39
- "@gitbeaker/node": "^34.6.0",
40
- "@octokit/rest": "^18.5.3",
41
38
  "dockerode": "^3.3.1",
42
39
  "express": "^4.17.1",
43
40
  "express-promise-router": "^4.1.0",
44
- "knex": "^0.21.6",
41
+ "luxon": "^2.0.2",
45
42
  {{#if dbTypePG}}
46
43
  "pg": "^8.3.0",
47
44
  {{/if}}
@@ -54,7 +51,8 @@
54
51
  "@backstage/cli": "^{{version '@backstage/cli'}}",
55
52
  "@types/dockerode": "^3.3.0",
56
53
  "@types/express": "^4.17.6",
57
- "@types/express-serve-static-core": "^4.17.5"
54
+ "@types/express-serve-static-core": "^4.17.5",
55
+ "@types/luxon": "^2.0.4"
58
56
  },
59
57
  "files": [
60
58
  "dist"
@@ -11,6 +11,7 @@ import { PluginEnvironment } from '../types';
11
11
  import { DefaultCatalogCollatorFactory } from '@backstage/plugin-catalog-backend';
12
12
  import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-techdocs-backend';
13
13
  import { Router } from 'express';
14
+ import { Duration } from 'luxon';
14
15
 
15
16
  export default async function createPlugin(
16
17
  env: PluginEnvironment,
@@ -31,10 +32,18 @@ export default async function createPlugin(
31
32
  searchEngine,
32
33
  });
33
34
 
35
+ const schedule = env.scheduler.createScheduledTaskRunner({
36
+ frequency: Duration.fromObject({ minutes: 10 }),
37
+ timeout: Duration.fromObject({ minutes: 15 }),
38
+ // A 3 second delay gives the backend server a chance to initialize before
39
+ // any collators are executed, which may attempt requests against the API.
40
+ initialDelay: Duration.fromObject({ seconds: 3 }),
41
+ });
42
+
34
43
  // Collators are responsible for gathering documents known to plugins. This
35
44
  // collator gathers entities from the software catalog.
36
45
  indexBuilder.addCollator({
37
- defaultRefreshIntervalSeconds: 600,
46
+ schedule,
38
47
  factory: DefaultCatalogCollatorFactory.fromConfig(env.config, {
39
48
  discovery: env.discovery,
40
49
  tokenManager: env.tokenManager,
@@ -43,7 +52,7 @@ export default async function createPlugin(
43
52
 
44
53
  // collator gathers entities from techdocs.
45
54
  indexBuilder.addCollator({
46
- defaultRefreshIntervalSeconds: 600,
55
+ schedule,
47
56
  factory: DefaultTechDocsCollatorFactory.fromConfig(env.config, {
48
57
  discovery: env.discovery,
49
58
  logger: env.logger,
@@ -54,10 +63,8 @@ export default async function createPlugin(
54
63
  // The scheduler controls when documents are gathered from collators and sent
55
64
  // to the search engine for indexing.
56
65
  const { scheduler } = await indexBuilder.build();
66
+ scheduler.start();
57
67
 
58
- // A 3 second delay gives the backend server a chance to initialize before
59
- // any collators are executed, which may attempt requests against the API.
60
- setTimeout(() => scheduler.start(), 3000);
61
68
  useHotCleanup(module, () => scheduler.stop());
62
69
 
63
70
  return await createRouter({
@@ -8,7 +8,7 @@ import {
8
8
  UrlReader,
9
9
  } from '@backstage/backend-common';
10
10
  import { PluginTaskScheduler } from '@backstage/backend-tasks';
11
- import { PermissionAuthorizer } from '@backstage/plugin-permission-common';
11
+ import { PermissionEvaluator } from '@backstage/plugin-permission-common';
12
12
 
13
13
  export type PluginEnvironment = {
14
14
  logger: Logger;
@@ -19,5 +19,5 @@ export type PluginEnvironment = {
19
19
  discovery: PluginEndpointDiscovery;
20
20
  tokenManager: TokenManager;
21
21
  scheduler: PluginTaskScheduler;
22
- permissions: PermissionAuthorizer;
22
+ permissions: PermissionEvaluator;
23
23
  };
@@ -0,0 +1,9 @@
1
+ # The Plugins Folder
2
+
3
+ This is where your own plugins and their associated modules live, each in a
4
+ separate folder of its own.
5
+
6
+ If you want to create a new plugin here, go to your project root directory, run
7
+ the command `yarn backstage-cli create`, and follow the on-screen instructions.
8
+
9
+ You can also check out existing plugins on [the plugin marketplace](https://backstage.io/plugins)!