{
  "version": 3,
  "sources": ["../../src/table.ts"],
  "sourcesContent": ["import type {Table} from '@code-like-a-carpenter/foundation-intermediate-representation';\n\nimport type {AWSDynamoDBTable} from './__generated__/json-schemas/serverless-application-model.ts';\nimport type {ServerlessApplicationModel} from './types.ts';\n\n/* eslint-disable complexity */\n/** cloudformation generator */\nexport function defineTable({\n  enablePointInTimeRecovery,\n  enableStreaming,\n  hasTtl,\n  tableName,\n  primaryKey: {isComposite},\n  secondaryIndexes,\n}: Table): ServerlessApplicationModel {\n  const attributeDefinitions = isComposite\n    ? expandCompositeAttribute('pk', 'sk')\n    : expandSimpleAttribute('pk');\n\n  const keySchema = isComposite\n    ? expandCompositeKey('pk', 'sk')\n    : expandSimpleKey('pk');\n\n  const globalSecondaryIndexes = [];\n  const localSecondaryIndexes = [];\n\n  for (const index of secondaryIndexes) {\n    if (index.type === 'gsi') {\n      attributeDefinitions.push(\n        ...(index.isComposite\n          ? expandCompositeAttribute(index.partitionKeyName, index.sortKeyName)\n          : expandSimpleAttribute(index.partitionKeyName))\n      );\n      const gsiKeySchema = index.isComposite\n        ? expandCompositeKey(index.partitionKeyName, index.sortKeyName)\n        : expandSimpleKey(index.partitionKeyName);\n      globalSecondaryIndexes.push({\n        IndexName: index.name,\n        KeySchema: gsiKeySchema,\n        Projection: {\n          ProjectionType: index.projectionType.toUpperCase(),\n        },\n      });\n    } else if (index.type === 'lsi') {\n      attributeDefinitions.push(...expandSimpleAttribute(index.sortKeyName));\n      const lsiKeySchema = expandCompositeKey(\n        index.partitionKeyName,\n        index.sortKeyName\n      );\n      localSecondaryIndexes.push({\n        IndexName: index.name,\n        KeySchema: lsiKeySchema,\n        Projection: {\n          ProjectionType: index.projectionType.toUpperCase(),\n        },\n      });\n    }\n  }\n\n  const resource: AWSDynamoDBTable = {\n    Properties: {\n      AttributeDefinitions: attributeDefinitions,\n      BillingMode: 'PAY_PER_REQUEST',\n      ...(globalSecondaryIndexes.length\n        ? {GlobalSecondaryIndexes: globalSecondaryIndexes}\n        : {}),\n      KeySchema: keySchema,\n      ...(localSecondaryIndexes.length\n        ? {LocalSecondaryIndexes: localSecondaryIndexes}\n        : {}),\n      SSESpecification: {\n        // @ts-expect-error typedef doesn't include intrinsic functions\n        SSEEnabled: {'Fn::If': ['IsProd', true, false]},\n      },\n      Tags: [\n        {\n          Key: 'StageName',\n          // @ts-expect-error typedef doesn't include intrinsic functions\n          Value: {Ref: 'StageName'},\n        },\n        {\n          Key: 'TableName',\n          Value: tableName,\n        },\n      ],\n      ...conditionalObject(enableStreaming, {\n        StreamSpecification: {\n          StreamViewType: 'NEW_AND_OLD_IMAGES',\n        },\n      }),\n      ...conditionalObject(enablePointInTimeRecovery, {\n        PointInTimeRecoverySpecification: {\n          PointInTimeRecoveryEnabled: {'Fn::If': ['IsProd', true, false]},\n        },\n      }),\n      ...conditionalObject(hasTtl, {\n        TimeToLiveSpecification: {\n          AttributeName: 'ttl',\n          Enabled: true,\n        },\n      }),\n    },\n    Type: 'AWS::DynamoDB::Table',\n  };\n\n  return {\n    Conditions: {\n      IsProd: {'Fn::Equals': [{Ref: 'StageName'}, 'production']},\n    },\n    Outputs: {\n      [tableName]: {\n        Description: `The name of the DynamoDB table for ${tableName}`,\n        Export: {\n          Name: {'Fn::Sub': `\\${AWS::StackName}-${tableName}`},\n        },\n        Value: {Ref: tableName},\n      },\n    },\n    Resources: {\n      [tableName]: resource,\n    },\n  };\n}\n\n/* eslint-enable complexity */\n\nfunction expandCompositeAttribute(pk: string, sk: string) {\n  return [\n    {AttributeName: pk, AttributeType: 'S'},\n    {AttributeName: sk, AttributeType: 'S'},\n  ];\n}\n\nfunction expandSimpleAttribute(pk: string) {\n  return [{AttributeName: pk, AttributeType: 'S'}];\n}\n\nfunction expandCompositeKey(pk: string, sk: string) {\n  return [\n    {AttributeName: pk, KeyType: 'HASH'},\n    {AttributeName: sk, KeyType: 'RANGE'},\n  ];\n}\n\nfunction expandSimpleKey(pk: string) {\n  return [{AttributeName: pk, KeyType: 'HASH'}];\n}\n\nfunction conditionalObject(condition: boolean, object: object) {\n  return condition ? object : {};\n}\n"],
  "mappings": "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",
  "names": []
}
