@backstage/create-app 0.4.22 → 0.4.24
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 +163 -0
- package/dist/index.cjs.js +91 -89
- package/dist/index.cjs.js.map +1 -1
- package/package.json +3 -3
- package/templates/default-app/app-config.yaml.hbs +1 -5
- package/templates/default-app/backstage.json.hbs +3 -0
- package/templates/default-app/package.json.hbs +3 -3
- package/templates/default-app/packages/app/.eslintrc.js +1 -3
- package/templates/default-app/packages/app/package.json.hbs +9 -6
- package/templates/default-app/packages/backend/.eslintrc.js +1 -3
- package/templates/default-app/packages/backend/package.json.hbs +12 -6
- package/templates/default-app/packages/backend/src/plugins/app.ts +6 -8
- package/templates/default-app/packages/backend/src/plugins/auth.ts +8 -12
- package/templates/default-app/packages/backend/src/plugins/proxy.ts +8 -6
- package/templates/default-app/packages/backend/src/plugins/scaffolder.ts +10 -17
- package/templates/default-app/packages/backend/src/plugins/{search.ts → search.ts.hbs} +31 -19
- package/templates/default-app/packages/backend/src/plugins/techdocs.ts +15 -19
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,168 @@
|
|
|
1
1
|
# @backstage/create-app
|
|
2
2
|
|
|
3
|
+
## 0.4.24
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 89c7e47967: Minor README update
|
|
8
|
+
- a422d7ce5e: chore(deps): bump `@testing-library/react` from 11.2.6 to 12.1.3
|
|
9
|
+
- efc73db10c: The main repo has switched from `@vscode/sqlite3` to `better-sqlite3` as its preferred SQLite installation. This decision was triggered by a number of issues with the former that arose because it needs build infrastructure in place and functional in order to be installed. The main drawback of this is that the new package uses the database client ID `better-sqlite3` instead of the plain `sqlite3`.
|
|
10
|
+
|
|
11
|
+
If you want to perform the same switch in your own repository,
|
|
12
|
+
|
|
13
|
+
- Replace all of your `package.json` dependencies on `@vscode/sqlite3` with the latest version of `better-sqlite3` instead
|
|
14
|
+
|
|
15
|
+
```diff
|
|
16
|
+
"dependencies": {
|
|
17
|
+
- "@vscode/sqlite3": "^5.0.7",
|
|
18
|
+
+ "better-sqlite3": "^7.5.0",
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- In your app-config and tests, wherever you supply `client: 'sqlite3'`, instead supply `client: 'better-sqlite3`
|
|
22
|
+
|
|
23
|
+
```diff
|
|
24
|
+
backend:
|
|
25
|
+
database:
|
|
26
|
+
- client: sqlite3
|
|
27
|
+
+ client: better-sqlite3
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 0.4.23
|
|
31
|
+
|
|
32
|
+
### Patch Changes
|
|
33
|
+
|
|
34
|
+
- f9c7bdd899: Builtin support for cookiecutter based templates has been removed from `@backstage/plugin-scaffolder-backend`. Due to this, the `containerRunner` argument to its `createRouter` has also been removed.
|
|
35
|
+
|
|
36
|
+
If you do not use cookiecutter templates and are fine with removing support from it in your own installation, update your `packages/backend/src/plugins/scaffolder.ts` file as follows:
|
|
37
|
+
|
|
38
|
+
```diff
|
|
39
|
+
-import { DockerContainerRunner } from '@backstage/backend-common';
|
|
40
|
+
import { CatalogClient } from '@backstage/catalog-client';
|
|
41
|
+
import { createRouter } from '@backstage/plugin-scaffolder-backend';
|
|
42
|
+
-import Docker from 'dockerode';
|
|
43
|
+
import { Router } from 'express';
|
|
44
|
+
import type { PluginEnvironment } from '../types';
|
|
45
|
+
|
|
46
|
+
export default async function createPlugin({
|
|
47
|
+
reader,
|
|
48
|
+
discovery,
|
|
49
|
+
}: PluginEnvironment): Promise<Router> {
|
|
50
|
+
- const dockerClient = new Docker();
|
|
51
|
+
- const containerRunner = new DockerContainerRunner({ dockerClient });
|
|
52
|
+
-
|
|
53
|
+
const catalogClient = new CatalogClient({ discoveryApi: discovery });
|
|
54
|
+
-
|
|
55
|
+
return await createRouter({
|
|
56
|
+
- containerRunner,
|
|
57
|
+
logger,
|
|
58
|
+
config,
|
|
59
|
+
// ...
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
If you want to retain cookiecutter support, please use the `@backstage/plugin-scaffolder-backend-module-cookiecutter` package explicitly (see [its README](https://github.com/backstage/backstage/tree/master/plugins/scaffolder-backend-module-cookiecutter) for installation instructions).
|
|
63
|
+
|
|
64
|
+
- 8a57b6595b: Removed the `cookiecutter-golang` template from the default `create-app` install as we no longer provide `cookiecutter` action out of the box.
|
|
65
|
+
|
|
66
|
+
You can remove the template by removing the following lines from your `app-config.yaml` under `catalog.locations`:
|
|
67
|
+
|
|
68
|
+
```diff
|
|
69
|
+
- - type: url
|
|
70
|
+
- target: https://github.com/spotify/cookiecutter-golang/blob/master/template.yaml
|
|
71
|
+
- rules:
|
|
72
|
+
- - allow: [Template]
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
- e0a69ba49f: build(deps): bump `fs-extra` from 9.1.0 to 10.0.1
|
|
76
|
+
- 1201383b60: Updated the template to write the Backstage release version to `backstage.json`, rather than the version of `@backstage/create-app`. This change is applied automatically when running `backstage-cli versions:bump` in the latest version of the Backstage CLI.
|
|
77
|
+
- c543fe3ff2: Postgres-based search is now installed when PG is chosen as the desired database for Backstage.
|
|
78
|
+
|
|
79
|
+
There is no need to make this change in an existing Backstage backend. See [supported search engines](https://backstage.io/docs/features/search/search-engines) for details about production-ready search engines.
|
|
80
|
+
|
|
81
|
+
- 55150919ed: - **BREAKING**: Support for `backstage.io/v1beta2` Software Templates has been removed. Please migrate your legacy templates to the new `scaffolder.backstage.io/v1beta3` `apiVersion` by following the [migration guide](https://backstage.io/docs/features/software-templates/migrating-from-v1beta2-to-v1beta3)
|
|
82
|
+
- bde30664c4: Updated template to use package roles. To apply this change to an existing app, check out the [migration guide](https://backstage.io/docs/tutorials/package-role-migration).
|
|
83
|
+
|
|
84
|
+
Specifically the following scripts in the root `package.json` have also been updated:
|
|
85
|
+
|
|
86
|
+
```diff
|
|
87
|
+
- "build": "lerna run build",
|
|
88
|
+
+ "build": "backstage-cli repo build --all",
|
|
89
|
+
|
|
90
|
+
...
|
|
91
|
+
|
|
92
|
+
- "lint": "lerna run lint --since origin/master --",
|
|
93
|
+
- "lint:all": "lerna run lint --",
|
|
94
|
+
+ "lint": "backstage-cli repo lint --since origin/master",
|
|
95
|
+
+ "lint:all": "backstage-cli repo lint",
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## 0.4.23-next.0
|
|
99
|
+
|
|
100
|
+
### Patch Changes
|
|
101
|
+
|
|
102
|
+
- f9c7bdd899: Builtin support for cookiecutter based templates has been removed from `@backstage/plugin-scaffolder-backend`. Due to this, the `containerRunner` argument to its `createRouter` has also been removed.
|
|
103
|
+
|
|
104
|
+
If you do not use cookiecutter templates and are fine with removing support from it in your own installation, update your `packages/backend/src/plugins/scaffolder.ts` file as follows:
|
|
105
|
+
|
|
106
|
+
```diff
|
|
107
|
+
-import { DockerContainerRunner } from '@backstage/backend-common';
|
|
108
|
+
import { CatalogClient } from '@backstage/catalog-client';
|
|
109
|
+
import { createRouter } from '@backstage/plugin-scaffolder-backend';
|
|
110
|
+
-import Docker from 'dockerode';
|
|
111
|
+
import { Router } from 'express';
|
|
112
|
+
import type { PluginEnvironment } from '../types';
|
|
113
|
+
|
|
114
|
+
export default async function createPlugin({
|
|
115
|
+
reader,
|
|
116
|
+
discovery,
|
|
117
|
+
}: PluginEnvironment): Promise<Router> {
|
|
118
|
+
- const dockerClient = new Docker();
|
|
119
|
+
- const containerRunner = new DockerContainerRunner({ dockerClient });
|
|
120
|
+
-
|
|
121
|
+
const catalogClient = new CatalogClient({ discoveryApi: discovery });
|
|
122
|
+
-
|
|
123
|
+
return await createRouter({
|
|
124
|
+
- containerRunner,
|
|
125
|
+
logger,
|
|
126
|
+
config,
|
|
127
|
+
// ...
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
If you want to retain cookiecutter support, please use the `@backstage/plugin-scaffolder-backend-module-cookiecutter` package explicitly (see [its README](https://github.com/backstage/backstage/tree/master/plugins/scaffolder-backend-module-cookiecutter) for installation instructions).
|
|
131
|
+
|
|
132
|
+
- 8a57b6595b: Removed the `cookiecutter-golang` template from the default `create-app` install as we no longer provide `cookiecutter` action out of the box.
|
|
133
|
+
|
|
134
|
+
You can remove the template by removing the following lines from your `app-config.yaml` under `catalog.locations`:
|
|
135
|
+
|
|
136
|
+
```diff
|
|
137
|
+
- - type: url
|
|
138
|
+
- target: https://github.com/spotify/cookiecutter-golang/blob/master/template.yaml
|
|
139
|
+
- rules:
|
|
140
|
+
- - allow: [Template]
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
- e0a69ba49f: build(deps): bump `fs-extra` from 9.1.0 to 10.0.1
|
|
144
|
+
- 1201383b60: Updated the template to write the Backstage release version to `backstage.json`, rather than the version of `@backstage/create-app`. This change is applied automatically when running `backstage-cli versions:bump` in the latest version of the Backstage CLI.
|
|
145
|
+
- c543fe3ff2: Postgres-based search is now installed when PG is chosen as the desired database for Backstage.
|
|
146
|
+
|
|
147
|
+
There is no need to make this change in an existing Backstage backend. See [supported search engines](https://backstage.io/docs/features/search/search-engines) for details about production-ready search engines.
|
|
148
|
+
|
|
149
|
+
- 55150919ed: - **BREAKING**: Support for `backstage.io/v1beta2` Software Templates has been removed. Please migrate your legacy templates to the new `scaffolder.backstage.io/v1beta3` `apiVersion` by following the [migration guide](https://backstage.io/docs/features/software-templates/migrating-from-v1beta2-to-v1beta3)
|
|
150
|
+
- bde30664c4: Updated template to use package roles. To apply this change to an existing app, check out the [migration guide](https://backstage.io/docs/tutorials/package-role-migration).
|
|
151
|
+
|
|
152
|
+
Specifically the following scripts in the root `package.json` have also been updated:
|
|
153
|
+
|
|
154
|
+
```diff
|
|
155
|
+
- "build": "lerna run build",
|
|
156
|
+
+ "build": "backstage-cli repo build --all",
|
|
157
|
+
|
|
158
|
+
...
|
|
159
|
+
|
|
160
|
+
- "lint": "lerna run lint --since origin/master --",
|
|
161
|
+
- "lint:all": "lerna run lint --",
|
|
162
|
+
+ "lint": "backstage-cli repo lint --since origin/master",
|
|
163
|
+
+ "lint:all": "backstage-cli repo lint",
|
|
164
|
+
```
|
|
165
|
+
|
|
3
166
|
## 0.4.22
|
|
4
167
|
|
|
5
168
|
### Patch Changes
|
package/dist/index.cjs.js
CHANGED
|
@@ -55,135 +55,141 @@ ${chalk__default["default"].red(`${error}`)}
|
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
var version$
|
|
58
|
+
var version$I = "0.4.24";
|
|
59
59
|
|
|
60
|
-
var version$
|
|
60
|
+
var version$H = "1.0.0";
|
|
61
61
|
|
|
62
|
-
var version$
|
|
62
|
+
var version$G = "1.0.0";
|
|
63
63
|
|
|
64
|
-
var version$
|
|
64
|
+
var version$F = "0.13.1";
|
|
65
65
|
|
|
66
|
-
var version$
|
|
66
|
+
var version$E = "0.2.1";
|
|
67
67
|
|
|
68
|
-
var version$
|
|
68
|
+
var version$D = "1.0.0";
|
|
69
69
|
|
|
70
|
-
var version$
|
|
70
|
+
var version$C = "1.0.0";
|
|
71
71
|
|
|
72
|
-
var version$
|
|
72
|
+
var version$B = "0.16.0";
|
|
73
73
|
|
|
74
|
-
var version$
|
|
74
|
+
var version$A = "1.0.0";
|
|
75
75
|
|
|
76
|
-
var version$
|
|
76
|
+
var version$z = "1.0.0";
|
|
77
77
|
|
|
78
|
-
var version$
|
|
78
|
+
var version$y = "0.9.2";
|
|
79
79
|
|
|
80
|
-
var version$
|
|
80
|
+
var version$x = "1.0.0";
|
|
81
81
|
|
|
82
|
-
var version$
|
|
82
|
+
var version$w = "1.0.0";
|
|
83
83
|
|
|
84
|
-
var version$
|
|
84
|
+
var version$v = "1.0.0";
|
|
85
85
|
|
|
86
|
-
var version$
|
|
86
|
+
var version$u = "1.0.0";
|
|
87
87
|
|
|
88
|
-
var version$
|
|
88
|
+
var version$t = "0.2.15";
|
|
89
89
|
|
|
90
|
-
var version$
|
|
90
|
+
var version$s = "0.8.3";
|
|
91
91
|
|
|
92
|
-
var version$
|
|
92
|
+
var version$r = "0.3.30";
|
|
93
93
|
|
|
94
|
-
var version$
|
|
94
|
+
var version$q = "0.12.2";
|
|
95
95
|
|
|
96
|
-
var version$
|
|
96
|
+
var version$p = "1.0.0";
|
|
97
97
|
|
|
98
|
-
var version$
|
|
98
|
+
var version$o = "1.0.0";
|
|
99
99
|
|
|
100
|
-
var version$
|
|
100
|
+
var version$n = "1.0.0";
|
|
101
101
|
|
|
102
|
-
var version$
|
|
102
|
+
var version$m = "1.0.0";
|
|
103
103
|
|
|
104
|
-
var version$
|
|
104
|
+
var version$l = "0.2.15";
|
|
105
105
|
|
|
106
|
-
var version$
|
|
106
|
+
var version$k = "0.8.6";
|
|
107
107
|
|
|
108
|
-
var version$
|
|
108
|
+
var version$j = "0.3.3";
|
|
109
109
|
|
|
110
|
-
var version$
|
|
110
|
+
var version$i = "0.3.34";
|
|
111
111
|
|
|
112
|
-
var version$
|
|
112
|
+
var version$h = "0.5.3";
|
|
113
113
|
|
|
114
|
-
var version$
|
|
114
|
+
var version$g = "0.3.3";
|
|
115
115
|
|
|
116
|
-
var version$
|
|
116
|
+
var version$f = "0.5.3";
|
|
117
117
|
|
|
118
|
-
var version$
|
|
118
|
+
var version$e = "0.5.3";
|
|
119
119
|
|
|
120
|
-
var version$
|
|
120
|
+
var version$d = "0.3.4";
|
|
121
121
|
|
|
122
|
-
var version$
|
|
122
|
+
var version$c = "0.5.5";
|
|
123
123
|
|
|
124
|
-
var version$
|
|
124
|
+
var version$b = "0.2.24";
|
|
125
125
|
|
|
126
|
-
var version$
|
|
126
|
+
var version$a = "0.1.27";
|
|
127
127
|
|
|
128
|
-
var version$
|
|
128
|
+
var version$9 = "1.0.0";
|
|
129
129
|
|
|
130
|
-
var version$
|
|
130
|
+
var version$8 = "1.0.0";
|
|
131
131
|
|
|
132
|
-
var version$
|
|
132
|
+
var version$7 = "0.7.4";
|
|
133
133
|
|
|
134
|
-
var version$
|
|
134
|
+
var version$6 = "0.4.8";
|
|
135
135
|
|
|
136
|
-
var version$
|
|
136
|
+
var version$5 = "0.3.1";
|
|
137
137
|
|
|
138
|
-
var version$
|
|
138
|
+
var version$4 = "0.5.2";
|
|
139
139
|
|
|
140
|
-
var version$
|
|
140
|
+
var version$3 = "0.5.10";
|
|
141
141
|
|
|
142
|
-
var version = "0.
|
|
142
|
+
var version$2 = "1.0.0";
|
|
143
|
+
|
|
144
|
+
var version$1 = "1.0.0";
|
|
145
|
+
|
|
146
|
+
var version = "0.4.2";
|
|
143
147
|
|
|
144
148
|
const packageVersions = {
|
|
145
|
-
|
|
146
|
-
"@backstage/
|
|
147
|
-
"@backstage/backend-
|
|
148
|
-
"@backstage/
|
|
149
|
-
"@backstage/catalog-
|
|
150
|
-
"@backstage/
|
|
151
|
-
"@backstage/
|
|
152
|
-
"@backstage/
|
|
153
|
-
"@backstage/core-
|
|
154
|
-
"@backstage/core-
|
|
155
|
-
"@backstage/
|
|
156
|
-
"@backstage/
|
|
157
|
-
"@backstage/
|
|
158
|
-
"@backstage/plugin-
|
|
159
|
-
"@backstage/plugin-
|
|
160
|
-
"@backstage/plugin-
|
|
161
|
-
"@backstage/plugin-catalog
|
|
162
|
-
"@backstage/plugin-catalog-
|
|
163
|
-
"@backstage/plugin-catalog-
|
|
164
|
-
"@backstage/plugin-catalog-
|
|
165
|
-
"@backstage/plugin-catalog-
|
|
166
|
-
"@backstage/plugin-
|
|
167
|
-
"@backstage/plugin-
|
|
168
|
-
"@backstage/plugin-
|
|
169
|
-
"@backstage/plugin-
|
|
170
|
-
"@backstage/plugin-
|
|
171
|
-
"@backstage/plugin-
|
|
172
|
-
"@backstage/plugin-permission-
|
|
173
|
-
"@backstage/plugin-permission-
|
|
174
|
-
"@backstage/plugin-
|
|
175
|
-
"@backstage/plugin-
|
|
176
|
-
"@backstage/plugin-
|
|
177
|
-
"@backstage/plugin-scaffolder
|
|
178
|
-
"@backstage/plugin-
|
|
179
|
-
"@backstage/plugin-search
|
|
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,
|
|
184
|
+
"@backstage/plugin-search-backend": version$6,
|
|
185
|
+
"@backstage/plugin-search-backend-module-pg": version$5,
|
|
180
186
|
"@backstage/plugin-search-backend-node": version$4,
|
|
181
187
|
"@backstage/plugin-tech-radar": version$3,
|
|
182
188
|
"@backstage/plugin-techdocs": version$2,
|
|
183
189
|
"@backstage/plugin-techdocs-backend": version$1,
|
|
184
190
|
"@backstage/plugin-user-settings": version,
|
|
185
|
-
"@backstage/test-utils": version$
|
|
186
|
-
"@backstage/theme": version$
|
|
191
|
+
"@backstage/test-utils": version$u,
|
|
192
|
+
"@backstage/theme": version$t
|
|
187
193
|
};
|
|
188
194
|
|
|
189
195
|
const TASK_NAME_MAX_LENGTH = 14;
|
|
@@ -224,7 +230,7 @@ ${chalk__default["default"].red(message)}
|
|
|
224
230
|
}
|
|
225
231
|
}
|
|
226
232
|
}
|
|
227
|
-
async function templatingTask(templateDir, destinationDir, context
|
|
233
|
+
async function templatingTask(templateDir, destinationDir, context) {
|
|
228
234
|
const files = await recursive__default["default"](templateDir).catch((error) => {
|
|
229
235
|
throw new Error(`Failed to read template directory: ${error.message}`);
|
|
230
236
|
});
|
|
@@ -259,10 +265,6 @@ async function templatingTask(templateDir, destinationDir, context, version) {
|
|
|
259
265
|
});
|
|
260
266
|
}
|
|
261
267
|
}
|
|
262
|
-
await Task.forItem("creating", cliCommon.BACKSTAGE_JSON, () => fs__default["default"].writeFile(path.join(destinationDir, cliCommon.BACKSTAGE_JSON), `{
|
|
263
|
-
"version": ${JSON.stringify(version)}
|
|
264
|
-
}
|
|
265
|
-
`));
|
|
266
268
|
}
|
|
267
269
|
async function checkAppExistsTask(rootDir, name) {
|
|
268
270
|
await Task.forItem("checking", name, async () => {
|
|
@@ -316,7 +318,7 @@ async function moveAppTask(tempDir, destination, id) {
|
|
|
316
318
|
});
|
|
317
319
|
}
|
|
318
320
|
|
|
319
|
-
var createApp = async (cmd
|
|
321
|
+
var createApp = async (cmd) => {
|
|
320
322
|
const paths = cliCommon.findPaths(__dirname);
|
|
321
323
|
const answers = await inquirer__default["default"].prompt([
|
|
322
324
|
{
|
|
@@ -351,14 +353,14 @@ var createApp = async (cmd, version) => {
|
|
|
351
353
|
Task.section("Checking that supplied path exists");
|
|
352
354
|
await checkPathExistsTask(appDir);
|
|
353
355
|
Task.section("Preparing files");
|
|
354
|
-
await templatingTask(templateDir, cmd.path, answers
|
|
356
|
+
await templatingTask(templateDir, cmd.path, answers);
|
|
355
357
|
} else {
|
|
356
358
|
Task.section("Checking if the directory is available");
|
|
357
359
|
await checkAppExistsTask(paths.targetDir, answers.name);
|
|
358
360
|
Task.section("Creating a temporary app directory");
|
|
359
361
|
await createTemporaryAppFolderTask(tempDir);
|
|
360
362
|
Task.section("Preparing files");
|
|
361
|
-
await templatingTask(templateDir, tempDir, answers
|
|
363
|
+
await templatingTask(templateDir, tempDir, answers);
|
|
362
364
|
Task.section("Moving to final location");
|
|
363
365
|
await moveAppTask(tempDir, appDir, answers.name);
|
|
364
366
|
}
|
|
@@ -384,7 +386,7 @@ var createApp = async (cmd, version) => {
|
|
|
384
386
|
};
|
|
385
387
|
|
|
386
388
|
const main = (argv) => {
|
|
387
|
-
program__default["default"].name("backstage-create-app").version(version$
|
|
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));
|
|
388
390
|
program__default["default"].parse(argv);
|
|
389
391
|
};
|
|
390
392
|
process.on("unhandledRejection", (rejection) => {
|
package/dist/index.cjs.js.map
CHANGED
|
@@ -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 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 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 '@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-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 { BACKSTAGE_JSON } from '@backstage/cli-common';\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 join,\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 version: string,\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 await Task.forItem('creating', BACKSTAGE_JSON, () =>\n fs.writeFile(\n join(destinationDir, BACKSTAGE_JSON),\n `{\\n \"version\": ${JSON.stringify(version)}\\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, version: string): 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, version);\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, version);\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, version));\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","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","pluginSearchBackendNode","pluginTechRadar","pluginTechdocs","pluginTechdocsBackend","pluginUserSettings","testUtils","theme","promisify","execCb","ora","recursive","resolvePath","relativePath","fs","dirname","basename","handlebars","BACKSTAGE_JSON","join","findPaths","inquirer","os","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 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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"}
|
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.
|
|
4
|
+
"version": "0.4.24",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"@backstage/cli-common": "^0.1.8",
|
|
37
37
|
"chalk": "^4.0.0",
|
|
38
38
|
"commander": "^6.1.0",
|
|
39
|
-
"fs-extra": "
|
|
39
|
+
"fs-extra": "10.0.1",
|
|
40
40
|
"handlebars": "^4.7.3",
|
|
41
41
|
"inquirer": "^8.2.0",
|
|
42
42
|
"ora": "^5.3.0",
|
|
@@ -60,5 +60,5 @@
|
|
|
60
60
|
"dist",
|
|
61
61
|
"templates"
|
|
62
62
|
],
|
|
63
|
-
"gitHead": "
|
|
63
|
+
"gitHead": "e9496f746b31600dbfac7fa76987479e66426257"
|
|
64
64
|
}
|
|
@@ -25,7 +25,7 @@ backend:
|
|
|
25
25
|
credentials: true
|
|
26
26
|
{{#if dbTypeSqlite}}
|
|
27
27
|
database:
|
|
28
|
-
client: sqlite3
|
|
28
|
+
client: better-sqlite3
|
|
29
29
|
connection: ':memory:'
|
|
30
30
|
{{/if}}
|
|
31
31
|
{{#if dbTypePG}}
|
|
@@ -116,10 +116,6 @@ catalog:
|
|
|
116
116
|
target: https://github.com/backstage/software-templates/blob/main/scaffolder-templates/springboot-grpc-template/template.yaml
|
|
117
117
|
rules:
|
|
118
118
|
- allow: [Template]
|
|
119
|
-
- type: url
|
|
120
|
-
target: https://github.com/spotify/cookiecutter-golang/blob/master/template.yaml
|
|
121
|
-
rules:
|
|
122
|
-
- allow: [Template]
|
|
123
119
|
- type: url
|
|
124
120
|
target: https://github.com/backstage/software-templates/blob/main/scaffolder-templates/docs-template/template.yaml
|
|
125
121
|
rules:
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"dev": "concurrently \"yarn start\" \"yarn start-backend\"",
|
|
10
10
|
"start": "yarn workspace app start",
|
|
11
11
|
"start-backend": "yarn workspace backend start",
|
|
12
|
-
"build": "
|
|
12
|
+
"build": "backstage-cli repo build --all",
|
|
13
13
|
"build-image": "yarn workspace backend build-image",
|
|
14
14
|
"tsc": "tsc",
|
|
15
15
|
"tsc:full": "tsc --skipLibCheck false --incremental false",
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
"diff": "lerna run diff --",
|
|
18
18
|
"test": "backstage-cli test",
|
|
19
19
|
"test:all": "lerna run test -- --coverage",
|
|
20
|
-
"lint": "
|
|
21
|
-
"lint:all": "
|
|
20
|
+
"lint": "backstage-cli repo lint --since origin/master",
|
|
21
|
+
"lint:all": "backstage-cli repo lint",
|
|
22
22
|
"prettier:check": "prettier --check .",
|
|
23
23
|
"create-plugin": "backstage-cli create-plugin --scope internal",
|
|
24
24
|
"remove-plugin": "backstage-cli remove-plugin"
|
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
"version": "0.0.0",
|
|
4
4
|
"private": true,
|
|
5
5
|
"bundled": true,
|
|
6
|
+
"backstage": {
|
|
7
|
+
"role": "frontend"
|
|
8
|
+
},
|
|
6
9
|
"dependencies": {
|
|
7
10
|
"@backstage/app-defaults": "^{{version '@backstage/app-defaults'}}",
|
|
8
11
|
"@backstage/catalog-model": "^{{version '@backstage/catalog-model'}}",
|
|
@@ -38,7 +41,7 @@
|
|
|
38
41
|
"devDependencies": {
|
|
39
42
|
"@backstage/test-utils": "^{{version '@backstage/test-utils'}}",
|
|
40
43
|
"@testing-library/jest-dom": "^5.10.1",
|
|
41
|
-
"@testing-library/react": "^
|
|
44
|
+
"@testing-library/react": "^12.1.3",
|
|
42
45
|
"@testing-library/user-event": "^12.0.7",
|
|
43
46
|
"@types/jest": "^26.0.7",
|
|
44
47
|
"@types/node": "^14.14.32",
|
|
@@ -49,13 +52,13 @@
|
|
|
49
52
|
"start-server-and-test": "^1.10.11"
|
|
50
53
|
},
|
|
51
54
|
"scripts": {
|
|
52
|
-
"start": "backstage-cli
|
|
53
|
-
"build": "backstage-cli
|
|
54
|
-
"clean": "backstage-cli clean",
|
|
55
|
-
"test": "backstage-cli test",
|
|
55
|
+
"start": "backstage-cli package start",
|
|
56
|
+
"build": "backstage-cli package build",
|
|
57
|
+
"clean": "backstage-cli package clean",
|
|
58
|
+
"test": "backstage-cli package test",
|
|
59
|
+
"lint": "backstage-cli package lint",
|
|
56
60
|
"test:e2e": "cross-env PORT=3001 start-server-and-test start http://localhost:3001 cy:dev",
|
|
57
61
|
"test:e2e:ci": "cross-env PORT=3001 start-server-and-test start http://localhost:3001 cy:run",
|
|
58
|
-
"lint": "backstage-cli lint",
|
|
59
62
|
"cy:dev": "cypress open",
|
|
60
63
|
"cy:run": "cypress run"
|
|
61
64
|
},
|
|
@@ -4,13 +4,16 @@
|
|
|
4
4
|
"main": "dist/index.cjs.js",
|
|
5
5
|
"types": "src/index.ts",
|
|
6
6
|
"private": true,
|
|
7
|
+
"backstage": {
|
|
8
|
+
"role": "backend"
|
|
9
|
+
},
|
|
7
10
|
"scripts": {
|
|
8
|
-
"
|
|
11
|
+
"start": "backstage-cli package start",
|
|
12
|
+
"build": "backstage-cli package build",
|
|
13
|
+
"lint": "backstage-cli package lint",
|
|
14
|
+
"test": "backstage-cli package test",
|
|
15
|
+
"clean": "backstage-cli package clean",
|
|
9
16
|
"build-image": "docker build ../.. -f Dockerfile --tag backstage",
|
|
10
|
-
"start": "backstage-cli backend:dev",
|
|
11
|
-
"lint": "backstage-cli lint",
|
|
12
|
-
"test": "backstage-cli test",
|
|
13
|
-
"clean": "backstage-cli clean",
|
|
14
17
|
"migrate:create": "knex migrate:make -x ts"
|
|
15
18
|
},
|
|
16
19
|
"dependencies": {
|
|
@@ -28,6 +31,9 @@
|
|
|
28
31
|
"@backstage/plugin-proxy-backend": "^{{version '@backstage/plugin-proxy-backend'}}",
|
|
29
32
|
"@backstage/plugin-scaffolder-backend": "^{{version '@backstage/plugin-scaffolder-backend'}}",
|
|
30
33
|
"@backstage/plugin-search-backend": "^{{version '@backstage/plugin-search-backend'}}",
|
|
34
|
+
{{#if dbTypePG}}
|
|
35
|
+
"@backstage/plugin-search-backend-module-pg": "^{{version '@backstage/plugin-search-backend-module-pg'}}",
|
|
36
|
+
{{/if}}
|
|
31
37
|
"@backstage/plugin-search-backend-node": "^{{version '@backstage/plugin-search-backend-node'}}",
|
|
32
38
|
"@backstage/plugin-techdocs-backend": "^{{version '@backstage/plugin-techdocs-backend'}}",
|
|
33
39
|
"@gitbeaker/node": "^34.6.0",
|
|
@@ -40,7 +46,7 @@
|
|
|
40
46
|
"pg": "^8.3.0",
|
|
41
47
|
{{/if}}
|
|
42
48
|
{{#if dbTypeSqlite}}
|
|
43
|
-
"
|
|
49
|
+
"better-sqlite3": "^7.5.0",
|
|
44
50
|
{{/if}}
|
|
45
51
|
"winston": "^3.2.1"
|
|
46
52
|
},
|
|
@@ -2,15 +2,13 @@ import { createRouter } from '@backstage/plugin-app-backend';
|
|
|
2
2
|
import { Router } from 'express';
|
|
3
3
|
import { PluginEnvironment } from '../types';
|
|
4
4
|
|
|
5
|
-
export default async function createPlugin(
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
database,
|
|
9
|
-
}: PluginEnvironment): Promise<Router> {
|
|
5
|
+
export default async function createPlugin(
|
|
6
|
+
env: PluginEnvironment,
|
|
7
|
+
): Promise<Router> {
|
|
10
8
|
return await createRouter({
|
|
11
|
-
logger,
|
|
12
|
-
config,
|
|
13
|
-
database,
|
|
9
|
+
logger: env.logger,
|
|
10
|
+
config: env.config,
|
|
11
|
+
database: env.database,
|
|
14
12
|
appPackageName: 'app',
|
|
15
13
|
});
|
|
16
14
|
}
|
|
@@ -2,18 +2,14 @@ import { createRouter } from '@backstage/plugin-auth-backend';
|
|
|
2
2
|
import { Router } from 'express';
|
|
3
3
|
import { PluginEnvironment } from '../types';
|
|
4
4
|
|
|
5
|
-
export default async function createPlugin(
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
config,
|
|
9
|
-
discovery,
|
|
10
|
-
tokenManager,
|
|
11
|
-
}: PluginEnvironment): Promise<Router> {
|
|
5
|
+
export default async function createPlugin(
|
|
6
|
+
env: PluginEnvironment,
|
|
7
|
+
): Promise<Router> {
|
|
12
8
|
return await createRouter({
|
|
13
|
-
logger,
|
|
14
|
-
config,
|
|
15
|
-
database,
|
|
16
|
-
discovery,
|
|
17
|
-
tokenManager,
|
|
9
|
+
logger: env.logger,
|
|
10
|
+
config: env.config,
|
|
11
|
+
database: env.database,
|
|
12
|
+
discovery: env.discovery,
|
|
13
|
+
tokenManager: env.tokenManager,
|
|
18
14
|
});
|
|
19
15
|
}
|
|
@@ -2,10 +2,12 @@ import { createRouter } from '@backstage/plugin-proxy-backend';
|
|
|
2
2
|
import { Router } from 'express';
|
|
3
3
|
import { PluginEnvironment } from '../types';
|
|
4
4
|
|
|
5
|
-
export default async function createPlugin(
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
+
});
|
|
11
13
|
}
|
|
@@ -1,27 +1,20 @@
|
|
|
1
|
-
import { DockerContainerRunner } from '@backstage/backend-common';
|
|
2
1
|
import { CatalogClient } from '@backstage/catalog-client';
|
|
3
2
|
import { createRouter } from '@backstage/plugin-scaffolder-backend';
|
|
4
|
-
import Docker from 'dockerode';
|
|
5
3
|
import { Router } from 'express';
|
|
6
4
|
import type { PluginEnvironment } from '../types';
|
|
7
5
|
|
|
8
|
-
export default async function createPlugin(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}: PluginEnvironment): Promise<Router> {
|
|
15
|
-
const dockerClient = new Docker();
|
|
16
|
-
const containerRunner = new DockerContainerRunner({ dockerClient });
|
|
17
|
-
const catalogClient = new CatalogClient({ discoveryApi: discovery });
|
|
6
|
+
export default async function createPlugin(
|
|
7
|
+
env: PluginEnvironment,
|
|
8
|
+
): Promise<Router> {
|
|
9
|
+
const catalogClient = new CatalogClient({
|
|
10
|
+
discoveryApi: env.discovery,
|
|
11
|
+
});
|
|
18
12
|
|
|
19
13
|
return await createRouter({
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
14
|
+
logger: env.logger,
|
|
15
|
+
config: env.config,
|
|
16
|
+
database: env.database,
|
|
17
|
+
reader: env.reader,
|
|
24
18
|
catalogClient,
|
|
25
|
-
reader,
|
|
26
19
|
});
|
|
27
20
|
}
|
|
@@ -4,38 +4,50 @@ import {
|
|
|
4
4
|
IndexBuilder,
|
|
5
5
|
LunrSearchEngine,
|
|
6
6
|
} from '@backstage/plugin-search-backend-node';
|
|
7
|
+
{{#if dbTypePG}}
|
|
8
|
+
import { PgSearchEngine } from '@backstage/plugin-search-backend-module-pg';
|
|
9
|
+
{{/if}}
|
|
7
10
|
import { PluginEnvironment } from '../types';
|
|
8
11
|
import { DefaultCatalogCollatorFactory } from '@backstage/plugin-catalog-backend';
|
|
9
12
|
import { DefaultTechDocsCollatorFactory } from '@backstage/plugin-techdocs-backend';
|
|
13
|
+
import { Router } from 'express';
|
|
10
14
|
|
|
11
|
-
export default async function createPlugin(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
discovery,
|
|
15
|
-
config,
|
|
16
|
-
tokenManager,
|
|
17
|
-
}: PluginEnvironment) {
|
|
15
|
+
export default async function createPlugin(
|
|
16
|
+
env: PluginEnvironment,
|
|
17
|
+
): Promise<Router> {
|
|
18
18
|
// Initialize a connection to a search engine.
|
|
19
|
-
|
|
20
|
-
const
|
|
19
|
+
{{#if dbTypeSqlite}}
|
|
20
|
+
const searchEngine = new LunrSearchEngine({
|
|
21
|
+
logger: env.logger,
|
|
22
|
+
});
|
|
23
|
+
{{/if}}
|
|
24
|
+
{{#if dbTypePG}}
|
|
25
|
+
const searchEngine = (await PgSearchEngine.supported(env.database))
|
|
26
|
+
? await PgSearchEngine.from({ database: env.database })
|
|
27
|
+
: new LunrSearchEngine({ logger: env.logger });
|
|
28
|
+
{{/if}}
|
|
29
|
+
const indexBuilder = new IndexBuilder({
|
|
30
|
+
logger: env.logger,
|
|
31
|
+
searchEngine,
|
|
32
|
+
});
|
|
21
33
|
|
|
22
34
|
// Collators are responsible for gathering documents known to plugins. This
|
|
23
35
|
// collator gathers entities from the software catalog.
|
|
24
36
|
indexBuilder.addCollator({
|
|
25
37
|
defaultRefreshIntervalSeconds: 600,
|
|
26
|
-
factory: DefaultCatalogCollatorFactory.fromConfig(config, {
|
|
27
|
-
discovery,
|
|
28
|
-
tokenManager,
|
|
38
|
+
factory: DefaultCatalogCollatorFactory.fromConfig(env.config, {
|
|
39
|
+
discovery: env.discovery,
|
|
40
|
+
tokenManager: env.tokenManager,
|
|
29
41
|
}),
|
|
30
42
|
});
|
|
31
43
|
|
|
32
44
|
// collator gathers entities from techdocs.
|
|
33
45
|
indexBuilder.addCollator({
|
|
34
46
|
defaultRefreshIntervalSeconds: 600,
|
|
35
|
-
factory: DefaultTechDocsCollatorFactory.fromConfig(config, {
|
|
36
|
-
discovery,
|
|
37
|
-
logger,
|
|
38
|
-
tokenManager,
|
|
47
|
+
factory: DefaultTechDocsCollatorFactory.fromConfig(env.config, {
|
|
48
|
+
discovery: env.discovery,
|
|
49
|
+
logger: env.logger,
|
|
50
|
+
tokenManager: env.tokenManager,
|
|
39
51
|
}),
|
|
40
52
|
});
|
|
41
53
|
|
|
@@ -51,8 +63,8 @@ export default async function createPlugin({
|
|
|
51
63
|
return await createRouter({
|
|
52
64
|
engine: indexBuilder.getSearchEngine(),
|
|
53
65
|
types: indexBuilder.getDocumentTypes(),
|
|
54
|
-
permissions,
|
|
55
|
-
config,
|
|
56
|
-
logger,
|
|
66
|
+
permissions: env.permissions,
|
|
67
|
+
config: env.config,
|
|
68
|
+
logger: env.logger,
|
|
57
69
|
});
|
|
58
70
|
}
|
|
@@ -9,17 +9,13 @@ import Docker from 'dockerode';
|
|
|
9
9
|
import { Router } from 'express';
|
|
10
10
|
import { PluginEnvironment } from '../types';
|
|
11
11
|
|
|
12
|
-
export default async function createPlugin(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
discovery,
|
|
16
|
-
reader,
|
|
17
|
-
cache,
|
|
18
|
-
}: PluginEnvironment): Promise<Router> {
|
|
12
|
+
export default async function createPlugin(
|
|
13
|
+
env: PluginEnvironment,
|
|
14
|
+
): Promise<Router> {
|
|
19
15
|
// Preparers are responsible for fetching source files for documentation.
|
|
20
|
-
const preparers = await Preparers.fromConfig(config, {
|
|
21
|
-
logger,
|
|
22
|
-
reader,
|
|
16
|
+
const preparers = await Preparers.fromConfig(env.config, {
|
|
17
|
+
logger: env.logger,
|
|
18
|
+
reader: env.reader,
|
|
23
19
|
});
|
|
24
20
|
|
|
25
21
|
// Docker client (conditionally) used by the generators, based on techdocs.generators config.
|
|
@@ -27,17 +23,17 @@ export default async function createPlugin({
|
|
|
27
23
|
const containerRunner = new DockerContainerRunner({ dockerClient });
|
|
28
24
|
|
|
29
25
|
// Generators are used for generating documentation sites.
|
|
30
|
-
const generators = await Generators.fromConfig(config, {
|
|
31
|
-
logger,
|
|
26
|
+
const generators = await Generators.fromConfig(env.config, {
|
|
27
|
+
logger: env.logger,
|
|
32
28
|
containerRunner,
|
|
33
29
|
});
|
|
34
30
|
|
|
35
31
|
// Publisher is used for
|
|
36
32
|
// 1. Publishing generated files to storage
|
|
37
33
|
// 2. Fetching files from storage and passing them to TechDocs frontend.
|
|
38
|
-
const publisher = await Publisher.fromConfig(config, {
|
|
39
|
-
logger,
|
|
40
|
-
discovery,
|
|
34
|
+
const publisher = await Publisher.fromConfig(env.config, {
|
|
35
|
+
logger: env.logger,
|
|
36
|
+
discovery: env.discovery,
|
|
41
37
|
});
|
|
42
38
|
|
|
43
39
|
// checks if the publisher is working and logs the result
|
|
@@ -47,9 +43,9 @@ export default async function createPlugin({
|
|
|
47
43
|
preparers,
|
|
48
44
|
generators,
|
|
49
45
|
publisher,
|
|
50
|
-
logger,
|
|
51
|
-
config,
|
|
52
|
-
discovery,
|
|
53
|
-
cache,
|
|
46
|
+
logger: env.logger,
|
|
47
|
+
config: env.config,
|
|
48
|
+
discovery: env.discovery,
|
|
49
|
+
cache: env.cache,
|
|
54
50
|
});
|
|
55
51
|
}
|