@backstage/cli-module-new 0.0.0-nightly-20260317031259
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 +15 -0
- package/README.md +14 -0
- package/bin/backstage-cli-module-new +32 -0
- package/dist/commands/new.cjs.js +115 -0
- package/dist/commands/new.cjs.js.map +1 -0
- package/dist/index.cjs.js +41 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/lib/codeowners/codeowners.cjs.js +92 -0
- package/dist/lib/codeowners/codeowners.cjs.js.map +1 -0
- package/dist/lib/createNewPackage.cjs.js +32 -0
- package/dist/lib/createNewPackage.cjs.js.map +1 -0
- package/dist/lib/defaultTemplates.cjs.js +17 -0
- package/dist/lib/defaultTemplates.cjs.js.map +1 -0
- package/dist/lib/execution/PortableTemplater.cjs.js +89 -0
- package/dist/lib/execution/PortableTemplater.cjs.js.map +1 -0
- package/dist/lib/execution/executePortableTemplate.cjs.js +66 -0
- package/dist/lib/execution/executePortableTemplate.cjs.js.map +1 -0
- package/dist/lib/execution/installNewPackage.cjs.js +127 -0
- package/dist/lib/execution/installNewPackage.cjs.js.map +1 -0
- package/dist/lib/execution/writeTemplateContents.cjs.js +116 -0
- package/dist/lib/execution/writeTemplateContents.cjs.js.map +1 -0
- package/dist/lib/preparation/collectPortableTemplateInput.cjs.js +157 -0
- package/dist/lib/preparation/collectPortableTemplateInput.cjs.js.map +1 -0
- package/dist/lib/preparation/loadPortableTemplate.cjs.js +81 -0
- package/dist/lib/preparation/loadPortableTemplate.cjs.js.map +1 -0
- package/dist/lib/preparation/loadPortableTemplateConfig.cjs.js +132 -0
- package/dist/lib/preparation/loadPortableTemplateConfig.cjs.js.map +1 -0
- package/dist/lib/preparation/resolvePackageParams.cjs.js +40 -0
- package/dist/lib/preparation/resolvePackageParams.cjs.js.map +1 -0
- package/dist/lib/preparation/selectTemplateInteractively.cjs.js +38 -0
- package/dist/lib/preparation/selectTemplateInteractively.cjs.js.map +1 -0
- package/dist/lib/tasks.cjs.js +51 -0
- package/dist/lib/tasks.cjs.js.map +1 -0
- package/dist/lib/types.cjs.js +19 -0
- package/dist/lib/types.cjs.js.map +1 -0
- package/dist/lib/version.cjs.js +93 -0
- package/dist/lib/version.cjs.js.map +1 -0
- package/dist/packages/backend-defaults/package.json.cjs.js +6 -0
- package/dist/packages/backend-defaults/package.json.cjs.js.map +1 -0
- package/dist/packages/backend-plugin-api/package.json.cjs.js +6 -0
- package/dist/packages/backend-plugin-api/package.json.cjs.js.map +1 -0
- package/dist/packages/backend-test-utils/package.json.cjs.js +6 -0
- package/dist/packages/backend-test-utils/package.json.cjs.js.map +1 -0
- package/dist/packages/catalog-client/package.json.cjs.js +6 -0
- package/dist/packages/catalog-client/package.json.cjs.js.map +1 -0
- package/dist/packages/cli/package.json.cjs.js +6 -0
- package/dist/packages/cli/package.json.cjs.js.map +1 -0
- package/dist/packages/cli-module-new/package.json.cjs.js +99 -0
- package/dist/packages/cli-module-new/package.json.cjs.js.map +1 -0
- package/dist/packages/config/package.json.cjs.js +6 -0
- package/dist/packages/config/package.json.cjs.js.map +1 -0
- package/dist/packages/core-app-api/package.json.cjs.js +6 -0
- package/dist/packages/core-app-api/package.json.cjs.js.map +1 -0
- package/dist/packages/core-components/package.json.cjs.js +6 -0
- package/dist/packages/core-components/package.json.cjs.js.map +1 -0
- package/dist/packages/core-plugin-api/package.json.cjs.js +6 -0
- package/dist/packages/core-plugin-api/package.json.cjs.js.map +1 -0
- package/dist/packages/dev-utils/package.json.cjs.js +6 -0
- package/dist/packages/dev-utils/package.json.cjs.js.map +1 -0
- package/dist/packages/errors/package.json.cjs.js +6 -0
- package/dist/packages/errors/package.json.cjs.js.map +1 -0
- package/dist/packages/frontend-defaults/package.json.cjs.js +6 -0
- package/dist/packages/frontend-defaults/package.json.cjs.js.map +1 -0
- package/dist/packages/frontend-dev-utils/package.json.cjs.js +6 -0
- package/dist/packages/frontend-dev-utils/package.json.cjs.js.map +1 -0
- package/dist/packages/frontend-plugin-api/package.json.cjs.js +6 -0
- package/dist/packages/frontend-plugin-api/package.json.cjs.js.map +1 -0
- package/dist/packages/frontend-test-utils/package.json.cjs.js +6 -0
- package/dist/packages/frontend-test-utils/package.json.cjs.js.map +1 -0
- package/dist/packages/test-utils/package.json.cjs.js +6 -0
- package/dist/packages/test-utils/package.json.cjs.js.map +1 -0
- package/dist/packages/theme/package.json.cjs.js +6 -0
- package/dist/packages/theme/package.json.cjs.js.map +1 -0
- package/dist/packages/types/package.json.cjs.js +6 -0
- package/dist/packages/types/package.json.cjs.js.map +1 -0
- package/dist/plugins/auth-backend/package.json.cjs.js +6 -0
- package/dist/plugins/auth-backend/package.json.cjs.js.map +1 -0
- package/dist/plugins/auth-backend-module-guest-provider/package.json.cjs.js +6 -0
- package/dist/plugins/auth-backend-module-guest-provider/package.json.cjs.js.map +1 -0
- package/dist/plugins/catalog-node/package.json.cjs.js +6 -0
- package/dist/plugins/catalog-node/package.json.cjs.js.map +1 -0
- package/dist/plugins/scaffolder-node/package.json.cjs.js +6 -0
- package/dist/plugins/scaffolder-node/package.json.cjs.js.map +1 -0
- package/dist/plugins/scaffolder-node-test-utils/package.json.cjs.js +6 -0
- package/dist/plugins/scaffolder-node-test-utils/package.json.cjs.js.map +1 -0
- package/package.json +69 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# @backstage/cli-module-new
|
|
2
|
+
|
|
3
|
+
## 0.0.0-nightly-20260317031259
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 329f394: Initial release of the CLI module packages. Each module provides a set of commands that can be discovered automatically by `@backstage/cli` or executed standalone.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- ebeb0d4: Updated the new frontend plugin template to use `@backstage/frontend-dev-utils` in its `dev/` entry point instead of wiring `createApp` manually. Generated plugins now get the same dev app helper setup as the built-in examples.
|
|
12
|
+
- Updated dependencies
|
|
13
|
+
- @backstage/cli-node@0.0.0-nightly-20260317031259
|
|
14
|
+
- @backstage/cli-common@0.0.0-nightly-20260317031259
|
|
15
|
+
- @backstage/errors@1.2.7
|
package/README.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# @backstage/cli-module-new
|
|
2
|
+
|
|
3
|
+
CLI module that provides the `new` command for the Backstage CLI, offering an interactive guide to scaffold new plugins, packages, and modules in your Backstage app.
|
|
4
|
+
|
|
5
|
+
## Commands
|
|
6
|
+
|
|
7
|
+
| Command | Description |
|
|
8
|
+
| :------ | :-------------------------------------------------------------- |
|
|
9
|
+
| `new` | Open up an interactive guide to creating new things in your app |
|
|
10
|
+
|
|
11
|
+
## Documentation
|
|
12
|
+
|
|
13
|
+
- [Backstage Readme](https://github.com/backstage/backstage/blob/master/README.md)
|
|
14
|
+
- [Backstage Documentation](https://backstage.io/docs)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2024 The Backstage Authors
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const path = require('node:path');
|
|
19
|
+
|
|
20
|
+
/* eslint-disable-next-line no-restricted-syntax */
|
|
21
|
+
const isLocal = require('node:fs').existsSync(
|
|
22
|
+
path.resolve(__dirname, '../src'),
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
if (isLocal) {
|
|
26
|
+
require('@backstage/cli-node/config/nodeTransform.cjs');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const { runCliModule } = require('@backstage/cli-node');
|
|
30
|
+
const cliModule = require(isLocal ? '../src/index' : '..').default;
|
|
31
|
+
const pkg = require('../package.json');
|
|
32
|
+
runCliModule({ module: cliModule, name: pkg.name, version: pkg.version });
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var cleye = require('cleye');
|
|
6
|
+
var createNewPackage = require('../lib/createNewPackage.cjs.js');
|
|
7
|
+
|
|
8
|
+
var _new = async ({ args, info }) => {
|
|
9
|
+
for (const flag of ["skipInstall", "npmRegistry", "baseVersion"]) {
|
|
10
|
+
if (args.some((a) => a === `--${flag}` || a.startsWith(`--${flag}=`))) {
|
|
11
|
+
process.stderr.write(
|
|
12
|
+
`DEPRECATION WARNING: --${flag} is deprecated, use the kebab-case form instead
|
|
13
|
+
`
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const {
|
|
18
|
+
flags: {
|
|
19
|
+
select,
|
|
20
|
+
option: rawArgOptions,
|
|
21
|
+
skipInstall,
|
|
22
|
+
scope,
|
|
23
|
+
npmRegistry,
|
|
24
|
+
baseVersion,
|
|
25
|
+
license,
|
|
26
|
+
private: isPrivate
|
|
27
|
+
}
|
|
28
|
+
} = cleye.cli(
|
|
29
|
+
{
|
|
30
|
+
help: info,
|
|
31
|
+
booleanFlagNegation: true,
|
|
32
|
+
flags: {
|
|
33
|
+
select: {
|
|
34
|
+
type: String,
|
|
35
|
+
description: "Select the thing you want to be creating upfront"
|
|
36
|
+
},
|
|
37
|
+
option: {
|
|
38
|
+
type: [String],
|
|
39
|
+
description: "Pre-fill options for the creation process",
|
|
40
|
+
default: []
|
|
41
|
+
},
|
|
42
|
+
skipInstall: {
|
|
43
|
+
type: Boolean,
|
|
44
|
+
description: `Skips running 'yarn install' and 'yarn lint --fix'`
|
|
45
|
+
},
|
|
46
|
+
scope: {
|
|
47
|
+
type: String,
|
|
48
|
+
description: "The scope to use for new packages"
|
|
49
|
+
},
|
|
50
|
+
npmRegistry: {
|
|
51
|
+
type: String,
|
|
52
|
+
description: "The package registry to use for new packages"
|
|
53
|
+
},
|
|
54
|
+
baseVersion: {
|
|
55
|
+
type: String,
|
|
56
|
+
description: "The version to use for any new packages (default: 0.1.0)"
|
|
57
|
+
},
|
|
58
|
+
license: {
|
|
59
|
+
type: String,
|
|
60
|
+
description: "The license to use for any new packages (default: Apache-2.0)"
|
|
61
|
+
},
|
|
62
|
+
private: {
|
|
63
|
+
type: Boolean,
|
|
64
|
+
description: "Mark new packages as private",
|
|
65
|
+
default: true
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
void 0,
|
|
70
|
+
args
|
|
71
|
+
);
|
|
72
|
+
const prefilledParams = parseParams(rawArgOptions);
|
|
73
|
+
let pluginInfix = void 0;
|
|
74
|
+
let packagePrefix = void 0;
|
|
75
|
+
if (scope) {
|
|
76
|
+
const normalizedScope = scope.startsWith("@") ? scope : `@${scope}`;
|
|
77
|
+
packagePrefix = normalizedScope.includes("/") ? normalizedScope : `${normalizedScope}/`;
|
|
78
|
+
pluginInfix = scope.includes("backstage") ? "plugin-" : "backstage-plugin-";
|
|
79
|
+
}
|
|
80
|
+
if (isPrivate === false || [npmRegistry, baseVersion, license].filter(Boolean).length !== 0) {
|
|
81
|
+
console.warn(
|
|
82
|
+
`Global template configuration via CLI flags is deprecated, see https://backstage.io/docs/cli/new for information on how to configure package templating`
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
await createNewPackage.createNewPackage({
|
|
86
|
+
prefilledParams,
|
|
87
|
+
preselectedTemplateId: select,
|
|
88
|
+
configOverrides: {
|
|
89
|
+
license,
|
|
90
|
+
version: baseVersion,
|
|
91
|
+
private: isPrivate,
|
|
92
|
+
publishRegistry: npmRegistry,
|
|
93
|
+
packageNamePrefix: packagePrefix,
|
|
94
|
+
packageNamePluginInfix: pluginInfix
|
|
95
|
+
},
|
|
96
|
+
skipInstall: Boolean(skipInstall)
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
function parseParams(optionStrings) {
|
|
100
|
+
const options = {};
|
|
101
|
+
for (const str of optionStrings) {
|
|
102
|
+
const [key] = str.split("=", 1);
|
|
103
|
+
const value = str.slice(key.length + 1);
|
|
104
|
+
if (!key || str[key.length] !== "=") {
|
|
105
|
+
throw new Error(
|
|
106
|
+
`Invalid option '${str}', must be of the format <key>=<value>`
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
options[key] = value;
|
|
110
|
+
}
|
|
111
|
+
return options;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
exports.default = _new;
|
|
115
|
+
//# sourceMappingURL=new.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.cjs.js","sources":["../../src/commands/new.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 { cli } from 'cleye';\nimport { createNewPackage } from '../lib/createNewPackage';\nimport type { CliCommandContext } from '@backstage/cli-node';\n\nexport default async ({ args, info }: CliCommandContext) => {\n for (const flag of ['skipInstall', 'npmRegistry', 'baseVersion']) {\n if (args.some(a => a === `--${flag}` || a.startsWith(`--${flag}=`))) {\n process.stderr.write(\n `DEPRECATION WARNING: --${flag} is deprecated, use the kebab-case form instead\\n`,\n );\n }\n }\n\n const {\n flags: {\n select,\n option: rawArgOptions,\n skipInstall,\n scope,\n npmRegistry,\n baseVersion,\n license,\n private: isPrivate,\n },\n } = cli(\n {\n help: info,\n booleanFlagNegation: true,\n flags: {\n select: {\n type: String,\n description: 'Select the thing you want to be creating upfront',\n },\n option: {\n type: [String] as const,\n description: 'Pre-fill options for the creation process',\n default: [] as string[],\n },\n skipInstall: {\n type: Boolean,\n description: `Skips running 'yarn install' and 'yarn lint --fix'`,\n },\n scope: {\n type: String,\n description: 'The scope to use for new packages',\n },\n npmRegistry: {\n type: String,\n description: 'The package registry to use for new packages',\n },\n baseVersion: {\n type: String,\n description:\n 'The version to use for any new packages (default: 0.1.0)',\n },\n license: {\n type: String,\n description:\n 'The license to use for any new packages (default: Apache-2.0)',\n },\n private: {\n type: Boolean,\n description: 'Mark new packages as private',\n default: true,\n },\n },\n },\n undefined,\n args,\n );\n\n const prefilledParams = parseParams(rawArgOptions);\n\n let pluginInfix: string | undefined = undefined;\n let packagePrefix: string | undefined = undefined;\n if (scope) {\n const normalizedScope = scope.startsWith('@') ? scope : `@${scope}`;\n packagePrefix = normalizedScope.includes('/')\n ? normalizedScope\n : `${normalizedScope}/`;\n pluginInfix = scope.includes('backstage') ? 'plugin-' : 'backstage-plugin-';\n }\n\n if (\n isPrivate === false ||\n [npmRegistry, baseVersion, license].filter(Boolean).length !== 0\n ) {\n console.warn(\n `Global template configuration via CLI flags is deprecated, see https://backstage.io/docs/cli/new for information on how to configure package templating`,\n );\n }\n\n await createNewPackage({\n prefilledParams,\n preselectedTemplateId: select,\n configOverrides: {\n license,\n version: baseVersion,\n private: isPrivate,\n publishRegistry: npmRegistry,\n packageNamePrefix: packagePrefix,\n packageNamePluginInfix: pluginInfix,\n },\n skipInstall: Boolean(skipInstall),\n });\n};\n\nfunction parseParams(optionStrings: string[]): Record<string, string> {\n const options: Record<string, string> = {};\n\n for (const str of optionStrings) {\n const [key] = str.split('=', 1);\n const value = str.slice(key.length + 1);\n if (!key || str[key.length] !== '=') {\n throw new Error(\n `Invalid option '${str}', must be of the format <key>=<value>`,\n );\n }\n options[key] = value;\n }\n\n return options;\n}\n"],"names":["cli","createNewPackage"],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var cliNode = require('@backstage/cli-node');
|
|
6
|
+
var errors = require('@backstage/errors');
|
|
7
|
+
var _package = require('./packages/cli-module-new/package.json.cjs.js');
|
|
8
|
+
|
|
9
|
+
var index = cliNode.createCliModule({
|
|
10
|
+
packageJson: _package.default,
|
|
11
|
+
init: async (reg) => {
|
|
12
|
+
reg.addCommand({
|
|
13
|
+
path: ["new"],
|
|
14
|
+
description: "Open up an interactive guide to creating new things in your app",
|
|
15
|
+
execute: { loader: () => import('./commands/new.cjs.js') }
|
|
16
|
+
});
|
|
17
|
+
reg.addCommand({
|
|
18
|
+
path: ["create"],
|
|
19
|
+
description: "Create a new Backstage app",
|
|
20
|
+
deprecated: true,
|
|
21
|
+
execute: async () => {
|
|
22
|
+
throw new errors.NotImplementedError(
|
|
23
|
+
`This command has been removed, use 'backstage-cli new' instead`
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
reg.addCommand({
|
|
28
|
+
path: ["create-plugin"],
|
|
29
|
+
description: "Create a new Backstage plugin",
|
|
30
|
+
deprecated: true,
|
|
31
|
+
execute: async () => {
|
|
32
|
+
throw new errors.NotImplementedError(
|
|
33
|
+
`This command has been removed, use 'backstage-cli new' instead`
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
exports.default = index;
|
|
41
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/index.ts"],"sourcesContent":["/*\n * Copyright 2025 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 */\nimport { createCliModule } from '@backstage/cli-node';\nimport { NotImplementedError } from '@backstage/errors';\nimport packageJson from '../package.json';\n\nexport default createCliModule({\n packageJson,\n init: async reg => {\n reg.addCommand({\n path: ['new'],\n description:\n 'Open up an interactive guide to creating new things in your app',\n execute: { loader: () => import('./commands/new') },\n });\n\n reg.addCommand({\n path: ['create'],\n description: 'Create a new Backstage app',\n deprecated: true,\n execute: async () => {\n throw new NotImplementedError(\n `This command has been removed, use 'backstage-cli new' instead`,\n );\n },\n });\n reg.addCommand({\n path: ['create-plugin'],\n description: 'Create a new Backstage plugin',\n deprecated: true,\n execute: async () => {\n throw new NotImplementedError(\n `This command has been removed, use 'backstage-cli new' instead`,\n );\n },\n });\n },\n});\n"],"names":["createCliModule","packageJson","NotImplementedError"],"mappings":";;;;;;;;AAmBA,YAAeA,uBAAA,CAAgB;AAAA,eAC7BC,gBAAA;AAAA,EACA,IAAA,EAAM,OAAM,GAAA,KAAO;AACjB,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,MACZ,WAAA,EACE,iEAAA;AAAA,MACF,SAAS,EAAE,MAAA,EAAQ,MAAM,OAAO,uBAAgB,CAAA;AAAE,KACnD,CAAA;AAED,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,QAAQ,CAAA;AAAA,MACf,WAAA,EAAa,4BAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MACZ,SAAS,YAAY;AACnB,QAAA,MAAM,IAAIC,0BAAA;AAAA,UACR,CAAA,8DAAA;AAAA,SACF;AAAA,MACF;AAAA,KACD,CAAA;AACD,IAAA,GAAA,CAAI,UAAA,CAAW;AAAA,MACb,IAAA,EAAM,CAAC,eAAe,CAAA;AAAA,MACtB,WAAA,EAAa,+BAAA;AAAA,MACb,UAAA,EAAY,IAAA;AAAA,MACZ,SAAS,YAAY;AACnB,QAAA,MAAM,IAAIA,0BAAA;AAAA,UACR,CAAA,8DAAA;AAAA,SACF;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC,CAAA;;;;"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fs = require('fs-extra');
|
|
4
|
+
var path = require('node:path');
|
|
5
|
+
var cliCommon = require('@backstage/cli-common');
|
|
6
|
+
|
|
7
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
|
|
10
|
+
var path__default = /*#__PURE__*/_interopDefaultCompat(path);
|
|
11
|
+
|
|
12
|
+
const TEAM_ID_RE = /^@[-\w]+\/[-\w]+$/;
|
|
13
|
+
const USER_ID_RE = /^@[-\w]+$/;
|
|
14
|
+
const EMAIL_RE = /^[^@]+@[-.\w]+\.[-\w]+$/i;
|
|
15
|
+
const DEFAULT_OWNER = "@backstage/maintainers";
|
|
16
|
+
async function getCodeownersFilePath(rootDir) {
|
|
17
|
+
const possiblePaths = [
|
|
18
|
+
path__default.default.join(rootDir, ".github", "CODEOWNERS"),
|
|
19
|
+
path__default.default.join(rootDir, ".gitlab", "CODEOWNERS"),
|
|
20
|
+
path__default.default.join(rootDir, "docs", "CODEOWNERS"),
|
|
21
|
+
path__default.default.join(rootDir, "CODEOWNERS")
|
|
22
|
+
];
|
|
23
|
+
for (const p of possiblePaths) {
|
|
24
|
+
if (await fs__default.default.pathExists(p)) {
|
|
25
|
+
return p;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return void 0;
|
|
29
|
+
}
|
|
30
|
+
function isValidSingleOwnerId(id) {
|
|
31
|
+
if (!id || typeof id !== "string") {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
return TEAM_ID_RE.test(id) || USER_ID_RE.test(id) || EMAIL_RE.test(id);
|
|
35
|
+
}
|
|
36
|
+
function parseOwnerIds(spaceSeparatedOwnerIds) {
|
|
37
|
+
if (!spaceSeparatedOwnerIds || typeof spaceSeparatedOwnerIds !== "string") {
|
|
38
|
+
return void 0;
|
|
39
|
+
}
|
|
40
|
+
const ids = spaceSeparatedOwnerIds.split(" ").filter(Boolean);
|
|
41
|
+
if (!ids.every(isValidSingleOwnerId)) {
|
|
42
|
+
return void 0;
|
|
43
|
+
}
|
|
44
|
+
return ids;
|
|
45
|
+
}
|
|
46
|
+
async function addCodeownersEntry(ownedPath, ownerStr, codeownersFilePath) {
|
|
47
|
+
const ownerIds = parseOwnerIds(ownerStr);
|
|
48
|
+
if (!ownerIds || ownerIds.length === 0) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
let filePath = codeownersFilePath;
|
|
52
|
+
if (!filePath) {
|
|
53
|
+
filePath = await getCodeownersFilePath(cliCommon.targetPaths.rootDir);
|
|
54
|
+
if (!filePath) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const allLines = (await fs__default.default.readFile(filePath, "utf8")).split("\n");
|
|
59
|
+
const commentLines = [];
|
|
60
|
+
for (const line of allLines) {
|
|
61
|
+
if (line[0] !== "#") {
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
commentLines.push(line);
|
|
65
|
+
}
|
|
66
|
+
const oldDeclarationEntries = allLines.filter((line) => line[0] !== "#").map((line) => line.split(/\s+/).filter(Boolean)).filter((tokens) => tokens.length >= 2).map((tokens) => ({
|
|
67
|
+
ownedPath: tokens[0],
|
|
68
|
+
ownerIds: tokens.slice(1)
|
|
69
|
+
}));
|
|
70
|
+
const newDeclarationEntries = oldDeclarationEntries.filter((entry) => entry.ownedPath !== "*").concat([{ ownedPath, ownerIds }]).sort((l1, l2) => l1.ownedPath.localeCompare(l2.ownedPath));
|
|
71
|
+
newDeclarationEntries.unshift({
|
|
72
|
+
ownedPath: "*",
|
|
73
|
+
ownerIds: [DEFAULT_OWNER]
|
|
74
|
+
});
|
|
75
|
+
const longestOwnedPath = newDeclarationEntries.reduce(
|
|
76
|
+
(length, entry) => Math.max(length, entry.ownedPath.length),
|
|
77
|
+
0
|
|
78
|
+
);
|
|
79
|
+
const newDeclarationLines = newDeclarationEntries.map((entry) => {
|
|
80
|
+
const entryPath = entry.ownedPath + " ".repeat(longestOwnedPath - entry.ownedPath.length);
|
|
81
|
+
return [entryPath, ...entry.ownerIds].join(" ");
|
|
82
|
+
});
|
|
83
|
+
const newLines = [...commentLines, "", ...newDeclarationLines, ""];
|
|
84
|
+
await fs__default.default.writeFile(filePath, newLines.join("\n"), "utf8");
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
exports.addCodeownersEntry = addCodeownersEntry;
|
|
89
|
+
exports.getCodeownersFilePath = getCodeownersFilePath;
|
|
90
|
+
exports.isValidSingleOwnerId = isValidSingleOwnerId;
|
|
91
|
+
exports.parseOwnerIds = parseOwnerIds;
|
|
92
|
+
//# sourceMappingURL=codeowners.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codeowners.cjs.js","sources":["../../../src/lib/codeowners/codeowners.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 fs from 'fs-extra';\nimport path from 'node:path';\nimport { targetPaths } from '@backstage/cli-common';\n\nconst TEAM_ID_RE = /^@[-\\w]+\\/[-\\w]+$/;\nconst USER_ID_RE = /^@[-\\w]+$/;\nconst EMAIL_RE = /^[^@]+@[-.\\w]+\\.[-\\w]+$/i;\nconst DEFAULT_OWNER = '@backstage/maintainers';\n\ntype CodeownersEntry = {\n ownedPath: string;\n ownerIds: string[];\n};\n\nexport async function getCodeownersFilePath(\n rootDir: string,\n): Promise<string | undefined> {\n const possiblePaths = [\n path.join(rootDir, '.github', 'CODEOWNERS'),\n path.join(rootDir, '.gitlab', 'CODEOWNERS'),\n path.join(rootDir, 'docs', 'CODEOWNERS'),\n path.join(rootDir, 'CODEOWNERS'),\n ];\n\n for (const p of possiblePaths) {\n if (await fs.pathExists(p)) {\n return p;\n }\n }\n\n return undefined;\n}\n\nexport function isValidSingleOwnerId(id: string): boolean {\n if (!id || typeof id !== 'string') {\n return false;\n }\n\n return TEAM_ID_RE.test(id) || USER_ID_RE.test(id) || EMAIL_RE.test(id);\n}\n\nexport function parseOwnerIds(\n spaceSeparatedOwnerIds: string | undefined,\n): string[] | undefined {\n if (!spaceSeparatedOwnerIds || typeof spaceSeparatedOwnerIds !== 'string') {\n return undefined;\n }\n\n const ids = spaceSeparatedOwnerIds.split(' ').filter(Boolean);\n if (!ids.every(isValidSingleOwnerId)) {\n return undefined;\n }\n\n return ids;\n}\n\nexport async function addCodeownersEntry(\n ownedPath: string,\n ownerStr: string,\n codeownersFilePath?: string,\n): Promise<boolean> {\n const ownerIds = parseOwnerIds(ownerStr);\n if (!ownerIds || ownerIds.length === 0) {\n return false;\n }\n\n let filePath = codeownersFilePath;\n if (!filePath) {\n filePath = await getCodeownersFilePath(targetPaths.rootDir);\n if (!filePath) {\n return false;\n }\n }\n\n const allLines = (await fs.readFile(filePath, 'utf8')).split('\\n');\n\n // Only keep comments from the top of the file\n const commentLines = [];\n for (const line of allLines) {\n if (line[0] !== '#') {\n break;\n }\n commentLines.push(line);\n }\n\n const oldDeclarationEntries: CodeownersEntry[] = allLines\n .filter(line => line[0] !== '#')\n .map(line => line.split(/\\s+/).filter(Boolean))\n .filter(tokens => tokens.length >= 2)\n .map(tokens => ({\n ownedPath: tokens[0],\n ownerIds: tokens.slice(1),\n }));\n\n const newDeclarationEntries = oldDeclarationEntries\n .filter(entry => entry.ownedPath !== '*')\n .concat([{ ownedPath, ownerIds }])\n .sort((l1, l2) => l1.ownedPath.localeCompare(l2.ownedPath));\n newDeclarationEntries.unshift({\n ownedPath: '*',\n ownerIds: [DEFAULT_OWNER],\n });\n\n // Calculate longest path to be able to align entries nicely\n const longestOwnedPath = newDeclarationEntries.reduce(\n (length, entry) => Math.max(length, entry.ownedPath.length),\n 0,\n );\n\n const newDeclarationLines = newDeclarationEntries.map(entry => {\n const entryPath =\n entry.ownedPath + ' '.repeat(longestOwnedPath - entry.ownedPath.length);\n return [entryPath, ...entry.ownerIds].join(' ');\n });\n\n const newLines = [...commentLines, '', ...newDeclarationLines, ''];\n\n await fs.writeFile(filePath, newLines.join('\\n'), 'utf8');\n\n return true;\n}\n"],"names":["path","fs","targetPaths"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var collectPortableTemplateInput = require('./preparation/collectPortableTemplateInput.cjs.js');
|
|
4
|
+
var loadPortableTemplateConfig = require('./preparation/loadPortableTemplateConfig.cjs.js');
|
|
5
|
+
var selectTemplateInteractively = require('./preparation/selectTemplateInteractively.cjs.js');
|
|
6
|
+
var loadPortableTemplate = require('./preparation/loadPortableTemplate.cjs.js');
|
|
7
|
+
var executePortableTemplate = require('./execution/executePortableTemplate.cjs.js');
|
|
8
|
+
|
|
9
|
+
async function createNewPackage(options) {
|
|
10
|
+
const config = await loadPortableTemplateConfig.loadPortableTemplateConfig({
|
|
11
|
+
overrides: options.configOverrides
|
|
12
|
+
});
|
|
13
|
+
const selectedTemplate = await selectTemplateInteractively.selectTemplateInteractively(
|
|
14
|
+
config,
|
|
15
|
+
options.preselectedTemplateId
|
|
16
|
+
);
|
|
17
|
+
const template = await loadPortableTemplate.loadPortableTemplate(selectedTemplate);
|
|
18
|
+
const input = await collectPortableTemplateInput.collectPortableTemplateInput({
|
|
19
|
+
config,
|
|
20
|
+
template,
|
|
21
|
+
prefilledParams: options.prefilledParams
|
|
22
|
+
});
|
|
23
|
+
await executePortableTemplate.executePortableTemplate({
|
|
24
|
+
config,
|
|
25
|
+
template,
|
|
26
|
+
input,
|
|
27
|
+
skipInstall: options.skipInstall
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
exports.createNewPackage = createNewPackage;
|
|
32
|
+
//# sourceMappingURL=createNewPackage.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createNewPackage.cjs.js","sources":["../../src/lib/createNewPackage.ts"],"sourcesContent":["/*\n * Copyright 2025 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 {\n collectPortableTemplateInput,\n loadPortableTemplate,\n loadPortableTemplateConfig,\n selectTemplateInteractively,\n} from './preparation';\nimport { executePortableTemplate } from './execution';\nimport { PortableTemplateConfig, PortableTemplateParams } from './types';\n\nexport type CreateNewPackageOptions = {\n preselectedTemplateId?: string;\n configOverrides: Partial<PortableTemplateConfig>;\n prefilledParams: PortableTemplateParams;\n skipInstall?: boolean;\n};\n\nexport async function createNewPackage(options: CreateNewPackageOptions) {\n const config = await loadPortableTemplateConfig({\n overrides: options.configOverrides,\n });\n\n const selectedTemplate = await selectTemplateInteractively(\n config,\n options.preselectedTemplateId,\n );\n const template = await loadPortableTemplate(selectedTemplate);\n\n const input = await collectPortableTemplateInput({\n config,\n template,\n prefilledParams: options.prefilledParams,\n });\n\n await executePortableTemplate({\n config,\n template,\n input,\n skipInstall: options.skipInstall,\n });\n}\n"],"names":["loadPortableTemplateConfig","selectTemplateInteractively","loadPortableTemplate","collectPortableTemplateInput","executePortableTemplate"],"mappings":";;;;;;;;AAgCA,eAAsB,iBAAiB,OAAA,EAAkC;AACvE,EAAA,MAAM,MAAA,GAAS,MAAMA,qDAAA,CAA2B;AAAA,IAC9C,WAAW,OAAA,CAAQ;AAAA,GACpB,CAAA;AAED,EAAA,MAAM,mBAAmB,MAAMC,uDAAA;AAAA,IAC7B,MAAA;AAAA,IACA,OAAA,CAAQ;AAAA,GACV;AACA,EAAA,MAAM,QAAA,GAAW,MAAMC,yCAAA,CAAqB,gBAAgB,CAAA;AAE5D,EAAA,MAAM,KAAA,GAAQ,MAAMC,yDAAA,CAA6B;AAAA,IAC/C,MAAA;AAAA,IACA,QAAA;AAAA,IACA,iBAAiB,OAAA,CAAQ;AAAA,GAC1B,CAAA;AAED,EAAA,MAAMC,+CAAA,CAAwB;AAAA,IAC5B,MAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAa,OAAA,CAAQ;AAAA,GACtB,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const defaultTemplates = [
|
|
4
|
+
"@backstage/cli/templates/frontend-plugin",
|
|
5
|
+
"@backstage/cli/templates/backend-plugin",
|
|
6
|
+
"@backstage/cli/templates/backend-plugin-module",
|
|
7
|
+
"@backstage/cli/templates/plugin-web-library",
|
|
8
|
+
"@backstage/cli/templates/plugin-node-library",
|
|
9
|
+
"@backstage/cli/templates/plugin-common-library",
|
|
10
|
+
"@backstage/cli/templates/web-library",
|
|
11
|
+
"@backstage/cli/templates/node-library",
|
|
12
|
+
"@backstage/cli/templates/catalog-provider-module",
|
|
13
|
+
"@backstage/cli/templates/scaffolder-backend-module"
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
exports.defaultTemplates = defaultTemplates;
|
|
17
|
+
//# sourceMappingURL=defaultTemplates.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultTemplates.cjs.js","sources":["../../src/lib/defaultTemplates.ts"],"sourcesContent":["/*\n * Copyright 2025 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\nexport const defaultTemplates = [\n '@backstage/cli/templates/frontend-plugin',\n '@backstage/cli/templates/backend-plugin',\n '@backstage/cli/templates/backend-plugin-module',\n '@backstage/cli/templates/plugin-web-library',\n '@backstage/cli/templates/plugin-node-library',\n '@backstage/cli/templates/plugin-common-library',\n '@backstage/cli/templates/web-library',\n '@backstage/cli/templates/node-library',\n '@backstage/cli/templates/catalog-provider-module',\n '@backstage/cli/templates/scaffolder-backend-module',\n];\n"],"names":[],"mappings":";;AAgBO,MAAM,gBAAA,GAAmB;AAAA,EAC9B,0CAAA;AAAA,EACA,yCAAA;AAAA,EACA,gDAAA;AAAA,EACA,6CAAA;AAAA,EACA,8CAAA;AAAA,EACA,gDAAA;AAAA,EACA,sCAAA;AAAA,EACA,uCAAA;AAAA,EACA,kDAAA;AAAA,EACA;AACF;;;;"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var handlebars = require('handlebars');
|
|
4
|
+
var camelCase = require('lodash/camelCase');
|
|
5
|
+
var kebabCase = require('lodash/kebabCase');
|
|
6
|
+
var lowerCase = require('lodash/lowerCase');
|
|
7
|
+
var snakeCase = require('lodash/snakeCase');
|
|
8
|
+
var startCase = require('lodash/startCase');
|
|
9
|
+
var upperCase = require('lodash/upperCase');
|
|
10
|
+
var upperFirst = require('lodash/upperFirst');
|
|
11
|
+
var lowerFirst = require('lodash/lowerFirst');
|
|
12
|
+
var cliNode = require('@backstage/cli-node');
|
|
13
|
+
var cliCommon = require('@backstage/cli-common');
|
|
14
|
+
var version = require('../version.cjs.js');
|
|
15
|
+
|
|
16
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
|
|
17
|
+
|
|
18
|
+
var handlebars__default = /*#__PURE__*/_interopDefaultCompat(handlebars);
|
|
19
|
+
var camelCase__default = /*#__PURE__*/_interopDefaultCompat(camelCase);
|
|
20
|
+
var kebabCase__default = /*#__PURE__*/_interopDefaultCompat(kebabCase);
|
|
21
|
+
var lowerCase__default = /*#__PURE__*/_interopDefaultCompat(lowerCase);
|
|
22
|
+
var snakeCase__default = /*#__PURE__*/_interopDefaultCompat(snakeCase);
|
|
23
|
+
var startCase__default = /*#__PURE__*/_interopDefaultCompat(startCase);
|
|
24
|
+
var upperCase__default = /*#__PURE__*/_interopDefaultCompat(upperCase);
|
|
25
|
+
var upperFirst__default = /*#__PURE__*/_interopDefaultCompat(upperFirst);
|
|
26
|
+
var lowerFirst__default = /*#__PURE__*/_interopDefaultCompat(lowerFirst);
|
|
27
|
+
|
|
28
|
+
const builtInHelpers = {
|
|
29
|
+
camelCase: camelCase__default.default,
|
|
30
|
+
kebabCase: kebabCase__default.default,
|
|
31
|
+
lowerCase: lowerCase__default.default,
|
|
32
|
+
snakeCase: snakeCase__default.default,
|
|
33
|
+
startCase: startCase__default.default,
|
|
34
|
+
upperCase: upperCase__default.default,
|
|
35
|
+
upperFirst: upperFirst__default.default,
|
|
36
|
+
lowerFirst: lowerFirst__default.default
|
|
37
|
+
};
|
|
38
|
+
class PortableTemplater {
|
|
39
|
+
static async create(options = {}) {
|
|
40
|
+
let lockfile;
|
|
41
|
+
try {
|
|
42
|
+
lockfile = await cliNode.Lockfile.load(cliCommon.targetPaths.resolveRoot("yarn.lock"));
|
|
43
|
+
} catch {
|
|
44
|
+
}
|
|
45
|
+
const yarnPluginEnabled = await cliNode.hasBackstageYarnPlugin();
|
|
46
|
+
const versionProvider = version.createPackageVersionProvider(lockfile, {
|
|
47
|
+
preferBackstageProtocol: yarnPluginEnabled
|
|
48
|
+
});
|
|
49
|
+
const templater = new PortableTemplater(
|
|
50
|
+
{
|
|
51
|
+
versionQuery(name, versionHint) {
|
|
52
|
+
return versionProvider(
|
|
53
|
+
name,
|
|
54
|
+
typeof versionHint === "string" ? versionHint : void 0
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
options.values ?? {}
|
|
59
|
+
);
|
|
60
|
+
if (options.templatedValues) {
|
|
61
|
+
templater.appendTemplatedValues(options.templatedValues);
|
|
62
|
+
}
|
|
63
|
+
return templater;
|
|
64
|
+
}
|
|
65
|
+
#templater;
|
|
66
|
+
#values;
|
|
67
|
+
constructor(helpers, values) {
|
|
68
|
+
this.#templater = handlebars__default.default.create();
|
|
69
|
+
this.#templater.registerHelper(builtInHelpers);
|
|
70
|
+
if (helpers) {
|
|
71
|
+
this.#templater.registerHelper(helpers);
|
|
72
|
+
}
|
|
73
|
+
this.#values = values;
|
|
74
|
+
}
|
|
75
|
+
template(content) {
|
|
76
|
+
return this.#templater.compile(content, {
|
|
77
|
+
strict: true
|
|
78
|
+
})(this.#values);
|
|
79
|
+
}
|
|
80
|
+
appendTemplatedValues(record) {
|
|
81
|
+
const newValues = Object.fromEntries(
|
|
82
|
+
Object.entries(record).map(([key, value]) => [key, this.template(value)])
|
|
83
|
+
);
|
|
84
|
+
this.#values = { ...this.#values, ...newValues };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
exports.PortableTemplater = PortableTemplater;
|
|
89
|
+
//# sourceMappingURL=PortableTemplater.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PortableTemplater.cjs.js","sources":["../../../src/lib/execution/PortableTemplater.ts"],"sourcesContent":["/*\n * Copyright 2025 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 handlebars from 'handlebars';\nimport { PortableTemplateParams } from '../types';\nimport camelCase from 'lodash/camelCase';\nimport kebabCase from 'lodash/kebabCase';\nimport lowerCase from 'lodash/lowerCase';\nimport snakeCase from 'lodash/snakeCase';\nimport startCase from 'lodash/startCase';\nimport upperCase from 'lodash/upperCase';\nimport upperFirst from 'lodash/upperFirst';\nimport lowerFirst from 'lodash/lowerFirst';\nimport { Lockfile } from '@backstage/cli-node';\nimport { targetPaths } from '@backstage/cli-common';\n\nimport { createPackageVersionProvider } from '../version';\nimport { hasBackstageYarnPlugin } from '@backstage/cli-node';\n\nconst builtInHelpers = {\n camelCase,\n kebabCase,\n lowerCase,\n snakeCase,\n startCase,\n upperCase,\n upperFirst,\n lowerFirst,\n};\n\ntype CreatePortableTemplaterOptions = {\n values?: PortableTemplateParams;\n templatedValues?: Record<string, string>;\n};\n\nexport class PortableTemplater {\n static async create(options: CreatePortableTemplaterOptions = {}) {\n let lockfile: Lockfile | undefined;\n try {\n lockfile = await Lockfile.load(targetPaths.resolveRoot('yarn.lock'));\n } catch {\n /* ignored */\n }\n\n const yarnPluginEnabled = await hasBackstageYarnPlugin();\n const versionProvider = createPackageVersionProvider(lockfile, {\n preferBackstageProtocol: yarnPluginEnabled,\n });\n\n const templater = new PortableTemplater(\n {\n versionQuery(name: string, versionHint: string | unknown) {\n return versionProvider(\n name,\n typeof versionHint === 'string' ? versionHint : undefined,\n );\n },\n },\n options.values ?? {},\n );\n\n if (options.templatedValues) {\n templater.appendTemplatedValues(options.templatedValues);\n }\n\n return templater;\n }\n\n readonly #templater: typeof handlebars;\n #values: PortableTemplateParams;\n\n private constructor(\n helpers: handlebars.HelperDeclareSpec,\n values: PortableTemplateParams,\n ) {\n this.#templater = handlebars.create();\n\n this.#templater.registerHelper(builtInHelpers);\n\n if (helpers) {\n this.#templater.registerHelper(helpers);\n }\n\n this.#values = values;\n }\n\n template(content: string): string {\n return this.#templater.compile(content, {\n strict: true,\n })(this.#values);\n }\n\n appendTemplatedValues(record: Record<string, string>): void {\n const newValues = Object.fromEntries(\n Object.entries(record).map(([key, value]) => [key, this.template(value)]),\n );\n this.#values = { ...this.#values, ...newValues };\n }\n}\n"],"names":["camelCase","kebabCase","lowerCase","snakeCase","startCase","upperCase","upperFirst","lowerFirst","Lockfile","targetPaths","hasBackstageYarnPlugin","createPackageVersionProvider","handlebars"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,MAAM,cAAA,GAAiB;AAAA,aACrBA,0BAAA;AAAA,aACAC,0BAAA;AAAA,aACAC,0BAAA;AAAA,aACAC,0BAAA;AAAA,aACAC,0BAAA;AAAA,aACAC,0BAAA;AAAA,cACAC,2BAAA;AAAA,cACAC;AACF,CAAA;AAOO,MAAM,iBAAA,CAAkB;AAAA,EAC7B,aAAa,MAAA,CAAO,OAAA,GAA0C,EAAC,EAAG;AAChE,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAMC,gBAAA,CAAS,IAAA,CAAKC,qBAAA,CAAY,WAAA,CAAY,WAAW,CAAC,CAAA;AAAA,IACrE,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,iBAAA,GAAoB,MAAMC,8BAAA,EAAuB;AACvD,IAAA,MAAM,eAAA,GAAkBC,qCAA6B,QAAA,EAAU;AAAA,MAC7D,uBAAA,EAAyB;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,YAAY,IAAI,iBAAA;AAAA,MACpB;AAAA,QACE,YAAA,CAAa,MAAc,WAAA,EAA+B;AACxD,UAAA,OAAO,eAAA;AAAA,YACL,IAAA;AAAA,YACA,OAAO,WAAA,KAAgB,QAAA,GAAW,WAAA,GAAc;AAAA,WAClD;AAAA,QACF;AAAA,OACF;AAAA,MACA,OAAA,CAAQ,UAAU;AAAC,KACrB;AAEA,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,SAAA,CAAU,qBAAA,CAAsB,QAAQ,eAAe,CAAA;AAAA,IACzD;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAES,UAAA;AAAA,EACT,OAAA;AAAA,EAEQ,WAAA,CACN,SACA,MAAA,EACA;AACA,IAAA,IAAA,CAAK,UAAA,GAAaC,4BAAW,MAAA,EAAO;AAEpC,IAAA,IAAA,CAAK,UAAA,CAAW,eAAe,cAAc,CAAA;AAE7C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,UAAA,CAAW,eAAe,OAAO,CAAA;AAAA,IACxC;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA,EAEA,SAAS,OAAA,EAAyB;AAChC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAS;AAAA,MACtC,MAAA,EAAQ;AAAA,KACT,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA;AAAA,EACjB;AAAA,EAEA,sBAAsB,MAAA,EAAsC;AAC1D,IAAA,MAAM,YAAY,MAAA,CAAO,WAAA;AAAA,MACvB,OAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAC,GAAA,EAAK,IAAA,CAAK,QAAA,CAAS,KAAK,CAAC,CAAC;AAAA,KAC1E;AACA,IAAA,IAAA,CAAK,UAAU,EAAE,GAAG,IAAA,CAAK,OAAA,EAAS,GAAG,SAAA,EAAU;AAAA,EACjD;AACF;;;;"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var errors = require('@backstage/errors');
|
|
4
|
+
var codeowners = require('../codeowners/codeowners.cjs.js');
|
|
5
|
+
var tasks = require('../tasks.cjs.js');
|
|
6
|
+
var installNewPackage = require('./installNewPackage.cjs.js');
|
|
7
|
+
var writeTemplateContents = require('./writeTemplateContents.cjs.js');
|
|
8
|
+
var cliCommon = require('@backstage/cli-common');
|
|
9
|
+
|
|
10
|
+
async function executePortableTemplate(options) {
|
|
11
|
+
const { template, input } = options;
|
|
12
|
+
let modified = false;
|
|
13
|
+
try {
|
|
14
|
+
const { targetDir } = await tasks.Task.forItem(
|
|
15
|
+
"templating",
|
|
16
|
+
input.packagePath,
|
|
17
|
+
() => writeTemplateContents.writeTemplateContents(template, input)
|
|
18
|
+
);
|
|
19
|
+
modified = true;
|
|
20
|
+
await installNewPackage.installNewPackage(input);
|
|
21
|
+
if (input.owner) {
|
|
22
|
+
await codeowners.addCodeownersEntry(targetDir, input.owner);
|
|
23
|
+
}
|
|
24
|
+
if (!options.skipInstall) {
|
|
25
|
+
for (const command of [
|
|
26
|
+
["yarn", "install"],
|
|
27
|
+
["yarn", "lint", "--fix"]
|
|
28
|
+
]) {
|
|
29
|
+
const commandStr = command.join(" ");
|
|
30
|
+
try {
|
|
31
|
+
await tasks.Task.forItem("executing", commandStr, async () => {
|
|
32
|
+
await cliCommon.run(command, {
|
|
33
|
+
cwd: targetDir,
|
|
34
|
+
stdio: "ignore"
|
|
35
|
+
}).waitForExit();
|
|
36
|
+
});
|
|
37
|
+
} catch (error) {
|
|
38
|
+
errors.assertError(error);
|
|
39
|
+
tasks.Task.error(
|
|
40
|
+
`Warning: Failed to execute command '${commandStr}', ${error}`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
tasks.Task.log();
|
|
46
|
+
tasks.Task.log(`\u{1F389} Successfully created ${template.name}`);
|
|
47
|
+
tasks.Task.log();
|
|
48
|
+
} catch (error) {
|
|
49
|
+
errors.assertError(error);
|
|
50
|
+
tasks.Task.error(error.message);
|
|
51
|
+
if (modified) {
|
|
52
|
+
tasks.Task.log("It seems that something went wrong in the creation process \u{1F914}");
|
|
53
|
+
tasks.Task.log();
|
|
54
|
+
tasks.Task.log(
|
|
55
|
+
"We have left the changes that were made intact in case you want to"
|
|
56
|
+
);
|
|
57
|
+
tasks.Task.log(
|
|
58
|
+
"continue manually, but you can also revert the changes and try again."
|
|
59
|
+
);
|
|
60
|
+
tasks.Task.error(`\u{1F525} Failed to create ${template.name}!`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
exports.executePortableTemplate = executePortableTemplate;
|
|
66
|
+
//# sourceMappingURL=executePortableTemplate.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executePortableTemplate.cjs.js","sources":["../../../src/lib/execution/executePortableTemplate.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { assertError } from '@backstage/errors';\nimport { addCodeownersEntry } from '../codeowners';\nimport { Task } from '../tasks';\nimport {\n PortableTemplate,\n PortableTemplateConfig,\n PortableTemplateInput,\n} from '../types';\nimport { installNewPackage } from './installNewPackage';\nimport { writeTemplateContents } from './writeTemplateContents';\nimport { run } from '@backstage/cli-common';\n\ntype ExecuteNewTemplateOptions = {\n config: PortableTemplateConfig;\n template: PortableTemplate;\n input: PortableTemplateInput;\n skipInstall?: boolean;\n};\n\nexport async function executePortableTemplate(\n options: ExecuteNewTemplateOptions,\n) {\n const { template, input } = options;\n\n let modified = false;\n try {\n const { targetDir } = await Task.forItem(\n 'templating',\n input.packagePath,\n () => writeTemplateContents(template, input),\n );\n\n modified = true;\n\n await installNewPackage(input);\n\n if (input.owner) {\n await addCodeownersEntry(targetDir, input.owner);\n }\n\n if (!options.skipInstall) {\n for (const command of [\n ['yarn', 'install'],\n ['yarn', 'lint', '--fix'],\n ]) {\n const commandStr = command.join(' ');\n try {\n await Task.forItem('executing', commandStr, async () => {\n await run(command, {\n cwd: targetDir,\n stdio: 'ignore',\n }).waitForExit();\n });\n } catch (error) {\n assertError(error);\n Task.error(\n `Warning: Failed to execute command '${commandStr}', ${error}`,\n );\n }\n }\n }\n\n Task.log();\n Task.log(`🎉 Successfully created ${template.name}`);\n Task.log();\n } catch (error) {\n assertError(error);\n Task.error(error.message);\n\n if (modified) {\n Task.log('It seems that something went wrong in the creation process 🤔');\n Task.log();\n Task.log(\n 'We have left the changes that were made intact in case you want to',\n );\n Task.log(\n 'continue manually, but you can also revert the changes and try again.',\n );\n\n Task.error(`🔥 Failed to create ${template.name}!`);\n }\n }\n}\n"],"names":["Task","writeTemplateContents","installNewPackage","addCodeownersEntry","run","assertError"],"mappings":";;;;;;;;;AAmCA,eAAsB,wBACpB,OAAA,EACA;AACA,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,OAAA;AAE5B,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAMA,UAAA,CAAK,OAAA;AAAA,MAC/B,YAAA;AAAA,MACA,KAAA,CAAM,WAAA;AAAA,MACN,MAAMC,2CAAA,CAAsB,QAAA,EAAU,KAAK;AAAA,KAC7C;AAEA,IAAA,QAAA,GAAW,IAAA;AAEX,IAAA,MAAMC,oCAAkB,KAAK,CAAA;AAE7B,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAMC,6BAAA,CAAmB,SAAA,EAAW,KAAA,CAAM,KAAK,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,CAAC,QAAQ,WAAA,EAAa;AACxB,MAAA,KAAA,MAAW,OAAA,IAAW;AAAA,QACpB,CAAC,QAAQ,SAAS,CAAA;AAAA,QAClB,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO;AAAA,OAC1B,EAAG;AACD,QAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AACnC,QAAA,IAAI;AACF,UAAA,MAAMH,UAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,UAAA,EAAY,YAAY;AACtD,YAAA,MAAMI,cAAI,OAAA,EAAS;AAAA,cACjB,GAAA,EAAK,SAAA;AAAA,cACL,KAAA,EAAO;AAAA,aACR,EAAE,WAAA,EAAY;AAAA,UACjB,CAAC,CAAA;AAAA,QACH,SAAS,KAAA,EAAO;AACd,UAAAC,kBAAA,CAAY,KAAK,CAAA;AACjB,UAAAL,UAAA,CAAK,KAAA;AAAA,YACH,CAAA,oCAAA,EAAuC,UAAU,CAAA,GAAA,EAAM,KAAK,CAAA;AAAA,WAC9D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAAA,UAAA,CAAK,GAAA,EAAI;AACT,IAAAA,UAAA,CAAK,GAAA,CAAI,CAAA,gCAAA,EAA4B,QAAA,CAAS,IAAI,CAAA,CAAE,CAAA;AACpD,IAAAA,UAAA,CAAK,GAAA,EAAI;AAAA,EACX,SAAS,KAAA,EAAO;AACd,IAAAK,kBAAA,CAAY,KAAK,CAAA;AACjB,IAAAL,UAAA,CAAK,KAAA,CAAM,MAAM,OAAO,CAAA;AAExB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAAA,UAAA,CAAK,IAAI,sEAA+D,CAAA;AACxE,MAAAA,UAAA,CAAK,GAAA,EAAI;AACT,MAAAA,UAAA,CAAK,GAAA;AAAA,QACH;AAAA,OACF;AACA,MAAAA,UAAA,CAAK,GAAA;AAAA,QACH;AAAA,OACF;AAEA,MAAAA,UAAA,CAAK,KAAA,CAAM,CAAA,4BAAA,EAAwB,QAAA,CAAS,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IACrD;AAAA,EACF;AACF;;;;"}
|