table: flagsTable()

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) {