export function resolveCfnProperty()

in packages/aws-c2a/lib/private/cfn.ts [14:65]


export function resolveCfnProperty(property: any, references: AWS.CloudFormation.Parameters): string | undefined {
  const key = looksLikeCfnIntrinsic(property);

  const resolve = (items: any[]) => {
    return items.map((item: any) => resolveCfnProperty(item, references) ?? item);
  };

  const searchReferences = (token: string) =>
    references.find(({ ParameterKey }) => ParameterKey === token)?.ParameterValue;

  switch(key) {
    case undefined:
      return undefined;
    case 'Ref': {
      const token: string = property[key] ?? '';
      return searchReferences(token);
    }
    case 'Fn::Split': {
      const splitItems = property[key] ?? [];
      const [splitDelimiter, source] = resolve(splitItems);
      return source.split(splitDelimiter);
    }
    case 'Fn::Select': {
      const selectItems = property[key] ?? [];
      const [index, resolvedItems] = resolve(selectItems);
      return resolvedItems[index];
    }
    case 'Fn::Join': {
      const [joinDelimiter, values] = property[key] ?? [];
      const resolvedValues = resolve(values);
      return resolvedValues.join(joinDelimiter);
    }
    case 'Fn::Sub': {
      const [unresolvedString, unresolvedSubstitutes] = typeof(property[key]) === 'string'
        ? [property[key], undefined]
        : property[key];

      const substitutes: {[k: string]: string} = Object.entries(unresolvedSubstitutes ?? {}).reduce(
        (acc, [k, value]) => ({...acc, [k]: resolveCfnProperty(value, references) ?? value }), {});

      const search = (ref: string): string => {
        return substitutes[ref] ?? searchReferences(ref) ?? `\${${ref}}`;
      };

      return (unresolvedString as string).replace(/\$\{([^}]*)\}/g, (_, m) => {
        return search(m);
      });
    }
    default:
      throw new Error(`Unsupported CloudFormation Intrinsic Function: ${key}`);
  }
}