export async function describeResourceType()

in src/cfn-registry.ts [33:82]


export async function describeResourceType(name: string, options: DescribeResourceTypeOptions = {}): Promise<TypeInfo> {
  const visibility = options.private ? 'PRIVATE' : 'PUBLIC';
  const cfn = options.client ?? new CloudFormationClient();

  let typeArn;

  if (name.startsWith('arn:')) {
    typeArn = name;
  } else {
    const types = [];
    let token;
    do {
      const res: AWS.CloudFormation.ListTypesOutput = await cfn.listTypes({
        NextToken: token,
        Type: name.endsWith('MODULE') ? 'MODULE' : 'RESOURCE',
        Filters: {
          TypeNamePrefix: name,
        },
        Visibility: visibility,
      });

      if (res.TypeSummaries) {
        types.push(...res.TypeSummaries);
      }
      token = res.NextToken;
    } while (token);

    if (types.length !== 1) {
      throw new Error('Cannot find unique CloudFormation Type ' + name);
    }

    typeArn = types[0].TypeArn;
  }

  const type = await cfn.describeType({
    Arn: typeArn,
    // TODO versioning
  });
  if (!type.Schema) {
    throw new Error('CloudFormation Type ' + name + ' does not contain schema');
  }
  if (!type.TypeName) {
    throw new Error('CloudFormation Type ' + name + ' does not contain a type name');
  }
  return {
    TypeName: type.TypeName,
    Schema: type.Schema,
    SourceUrl: type.SourceUrl ?? type.Arn!,
  };
}