def METHOD_NAME(uri: str, extract_dir: Optional[str] = None,
              **kwargs) -> List[dict]:
    """Parse the contents of a STAC catalog.
    The file is downloaded if needed. If it is a zip file, it is unzipped and
    the catalog.json inside is parsed.
    Args:
        uri (str): Either a URI to a STAC catalog JSON file or a URI to a zip
            file containing a STAC catalog JSON file.
        extract_dir (Optional[str]): Dir to extract to, if URI is a zip file.
            If None, a temporary dir will be used. Defaults to None.
        **kwargs: Extra args for :func:`.parse_stac`.
    Raises:
        FileNotFoundError: If catalog.json is not found inside the zip file.
        Exception: If multiple catalog.json's are found inside the zip file.
    Returns:
        List[dict]: A lsit of dicts with keys: "label_uri", "image_uris",
            "label_bbox", "image_bbox", "bboxes_intersect", and "aoi_geometry".
            Each dict corresponds to one label item and its associated image
            assets in the STAC catalog.
    """
    from pathlib import Path
    from rastervision.pipeline.file_system.utils import (download_if_needed,
                                                         is_archive, extract)
    catalog_path = download_if_needed(uri)
    if catalog_path.lower().endswith('.json'):
        return parse_stac(catalog_path, **kwargs)
    if not is_archive(catalog_path):
        raise ValueError(f'Unsupported file format: ("{uri}"). '
                         'URIS must be a JSON file or compressed archive.')
    extract_dir = extract(catalog_path, extract_dir)
    catalog_paths = list(Path(extract_dir).glob('**/catalog.json'))
    if len(catalog_paths) == 0:
        raise FileNotFoundError(f'Unable to find "catalog.json" in {uri}.')
    elif len(catalog_paths) > 1:
        raise Exception(f'More than one "catalog.json" found in ' f'{uri}.')
    catalog_path = str(catalog_paths[0])
    return parse_stac(catalog_path, **kwargs)