String renderPkgVersionsPage()

in app/lib/frontend/templates/package_versions.dart [21:125]


String renderPkgVersionsPage(
  PackagePageData data,
  List<VersionInfo> versions, {
  required Version dartSdkVersion,
}) {
  final previewVersionRows = <d.Node>[];
  final stableVersionRows = <d.Node>[];
  final prereleaseVersionRows = <d.Node>[];
  final retractedVersionRows = <d.Node>[];
  final latestPrereleaseVersion = data.latestReleases!.showPrerelease
      ? versions.firstWhereOrNull(
          (v) => v.version == data.latestReleases!.prerelease!.version,
        )
      : null;
  for (int i = 0; i < versions.length; i++) {
    final version = versions[i];
    final pubspec = Pubspec.fromJson(version.pubspec);
    final rowNode = versionRowNode(pubspec.name, version, pubspec);
    final semanticVersion = Version.parse(version.version);
    if (version.retracted != null && version.retracted!) {
      retractedVersionRows.add(rowNode);
    } else if (semanticVersion.isPreRelease) {
      prereleaseVersionRows.add(rowNode);
    } else if (pubspec.isPreviewForCurrentSdk(dartSdkVersion)) {
      previewVersionRows.add(rowNode);
    } else {
      stableVersionRows.add(rowNode);
    }
  }

  final blocks = <d.Node>[];
  if (stableVersionRows.isNotEmpty &&
      prereleaseVersionRows.isNotEmpty &&
      data.latestReleases!.showPrerelease) {
    blocks.add(d.p(
      children: [
        d.text('The latest prerelease was '),
        d.a(href: '#prerelease', text: latestPrereleaseVersion!.version),
        d.text(' '),
        d.xAgoTimestamp(latestPrereleaseVersion.published!, datePrefix: 'on'),
        d.text('.'),
      ],
    ));
  }
  if (previewVersionRows.isNotEmpty) {
    blocks.add(versionSectionNode(
      id: 'preview',
      label: 'Preview',
      packageName: data.package!.name!,
      rows: previewVersionRows,
    ));
  }
  if (stableVersionRows.isNotEmpty) {
    blocks.add(versionSectionNode(
      id: 'stable',
      label: 'Stable',
      packageName: data.package!.name!,
      rows: stableVersionRows,
    ));
  }
  if (prereleaseVersionRows.isNotEmpty) {
    blocks.add(versionSectionNode(
      id: 'prerelease',
      label: 'Prerelease',
      packageName: data.package!.name!,
      rows: prereleaseVersionRows,
    ));
  }
  if (retractedVersionRows.isNotEmpty) {
    blocks.add(versionSectionNode(
      id: 'retracted',
      label: 'Retracted',
      packageName: data.package!.name!,
      rows: retractedVersionRows,
    ));
  }

  final tabs = buildPackageTabs(
    data: data,
    versionsTab: Tab.withContent(
      id: 'versions',
      title: 'Versions',
      contentNode: d.fragment(blocks),
    ),
  );

  final content = renderDetailPage(
    headerNode: renderPkgHeader(data),
    tabs: tabs,
    infoBoxLead: data.version!.ellipsizedDescription,
    infoBoxNode: renderPkgInfoBox(data),
    footerNode: renderPackageSchemaOrgHtml(data),
  );

  final canonicalUrl = urls.pkgPageUrl(data.package!.name!,
      includeHost: true, pkgPageTab: urls.PkgPageTab.versions);
  return renderLayoutPage(
    PageType.package,
    content,
    title: '${data.package!.name} package - All Versions',
    canonicalUrl: canonicalUrl,
    pageData: pkgPageData(data.package!, data.version!),
    noIndex: data.package!.isDiscontinued,
  );
}