Get templates and globals from pkg.json

Signed-off-by: Min Kim <minkimcello@gmail.com>
This commit is contained in:
Min Kim
2024-09-26 09:35:39 -04:00
parent fb8c558f17
commit 03c9b8744b
+105 -89
View File
@@ -23,98 +23,114 @@ import { isMonoRepo } from '@backstage/cli-node';
import { paths } from '../../lib/paths';
import { assertError } from '@backstage/errors';
import { Task } from '../../lib/tasks';
import defaultTemplates from '../../../templates/alpha/all-default-templates';
function parseOptions(optionStrings: string[]): Record<string, string> {
const options: Record<string, string> = {};
for (const str of optionStrings) {
const [key] = str.split('=', 1);
const value = str.slice(key.length + 1);
if (!key || str[key.length] !== '=') {
throw new Error(
`Invalid option '${str}', must be of the format <key>=<value>`,
);
}
options[key] = value;
}
return options;
interface TemplateLocation {
id: string;
target: string;
}
export default async (opts: OptionValues) => {
const factory = await FactoryRegistry.interactiveSelect(opts.select);
const providedOptions = parseOptions(opts.option);
const options = await FactoryRegistry.populateOptions(
factory,
providedOptions,
);
let defaultVersion = '0.1.0';
if (opts.baseVersion) {
defaultVersion = opts.baseVersion;
} else {
const lernaVersion = await fs
.readJson(paths.resolveTargetRoot('lerna.json'))
.then(pkg => pkg.version)
.catch(() => undefined);
if (lernaVersion) {
defaultVersion = lernaVersion;
}
}
const tempDirs = new Array<string>();
async function createTemporaryDirectory(name: string): Promise<string> {
const dir = await fs.mkdtemp(joinPath(os.tmpdir(), name));
tempDirs.push(dir);
return dir;
}
const license = opts.license ?? 'Apache-2.0';
let modified = false;
try {
await factory.create(options, {
isMonoRepo: await isMonoRepo(),
defaultVersion,
license,
scope: opts.scope?.replace(/^@/, ''),
npmRegistry: opts.npmRegistry,
private: Boolean(opts.private),
createTemporaryDirectory,
markAsModified() {
modified = true;
},
});
Task.log();
Task.log(`🎉 Successfully created ${factory.name}`);
Task.log();
} catch (error) {
assertError(error);
Task.error(error.message);
if (modified) {
Task.log('It seems that something went wrong in the creation process 🤔');
Task.log();
Task.log(
'We have left the changes that were made intact in case you want to',
);
Task.log(
'continue manually, but you can also revert the changes and try again.',
);
Task.error(`🔥 Failed to create ${factory.name}!`);
}
} finally {
for (const dir of tempDirs) {
try {
await fs.remove(dir);
} catch (error) {
console.error(
`Failed to remove temporary directory '${dir}', ${error}`,
);
async function readCliConfig(
cliConfig:
| {
defaults?: boolean;
templates?: TemplateLocation[];
globals?: Record<string, string>;
}
}
| undefined,
) {
let templates: TemplateLocation[] = [];
const cliTemplates = cliConfig?.templates;
if (!cliConfig || cliConfig?.defaults) {
templates = defaultTemplates;
}
if (cliTemplates?.length) {
cliTemplates.forEach((template: TemplateLocation) => {
templates.push({
id: template.id,
target: template.target,
});
});
}
return {
templates,
globals: { ...cliConfig?.globals },
};
}
export default async () => {
const pkgJson = await fs.readJson(paths.resolveTargetRoot('package.json'));
const cliConfig = pkgJson.backstage?.cli;
const { templates, globals } = await readCliConfig(cliConfig);
console.log(templates, globals);
// let defaultVersion = '0.1.0';
// if (opts.baseVersion) {
// defaultVersion = opts.baseVersion;
// } else {
// const lernaVersion = await fs
// .readJson(paths.resolveTargetRoot('lerna.json'))
// .then(pkg => pkg.version)
// .catch(() => undefined);
// if (lernaVersion) {
// defaultVersion = lernaVersion;
// }
// }
// const tempDirs = new Array<string>();
// async function createTemporaryDirectory(name: string): Promise<string> {
// const dir = await fs.mkdtemp(joinPath(os.tmpdir(), name));
// tempDirs.push(dir);
// return dir;
// }
// const license = opts.license ?? 'Apache-2.0';
// let modified = false;
// try {
// await factory.create(options, {
// isMonoRepo: await isMonoRepo(),
// defaultVersion,
// license,
// scope: opts.scope?.replace(/^@/, ''),
// npmRegistry: opts.npmRegistry,
// private: Boolean(opts.private),
// createTemporaryDirectory,
// markAsModified() {
// modified = true;
// },
// });
// Task.log();
// Task.log(`🎉 Successfully created ${factory.name}`);
// Task.log();
// } catch (error) {
// assertError(error);
// Task.error(error.message);
// if (modified) {
// Task.log('It seems that something went wrong in the creation process 🤔');
// Task.log();
// Task.log(
// 'We have left the changes that were made intact in case you want to',
// );
// Task.log(
// 'continue manually, but you can also revert the changes and try again.',
// );
// Task.error(`🔥 Failed to create ${factory.name}!`);
// }
// } finally {
// for (const dir of tempDirs) {
// try {
// await fs.remove(dir);
// } catch (error) {
// console.error(
// `Failed to remove temporary directory '${dir}', ${error}`,
// );
// }
// }
// }
};