@backstage/cli 0.8.2 → 0.9.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 +23 -0
- package/dist/cjs/{build-70dd213a.cjs.js → build-5907bd33.cjs.js} +3 -3
- package/dist/cjs/{build-bae5a019.cjs.js → build-73b8edfc.cjs.js} +3 -3
- package/dist/cjs/{build-b25b29ed.cjs.js → build-7571e64b.cjs.js} +3 -3
- package/dist/cjs/{build-1cbb9e7d.cjs.js → build-9e812f65.cjs.js} +5 -5
- package/dist/cjs/{buildImage-6b35526c.cjs.js → buildImage-7b597eb4.cjs.js} +4 -4
- package/dist/cjs/{buildWorkspace-424d4929.cjs.js → buildWorkspace-779679cc.cjs.js} +4 -4
- package/dist/cjs/{bump-bce7f9c2.cjs.js → bump-67695db2.cjs.js} +28 -6
- package/dist/cjs/{bundle-cc6870fb.cjs.js → bundle-561463d9.cjs.js} +5 -5
- package/dist/cjs/{clean-7a981ea7.cjs.js → clean-1156a89f.cjs.js} +2 -2
- package/dist/cjs/{config-24fce3c1.cjs.js → config-10d49423.cjs.js} +3 -3
- package/dist/cjs/create-b0f456f9.cjs.js +483 -0
- package/dist/cjs/{createPlugin-2c2b30fc.cjs.js → createPlugin-2c95815c.cjs.js} +8 -9
- package/dist/cjs/{dev-efe399b8.cjs.js → dev-a04f9251.cjs.js} +4 -4
- package/dist/cjs/{diff-e3661054.cjs.js → diff-d009aa81.cjs.js} +2 -2
- package/dist/cjs/{docs-ceb404a3.cjs.js → docs-d4bb9d0c.cjs.js} +3 -3
- package/dist/cjs/{index-6fee1c9a.cjs.js → index-25ca4442.cjs.js} +59 -55
- package/dist/cjs/{index-fbff7b78.cjs.js → index-351d0371.cjs.js} +2 -2
- package/dist/cjs/{index-26bec8ac.cjs.js → index-af2b13e0.cjs.js} +11 -8
- package/dist/cjs/{info-5e7c2679.cjs.js → info-05aaf204.cjs.js} +3 -3
- package/dist/cjs/{install-5920b5df.cjs.js → install-5d8e8fe5.cjs.js} +4 -4
- package/dist/cjs/{lint-306bb8fe.cjs.js → lint-85c90960.cjs.js} +3 -3
- package/dist/cjs/{lint-6175d471.cjs.js → lint-d1316de9.cjs.js} +3 -3
- package/dist/cjs/{pack-32228ad6.cjs.js → pack-58a2ab5d.cjs.js} +2 -2
- package/dist/cjs/{packager-1ad7272f.cjs.js → packager-b251454c.cjs.js} +2 -2
- package/dist/cjs/{packages-a5b6a3df.cjs.js → packages-4a2d7110.cjs.js} +3 -3
- package/dist/cjs/{paths-09202a46.cjs.js → paths-034708b3.cjs.js} +20 -5
- package/dist/cjs/{print-806676fe.cjs.js → print-5d03aebd.cjs.js} +3 -3
- package/dist/cjs/{removePlugin-f82ac16a.cjs.js → removePlugin-c64823bb.cjs.js} +5 -3
- package/dist/cjs/{run-59c4395e.cjs.js → run-924136d8.cjs.js} +2 -2
- package/dist/cjs/{schema-398d8593.cjs.js → schema-d59459da.cjs.js} +3 -3
- package/dist/cjs/{serve-f4bb3cb0.cjs.js → serve-0f30d0fc.cjs.js} +6 -6
- package/dist/cjs/{serve-708fbf98.cjs.js → serve-28c83157.cjs.js} +7 -7
- package/dist/cjs/{server-107d9cc0.cjs.js → server-652ec9a3.cjs.js} +2 -2
- package/dist/cjs/{tasks-9bd3e946.cjs.js → tasks-802f087f.cjs.js} +78 -12
- package/dist/cjs/{testCommand-e32fbd45.cjs.js → testCommand-11d07d1b.cjs.js} +3 -3
- package/dist/cjs/{validate-9523a11e.cjs.js → validate-3cc188fa.cjs.js} +3 -3
- package/dist/index.cjs.js +1 -1
- package/package.json +12 -12
- package/templates/default-backend-plugin/package.json.hbs +39 -37
- package/templates/default-common-plugin-package/.eslintrc.js +3 -0
- package/templates/default-common-plugin-package/README.md.hbs +5 -0
- package/templates/default-common-plugin-package/package.json.hbs +34 -0
- package/templates/default-common-plugin-package/src/index.ts.hbs +19 -0
- package/templates/default-common-plugin-package/src/setupTests.ts +1 -0
- package/templates/default-common-plugin-package/tsconfig.json +9 -0
- package/templates/default-plugin/package.json.hbs +4 -2
- package/templates/scaffolder-module/.eslintrc.js +3 -0
- package/templates/scaffolder-module/README.md.hbs +5 -0
- package/templates/scaffolder-module/package.json.hbs +37 -0
- package/templates/scaffolder-module/src/actions/example/example.test.ts +50 -0
- package/templates/scaffolder-module/src/actions/example/example.ts +57 -0
- package/templates/scaffolder-module/src/actions/example/index.ts +1 -0
- package/templates/scaffolder-module/src/actions/index.ts +1 -0
- package/templates/scaffolder-module/src/index.ts.hbs +8 -0
- package/templates/scaffolder-module/tsconfig.json +9 -0
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var os = require('os');
|
|
4
|
+
var fs = require('fs-extra');
|
|
5
|
+
var path = require('path');
|
|
6
|
+
var chalk = require('chalk');
|
|
7
|
+
var inquirer = require('inquirer');
|
|
8
|
+
var camelCase = require('lodash/camelCase');
|
|
9
|
+
var upperFirst = require('lodash/upperFirst');
|
|
10
|
+
var index = require('./index-25ca4442.cjs.js');
|
|
11
|
+
var tasks = require('./tasks-802f087f.cjs.js');
|
|
12
|
+
var Lockfile = require('./Lockfile-80f0eec4.cjs.js');
|
|
13
|
+
require('./run-924136d8.cjs.js');
|
|
14
|
+
var partition = require('lodash/partition');
|
|
15
|
+
var errors = require('@backstage/errors');
|
|
16
|
+
require('commander');
|
|
17
|
+
require('semver');
|
|
18
|
+
require('@backstage/cli-common');
|
|
19
|
+
require('@backstage/config/package.json');
|
|
20
|
+
require('handlebars');
|
|
21
|
+
require('ora');
|
|
22
|
+
require('util');
|
|
23
|
+
require('recursive-readdir');
|
|
24
|
+
require('child_process');
|
|
25
|
+
require('@yarnpkg/lockfile');
|
|
26
|
+
|
|
27
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
28
|
+
|
|
29
|
+
var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
|
|
30
|
+
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
|
|
31
|
+
var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
|
|
32
|
+
var inquirer__default = /*#__PURE__*/_interopDefaultLegacy(inquirer);
|
|
33
|
+
var camelCase__default = /*#__PURE__*/_interopDefaultLegacy(camelCase);
|
|
34
|
+
var upperFirst__default = /*#__PURE__*/_interopDefaultLegacy(upperFirst);
|
|
35
|
+
var partition__default = /*#__PURE__*/_interopDefaultLegacy(partition);
|
|
36
|
+
|
|
37
|
+
function createFactory(config) {
|
|
38
|
+
return config;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function pluginIdPrompt() {
|
|
42
|
+
return {
|
|
43
|
+
type: "input",
|
|
44
|
+
name: "id",
|
|
45
|
+
message: "Enter the ID of the plugin [required]",
|
|
46
|
+
validate: (value) => {
|
|
47
|
+
if (!value) {
|
|
48
|
+
return "Please enter the ID of the plugin";
|
|
49
|
+
} else if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(value)) {
|
|
50
|
+
return "Plugin IDs must be lowercase and contain only letters, digits, and dashes.";
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function ownerPrompt() {
|
|
57
|
+
return {
|
|
58
|
+
type: "input",
|
|
59
|
+
name: "owner",
|
|
60
|
+
message: "Enter an owner to add to CODEOWNERS [optional]",
|
|
61
|
+
when: (opts) => Boolean(opts.codeOwnersPath),
|
|
62
|
+
validate: (value) => {
|
|
63
|
+
if (!value) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
const ownerIds = tasks.parseOwnerIds(value);
|
|
67
|
+
if (!ownerIds) {
|
|
68
|
+
return "The owner must be a space separated list of team names (e.g. @org/team-name), usernames (e.g. @username), or the email addresses (e.g. user@example.com).";
|
|
69
|
+
}
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async function executePluginPackageTemplate(ctx, options) {
|
|
76
|
+
const {targetDir} = options;
|
|
77
|
+
let lockfile;
|
|
78
|
+
try {
|
|
79
|
+
lockfile = await Lockfile.Lockfile.load(index.paths.resolveTargetRoot("yarn.lock"));
|
|
80
|
+
} catch {
|
|
81
|
+
}
|
|
82
|
+
tasks.Task.section("Checking Prerequisites");
|
|
83
|
+
const shortPluginDir = path.relative(index.paths.targetRoot, targetDir);
|
|
84
|
+
await tasks.Task.forItem("availability", shortPluginDir, async () => {
|
|
85
|
+
if (await fs__default['default'].pathExists(targetDir)) {
|
|
86
|
+
throw new Error(`A package with the same plugin ID already exists at ${chalk__default['default'].cyan(shortPluginDir)}. Please try again with a different ID.`);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
const tempDir = await tasks.Task.forItem("creating", "temp dir", async () => {
|
|
90
|
+
return await ctx.createTemporaryDirectory("backstage-create");
|
|
91
|
+
});
|
|
92
|
+
tasks.Task.section("Executing Template");
|
|
93
|
+
await tasks.templatingTask(index.paths.resolveOwn("templates", options.templateName), tempDir, options.values, index.createPackageVersionProvider(lockfile));
|
|
94
|
+
const pkgJsonPath = path.resolve(tempDir, "package.json");
|
|
95
|
+
if (await fs__default['default'].pathExists(pkgJsonPath)) {
|
|
96
|
+
const pkgJson = await fs__default['default'].readJson(pkgJsonPath);
|
|
97
|
+
await fs__default['default'].writeJson(pkgJsonPath, pkgJson, {spaces: 2});
|
|
98
|
+
}
|
|
99
|
+
tasks.Task.section("Installing");
|
|
100
|
+
await tasks.Task.forItem("moving", shortPluginDir, async () => {
|
|
101
|
+
await fs__default['default'].move(tempDir, targetDir).catch((error) => {
|
|
102
|
+
throw new Error(`Failed to move package from ${tempDir} to ${targetDir}, ${error.message}`);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
ctx.markAsModified();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const frontendPlugin = createFactory({
|
|
109
|
+
name: "plugin",
|
|
110
|
+
description: "A new frontend plugin",
|
|
111
|
+
optionsDiscovery: async () => ({
|
|
112
|
+
codeOwnersPath: await tasks.getCodeownersFilePath(index.paths.targetRoot)
|
|
113
|
+
}),
|
|
114
|
+
optionsPrompts: [pluginIdPrompt(), ownerPrompt()],
|
|
115
|
+
async create(options, ctx) {
|
|
116
|
+
const {id} = options;
|
|
117
|
+
const name = ctx.scope ? `@${ctx.scope}/plugin-${id}` : `backstage-plugin-${id}`;
|
|
118
|
+
const extensionName = `${upperFirst__default['default'](camelCase__default['default'](id))}Page`;
|
|
119
|
+
tasks.Task.log();
|
|
120
|
+
tasks.Task.log(`Creating backend plugin ${chalk__default['default'].cyan(name)}`);
|
|
121
|
+
const targetDir = ctx.isMonoRepo ? index.paths.resolveTargetRoot("plugins", id) : index.paths.resolveTargetRoot(`backstage-plugin-${id}`);
|
|
122
|
+
await executePluginPackageTemplate(ctx, {
|
|
123
|
+
targetDir,
|
|
124
|
+
templateName: "default-plugin",
|
|
125
|
+
values: {
|
|
126
|
+
id,
|
|
127
|
+
name,
|
|
128
|
+
extensionName,
|
|
129
|
+
pluginVar: `${camelCase__default['default'](id)}Plugin`,
|
|
130
|
+
pluginVersion: ctx.defaultVersion,
|
|
131
|
+
privatePackage: ctx.private,
|
|
132
|
+
npmRegistry: ctx.npmRegistry
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
if (await fs__default['default'].pathExists(index.paths.resolveTargetRoot("packages/app"))) {
|
|
136
|
+
await tasks.Task.forItem("app", "adding dependency", async () => {
|
|
137
|
+
await tasks.addPackageDependency(index.paths.resolveTargetRoot("packages/app/package.json"), {
|
|
138
|
+
dependencies: {
|
|
139
|
+
[name]: `^${ctx.defaultVersion}`
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
await tasks.Task.forItem("app", "adding import", async () => {
|
|
144
|
+
var _a;
|
|
145
|
+
const pluginsFilePath = index.paths.resolveTargetRoot("packages/app/src/App.tsx");
|
|
146
|
+
if (!await fs__default['default'].pathExists(pluginsFilePath)) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
const content = await fs__default['default'].readFile(pluginsFilePath, "utf8");
|
|
150
|
+
const revLines = content.split("\n").reverse();
|
|
151
|
+
const lastImportIndex = revLines.findIndex((line) => line.match(/ from ("|').*("|')/));
|
|
152
|
+
const lastRouteIndex = revLines.findIndex((line) => line.match(/<\/FlatRoutes/));
|
|
153
|
+
if (lastImportIndex !== -1 && lastRouteIndex !== -1) {
|
|
154
|
+
const importLine = `import { ${extensionName} } from '${name}';`;
|
|
155
|
+
if (!content.includes(importLine)) {
|
|
156
|
+
revLines.splice(lastImportIndex, 0, importLine);
|
|
157
|
+
}
|
|
158
|
+
const componentLine = `<Route path="/${id}" element={<${extensionName} />} />`;
|
|
159
|
+
if (!content.includes(componentLine)) {
|
|
160
|
+
const [indentation] = (_a = revLines[lastRouteIndex + 1].match(/^\s*/)) != null ? _a : [];
|
|
161
|
+
revLines.splice(lastRouteIndex + 1, 0, indentation + componentLine);
|
|
162
|
+
}
|
|
163
|
+
const newContent = revLines.reverse().join("\n");
|
|
164
|
+
await fs__default['default'].writeFile(pluginsFilePath, newContent, "utf8");
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
if (options.owner) {
|
|
169
|
+
await tasks.addCodeownersEntry(`/plugins/${id}`, options.owner);
|
|
170
|
+
}
|
|
171
|
+
await tasks.Task.forCommand("yarn install", {cwd: targetDir, optional: true});
|
|
172
|
+
await tasks.Task.forCommand("yarn lint --fix", {
|
|
173
|
+
cwd: targetDir,
|
|
174
|
+
optional: true
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
const backendPlugin = createFactory({
|
|
180
|
+
name: "backend-plugin",
|
|
181
|
+
description: "A new backend plugin",
|
|
182
|
+
optionsDiscovery: async () => ({
|
|
183
|
+
codeOwnersPath: await tasks.getCodeownersFilePath(index.paths.targetRoot)
|
|
184
|
+
}),
|
|
185
|
+
optionsPrompts: [pluginIdPrompt(), ownerPrompt()],
|
|
186
|
+
async create(options, ctx) {
|
|
187
|
+
const id = `${options.id}-backend`;
|
|
188
|
+
const name = ctx.scope ? `@${ctx.scope}/plugin-${id}` : `backstage-plugin-${id}`;
|
|
189
|
+
tasks.Task.log();
|
|
190
|
+
tasks.Task.log(`Creating backend plugin ${chalk__default['default'].cyan(name)}`);
|
|
191
|
+
const targetDir = ctx.isMonoRepo ? index.paths.resolveTargetRoot("plugins", id) : index.paths.resolveTargetRoot(`backstage-plugin-${id}`);
|
|
192
|
+
await executePluginPackageTemplate(ctx, {
|
|
193
|
+
targetDir,
|
|
194
|
+
templateName: "default-backend-plugin",
|
|
195
|
+
values: {
|
|
196
|
+
id,
|
|
197
|
+
name,
|
|
198
|
+
pluginVar: `${camelCase__default['default'](id)}Plugin`,
|
|
199
|
+
pluginVersion: ctx.defaultVersion,
|
|
200
|
+
privatePackage: ctx.private,
|
|
201
|
+
npmRegistry: ctx.npmRegistry
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
if (await fs__default['default'].pathExists(index.paths.resolveTargetRoot("packages/backend"))) {
|
|
205
|
+
await tasks.Task.forItem("backend", "adding dependency", async () => {
|
|
206
|
+
await tasks.addPackageDependency(index.paths.resolveTargetRoot("packages/backend/package.json"), {
|
|
207
|
+
dependencies: {
|
|
208
|
+
[name]: `^${ctx.defaultVersion}`
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
if (options.owner) {
|
|
214
|
+
await tasks.addCodeownersEntry(`/plugins/${id}`, options.owner);
|
|
215
|
+
}
|
|
216
|
+
await tasks.Task.forCommand("yarn install", {cwd: targetDir, optional: true});
|
|
217
|
+
await tasks.Task.forCommand("yarn lint --fix", {
|
|
218
|
+
cwd: targetDir,
|
|
219
|
+
optional: true
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
const pluginCommon = createFactory({
|
|
225
|
+
name: "plugin-common",
|
|
226
|
+
description: "A new isomorphic common plugin package",
|
|
227
|
+
optionsDiscovery: async () => ({
|
|
228
|
+
codeOwnersPath: await tasks.getCodeownersFilePath(index.paths.targetRoot)
|
|
229
|
+
}),
|
|
230
|
+
optionsPrompts: [pluginIdPrompt(), ownerPrompt()],
|
|
231
|
+
async create(options, ctx) {
|
|
232
|
+
const {id} = options;
|
|
233
|
+
const suffix = `${id}-common`;
|
|
234
|
+
const name = ctx.scope ? `@${ctx.scope}/plugin-${suffix}` : `backstage-plugin-${suffix}`;
|
|
235
|
+
tasks.Task.log();
|
|
236
|
+
tasks.Task.log(`Creating backend plugin ${chalk__default['default'].cyan(name)}`);
|
|
237
|
+
const targetDir = ctx.isMonoRepo ? index.paths.resolveTargetRoot("plugins", suffix) : index.paths.resolveTargetRoot(`backstage-plugin-${suffix}`);
|
|
238
|
+
await executePluginPackageTemplate(ctx, {
|
|
239
|
+
targetDir,
|
|
240
|
+
templateName: "default-common-plugin-package",
|
|
241
|
+
values: {
|
|
242
|
+
id,
|
|
243
|
+
name,
|
|
244
|
+
privatePackage: ctx.private,
|
|
245
|
+
npmRegistry: ctx.npmRegistry,
|
|
246
|
+
pluginVersion: ctx.defaultVersion
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
if (options.owner) {
|
|
250
|
+
await tasks.addCodeownersEntry(`/plugins/${suffix}`, options.owner);
|
|
251
|
+
}
|
|
252
|
+
await tasks.Task.forCommand("yarn install", {cwd: targetDir, optional: true});
|
|
253
|
+
await tasks.Task.forCommand("yarn lint --fix", {
|
|
254
|
+
cwd: targetDir,
|
|
255
|
+
optional: true
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
const scaffolderModule = createFactory({
|
|
261
|
+
name: "scaffolder-module",
|
|
262
|
+
description: "An module exporting custom actions for @backstage/plugin-scaffolder-backend",
|
|
263
|
+
optionsDiscovery: async () => ({
|
|
264
|
+
codeOwnersPath: await tasks.getCodeownersFilePath(index.paths.targetRoot)
|
|
265
|
+
}),
|
|
266
|
+
optionsPrompts: [
|
|
267
|
+
{
|
|
268
|
+
type: "input",
|
|
269
|
+
name: "id",
|
|
270
|
+
message: "Enter the name of the module [required]",
|
|
271
|
+
validate: (value) => {
|
|
272
|
+
if (!value) {
|
|
273
|
+
return "Please enter the name of the module";
|
|
274
|
+
} else if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(value)) {
|
|
275
|
+
return "Module names must be lowercase and contain only letters, digits, and dashes.";
|
|
276
|
+
}
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
ownerPrompt()
|
|
281
|
+
],
|
|
282
|
+
async create(options, ctx) {
|
|
283
|
+
const {id} = options;
|
|
284
|
+
const slug = `scaffolder-backend-module-${id}`;
|
|
285
|
+
let name = `backstage-plugin-${slug}`;
|
|
286
|
+
if (ctx.scope) {
|
|
287
|
+
if (ctx.scope === "backstage") {
|
|
288
|
+
name = `@backstage/plugin-${slug}`;
|
|
289
|
+
} else {
|
|
290
|
+
name = `@${ctx.scope}/backstage-plugin-${slug}`;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
tasks.Task.log();
|
|
294
|
+
tasks.Task.log(`Creating module ${chalk__default['default'].cyan(name)}`);
|
|
295
|
+
const targetDir = ctx.isMonoRepo ? index.paths.resolveTargetRoot("plugins", slug) : index.paths.resolveTargetRoot(`backstage-plugin-${slug}`);
|
|
296
|
+
await executePluginPackageTemplate(ctx, {
|
|
297
|
+
targetDir,
|
|
298
|
+
templateName: "scaffolder-module",
|
|
299
|
+
values: {
|
|
300
|
+
id,
|
|
301
|
+
name,
|
|
302
|
+
privatePackage: ctx.private,
|
|
303
|
+
npmRegistry: ctx.npmRegistry,
|
|
304
|
+
pluginVersion: ctx.defaultVersion
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
if (options.owner) {
|
|
308
|
+
await tasks.addCodeownersEntry(`/plugins/${slug}`, options.owner);
|
|
309
|
+
}
|
|
310
|
+
await tasks.Task.forCommand("yarn install", {cwd: targetDir, optional: true});
|
|
311
|
+
await tasks.Task.forCommand("yarn lint --fix", {
|
|
312
|
+
cwd: targetDir,
|
|
313
|
+
optional: true
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
var factories = /*#__PURE__*/Object.freeze({
|
|
319
|
+
__proto__: null,
|
|
320
|
+
frontendPlugin: frontendPlugin,
|
|
321
|
+
backendPlugin: backendPlugin,
|
|
322
|
+
pluginCommon: pluginCommon,
|
|
323
|
+
scaffolderModule: scaffolderModule
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
function applyPromptMessageTransforms(prompt, transforms) {
|
|
327
|
+
return {
|
|
328
|
+
...prompt,
|
|
329
|
+
message: prompt.message && (async (answers) => {
|
|
330
|
+
if (typeof prompt.message === "function") {
|
|
331
|
+
return transforms.message(await prompt.message(answers));
|
|
332
|
+
}
|
|
333
|
+
return transforms.message(await prompt.message);
|
|
334
|
+
}),
|
|
335
|
+
validate: prompt.validate && (async (...args) => {
|
|
336
|
+
const result = await prompt.validate(...args);
|
|
337
|
+
if (typeof result === "string") {
|
|
338
|
+
return transforms.error(result);
|
|
339
|
+
}
|
|
340
|
+
return result;
|
|
341
|
+
})
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
class FactoryRegistry {
|
|
345
|
+
static async interactiveSelect(preselected) {
|
|
346
|
+
let selected = preselected;
|
|
347
|
+
if (!selected) {
|
|
348
|
+
const answers = await inquirer__default['default'].prompt([
|
|
349
|
+
{
|
|
350
|
+
type: "list",
|
|
351
|
+
name: "name",
|
|
352
|
+
message: "What do you want to create?",
|
|
353
|
+
choices: Array.from(this.factoryMap.values()).map((factory2) => ({
|
|
354
|
+
name: `${factory2.name} - ${factory2.description}`,
|
|
355
|
+
value: factory2.name
|
|
356
|
+
}))
|
|
357
|
+
}
|
|
358
|
+
]);
|
|
359
|
+
selected = answers.name;
|
|
360
|
+
}
|
|
361
|
+
const factory = this.factoryMap.get(selected);
|
|
362
|
+
if (!factory) {
|
|
363
|
+
throw new Error(`Unknown selection '${selected}'`);
|
|
364
|
+
}
|
|
365
|
+
return factory;
|
|
366
|
+
}
|
|
367
|
+
static async populateOptions(factory, provided) {
|
|
368
|
+
let currentOptions = provided;
|
|
369
|
+
if (factory.optionsDiscovery) {
|
|
370
|
+
const discoveredOptions = await factory.optionsDiscovery();
|
|
371
|
+
currentOptions = {
|
|
372
|
+
...currentOptions,
|
|
373
|
+
...discoveredOptions
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
if (factory.optionsPrompts) {
|
|
377
|
+
const [hasAnswers, needsAnswers] = partition__default['default'](factory.optionsPrompts, (option) => option.name in currentOptions);
|
|
378
|
+
for (const option of hasAnswers) {
|
|
379
|
+
const value = provided[option.name];
|
|
380
|
+
if (option.validate) {
|
|
381
|
+
const result = option.validate(value);
|
|
382
|
+
if (result !== true) {
|
|
383
|
+
throw new Error(`Invalid option '${option.name}'. ${result}`);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
currentOptions = await inquirer__default['default'].prompt(needsAnswers.map((option) => applyPromptMessageTransforms(option, {
|
|
388
|
+
message: chalk__default['default'].blue,
|
|
389
|
+
error: chalk__default['default'].red
|
|
390
|
+
})), currentOptions);
|
|
391
|
+
}
|
|
392
|
+
return currentOptions;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
FactoryRegistry.factoryMap = new Map(Object.values(factories).map((factory) => [factory.name, factory]));
|
|
396
|
+
|
|
397
|
+
function parseOptions(optionStrings) {
|
|
398
|
+
const options = {};
|
|
399
|
+
for (const str of optionStrings) {
|
|
400
|
+
const [key] = str.split("=", 1);
|
|
401
|
+
const value = str.slice(key.length + 1);
|
|
402
|
+
if (!key || str[key.length] !== "=") {
|
|
403
|
+
throw new Error(`Invalid option '${str}', must be of the format <key>=<value>`);
|
|
404
|
+
}
|
|
405
|
+
options[key] = value;
|
|
406
|
+
}
|
|
407
|
+
return options;
|
|
408
|
+
}
|
|
409
|
+
var create = async (cmd) => {
|
|
410
|
+
var _a;
|
|
411
|
+
const cmdOpts = cmd.opts();
|
|
412
|
+
const factory = await FactoryRegistry.interactiveSelect(cmdOpts.select);
|
|
413
|
+
const providedOptions = parseOptions(cmdOpts.option);
|
|
414
|
+
const options = await FactoryRegistry.populateOptions(factory, providedOptions);
|
|
415
|
+
let isMonoRepo = false;
|
|
416
|
+
try {
|
|
417
|
+
const rootPackageJson = await fs__default['default'].readJson(index.paths.resolveTargetRoot("package.json"));
|
|
418
|
+
if (rootPackageJson.workspaces) {
|
|
419
|
+
isMonoRepo = true;
|
|
420
|
+
}
|
|
421
|
+
} catch (error) {
|
|
422
|
+
errors.assertError(error);
|
|
423
|
+
if (error.code !== "ENOENT") {
|
|
424
|
+
throw error;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
let defaultVersion = "0.1.0";
|
|
428
|
+
try {
|
|
429
|
+
const rootLernaJson = await fs__default['default'].readJson(index.paths.resolveTargetRoot("lerna.json"));
|
|
430
|
+
if (rootLernaJson.version) {
|
|
431
|
+
defaultVersion = rootLernaJson.version;
|
|
432
|
+
}
|
|
433
|
+
} catch (error) {
|
|
434
|
+
errors.assertError(error);
|
|
435
|
+
if (error.code !== "ENOENT") {
|
|
436
|
+
throw error;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
const tempDirs = new Array();
|
|
440
|
+
async function createTemporaryDirectory(name) {
|
|
441
|
+
const dir = await fs__default['default'].mkdtemp(path.join(os__default['default'].tmpdir(), name));
|
|
442
|
+
tempDirs.push(dir);
|
|
443
|
+
return dir;
|
|
444
|
+
}
|
|
445
|
+
let modified = false;
|
|
446
|
+
try {
|
|
447
|
+
await factory.create(options, {
|
|
448
|
+
isMonoRepo,
|
|
449
|
+
defaultVersion,
|
|
450
|
+
scope: (_a = cmdOpts.scope) == null ? void 0 : _a.replace(/^@/, ""),
|
|
451
|
+
npmRegistry: cmdOpts.npmRegistry,
|
|
452
|
+
private: Boolean(cmdOpts.private),
|
|
453
|
+
createTemporaryDirectory,
|
|
454
|
+
markAsModified() {
|
|
455
|
+
modified = true;
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
tasks.Task.log();
|
|
459
|
+
tasks.Task.log(`\u{1F389} Successfully created ${factory.name}`);
|
|
460
|
+
tasks.Task.log();
|
|
461
|
+
} catch (error) {
|
|
462
|
+
errors.assertError(error);
|
|
463
|
+
tasks.Task.error(error.message);
|
|
464
|
+
if (modified) {
|
|
465
|
+
tasks.Task.log("It seems that something went wrong in the creation process \u{1F914}");
|
|
466
|
+
tasks.Task.log();
|
|
467
|
+
tasks.Task.log("We have left the changes that were made intact in case you want to");
|
|
468
|
+
tasks.Task.log("continue manually, but you can also revert the changes and try again.");
|
|
469
|
+
tasks.Task.error(`\u{1F525} Failed to create ${factory.name}!`);
|
|
470
|
+
}
|
|
471
|
+
} finally {
|
|
472
|
+
for (const dir of tempDirs) {
|
|
473
|
+
try {
|
|
474
|
+
await fs__default['default'].remove(dir);
|
|
475
|
+
} catch (error) {
|
|
476
|
+
console.error(`Failed to remove temporary directory '${dir}', ${error}`);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
};
|
|
481
|
+
|
|
482
|
+
exports.default = create;
|
|
483
|
+
//# sourceMappingURL=create-b0f456f9.cjs.js.map
|
|
@@ -10,10 +10,10 @@ var camelCase = require('lodash/camelCase');
|
|
|
10
10
|
var upperFirst = require('lodash/upperFirst');
|
|
11
11
|
var os = require('os');
|
|
12
12
|
var errors = require('@backstage/errors');
|
|
13
|
-
var tasks = require('./tasks-
|
|
14
|
-
var index = require('./index-
|
|
13
|
+
var tasks = require('./tasks-802f087f.cjs.js');
|
|
14
|
+
var index = require('./index-25ca4442.cjs.js');
|
|
15
15
|
var Lockfile = require('./Lockfile-80f0eec4.cjs.js');
|
|
16
|
-
require('./run-
|
|
16
|
+
require('./run-924136d8.cjs.js');
|
|
17
17
|
require('handlebars');
|
|
18
18
|
require('ora');
|
|
19
19
|
require('recursive-readdir');
|
|
@@ -154,8 +154,8 @@ var createPlugin = async (cmd) => {
|
|
|
154
154
|
if (!value) {
|
|
155
155
|
return true;
|
|
156
156
|
}
|
|
157
|
-
const
|
|
158
|
-
if (!
|
|
157
|
+
const ownerIds = tasks.parseOwnerIds(value);
|
|
158
|
+
if (!ownerIds) {
|
|
159
159
|
return chalk__default['default'].red("The owner must be a space separated list of team names (e.g. @org/team-name), usernames (e.g. @username), or the email addresses of users (e.g. user@example.com).");
|
|
160
160
|
}
|
|
161
161
|
return true;
|
|
@@ -173,7 +173,6 @@ var createPlugin = async (cmd) => {
|
|
|
173
173
|
const appPackage = index.paths.resolveTargetRoot("packages/app");
|
|
174
174
|
const templateDir = index.paths.resolveOwn(cmd.backend ? "templates/default-backend-plugin" : "templates/default-plugin");
|
|
175
175
|
const pluginDir = isMonoRepo ? index.paths.resolveTargetRoot("plugins", pluginId) : index.paths.resolveTargetRoot(pluginId);
|
|
176
|
-
const ownerIds = tasks.parseOwnerIds(answers.owner);
|
|
177
176
|
const {version: pluginVersion} = isMonoRepo ? await fs__default['default'].readJson(index.paths.resolveTargetRoot("lerna.json")) : {version: "0.1.0"};
|
|
178
177
|
let lockfile;
|
|
179
178
|
try {
|
|
@@ -208,8 +207,8 @@ var createPlugin = async (cmd) => {
|
|
|
208
207
|
tasks.Task.section("Import plugin in app");
|
|
209
208
|
await addPluginExtensionToApp(pluginId, extensionName, name);
|
|
210
209
|
}
|
|
211
|
-
if (
|
|
212
|
-
await tasks.addCodeownersEntry(
|
|
210
|
+
if (answers.owner) {
|
|
211
|
+
await tasks.addCodeownersEntry(`/plugins/${pluginId}`, answers.owner);
|
|
213
212
|
}
|
|
214
213
|
tasks.Task.log();
|
|
215
214
|
tasks.Task.log(`\u{1F947} Successfully created ${chalk__default['default'].cyan(`${name}`)}`);
|
|
@@ -233,4 +232,4 @@ exports.addPluginExtensionToApp = addPluginExtensionToApp;
|
|
|
233
232
|
exports.capitalize = capitalize;
|
|
234
233
|
exports.default = createPlugin;
|
|
235
234
|
exports.movePlugin = movePlugin;
|
|
236
|
-
//# sourceMappingURL=createPlugin-
|
|
235
|
+
//# sourceMappingURL=createPlugin-2c95815c.cjs.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var fs = require('fs-extra');
|
|
4
|
-
var index = require('./index-
|
|
4
|
+
var index = require('./index-25ca4442.cjs.js');
|
|
5
5
|
var webpack = require('webpack');
|
|
6
|
-
var paths = require('./paths-
|
|
6
|
+
var paths = require('./paths-034708b3.cjs.js');
|
|
7
7
|
require('commander');
|
|
8
8
|
require('chalk');
|
|
9
9
|
require('semver');
|
|
@@ -20,7 +20,7 @@ require('terser-webpack-plugin');
|
|
|
20
20
|
require('./parallel-a4714c72.cjs.js');
|
|
21
21
|
require('mini-css-extract-plugin');
|
|
22
22
|
require('./svgrTemplate-2d0d15cf.cjs.js');
|
|
23
|
-
require('./run-
|
|
23
|
+
require('./run-924136d8.cjs.js');
|
|
24
24
|
require('child_process');
|
|
25
25
|
require('util');
|
|
26
26
|
require('lodash/pickBy');
|
|
@@ -67,4 +67,4 @@ var dev = async (cmd) => {
|
|
|
67
67
|
};
|
|
68
68
|
|
|
69
69
|
exports.default = dev;
|
|
70
|
-
//# sourceMappingURL=dev-
|
|
70
|
+
//# sourceMappingURL=dev-a04f9251.cjs.js.map
|
|
@@ -7,7 +7,7 @@ var path = require('path');
|
|
|
7
7
|
var inquirer = require('inquirer');
|
|
8
8
|
var handlebars = require('handlebars');
|
|
9
9
|
var recursive = require('recursive-readdir');
|
|
10
|
-
var index = require('./index-
|
|
10
|
+
var index = require('./index-25ca4442.cjs.js');
|
|
11
11
|
require('commander');
|
|
12
12
|
require('semver');
|
|
13
13
|
require('@backstage/cli-common');
|
|
@@ -374,4 +374,4 @@ async function readPluginData() {
|
|
|
374
374
|
}
|
|
375
375
|
|
|
376
376
|
exports.default = diff;
|
|
377
|
-
//# sourceMappingURL=diff-
|
|
377
|
+
//# sourceMappingURL=diff-d009aa81.cjs.js.map
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
var configLoader = require('@backstage/config-loader');
|
|
4
4
|
var openBrowser = require('react-dev-utils/openBrowser');
|
|
5
|
-
var config = require('./config-
|
|
5
|
+
var config = require('./config-10d49423.cjs.js');
|
|
6
6
|
require('@backstage/config');
|
|
7
|
-
require('./index-
|
|
7
|
+
require('./index-25ca4442.cjs.js');
|
|
8
8
|
require('commander');
|
|
9
9
|
require('chalk');
|
|
10
10
|
require('fs-extra');
|
|
@@ -29,4 +29,4 @@ var docs = async (cmd) => {
|
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
exports.default = docs;
|
|
32
|
-
//# sourceMappingURL=docs-
|
|
32
|
+
//# sourceMappingURL=docs-d4bb9d0c.cjs.js.map
|