in packages/aws-cdk-lib/cx-api/build-tools/flag-report.ts [11:115]
table: flagsTable(),
details: flagsDetails(),
json: recommendedJson(),
removed: removedFlags(),
diff: changedFlags(),
migratejson: migrateJson(),
});
// Write to the package root
await updateRecommendedFlagsFile(path.join(__dirname, '..', '..', 'recommended-feature-flags.json'));
}
function flagsTable() {
return renderTable([
['Flag', 'Summary', 'Since', 'Type'],
...v2flags().map(([name, flag]) =>
[
renderLink(mdEsc(name), githubHeadingLink(flagDetailsHeading(name, flag))),
flag.summary,
flag.introducedIn.v2 ?? '',
renderType(flag.type, 'short'),
],
),
]);
}
function removedFlags() {
const removedInV2 = flags(flag => flag.introducedIn.v2 === undefined && flag.introducedIn.v1 !== undefined);
return renderTable([
['Flag', 'Summary', 'Type', 'Since'],
...removedInV2.map(([name, flag]) => [
renderLink(mdEsc(name), githubHeadingLink(flagDetailsHeading(name, flag))),
flag.summary,
renderType(flag.type, 'short'),
flag.introducedIn.v1 ?? '',
]),
]);
}
function changedFlags() {
const changedInV2 = flags(flag => !!flag.defaults?.v2 && !!flag.introducedIn.v2);
return renderTable([
['Flag', 'Summary', 'Type', 'Since', 'v1 default', 'v2 default'],
...changedInV2.map(([name, flag]) => [
renderLink(mdEsc(name), githubHeadingLink(flagDetailsHeading(name, flag))),
flag.summary,
renderType(flag.type, 'short'),
flag.introducedIn.v1 ?? '',
renderValue(false),
renderValue(flag.defaults?.v2),
]),
]);
}
function migrateJson() {
const changedInV2 = flags(flag => !!flag.defaults?.v2 && !!flag.introducedIn.v2 && !!flag.introducedIn.v1);
const context = Object.fromEntries(changedInV2.map(([name, _]) => [name, false]));
return [
'```json',
JSON.stringify({ context }, undefined, 2),
'```',
].join('\n');
}
function flagsDetails() {
const allFlags = flags(_ => true);
return allFlags.flatMap(([name, flag]) => [
`### ${flagDetailsHeading(name, flag)}`,
'',
`*${flag.summary}*`,
'',
`Flag type: ${renderType(flag.type, 'long')}`,
'',
dedent(flag.detailsMd),
'',
renderTable([
['Since', 'Default', 'Recommended'],
// V1
flag.introducedIn.v1
? [flag.introducedIn.v1, renderValue(false), renderValue(flag.recommendedValue)]
: ['(not in v1)', '', ''],
// V2
flag.introducedIn.v2
? [flag.introducedIn.v2, renderValue(flag.defaults?.v2 ?? false), renderValue(flag.recommendedValue)]
: flag.defaults?.v2 !== undefined
? ['(default in v2)', renderValue(flag.defaults?.v2), '']
: ['(not in v2)', '', ''],
]),
...oldBehavior(flag) ? [
`**Compatibility with old behavior:** ${oldBehavior(flag)}`,
'',
] : [],
'',
]).join('\n');
}
function oldBehavior(flag: FlagInfo): string | undefined {
switch (flag.type) {