├── .eslintignore ├── .eslintrc ├── .gitignore ├── LICENSE.txt ├── README.md ├── apis ├── acm-2015-12-08.min.json ├── acm-2015-12-08.normal.json ├── acm-2015-12-08.paginators.json ├── apigateway-2015-07-09.min.json ├── apigateway-2015-07-09.normal.json ├── apigateway-2015-07-09.paginators.json ├── application-autoscaling-2016-02-06.examples.json ├── application-autoscaling-2016-02-06.min.json ├── application-autoscaling-2016-02-06.normal.json ├── application-autoscaling-2016-02-06.paginators.json ├── appstream-2016-12-01.min.json ├── appstream-2016-12-01.normal.json ├── appstream-2016-12-01.waiters2.json ├── autoscaling-2011-01-01.examples.json ├── autoscaling-2011-01-01.min.json ├── autoscaling-2011-01-01.normal.json ├── autoscaling-2011-01-01.paginators.json ├── batch-2016-08-10.examples.json ├── batch-2016-08-10.min.json ├── batch-2016-08-10.normal.json ├── budgets-2016-10-20.min.json ├── budgets-2016-10-20.normal.json ├── clouddirectory-2016-05-10.min.json ├── clouddirectory-2016-05-10.normal.json ├── clouddirectory-2016-05-10.paginators.json ├── cloudformation-2010-05-15.examples.json ├── cloudformation-2010-05-15.min.json ├── cloudformation-2010-05-15.normal.json ├── cloudformation-2010-05-15.paginators.json ├── cloudformation-2010-05-15.waiters2.json ├── cloudfront-2016-11-25.min.json ├── cloudfront-2016-11-25.normal.json ├── cloudfront-2016-11-25.paginators.json ├── cloudfront-2016-11-25.waiters2.json ├── cloudhsm-2014-05-30.min.json ├── cloudhsm-2014-05-30.normal.json ├── cloudsearch-2011-02-01.min.json ├── cloudsearch-2011-02-01.normal.json ├── cloudsearch-2011-02-01.paginators.json ├── cloudsearch-2013-01-01.min.json ├── cloudsearch-2013-01-01.normal.json ├── cloudsearch-2013-01-01.paginators.json ├── cloudsearchdomain-2013-01-01.min.json ├── cloudsearchdomain-2013-01-01.normal.json ├── cloudtrail-2013-11-01.min.json ├── cloudtrail-2013-11-01.normal.json ├── cloudtrail-2013-11-01.paginators.json ├── codebuild-2016-10-06.min.json ├── codebuild-2016-10-06.normal.json ├── codebuild-2016-10-06.paginators.json ├── codecommit-2015-04-13.min.json ├── codecommit-2015-04-13.normal.json ├── codecommit-2015-04-13.paginators.json ├── codedeploy-2014-10-06.min.json ├── codedeploy-2014-10-06.normal.json ├── codedeploy-2014-10-06.paginators.json ├── codedeploy-2014-10-06.waiters2.json ├── codepipeline-2015-07-09.examples.json ├── codepipeline-2015-07-09.min.json ├── codepipeline-2015-07-09.normal.json ├── cognito-identity-2014-06-30.min.json ├── cognito-identity-2014-06-30.normal.json ├── cognito-idp-2016-04-18.min.json ├── cognito-idp-2016-04-18.normal.json ├── cognito-sync-2014-06-30.min.json ├── cognito-sync-2014-06-30.normal.json ├── config-2014-11-12.min.json ├── config-2014-11-12.normal.json ├── config-2014-11-12.paginators.json ├── cur-2017-01-06.min.json ├── cur-2017-01-06.normal.json ├── cur-2017-01-06.paginators.json ├── datapipeline-2012-10-29.min.json ├── datapipeline-2012-10-29.normal.json ├── datapipeline-2012-10-29.paginators.json ├── devicefarm-2015-06-23.examples.json ├── devicefarm-2015-06-23.min.json ├── devicefarm-2015-06-23.normal.json ├── devicefarm-2015-06-23.paginators.json ├── directconnect-2012-10-25.min.json ├── directconnect-2012-10-25.normal.json ├── directconnect-2012-10-25.paginators.json ├── discovery-2015-11-01.min.json ├── discovery-2015-11-01.normal.json ├── dms-2016-01-01.min.json ├── dms-2016-01-01.normal.json ├── ds-2015-04-16.min.json ├── ds-2015-04-16.normal.json ├── dynamodb-2011-12-05.min.json ├── dynamodb-2011-12-05.normal.json ├── dynamodb-2011-12-05.paginators.json ├── dynamodb-2011-12-05.waiters2.json ├── dynamodb-2012-08-10.examples.json ├── dynamodb-2012-08-10.min.json ├── dynamodb-2012-08-10.normal.json ├── dynamodb-2012-08-10.paginators.json ├── dynamodb-2012-08-10.waiters2.json ├── ec2-2016-11-15.examples.json ├── ec2-2016-11-15.min.json ├── ec2-2016-11-15.normal.json ├── ec2-2016-11-15.paginators.json ├── ec2-2016-11-15.waiters2.json ├── ecr-2015-09-21.examples.json ├── ecr-2015-09-21.min.json ├── ecr-2015-09-21.normal.json ├── ecr-2015-09-21.paginators.json ├── ecs-2014-11-13.examples.json ├── ecs-2014-11-13.min.json ├── ecs-2014-11-13.normal.json ├── ecs-2014-11-13.paginators.json ├── ecs-2014-11-13.waiters2.json ├── elasticache-2015-02-02.min.json ├── elasticache-2015-02-02.normal.json ├── elasticache-2015-02-02.paginators.json ├── elasticache-2015-02-02.waiters2.json ├── elasticbeanstalk-2010-12-01.examples.json ├── elasticbeanstalk-2010-12-01.min.json ├── elasticbeanstalk-2010-12-01.normal.json ├── elasticbeanstalk-2010-12-01.paginators.json ├── elasticfilesystem-2015-02-01.examples.json ├── elasticfilesystem-2015-02-01.min.json ├── elasticfilesystem-2015-02-01.normal.json ├── elasticloadbalancing-2012-06-01.examples.json ├── elasticloadbalancing-2012-06-01.min.json ├── elasticloadbalancing-2012-06-01.normal.json ├── elasticloadbalancing-2012-06-01.paginators.json ├── elasticloadbalancing-2012-06-01.waiters2.json ├── elasticloadbalancingv2-2015-12-01.examples.json ├── elasticloadbalancingv2-2015-12-01.min.json ├── elasticloadbalancingv2-2015-12-01.normal.json ├── elasticloadbalancingv2-2015-12-01.paginators.json ├── elasticmapreduce-2009-03-31.min.json ├── elasticmapreduce-2009-03-31.normal.json ├── elasticmapreduce-2009-03-31.paginators.json ├── elasticmapreduce-2009-03-31.waiters2.json ├── elastictranscoder-2012-09-25.min.json ├── elastictranscoder-2012-09-25.normal.json ├── elastictranscoder-2012-09-25.paginators.json ├── elastictranscoder-2012-09-25.waiters2.json ├── email-2010-12-01.examples.json ├── email-2010-12-01.min.json ├── email-2010-12-01.normal.json ├── email-2010-12-01.paginators.json ├── email-2010-12-01.waiters2.json ├── es-2015-01-01.min.json ├── es-2015-01-01.normal.json ├── events-2015-10-07.min.json ├── events-2015-10-07.normal.json ├── firehose-2015-08-04.min.json ├── firehose-2015-08-04.normal.json ├── gamelift-2015-10-01.min.json ├── gamelift-2015-10-01.normal.json ├── glacier-2012-06-01.examples.json ├── glacier-2012-06-01.min.json ├── glacier-2012-06-01.normal.json ├── glacier-2012-06-01.paginators.json ├── glacier-2012-06-01.waiters2.json ├── health-2016-08-04.min.json ├── health-2016-08-04.normal.json ├── health-2016-08-04.paginators.json ├── iam-2010-05-08.examples.json ├── iam-2010-05-08.min.json ├── iam-2010-05-08.normal.json ├── iam-2010-05-08.paginators.json ├── iam-2010-05-08.waiters2.json ├── importexport-2010-06-01.min.json ├── importexport-2010-06-01.normal.json ├── importexport-2010-06-01.paginators.json ├── inspector-2016-02-16.examples.json ├── inspector-2016-02-16.min.json ├── inspector-2016-02-16.normal.json ├── iot-2015-05-28.min.json ├── iot-2015-05-28.normal.json ├── iot-data-2015-05-28.min.json ├── iot-data-2015-05-28.normal.json ├── kinesis-2013-12-02.min.json ├── kinesis-2013-12-02.normal.json ├── kinesis-2013-12-02.paginators.json ├── kinesis-2013-12-02.waiters2.json ├── kinesisanalytics-2015-08-14.min.json ├── kinesisanalytics-2015-08-14.normal.json ├── kms-2014-11-01.examples.json ├── kms-2014-11-01.min.json ├── kms-2014-11-01.normal.json ├── kms-2014-11-01.paginators.json ├── lambda-2014-11-11.min.json ├── lambda-2014-11-11.normal.json ├── lambda-2014-11-11.paginators.json ├── lambda-2015-03-31.examples.json ├── lambda-2015-03-31.min.json ├── lambda-2015-03-31.normal.json ├── lambda-2015-03-31.paginators.json ├── lightsail-2016-11-28.min.json ├── lightsail-2016-11-28.normal.json ├── logs-2014-03-28.min.json ├── logs-2014-03-28.normal.json ├── logs-2014-03-28.paginators.json ├── machinelearning-2014-12-12.min.json ├── machinelearning-2014-12-12.normal.json ├── machinelearning-2014-12-12.paginators.json ├── machinelearning-2014-12-12.waiters2.json ├── marketplacecommerceanalytics-2015-07-01.min.json ├── marketplacecommerceanalytics-2015-07-01.normal.json ├── metadata.json ├── meteringmarketplace-2016-01-14.min.json ├── meteringmarketplace-2016-01-14.normal.json ├── mobileanalytics-2014-06-05.min.json ├── mobileanalytics-2014-06-05.normal.json ├── monitoring-2010-08-01.min.json ├── monitoring-2010-08-01.normal.json ├── monitoring-2010-08-01.paginators.json ├── monitoring-2010-08-01.waiters2.json ├── opsworks-2013-02-18.min.json ├── opsworks-2013-02-18.normal.json ├── opsworks-2013-02-18.paginators.json ├── opsworks-2013-02-18.waiters2.json ├── opsworkscm-2016-11-01.min.json ├── opsworkscm-2016-11-01.normal.json ├── pinpoint-2016-12-01.min.json ├── pinpoint-2016-12-01.normal.json ├── polly-2016-06-10.examples.json ├── polly-2016-06-10.min.json ├── polly-2016-06-10.normal.json ├── rds-2013-01-10.min.json ├── rds-2013-01-10.normal.json ├── rds-2013-01-10.paginators.json ├── rds-2013-02-12.min.json ├── rds-2013-02-12.normal.json ├── rds-2013-02-12.paginators.json ├── rds-2013-09-09.min.json ├── rds-2013-09-09.normal.json ├── rds-2013-09-09.paginators.json ├── rds-2013-09-09.waiters2.json ├── rds-2014-10-31.min.json ├── rds-2014-10-31.normal.json ├── rds-2014-10-31.paginators.json ├── rds-2014-10-31.waiters2.json ├── redshift-2012-12-01.min.json ├── redshift-2012-12-01.normal.json ├── redshift-2012-12-01.paginators.json ├── redshift-2012-12-01.waiters2.json ├── rekognition-2016-06-27.examples.json ├── rekognition-2016-06-27.min.json ├── rekognition-2016-06-27.normal.json ├── rekognition-2016-06-27.paginators.json ├── route53-2013-04-01.min.json ├── route53-2013-04-01.normal.json ├── route53-2013-04-01.paginators.json ├── route53-2013-04-01.waiters2.json ├── route53domains-2014-05-15.min.json ├── route53domains-2014-05-15.normal.json ├── route53domains-2014-05-15.paginators.json ├── s3-2006-03-01.min.json ├── s3-2006-03-01.normal.json ├── s3-2006-03-01.paginators.json ├── s3-2006-03-01.waiters2.json ├── sdb-2009-04-15.min.json ├── sdb-2009-04-15.normal.json ├── sdb-2009-04-15.paginators.json ├── servicecatalog-2015-12-10.min.json ├── servicecatalog-2015-12-10.normal.json ├── shield-2016-06-02.min.json ├── shield-2016-06-02.normal.json ├── sms-2016-10-24.min.json ├── sms-2016-10-24.normal.json ├── sms-2016-10-24.paginators.json ├── snowball-2016-06-30.examples.json ├── snowball-2016-06-30.min.json ├── snowball-2016-06-30.normal.json ├── snowball-2016-06-30.paginators.json ├── sns-2010-03-31.min.json ├── sns-2010-03-31.normal.json ├── sns-2010-03-31.paginators.json ├── sqs-2012-11-05.examples.json ├── sqs-2012-11-05.min.json ├── sqs-2012-11-05.normal.json ├── sqs-2012-11-05.paginators.json ├── ssm-2014-11-06.min.json ├── ssm-2014-11-06.normal.json ├── ssm-2014-11-06.paginators.json ├── states-2016-11-23.min.json ├── states-2016-11-23.normal.json ├── states-2016-11-23.paginators.json ├── storagegateway-2013-06-30.examples.json ├── storagegateway-2013-06-30.min.json ├── storagegateway-2013-06-30.normal.json ├── storagegateway-2013-06-30.paginators.json ├── streams.dynamodb-2012-08-10.examples.json ├── streams.dynamodb-2012-08-10.min.json ├── streams.dynamodb-2012-08-10.normal.json ├── sts-2011-06-15.examples.json ├── sts-2011-06-15.min.json ├── sts-2011-06-15.normal.json ├── support-2013-04-15.min.json ├── support-2013-04-15.normal.json ├── support-2013-04-15.paginators.json ├── swf-2012-01-25.min.json ├── swf-2012-01-25.normal.json ├── swf-2012-01-25.paginators.json ├── waf-2015-08-24.examples.json ├── waf-2015-08-24.min.json ├── waf-2015-08-24.normal.json ├── waf-regional-2016-11-28.examples.json ├── waf-regional-2016-11-28.min.json ├── waf-regional-2016-11-28.normal.json ├── workspaces-2015-04-08.min.json ├── workspaces-2015-04-08.normal.json ├── workspaces-2015-04-08.paginators.json ├── xray-2016-04-12.min.json └── xray-2016-04-12.normal.json ├── circle.yml ├── demo ├── .gitignore ├── Main.elm ├── README.md └── elm-package.json ├── elm-package.json ├── index.js ├── package.json ├── scripts ├── ci-elm-hack.sh ├── generate-sdk.js ├── process-service.js └── util │ ├── case-conversions.js │ ├── dots.js │ ├── find-latest-sources.js │ ├── module-name.js │ ├── render.js │ ├── replace-path-params.js │ ├── resolve-types.js │ └── set.js ├── src ├── AWS.elm └── AWS │ ├── Config.elm │ ├── Decode.elm │ ├── Encode.elm │ ├── Enum.elm │ ├── Http.elm │ ├── Services │ └── .gitkeep │ └── Signers │ ├── Canonical.elm │ └── V4.elm ├── templates ├── api.dot ├── defineOperation.dot ├── defineRecordDecoder.dot ├── defineRecordJsonEncoder.dot ├── defineRecordQueryEncoder.dot ├── defineRecordType.dot ├── defineUnionDecoder.dot ├── defineUnionDoc.dot ├── defineUnionType.dot └── elmPackage.dot └── tests ├── .gitignore ├── DecodeTests.elm ├── EncodeTests.elm ├── EnumTests.elm ├── HttpTests.elm ├── SignersTests ├── CanonicalTests.elm └── V4Tests.elm ├── TestHelpers.elm └── elm-package.json /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | elm-stuff 3 | src 4 | aws4_testsuite 5 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | extends: airbnb 2 | rules: 3 | import/no-dynamic-require: "off" 4 | import/no-extraneous-dependencies: "off" 5 | no-console: "off" 6 | no-param-reassign: "off" 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /docs.json 2 | /src/AWS/Services 3 | /tests/aws4_testsuite 4 | elm-stuff 5 | node_modules 6 | *.log 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | AWS SDK for elm 2 | =============== 3 | 4 | __Deprecated__ 5 | 6 | The idea of having a single fully generated Elm package for every AWS service was abandoned for the following reasons: 7 | 8 | * Breaking changes to one service would require a Major version bump for the entire service 9 | * It was difficult to come up with nice, user-friendly, fully generated, APIs for every service 10 | 11 | This repo has been split into 2 separate repos, each with a specific purpose: 12 | 13 | * [elm-aws-core][] For making authenticated REST requests to AWS services using pure Elm. 14 | * [elm-aws-generate][] Elm code generation from AWS JSON service files. The generated code is intended to be a starting point, from which a developer can create a nice, user-friendly client, tailored to a specific AWS service. 15 | 16 | [elm-aws-core]:https://github.com/ktonon/elm-aws-core 17 | [elm-aws-generate]:https://github.com/ktonon/elm-aws-generate 18 | -------------------------------------------------------------------------------- /apis/acm-2015-12-08.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListCertificates": { 4 | "input_token": "NextToken", 5 | "limit_key": "MaxItems", 6 | "output_token": "NextToken", 7 | "result_key": "CertificateSummaryList" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /apis/apigateway-2015-07-09.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "GetApiKeys": { 4 | "input_token": "position", 5 | "output_token": "position", 6 | "limit_key": "limit", 7 | "result_key": "items" 8 | }, 9 | "GetBasePathMappings": { 10 | "input_token": "position", 11 | "output_token": "position", 12 | "limit_key": "limit", 13 | "result_key": "items" 14 | }, 15 | "GetClientCertificates": { 16 | "input_token": "position", 17 | "output_token": "position", 18 | "limit_key": "limit", 19 | "result_key": "items" 20 | }, 21 | "GetDeployments": { 22 | "input_token": "position", 23 | "output_token": "position", 24 | "limit_key": "limit", 25 | "result_key": "items" 26 | }, 27 | "GetDomainNames": { 28 | "input_token": "position", 29 | "output_token": "position", 30 | "limit_key": "limit", 31 | "result_key": "items" 32 | }, 33 | "GetModels": { 34 | "input_token": "position", 35 | "output_token": "position", 36 | "limit_key": "limit", 37 | "result_key": "items" 38 | }, 39 | "GetResources": { 40 | "input_token": "position", 41 | "output_token": "position", 42 | "limit_key": "limit", 43 | "result_key": "items" 44 | }, 45 | "GetRestApis": { 46 | "input_token": "position", 47 | "output_token": "position", 48 | "limit_key": "limit", 49 | "result_key": "items" 50 | }, 51 | "GetUsage": { 52 | "input_token": "position", 53 | "output_token": "position", 54 | "limit_key": "limit", 55 | "result_key": "items" 56 | }, 57 | "GetUsagePlans": { 58 | "input_token": "position", 59 | "output_token": "position", 60 | "limit_key": "limit", 61 | "result_key": "items" 62 | }, 63 | "GetUsagePlanKeys": { 64 | "input_token": "position", 65 | "output_token": "position", 66 | "limit_key": "limit", 67 | "result_key": "items" 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /apis/application-autoscaling-2016-02-06.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeScalableTargets": { 4 | "input_token": "NextToken", 5 | "output_token": "NextToken", 6 | "limit_key": "MaxResults", 7 | "result_key": "ScalableTargets" 8 | }, 9 | "DescribeScalingPolicies": { 10 | "input_token": "NextToken", 11 | "output_token": "NextToken", 12 | "limit_key": "MaxResults", 13 | "result_key": "ScalingPolicies" 14 | }, 15 | "DescribeScalingActivities": { 16 | "input_token": "NextToken", 17 | "output_token": "NextToken", 18 | "limit_key": "MaxResults", 19 | "result_key": "ScalingActivities" 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /apis/appstream-2016-12-01.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "FleetStarted": { 5 | "delay": 30, 6 | "maxAttempts": 40, 7 | "operation": "DescribeFleets", 8 | "acceptors": [ 9 | { 10 | "state": "success", 11 | "matcher": "pathAll", 12 | "argument": "fleets[].state", 13 | "expected": "ACTIVE" 14 | }, 15 | { 16 | "state": "failure", 17 | "matcher": "pathAny", 18 | "argument": "fleets[].state", 19 | "expected": "PENDING_DEACTIVATE" 20 | }, 21 | { 22 | "state": "failure", 23 | "matcher": "pathAny", 24 | "argument": "fleets[].state", 25 | "expected": "INACTIVE" 26 | } 27 | ] 28 | }, 29 | "FleetStopped": { 30 | "delay": 30, 31 | "maxAttempts": 40, 32 | "operation": "DescribeFleets", 33 | "acceptors": [ 34 | { 35 | "state": "success", 36 | "matcher": "pathAll", 37 | "argument": "fleets[].state", 38 | "expected": "INACTIVE" 39 | }, 40 | { 41 | "state": "failure", 42 | "matcher": "pathAny", 43 | "argument": "fleets[].state", 44 | "expected": "PENDING_ACTIVATE" 45 | }, 46 | { 47 | "state": "failure", 48 | "matcher": "pathAny", 49 | "argument": "fleets[].state", 50 | "expected": "ACTIVE" 51 | } 52 | ] 53 | } 54 | } 55 | } -------------------------------------------------------------------------------- /apis/autoscaling-2011-01-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeAutoScalingGroups": { 4 | "input_token": "NextToken", 5 | "output_token": "NextToken", 6 | "limit_key": "MaxRecords", 7 | "result_key": "AutoScalingGroups" 8 | }, 9 | "DescribeAutoScalingInstances": { 10 | "input_token": "NextToken", 11 | "output_token": "NextToken", 12 | "limit_key": "MaxRecords", 13 | "result_key": "AutoScalingInstances" 14 | }, 15 | "DescribeLaunchConfigurations": { 16 | "input_token": "NextToken", 17 | "output_token": "NextToken", 18 | "limit_key": "MaxRecords", 19 | "result_key": "LaunchConfigurations" 20 | }, 21 | "DescribeNotificationConfigurations": { 22 | "input_token": "NextToken", 23 | "output_token": "NextToken", 24 | "limit_key": "MaxRecords", 25 | "result_key": "NotificationConfigurations" 26 | }, 27 | "DescribePolicies": { 28 | "input_token": "NextToken", 29 | "output_token": "NextToken", 30 | "limit_key": "MaxRecords", 31 | "result_key": "ScalingPolicies" 32 | }, 33 | "DescribeScalingActivities": { 34 | "input_token": "NextToken", 35 | "output_token": "NextToken", 36 | "limit_key": "MaxRecords", 37 | "result_key": "Activities" 38 | }, 39 | "DescribeScheduledActions": { 40 | "input_token": "NextToken", 41 | "output_token": "NextToken", 42 | "limit_key": "MaxRecords", 43 | "result_key": "ScheduledUpdateGroupActions" 44 | }, 45 | "DescribeTags": { 46 | "input_token": "NextToken", 47 | "output_token": "NextToken", 48 | "limit_key": "MaxRecords", 49 | "result_key": "Tags" 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /apis/clouddirectory-2016-05-10.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListAppliedSchemaArns": { 4 | "input_token": "NextToken", 5 | "output_token": "NextToken", 6 | "limit_key": "MaxResults" 7 | }, 8 | "ListAttachedIndices": { 9 | "input_token": "NextToken", 10 | "output_token": "NextToken", 11 | "limit_key": "MaxResults" 12 | }, 13 | "ListDevelopmentSchemaArns": { 14 | "input_token": "NextToken", 15 | "output_token": "NextToken", 16 | "limit_key": "MaxResults" 17 | }, 18 | "ListDirectories": { 19 | "input_token": "NextToken", 20 | "output_token": "NextToken", 21 | "limit_key": "MaxResults" 22 | }, 23 | "ListFacetAttributes": { 24 | "input_token": "NextToken", 25 | "output_token": "NextToken", 26 | "limit_key": "MaxResults" 27 | }, 28 | "ListFacetNames": { 29 | "input_token": "NextToken", 30 | "output_token": "NextToken", 31 | "limit_key": "MaxResults" 32 | }, 33 | "ListIndex": { 34 | "input_token": "NextToken", 35 | "output_token": "NextToken", 36 | "limit_key": "MaxResults" 37 | }, 38 | "ListObjectAttributes": { 39 | "input_token": "NextToken", 40 | "output_token": "NextToken", 41 | "limit_key": "MaxResults" 42 | }, 43 | "ListObjectChildren": { 44 | "input_token": "NextToken", 45 | "output_token": "NextToken", 46 | "limit_key": "MaxResults" 47 | }, 48 | "ListObjectParents": { 49 | "input_token": "NextToken", 50 | "output_token": "NextToken", 51 | "limit_key": "MaxResults" 52 | }, 53 | "ListObjectPolicies": { 54 | "input_token": "NextToken", 55 | "output_token": "NextToken", 56 | "limit_key": "MaxResults" 57 | }, 58 | "ListPolicyAttachments": { 59 | "input_token": "NextToken", 60 | "output_token": "NextToken", 61 | "limit_key": "MaxResults" 62 | }, 63 | "ListPublishedSchemaArns": { 64 | "input_token": "NextToken", 65 | "output_token": "NextToken", 66 | "limit_key": "MaxResults" 67 | }, 68 | "ListTagsForResource": { 69 | "input_token": "NextToken", 70 | "output_token": "NextToken", 71 | "limit_key": "MaxResults" 72 | }, 73 | "LookupPolicy": { 74 | "input_token": "NextToken", 75 | "output_token": "NextToken", 76 | "limit_key": "MaxResults" 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /apis/cloudformation-2010-05-15.examples.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "examples": { 4 | "CancelUpdateStack": [ 5 | { 6 | "input": { 7 | "StackName": "MyStack" 8 | }, 9 | "comments": { 10 | "input": { 11 | }, 12 | "output": { 13 | } 14 | }, 15 | "description": "This example cancels an update of the specified stack.", 16 | "id": "to-cancel-a-stack-update-that-is-in-progress-1472747085196", 17 | "title": "To cancel a stack update in progress" 18 | } 19 | ], 20 | "UpdateStack": [ 21 | { 22 | "input": { 23 | "NotificationARNs": [ 24 | 25 | ], 26 | "Parameters": [ 27 | { 28 | "ParameterKey": "KeyPairName", 29 | "ParameterValue": "ExampleKeyPair" 30 | }, 31 | { 32 | "ParameterKey": "SubnetIDs", 33 | "ParameterValue": "ExampleSubnetID1, ExampleSubnetID2" 34 | } 35 | ], 36 | "ResourceTypes": [ 37 | 38 | ], 39 | "StackName": "MyStack", 40 | "Tags": [ 41 | 42 | ], 43 | "TemplateURL": "https://s3.amazonaws.com/example/updated.template" 44 | }, 45 | "output": { 46 | "StackId": "" 47 | }, 48 | "comments": { 49 | "input": { 50 | }, 51 | "output": { 52 | } 53 | }, 54 | "description": "This example updates the template and input parameters for the specified stack.", 55 | "id": "to-update-an-aws-cloudformation-stack-1472841931621", 56 | "title": "To update an AWS CloudFormation stack" 57 | }, 58 | { 59 | "input": { 60 | "NotificationARNs": [ 61 | 62 | ], 63 | "Parameters": [ 64 | { 65 | "ParameterKey": "KeyPairName", 66 | "UsePreviousValue": true 67 | }, 68 | { 69 | "ParameterKey": "SubnetIDs", 70 | "ParameterValue": "SampleSubnetID1, UpdatedSampleSubnetID2" 71 | } 72 | ], 73 | "ResourceTypes": [ 74 | 75 | ], 76 | "StackName": "MyStack", 77 | "Tags": [ 78 | 79 | ], 80 | "TemplateURL": "https://s3.amazonaws.com/example/updated.template" 81 | }, 82 | "output": { 83 | "StackId": "" 84 | }, 85 | "comments": { 86 | "input": { 87 | }, 88 | "output": { 89 | } 90 | }, 91 | "description": "This example updates only the the specified parameter value for the specified stack. If you don't specify a parameter value, AWS CloudFormation uses the default value from the template.", 92 | "id": "to-update-an-aws-cloudformation-stack-1472841931621", 93 | "title": "To update an AWS CloudFormation stack" 94 | }, 95 | { 96 | "input": { 97 | "Capabilities": [ 98 | 99 | ], 100 | "NotificationARNs": [ 101 | "arn:aws:sns:use-east-1:123456789012:mytopic1", 102 | "arn:aws:sns:us-east-1:123456789012:mytopic2" 103 | ], 104 | "Parameters": [ 105 | 106 | ], 107 | "ResourceTypes": [ 108 | 109 | ], 110 | "StackName": "MyStack", 111 | "Tags": [ 112 | 113 | ], 114 | "TemplateURL": "https://s3.amazonaws.com/example/updated.template", 115 | "UsePreviousTemplate": true 116 | }, 117 | "output": { 118 | "StackId": "" 119 | }, 120 | "comments": { 121 | "input": { 122 | }, 123 | "output": { 124 | } 125 | }, 126 | "description": "This example adds two stack notification topics to the specified stack.", 127 | "id": "to-update-an-aws-cloudformation-stack-1472841931621", 128 | "title": "To update an AWS CloudFormation stack" 129 | } 130 | ], 131 | "ValidateTemplate": [ 132 | { 133 | "input": { 134 | "TemplateBody": "MyTemplate.json" 135 | }, 136 | "output": { 137 | "Capabilities": [ 138 | 139 | ], 140 | "CapabilitiesReason": "", 141 | "Description": "AWS CloudFormation Example Template S3_Bucket: An example template that shows how to create a publicly-accessible S3 bucket. IMPORTANT: This template creates an S3 bucket. You will be billed for the AWS resources used if you create a stack from this template.", 142 | "Parameters": [ 143 | 144 | ] 145 | }, 146 | "comments": { 147 | "input": { 148 | }, 149 | "output": { 150 | } 151 | }, 152 | "description": "This example validates the specified template.", 153 | "id": "to-validate-an-aws-cloudformation-template-1472839072307", 154 | "title": "To validate an AWS CloudFormation template" 155 | } 156 | ] 157 | } 158 | } 159 | -------------------------------------------------------------------------------- /apis/cloudformation-2010-05-15.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeStackEvents": { 4 | "input_token": "NextToken", 5 | "output_token": "NextToken", 6 | "result_key": "StackEvents" 7 | }, 8 | "DescribeStackResources": { 9 | "result_key": "StackResources" 10 | }, 11 | "DescribeStacks": { 12 | "input_token": "NextToken", 13 | "output_token": "NextToken", 14 | "result_key": "Stacks" 15 | }, 16 | "ListStackResources": { 17 | "input_token": "NextToken", 18 | "output_token": "NextToken", 19 | "result_key": "StackResourceSummaries" 20 | }, 21 | "ListStacks": { 22 | "input_token": "NextToken", 23 | "output_token": "NextToken", 24 | "result_key": "StackSummaries" 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /apis/cloudformation-2010-05-15.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "StackExists": { 5 | "delay": 5, 6 | "operation": "DescribeStacks", 7 | "maxAttempts": 20, 8 | "acceptors": [ 9 | { 10 | "matcher": "status", 11 | "expected": 200, 12 | "state": "success" 13 | }, 14 | { 15 | "matcher": "error", 16 | "expected": "ValidationError", 17 | "state": "retry" 18 | } 19 | ] 20 | }, 21 | "StackCreateComplete": { 22 | "delay": 30, 23 | "operation": "DescribeStacks", 24 | "maxAttempts": 120, 25 | "description": "Wait until stack status is CREATE_COMPLETE.", 26 | "acceptors": [ 27 | { 28 | "argument": "Stacks[].StackStatus", 29 | "expected": "CREATE_COMPLETE", 30 | "matcher": "pathAll", 31 | "state": "success" 32 | }, 33 | { 34 | "argument": "Stacks[].StackStatus", 35 | "expected": "CREATE_FAILED", 36 | "matcher": "pathAny", 37 | "state": "failure" 38 | }, 39 | { 40 | "argument": "Stacks[].StackStatus", 41 | "expected": "DELETE_COMPLETE", 42 | "matcher": "pathAny", 43 | "state": "failure" 44 | }, 45 | { 46 | "argument": "Stacks[].StackStatus", 47 | "expected": "DELETE_FAILED", 48 | "matcher": "pathAny", 49 | "state": "failure" 50 | }, 51 | { 52 | "argument": "Stacks[].StackStatus", 53 | "expected": "ROLLBACK_FAILED", 54 | "matcher": "pathAny", 55 | "state": "failure" 56 | }, 57 | { 58 | "argument": "Stacks[].StackStatus", 59 | "expected": "ROLLBACK_COMPLETE", 60 | "matcher": "pathAny", 61 | "state": "failure" 62 | }, 63 | { 64 | "expected": "ValidationError", 65 | "matcher": "error", 66 | "state": "failure" 67 | } 68 | ] 69 | }, 70 | "StackDeleteComplete": { 71 | "delay": 30, 72 | "operation": "DescribeStacks", 73 | "maxAttempts": 120, 74 | "description": "Wait until stack status is DELETE_COMPLETE.", 75 | "acceptors": [ 76 | { 77 | "argument": "Stacks[].StackStatus", 78 | "expected": "DELETE_COMPLETE", 79 | "matcher": "pathAll", 80 | "state": "success" 81 | }, 82 | { 83 | "expected": "ValidationError", 84 | "matcher": "error", 85 | "state": "success" 86 | }, 87 | { 88 | "argument": "Stacks[].StackStatus", 89 | "expected": "DELETE_FAILED", 90 | "matcher": "pathAny", 91 | "state": "failure" 92 | }, 93 | { 94 | "argument": "Stacks[].StackStatus", 95 | "expected": "CREATE_FAILED", 96 | "matcher": "pathAny", 97 | "state": "failure" 98 | }, 99 | { 100 | "argument": "Stacks[].StackStatus", 101 | "expected": "ROLLBACK_FAILED", 102 | "matcher": "pathAny", 103 | "state": "failure" 104 | }, 105 | { 106 | "argument": "Stacks[].StackStatus", 107 | "expected": "UPDATE_ROLLBACK_FAILED", 108 | "matcher": "pathAny", 109 | "state": "failure" 110 | }, 111 | { 112 | "argument": "Stacks[].StackStatus", 113 | "expected": "UPDATE_ROLLBACK_IN_PROGRESS", 114 | "matcher": "pathAny", 115 | "state": "failure" 116 | } 117 | ] 118 | }, 119 | "StackUpdateComplete": { 120 | "delay": 30, 121 | "maxAttempts": 120, 122 | "operation": "DescribeStacks", 123 | "description": "Wait until stack status is UPDATE_COMPLETE.", 124 | "acceptors": [ 125 | { 126 | "argument": "Stacks[].StackStatus", 127 | "expected": "UPDATE_COMPLETE", 128 | "matcher": "pathAll", 129 | "state": "success" 130 | }, 131 | { 132 | "expected": "UPDATE_FAILED", 133 | "matcher": "pathAny", 134 | "state": "failure", 135 | "argument": "Stacks[].StackStatus" 136 | }, 137 | { 138 | "argument": "Stacks[].StackStatus", 139 | "expected": "UPDATE_ROLLBACK_FAILED", 140 | "matcher": "pathAny", 141 | "state": "failure" 142 | }, 143 | { 144 | "expected": "UPDATE_ROLLBACK_COMPLETE", 145 | "matcher": "pathAny", 146 | "state": "failure", 147 | "argument": "Stacks[].StackStatus" 148 | }, 149 | { 150 | "expected": "ValidationError", 151 | "matcher": "error", 152 | "state": "failure" 153 | } 154 | ] 155 | } 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /apis/cloudfront-2016-11-25.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListCloudFrontOriginAccessIdentities": { 4 | "input_token": "Marker", 5 | "output_token": "CloudFrontOriginAccessIdentityList.NextMarker", 6 | "limit_key": "MaxItems", 7 | "more_results": "CloudFrontOriginAccessIdentityList.IsTruncated", 8 | "result_key": "CloudFrontOriginAccessIdentityList.Items" 9 | }, 10 | "ListDistributions": { 11 | "input_token": "Marker", 12 | "output_token": "DistributionList.NextMarker", 13 | "limit_key": "MaxItems", 14 | "more_results": "DistributionList.IsTruncated", 15 | "result_key": "DistributionList.Items" 16 | }, 17 | "ListInvalidations": { 18 | "input_token": "Marker", 19 | "output_token": "InvalidationList.NextMarker", 20 | "limit_key": "MaxItems", 21 | "more_results": "InvalidationList.IsTruncated", 22 | "result_key": "InvalidationList.Items" 23 | }, 24 | "ListStreamingDistributions": { 25 | "input_token": "Marker", 26 | "output_token": "StreamingDistributionList.NextMarker", 27 | "limit_key": "MaxItems", 28 | "more_results": "StreamingDistributionList.IsTruncated", 29 | "result_key": "StreamingDistributionList.Items" 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /apis/cloudfront-2016-11-25.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "DistributionDeployed": { 5 | "delay": 60, 6 | "operation": "GetDistribution", 7 | "maxAttempts": 25, 8 | "description": "Wait until a distribution is deployed.", 9 | "acceptors": [ 10 | { 11 | "expected": "Deployed", 12 | "matcher": "path", 13 | "state": "success", 14 | "argument": "Distribution.Status" 15 | } 16 | ] 17 | }, 18 | "InvalidationCompleted": { 19 | "delay": 20, 20 | "operation": "GetInvalidation", 21 | "maxAttempts": 30, 22 | "description": "Wait until an invalidation has completed.", 23 | "acceptors": [ 24 | { 25 | "expected": "Completed", 26 | "matcher": "path", 27 | "state": "success", 28 | "argument": "Invalidation.Status" 29 | } 30 | ] 31 | }, 32 | "StreamingDistributionDeployed": { 33 | "delay": 60, 34 | "operation": "GetStreamingDistribution", 35 | "maxAttempts": 25, 36 | "description": "Wait until a streaming distribution is deployed.", 37 | "acceptors": [ 38 | { 39 | "expected": "Deployed", 40 | "matcher": "path", 41 | "state": "success", 42 | "argument": "StreamingDistribution.Status" 43 | } 44 | ] 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /apis/cloudsearch-2011-02-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeDomains": { 4 | "result_key": "DomainStatusList" 5 | }, 6 | "DescribeIndexFields": { 7 | "result_key": "IndexFields" 8 | }, 9 | "DescribeRankExpressions": { 10 | "result_key": "RankExpressions" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apis/cloudsearch-2013-01-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeAnalysisSchemes": { 4 | "result_key": "AnalysisSchemes" 5 | }, 6 | "DescribeDomains": { 7 | "result_key": "DomainStatusList" 8 | }, 9 | "DescribeExpressions": { 10 | "result_key": "Expressions" 11 | }, 12 | "DescribeIndexFields": { 13 | "result_key": "IndexFields" 14 | }, 15 | "DescribeSuggesters": { 16 | "result_key": "Suggesters" 17 | } 18 | } 19 | } 20 | 21 | -------------------------------------------------------------------------------- /apis/cloudtrail-2013-11-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeTrails": { 4 | "result_key": "trailList" 5 | }, 6 | "LookupEvents": { 7 | "input_token": "NextToken", 8 | "output_token": "NextToken", 9 | "limit_key": "MaxResults", 10 | "result_key": "Events" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apis/codebuild-2016-10-06.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | } 4 | } 5 | -------------------------------------------------------------------------------- /apis/codecommit-2015-04-13.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "GetDifferences": { 4 | "input_token": "NextToken", 5 | "limit_key": "MaxResults", 6 | "output_token": "NextToken" 7 | }, 8 | "ListBranches": { 9 | "input_token": "nextToken", 10 | "output_token": "nextToken", 11 | "result_key": "branches" 12 | }, 13 | "ListRepositories": { 14 | "input_token": "nextToken", 15 | "output_token": "nextToken", 16 | "result_key": "repositories" 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /apis/codedeploy-2014-10-06.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | } 4 | } 5 | -------------------------------------------------------------------------------- /apis/codedeploy-2014-10-06.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "DeploymentSuccessful": { 5 | "delay": 15, 6 | "operation": "GetDeployment", 7 | "maxAttempts": 120, 8 | "acceptors": [ 9 | { 10 | "expected": "Succeeded", 11 | "matcher": "path", 12 | "state": "success", 13 | "argument": "deploymentInfo.status" 14 | }, 15 | { 16 | "expected": "Failed", 17 | "matcher": "path", 18 | "state": "failure", 19 | "argument": "deploymentInfo.status" 20 | }, 21 | { 22 | "expected": "Stopped", 23 | "matcher": "path", 24 | "state": "failure", 25 | "argument": "deploymentInfo.status" 26 | } 27 | ] 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /apis/config-2014-11-12.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "GetResourceConfigHistory": { 4 | "input_token": "nextToken", 5 | "limit_key": "limit", 6 | "output_token": "nextToken", 7 | "result_key": "configurationItems" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /apis/cur-2017-01-06.min.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "metadata": { 4 | "apiVersion": "2017-01-06", 5 | "endpointPrefix": "cur", 6 | "jsonVersion": "1.1", 7 | "protocol": "json", 8 | "serviceFullName": "AWS Cost and Usage Report Service", 9 | "signatureVersion": "v4", 10 | "signingName": "cur", 11 | "targetPrefix": "AWSOrigamiServiceGatewayService", 12 | "uid": "cur-2017-01-06" 13 | }, 14 | "operations": { 15 | "DeleteReportDefinition": { 16 | "input": { 17 | "type": "structure", 18 | "members": { 19 | "ReportName": {} 20 | } 21 | }, 22 | "output": { 23 | "type": "structure", 24 | "members": { 25 | "ResponseMessage": {} 26 | } 27 | } 28 | }, 29 | "DescribeReportDefinitions": { 30 | "input": { 31 | "type": "structure", 32 | "members": { 33 | "MaxResults": { 34 | "type": "integer" 35 | }, 36 | "NextToken": {} 37 | } 38 | }, 39 | "output": { 40 | "type": "structure", 41 | "members": { 42 | "ReportDefinitions": { 43 | "type": "list", 44 | "member": { 45 | "shape": "Sa" 46 | } 47 | }, 48 | "NextToken": {} 49 | } 50 | } 51 | }, 52 | "PutReportDefinition": { 53 | "input": { 54 | "type": "structure", 55 | "required": [ 56 | "ReportDefinition" 57 | ], 58 | "members": { 59 | "ReportDefinition": { 60 | "shape": "Sa" 61 | } 62 | } 63 | }, 64 | "output": { 65 | "type": "structure", 66 | "members": {} 67 | } 68 | } 69 | }, 70 | "shapes": { 71 | "Sa": { 72 | "type": "structure", 73 | "required": [ 74 | "ReportName", 75 | "TimeUnit", 76 | "Format", 77 | "Compression", 78 | "AdditionalSchemaElements", 79 | "S3Bucket", 80 | "S3Prefix", 81 | "S3Region" 82 | ], 83 | "members": { 84 | "ReportName": {}, 85 | "TimeUnit": {}, 86 | "Format": {}, 87 | "Compression": {}, 88 | "AdditionalSchemaElements": { 89 | "type": "list", 90 | "member": {} 91 | }, 92 | "S3Bucket": {}, 93 | "S3Prefix": {}, 94 | "S3Region": {}, 95 | "AdditionalArtifacts": { 96 | "type": "list", 97 | "member": {} 98 | } 99 | } 100 | } 101 | } 102 | } -------------------------------------------------------------------------------- /apis/cur-2017-01-06.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeReportDefinitions": { 4 | "input_token": "NextToken", 5 | "output_token": "NextToken", 6 | "limit_key": "MaxResults" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /apis/datapipeline-2012-10-29.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListPipelines": { 4 | "input_token": "marker", 5 | "output_token": "marker", 6 | "more_results": "hasMoreResults", 7 | "result_key": "pipelineIdList" 8 | }, 9 | "DescribeObjects": { 10 | "input_token": "marker", 11 | "output_token": "marker", 12 | "more_results": "hasMoreResults", 13 | "result_key": "pipelineObjects" 14 | }, 15 | "DescribePipelines": { 16 | "result_key": "pipelineDescriptionList" 17 | }, 18 | "QueryObjects": { 19 | "input_token": "marker", 20 | "output_token": "marker", 21 | "more_results": "hasMoreResults", 22 | "limit_key": "limit", 23 | "result_key": "ids" 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /apis/devicefarm-2015-06-23.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "GetOfferingStatus": { 4 | "input_token": "nextToken", 5 | "output_token": "nextToken", 6 | "result_key": ["current","nextPeriod"] 7 | }, 8 | "ListArtifacts": { 9 | "input_token": "nextToken", 10 | "output_token": "nextToken", 11 | "result_key": "artifacts" 12 | }, 13 | "ListDevicePools": { 14 | "input_token": "nextToken", 15 | "output_token": "nextToken", 16 | "result_key": "devicePools" 17 | }, 18 | "ListDevices": { 19 | "input_token": "nextToken", 20 | "output_token": "nextToken", 21 | "result_key": "devices" 22 | }, 23 | "ListJobs": { 24 | "input_token": "nextToken", 25 | "output_token": "nextToken", 26 | "result_key": "jobs" 27 | }, 28 | "ListOfferingTransactions": { 29 | "input_token": "nextToken", 30 | "output_token": "nextToken", 31 | "result_key": "offeringTransactions" 32 | }, 33 | "ListOfferings": { 34 | "input_token": "nextToken", 35 | "output_token": "nextToken", 36 | "result_key": "offerings" 37 | }, 38 | "ListProjects": { 39 | "input_token": "nextToken", 40 | "output_token": "nextToken", 41 | "result_key": "projects" 42 | }, 43 | "ListRuns": { 44 | "input_token": "nextToken", 45 | "output_token": "nextToken", 46 | "result_key": "runs" 47 | }, 48 | "ListSamples": { 49 | "input_token": "nextToken", 50 | "output_token": "nextToken", 51 | "result_key": "samples" 52 | }, 53 | "ListSuites": { 54 | "input_token": "nextToken", 55 | "output_token": "nextToken", 56 | "result_key": "suites" 57 | }, 58 | "ListTests": { 59 | "input_token": "nextToken", 60 | "output_token": "nextToken", 61 | "result_key": "tests" 62 | }, 63 | "ListUniqueProblems": { 64 | "input_token": "nextToken", 65 | "output_token": "nextToken", 66 | "result_key": "uniqueProblems" 67 | }, 68 | "ListUploads": { 69 | "input_token": "nextToken", 70 | "output_token": "nextToken", 71 | "result_key": "uploads" 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /apis/directconnect-2012-10-25.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeConnections": { 4 | "result_key": "connections" 5 | }, 6 | "DescribeConnectionsOnInterconnect": { 7 | "result_key": "connections" 8 | }, 9 | "DescribeInterconnects": { 10 | "result_key": "interconnects" 11 | }, 12 | "DescribeLocations": { 13 | "result_key": "locations" 14 | }, 15 | "DescribeVirtualGateways": { 16 | "result_key": "virtualGateways" 17 | }, 18 | "DescribeVirtualInterfaces": { 19 | "result_key": "virtualInterfaces" 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /apis/dynamodb-2011-12-05.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "BatchGetItem": { 4 | "input_token": "RequestItems", 5 | "output_token": "UnprocessedKeys" 6 | }, 7 | "ListTables": { 8 | "input_token": "ExclusiveStartTableName", 9 | "limit_key": "Limit", 10 | "output_token": "LastEvaluatedTableName", 11 | "result_key": "TableNames" 12 | }, 13 | "Query": { 14 | "input_token": "ExclusiveStartKey", 15 | "limit_key": "Limit", 16 | "output_token": "LastEvaluatedKey", 17 | "result_key": "Items" 18 | }, 19 | "Scan": { 20 | "input_token": "ExclusiveStartKey", 21 | "limit_key": "Limit", 22 | "output_token": "LastEvaluatedKey", 23 | "result_key": "Items" 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /apis/dynamodb-2011-12-05.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "TableExists": { 5 | "delay": 20, 6 | "operation": "DescribeTable", 7 | "maxAttempts": 25, 8 | "acceptors": [ 9 | { 10 | "expected": "ACTIVE", 11 | "matcher": "path", 12 | "state": "success", 13 | "argument": "Table.TableStatus" 14 | }, 15 | { 16 | "expected": "ResourceNotFoundException", 17 | "matcher": "error", 18 | "state": "retry" 19 | } 20 | ] 21 | }, 22 | "TableNotExists": { 23 | "delay": 20, 24 | "operation": "DescribeTable", 25 | "maxAttempts": 25, 26 | "acceptors": [ 27 | { 28 | "expected": "ResourceNotFoundException", 29 | "matcher": "error", 30 | "state": "success" 31 | } 32 | ] 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /apis/dynamodb-2012-08-10.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "BatchGetItem": { 4 | "input_token": "RequestItems", 5 | "output_token": "UnprocessedKeys" 6 | }, 7 | "ListTables": { 8 | "input_token": "ExclusiveStartTableName", 9 | "limit_key": "Limit", 10 | "output_token": "LastEvaluatedTableName", 11 | "result_key": "TableNames" 12 | }, 13 | "Query": { 14 | "input_token": "ExclusiveStartKey", 15 | "limit_key": "Limit", 16 | "output_token": "LastEvaluatedKey", 17 | "result_key": "Items" 18 | }, 19 | "Scan": { 20 | "input_token": "ExclusiveStartKey", 21 | "limit_key": "Limit", 22 | "output_token": "LastEvaluatedKey", 23 | "result_key": "Items" 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /apis/dynamodb-2012-08-10.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "TableExists": { 5 | "delay": 20, 6 | "operation": "DescribeTable", 7 | "maxAttempts": 25, 8 | "acceptors": [ 9 | { 10 | "expected": "ACTIVE", 11 | "matcher": "path", 12 | "state": "success", 13 | "argument": "Table.TableStatus" 14 | }, 15 | { 16 | "expected": "ResourceNotFoundException", 17 | "matcher": "error", 18 | "state": "retry" 19 | } 20 | ] 21 | }, 22 | "TableNotExists": { 23 | "delay": 20, 24 | "operation": "DescribeTable", 25 | "maxAttempts": 25, 26 | "acceptors": [ 27 | { 28 | "expected": "ResourceNotFoundException", 29 | "matcher": "error", 30 | "state": "success" 31 | } 32 | ] 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /apis/ec2-2016-11-15.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeAccountAttributes": { 4 | "result_key": "AccountAttributes" 5 | }, 6 | "DescribeAddresses": { 7 | "result_key": "Addresses" 8 | }, 9 | "DescribeAvailabilityZones": { 10 | "result_key": "AvailabilityZones" 11 | }, 12 | "DescribeBundleTasks": { 13 | "result_key": "BundleTasks" 14 | }, 15 | "DescribeConversionTasks": { 16 | "result_key": "ConversionTasks" 17 | }, 18 | "DescribeCustomerGateways": { 19 | "result_key": "CustomerGateways" 20 | }, 21 | "DescribeDhcpOptions": { 22 | "result_key": "DhcpOptions" 23 | }, 24 | "DescribeExportTasks": { 25 | "result_key": "ExportTasks" 26 | }, 27 | "DescribeImages": { 28 | "result_key": "Images" 29 | }, 30 | "DescribeInstanceStatus": { 31 | "input_token": "NextToken", 32 | "limit_key": "MaxResults", 33 | "output_token": "NextToken", 34 | "result_key": "InstanceStatuses" 35 | }, 36 | "DescribeInstances": { 37 | "input_token": "NextToken", 38 | "limit_key": "MaxResults", 39 | "output_token": "NextToken", 40 | "result_key": "Reservations" 41 | }, 42 | "DescribeInternetGateways": { 43 | "result_key": "InternetGateways" 44 | }, 45 | "DescribeKeyPairs": { 46 | "result_key": "KeyPairs" 47 | }, 48 | "DescribeNetworkAcls": { 49 | "result_key": "NetworkAcls" 50 | }, 51 | "DescribeNetworkInterfaces": { 52 | "result_key": "NetworkInterfaces" 53 | }, 54 | "DescribePlacementGroups": { 55 | "result_key": "PlacementGroups" 56 | }, 57 | "DescribeRegions": { 58 | "result_key": "Regions" 59 | }, 60 | "DescribeReservedInstances": { 61 | "result_key": "ReservedInstances" 62 | }, 63 | "DescribeReservedInstancesListings": { 64 | "result_key": "ReservedInstancesListings" 65 | }, 66 | "DescribeReservedInstancesModifications": { 67 | "input_token": "NextToken", 68 | "output_token": "NextToken", 69 | "result_key": "ReservedInstancesModifications" 70 | }, 71 | "DescribeReservedInstancesOfferings": { 72 | "input_token": "NextToken", 73 | "limit_key": "MaxResults", 74 | "output_token": "NextToken", 75 | "result_key": "ReservedInstancesOfferings" 76 | }, 77 | "DescribeRouteTables": { 78 | "result_key": "RouteTables" 79 | }, 80 | "DescribeSecurityGroups": { 81 | "result_key": "SecurityGroups" 82 | }, 83 | "DescribeSnapshots": { 84 | "input_token": "NextToken", 85 | "limit_key": "MaxResults", 86 | "output_token": "NextToken", 87 | "result_key": "Snapshots" 88 | }, 89 | "DescribeSpotFleetRequests": { 90 | "input_token": "NextToken", 91 | "limit_key": "MaxResults", 92 | "output_token": "NextToken", 93 | "result_key": "SpotFleetRequestConfigs" 94 | }, 95 | "DescribeSpotInstanceRequests": { 96 | "result_key": "SpotInstanceRequests" 97 | }, 98 | "DescribeSpotPriceHistory": { 99 | "input_token": "NextToken", 100 | "limit_key": "MaxResults", 101 | "output_token": "NextToken", 102 | "result_key": "SpotPriceHistory" 103 | }, 104 | "DescribeSubnets": { 105 | "result_key": "Subnets" 106 | }, 107 | "DescribeTags": { 108 | "input_token": "NextToken", 109 | "limit_key": "MaxResults", 110 | "output_token": "NextToken", 111 | "result_key": "Tags" 112 | }, 113 | "DescribeVolumeStatus": { 114 | "input_token": "NextToken", 115 | "limit_key": "MaxResults", 116 | "output_token": "NextToken", 117 | "result_key": "VolumeStatuses" 118 | }, 119 | "DescribeVolumes": { 120 | "input_token": "NextToken", 121 | "limit_key": "MaxResults", 122 | "output_token": "NextToken", 123 | "result_key": "Volumes" 124 | }, 125 | "DescribeVpcPeeringConnections": { 126 | "result_key": "VpcPeeringConnections" 127 | }, 128 | "DescribeVpcs": { 129 | "result_key": "Vpcs" 130 | }, 131 | "DescribeVpnConnections": { 132 | "result_key": "VpnConnections" 133 | }, 134 | "DescribeVpnGateways": { 135 | "result_key": "VpnGateways" 136 | } 137 | } 138 | } -------------------------------------------------------------------------------- /apis/ecr-2015-09-21.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListImages": { 4 | "input_token": "nextToken", 5 | "output_token": "nextToken", 6 | "limit_key": "maxResults", 7 | "result_key": "imageIds" 8 | }, 9 | "DescribeImages": { 10 | "input_token": "nextToken", 11 | "output_token": "nextToken", 12 | "limit_key": "maxResults", 13 | "result_key": "imageDetails" 14 | }, 15 | "DescribeRepositories": { 16 | "input_token": "nextToken", 17 | "output_token": "nextToken", 18 | "limit_key": "maxResults", 19 | "result_key": "repositories" 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /apis/ecs-2014-11-13.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListClusters": { 4 | "input_token": "nextToken", 5 | "output_token": "nextToken", 6 | "limit_key": "maxResults", 7 | "result_key": "clusterArns" 8 | }, 9 | "ListContainerInstances": { 10 | "input_token": "nextToken", 11 | "output_token": "nextToken", 12 | "limit_key": "maxResults", 13 | "result_key": "containerInstanceArns" 14 | }, 15 | "ListTaskDefinitions": { 16 | "input_token": "nextToken", 17 | "output_token": "nextToken", 18 | "limit_key": "maxResults", 19 | "result_key": "taskDefinitionArns" 20 | }, 21 | "ListTaskDefinitionFamilies": { 22 | "input_token": "nextToken", 23 | "output_token": "nextToken", 24 | "limit_key": "maxResults", 25 | "result_key": "families" 26 | }, 27 | "ListTasks": { 28 | "input_token": "nextToken", 29 | "output_token": "nextToken", 30 | "limit_key": "maxResults", 31 | "result_key": "taskArns" 32 | }, 33 | "ListServices": { 34 | "input_token": "nextToken", 35 | "output_token": "nextToken", 36 | "limit_key": "maxResults", 37 | "result_key": "serviceArns" 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /apis/ecs-2014-11-13.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "TasksRunning": { 5 | "delay": 6, 6 | "operation": "DescribeTasks", 7 | "maxAttempts": 100, 8 | "acceptors": [ 9 | { 10 | "expected": "STOPPED", 11 | "matcher": "pathAny", 12 | "state": "failure", 13 | "argument": "tasks[].lastStatus" 14 | }, 15 | { 16 | "expected": "MISSING", 17 | "matcher": "pathAny", 18 | "state": "failure", 19 | "argument": "failures[].reason" 20 | }, 21 | { 22 | "expected": "RUNNING", 23 | "matcher": "pathAll", 24 | "state": "success", 25 | "argument": "tasks[].lastStatus" 26 | } 27 | ] 28 | }, 29 | "TasksStopped": { 30 | "delay": 6, 31 | "operation": "DescribeTasks", 32 | "maxAttempts": 100, 33 | "acceptors": [ 34 | { 35 | "expected": "STOPPED", 36 | "matcher": "pathAll", 37 | "state": "success", 38 | "argument": "tasks[].lastStatus" 39 | } 40 | ] 41 | }, 42 | "ServicesStable": { 43 | "delay": 15, 44 | "operation": "DescribeServices", 45 | "maxAttempts": 40, 46 | "acceptors": [ 47 | { 48 | "expected": "MISSING", 49 | "matcher": "pathAny", 50 | "state": "failure", 51 | "argument": "failures[].reason" 52 | }, 53 | { 54 | "expected": "DRAINING", 55 | "matcher": "pathAny", 56 | "state": "failure", 57 | "argument": "services[].status" 58 | }, 59 | { 60 | "expected": "INACTIVE", 61 | "matcher": "pathAny", 62 | "state": "failure", 63 | "argument": "services[].status" 64 | }, 65 | { 66 | "expected": true, 67 | "matcher": "path", 68 | "state": "success", 69 | "argument": "length(services[?!(length(deployments) == `1` && runningCount == desiredCount)]) == `0`" 70 | } 71 | ] 72 | }, 73 | "ServicesInactive": { 74 | "delay": 15, 75 | "operation": "DescribeServices", 76 | "maxAttempts": 40, 77 | "acceptors": [ 78 | { 79 | "expected": "MISSING", 80 | "matcher": "pathAny", 81 | "state": "failure", 82 | "argument": "failures[].reason" 83 | }, 84 | { 85 | "expected": "INACTIVE", 86 | "matcher": "pathAny", 87 | "state": "success", 88 | "argument": "services[].status" 89 | } 90 | ] 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /apis/elasticache-2015-02-02.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeCacheClusters": { 4 | "input_token": "Marker", 5 | "output_token": "Marker", 6 | "limit_key": "MaxRecords", 7 | "result_key": "CacheClusters" 8 | }, 9 | "DescribeCacheEngineVersions": { 10 | "input_token": "Marker", 11 | "output_token": "Marker", 12 | "limit_key": "MaxRecords", 13 | "result_key": "CacheEngineVersions" 14 | }, 15 | "DescribeCacheParameterGroups": { 16 | "input_token": "Marker", 17 | "output_token": "Marker", 18 | "limit_key": "MaxRecords", 19 | "result_key": "CacheParameterGroups" 20 | }, 21 | "DescribeCacheParameters": { 22 | "input_token": "Marker", 23 | "output_token": "Marker", 24 | "limit_key": "MaxRecords", 25 | "result_key": "Parameters" 26 | }, 27 | "DescribeCacheSecurityGroups": { 28 | "input_token": "Marker", 29 | "output_token": "Marker", 30 | "limit_key": "MaxRecords", 31 | "result_key": "CacheSecurityGroups" 32 | }, 33 | "DescribeCacheSubnetGroups": { 34 | "input_token": "Marker", 35 | "output_token": "Marker", 36 | "limit_key": "MaxRecords", 37 | "result_key": "CacheSubnetGroups" 38 | }, 39 | "DescribeEngineDefaultParameters": { 40 | "input_token": "Marker", 41 | "output_token": "EngineDefaults.Marker", 42 | "limit_key": "MaxRecords", 43 | "result_key": "EngineDefaults.Parameters" 44 | }, 45 | "DescribeEvents": { 46 | "input_token": "Marker", 47 | "output_token": "Marker", 48 | "limit_key": "MaxRecords", 49 | "result_key": "Events" 50 | }, 51 | "DescribeReservedCacheNodes": { 52 | "input_token": "Marker", 53 | "output_token": "Marker", 54 | "limit_key": "MaxRecords", 55 | "result_key": "ReservedCacheNodes" 56 | }, 57 | "DescribeReservedCacheNodesOfferings": { 58 | "input_token": "Marker", 59 | "output_token": "Marker", 60 | "limit_key": "MaxRecords", 61 | "result_key": "ReservedCacheNodesOfferings" 62 | }, 63 | "DescribeReplicationGroups": { 64 | "input_token": "Marker", 65 | "output_token": "Marker", 66 | "limit_key": "MaxRecords", 67 | "result_key": "ReplicationGroups" 68 | }, 69 | "DescribeSnapshots": { 70 | "input_token": "Marker", 71 | "output_token": "Marker", 72 | "limit_key": "MaxRecords", 73 | "result_key": "Snapshots" 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /apis/elasticache-2015-02-02.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version":2, 3 | "waiters":{ 4 | "CacheClusterAvailable":{ 5 | "acceptors":[ 6 | { 7 | "argument":"CacheClusters[].CacheClusterStatus", 8 | "expected":"available", 9 | "matcher":"pathAll", 10 | "state":"success" 11 | }, 12 | { 13 | "argument":"CacheClusters[].CacheClusterStatus", 14 | "expected":"deleted", 15 | "matcher":"pathAny", 16 | "state":"failure" 17 | }, 18 | { 19 | "argument":"CacheClusters[].CacheClusterStatus", 20 | "expected":"deleting", 21 | "matcher":"pathAny", 22 | "state":"failure" 23 | }, 24 | { 25 | "argument":"CacheClusters[].CacheClusterStatus", 26 | "expected":"incompatible-network", 27 | "matcher":"pathAny", 28 | "state":"failure" 29 | }, 30 | { 31 | "argument":"CacheClusters[].CacheClusterStatus", 32 | "expected":"restore-failed", 33 | "matcher":"pathAny", 34 | "state":"failure" 35 | } 36 | ], 37 | "delay":15, 38 | "description":"Wait until ElastiCache cluster is available.", 39 | "maxAttempts":40, 40 | "operation":"DescribeCacheClusters" 41 | }, 42 | "CacheClusterDeleted":{ 43 | "acceptors":[ 44 | { 45 | "argument":"CacheClusters[].CacheClusterStatus", 46 | "expected":"deleted", 47 | "matcher":"pathAll", 48 | "state":"success" 49 | }, 50 | { 51 | "expected":"CacheClusterNotFound", 52 | "matcher":"error", 53 | "state":"success" 54 | }, 55 | { 56 | "argument":"CacheClusters[].CacheClusterStatus", 57 | "expected":"available", 58 | "matcher":"pathAny", 59 | "state":"failure" 60 | }, 61 | { 62 | "argument":"CacheClusters[].CacheClusterStatus", 63 | "expected":"creating", 64 | "matcher":"pathAny", 65 | "state":"failure" 66 | }, 67 | { 68 | "argument":"CacheClusters[].CacheClusterStatus", 69 | "expected":"incompatible-network", 70 | "matcher":"pathAny", 71 | "state":"failure" 72 | }, 73 | { 74 | "argument":"CacheClusters[].CacheClusterStatus", 75 | "expected":"modifying", 76 | "matcher":"pathAny", 77 | "state":"failure" 78 | }, 79 | { 80 | "argument":"CacheClusters[].CacheClusterStatus", 81 | "expected":"restore-failed", 82 | "matcher":"pathAny", 83 | "state":"failure" 84 | }, 85 | { 86 | "argument":"CacheClusters[].CacheClusterStatus", 87 | "expected":"snapshotting", 88 | "matcher":"pathAny", 89 | "state":"failure" 90 | } 91 | ], 92 | "delay":15, 93 | "description":"Wait until ElastiCache cluster is deleted.", 94 | "maxAttempts":40, 95 | "operation":"DescribeCacheClusters" 96 | }, 97 | "ReplicationGroupAvailable":{ 98 | "acceptors":[ 99 | { 100 | "argument":"ReplicationGroups[].Status", 101 | "expected":"available", 102 | "matcher":"pathAll", 103 | "state":"success" 104 | }, 105 | { 106 | "argument":"ReplicationGroups[].Status", 107 | "expected":"deleted", 108 | "matcher":"pathAny", 109 | "state":"failure" 110 | } 111 | ], 112 | "delay":15, 113 | "description":"Wait until ElastiCache replication group is available.", 114 | "maxAttempts":40, 115 | "operation":"DescribeReplicationGroups" 116 | }, 117 | "ReplicationGroupDeleted":{ 118 | "acceptors":[ 119 | { 120 | "argument":"ReplicationGroups[].Status", 121 | "expected":"deleted", 122 | "matcher":"pathAll", 123 | "state":"success" 124 | }, 125 | { 126 | "argument":"ReplicationGroups[].Status", 127 | "expected":"available", 128 | "matcher":"pathAny", 129 | "state":"failure" 130 | }, 131 | { 132 | "expected":"ReplicationGroupNotFoundFault", 133 | "matcher":"error", 134 | "state":"success" 135 | } 136 | ], 137 | "delay":15, 138 | "description":"Wait until ElastiCache replication group is deleted.", 139 | "maxAttempts":40, 140 | "operation":"DescribeReplicationGroups" 141 | } 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /apis/elasticbeanstalk-2010-12-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeApplicationVersions": { 4 | "result_key": "ApplicationVersions" 5 | }, 6 | "DescribeApplications": { 7 | "result_key": "Applications" 8 | }, 9 | "DescribeConfigurationOptions": { 10 | "result_key": "Options" 11 | }, 12 | "DescribeEnvironments": { 13 | "result_key": "Environments" 14 | }, 15 | "DescribeEvents": { 16 | "input_token": "NextToken", 17 | "output_token": "NextToken", 18 | "limit_key": "MaxRecords", 19 | "result_key": "Events" 20 | }, 21 | "ListAvailableSolutionStacks": { 22 | "result_key": "SolutionStacks" 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /apis/elasticloadbalancing-2012-06-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeInstanceHealth": { 4 | "result_key": "InstanceStates" 5 | }, 6 | "DescribeLoadBalancerPolicies": { 7 | "result_key": "PolicyDescriptions" 8 | }, 9 | "DescribeLoadBalancerPolicyTypes": { 10 | "result_key": "PolicyTypeDescriptions" 11 | }, 12 | "DescribeLoadBalancers": { 13 | "input_token": "Marker", 14 | "output_token": "NextMarker", 15 | "result_key": "LoadBalancerDescriptions" 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apis/elasticloadbalancing-2012-06-01.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version":2, 3 | "waiters":{ 4 | "InstanceDeregistered": { 5 | "delay": 15, 6 | "operation": "DescribeInstanceHealth", 7 | "maxAttempts": 40, 8 | "acceptors": [ 9 | { 10 | "expected": "OutOfService", 11 | "matcher": "pathAll", 12 | "state": "success", 13 | "argument": "InstanceStates[].State" 14 | }, 15 | { 16 | "matcher": "error", 17 | "expected": "InvalidInstance", 18 | "state": "success" 19 | } 20 | ] 21 | }, 22 | "AnyInstanceInService":{ 23 | "acceptors":[ 24 | { 25 | "argument":"InstanceStates[].State", 26 | "expected":"InService", 27 | "matcher":"pathAny", 28 | "state":"success" 29 | } 30 | ], 31 | "delay":15, 32 | "maxAttempts":40, 33 | "operation":"DescribeInstanceHealth" 34 | }, 35 | "InstanceInService":{ 36 | "acceptors":[ 37 | { 38 | "argument":"InstanceStates[].State", 39 | "expected":"InService", 40 | "matcher":"pathAll", 41 | "state":"success" 42 | } 43 | ], 44 | "delay":15, 45 | "maxAttempts":40, 46 | "operation":"DescribeInstanceHealth" 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /apis/elasticloadbalancingv2-2015-12-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeListeners": { 4 | "input_token": "Marker", 5 | "output_token": "NextMarker", 6 | "result_key": "Listeners" 7 | }, 8 | "DescribeLoadBalancers": { 9 | "input_token": "Marker", 10 | "output_token": "NextMarker", 11 | "result_key": "LoadBalancers" 12 | }, 13 | "DescribeTargetGroups": { 14 | "input_token": "Marker", 15 | "output_token": "NextMarker", 16 | "result_key": "TargetGroups" 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /apis/elasticmapreduce-2009-03-31.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeJobFlows": { 4 | "result_key": "JobFlows" 5 | }, 6 | "ListBootstrapActions": { 7 | "input_token": "Marker", 8 | "output_token": "Marker", 9 | "result_key": "BootstrapActions" 10 | }, 11 | "ListClusters": { 12 | "input_token": "Marker", 13 | "output_token": "Marker", 14 | "result_key": "Clusters" 15 | }, 16 | "ListInstanceGroups": { 17 | "input_token": "Marker", 18 | "output_token": "Marker", 19 | "result_key": "InstanceGroups" 20 | }, 21 | "ListInstances": { 22 | "input_token": "Marker", 23 | "output_token": "Marker", 24 | "result_key": "Instances" 25 | }, 26 | "ListSteps": { 27 | "input_token": "Marker", 28 | "output_token": "Marker", 29 | "result_key": "Steps" 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /apis/elasticmapreduce-2009-03-31.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "ClusterRunning": { 5 | "delay": 30, 6 | "operation": "DescribeCluster", 7 | "maxAttempts": 60, 8 | "acceptors": [ 9 | { 10 | "state": "success", 11 | "matcher": "path", 12 | "argument": "Cluster.Status.State", 13 | "expected": "RUNNING" 14 | }, 15 | { 16 | "state": "success", 17 | "matcher": "path", 18 | "argument": "Cluster.Status.State", 19 | "expected": "WAITING" 20 | }, 21 | { 22 | "state": "failure", 23 | "matcher": "path", 24 | "argument": "Cluster.Status.State", 25 | "expected": "TERMINATING" 26 | }, 27 | { 28 | "state": "failure", 29 | "matcher": "path", 30 | "argument": "Cluster.Status.State", 31 | "expected": "TERMINATED" 32 | }, 33 | { 34 | "state": "failure", 35 | "matcher": "path", 36 | "argument": "Cluster.Status.State", 37 | "expected": "TERMINATED_WITH_ERRORS" 38 | } 39 | ] 40 | }, 41 | "StepComplete": { 42 | "delay": 30, 43 | "operation": "DescribeStep", 44 | "maxAttempts": 60, 45 | "acceptors": [ 46 | { 47 | "state": "success", 48 | "matcher": "path", 49 | "argument": "Step.Status.State", 50 | "expected": "COMPLETED" 51 | }, 52 | { 53 | "state": "failure", 54 | "matcher": "path", 55 | "argument": "Step.Status.State", 56 | "expected": "FAILED" 57 | }, 58 | { 59 | "state": "failure", 60 | "matcher": "path", 61 | "argument": "Step.Status.State", 62 | "expected": "CANCELLED" 63 | } 64 | ] 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /apis/elastictranscoder-2012-09-25.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListJobsByPipeline": { 4 | "input_token": "PageToken", 5 | "output_token": "NextPageToken", 6 | "result_key": "Jobs" 7 | }, 8 | "ListJobsByStatus": { 9 | "input_token": "PageToken", 10 | "output_token": "NextPageToken", 11 | "result_key": "Jobs" 12 | }, 13 | "ListPipelines": { 14 | "input_token": "PageToken", 15 | "output_token": "NextPageToken", 16 | "result_key": "Pipelines" 17 | }, 18 | "ListPresets": { 19 | "input_token": "PageToken", 20 | "output_token": "NextPageToken", 21 | "result_key": "Presets" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /apis/elastictranscoder-2012-09-25.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "JobComplete": { 5 | "delay": 30, 6 | "operation": "ReadJob", 7 | "maxAttempts": 120, 8 | "acceptors": [ 9 | { 10 | "expected": "Complete", 11 | "matcher": "path", 12 | "state": "success", 13 | "argument": "Job.Status" 14 | }, 15 | { 16 | "expected": "Canceled", 17 | "matcher": "path", 18 | "state": "failure", 19 | "argument": "Job.Status" 20 | }, 21 | { 22 | "expected": "Error", 23 | "matcher": "path", 24 | "state": "failure", 25 | "argument": "Job.Status" 26 | } 27 | ] 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /apis/email-2010-12-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListIdentities": { 4 | "input_token": "NextToken", 5 | "output_token": "NextToken", 6 | "limit_key": "MaxItems", 7 | "result_key": "Identities" 8 | }, 9 | "ListVerifiedEmailAddresses": { 10 | "result_key": "VerifiedEmailAddresses" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apis/email-2010-12-01.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "IdentityExists": { 5 | "delay": 3, 6 | "operation": "GetIdentityVerificationAttributes", 7 | "maxAttempts": 20, 8 | "acceptors": [ 9 | { 10 | "expected": "Success", 11 | "matcher": "pathAll", 12 | "state": "success", 13 | "argument": "VerificationAttributes.*.VerificationStatus" 14 | } 15 | ] 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apis/glacier-2012-06-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListJobs": { 4 | "input_token": "marker", 5 | "limit_key": "limit", 6 | "output_token": "Marker", 7 | "result_key": "JobList" 8 | }, 9 | "ListMultipartUploads": { 10 | "input_token": "marker", 11 | "limit_key": "limit", 12 | "output_token": "Marker", 13 | "result_key": "UploadsList" 14 | }, 15 | "ListParts": { 16 | "input_token": "marker", 17 | "limit_key": "limit", 18 | "output_token": "Marker", 19 | "result_key": "Parts" 20 | }, 21 | "ListVaults": { 22 | "input_token": "marker", 23 | "limit_key": "limit", 24 | "output_token": "Marker", 25 | "result_key": "VaultList" 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /apis/glacier-2012-06-01.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "VaultExists": { 5 | "operation": "DescribeVault", 6 | "delay": 3, 7 | "maxAttempts": 15, 8 | "acceptors": [ 9 | { 10 | "state": "success", 11 | "matcher": "status", 12 | "expected": 200 13 | }, 14 | { 15 | "state": "retry", 16 | "matcher": "error", 17 | "expected": "ResourceNotFoundException" 18 | } 19 | ] 20 | }, 21 | "VaultNotExists": { 22 | "operation": "DescribeVault", 23 | "delay": 3, 24 | "maxAttempts": 15, 25 | "acceptors": [ 26 | { 27 | "state": "retry", 28 | "matcher": "status", 29 | "expected": 200 30 | }, 31 | { 32 | "state": "success", 33 | "matcher": "error", 34 | "expected": "ResourceNotFoundException" 35 | } 36 | ] 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /apis/health-2016-08-04.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeAffectedEntities": { 4 | "input_token": "nextToken", 5 | "output_token": "nextToken", 6 | "limit_key": "maxResults", 7 | "result_key": "entities" 8 | }, 9 | "DescribeEntityAggregates": { 10 | "result_key": "entityAggregates" 11 | }, 12 | "DescribeEventAggregates": { 13 | "input_token": "nextToken", 14 | "output_token": "nextToken", 15 | "limit_key": "maxResults", 16 | "result_key": "eventAggregates" 17 | }, 18 | "DescribeEvents": { 19 | "input_token": "nextToken", 20 | "output_token": "nextToken", 21 | "limit_key": "maxResults", 22 | "result_key": "events" 23 | }, 24 | "DescribeEventTypes": { 25 | "input_token": "nextToken", 26 | "output_token": "nextToken", 27 | "limit_key": "maxResults", 28 | "result_key": "eventTypes" 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /apis/iam-2010-05-08.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "GetAccountAuthorizationDetails": { 4 | "input_token": "Marker", 5 | "limit_key": "MaxItems", 6 | "more_results": "IsTruncated", 7 | "output_token": "Marker", 8 | "result_key": [ 9 | "UserDetailList", 10 | "GroupDetailList", 11 | "RoleDetailList", 12 | "Policies" 13 | ] 14 | }, 15 | "GetGroup": { 16 | "input_token": "Marker", 17 | "limit_key": "MaxItems", 18 | "more_results": "IsTruncated", 19 | "output_token": "Marker", 20 | "result_key": "Users" 21 | }, 22 | "ListAccessKeys": { 23 | "input_token": "Marker", 24 | "limit_key": "MaxItems", 25 | "more_results": "IsTruncated", 26 | "output_token": "Marker", 27 | "result_key": "AccessKeyMetadata" 28 | }, 29 | "ListAccountAliases": { 30 | "input_token": "Marker", 31 | "limit_key": "MaxItems", 32 | "more_results": "IsTruncated", 33 | "output_token": "Marker", 34 | "result_key": "AccountAliases" 35 | }, 36 | "ListAttachedGroupPolicies": { 37 | "input_token": "Marker", 38 | "limit_key": "MaxItems", 39 | "more_results": "IsTruncated", 40 | "output_token": "Marker", 41 | "result_key": "AttachedPolicies" 42 | }, 43 | "ListAttachedRolePolicies": { 44 | "input_token": "Marker", 45 | "limit_key": "MaxItems", 46 | "more_results": "IsTruncated", 47 | "output_token": "Marker", 48 | "result_key": "AttachedPolicies" 49 | }, 50 | "ListAttachedUserPolicies": { 51 | "input_token": "Marker", 52 | "limit_key": "MaxItems", 53 | "more_results": "IsTruncated", 54 | "output_token": "Marker", 55 | "result_key": "AttachedPolicies" 56 | }, 57 | "ListEntitiesForPolicy": { 58 | "input_token": "Marker", 59 | "limit_key": "MaxItems", 60 | "more_results": "IsTruncated", 61 | "output_token": "Marker", 62 | "result_key": [ 63 | "PolicyGroups", 64 | "PolicyUsers", 65 | "PolicyRoles" 66 | ] 67 | }, 68 | "ListGroupPolicies": { 69 | "input_token": "Marker", 70 | "limit_key": "MaxItems", 71 | "more_results": "IsTruncated", 72 | "output_token": "Marker", 73 | "result_key": "PolicyNames" 74 | }, 75 | "ListGroups": { 76 | "input_token": "Marker", 77 | "limit_key": "MaxItems", 78 | "more_results": "IsTruncated", 79 | "output_token": "Marker", 80 | "result_key": "Groups" 81 | }, 82 | "ListGroupsForUser": { 83 | "input_token": "Marker", 84 | "limit_key": "MaxItems", 85 | "more_results": "IsTruncated", 86 | "output_token": "Marker", 87 | "result_key": "Groups" 88 | }, 89 | "ListInstanceProfiles": { 90 | "input_token": "Marker", 91 | "limit_key": "MaxItems", 92 | "more_results": "IsTruncated", 93 | "output_token": "Marker", 94 | "result_key": "InstanceProfiles" 95 | }, 96 | "ListInstanceProfilesForRole": { 97 | "input_token": "Marker", 98 | "limit_key": "MaxItems", 99 | "more_results": "IsTruncated", 100 | "output_token": "Marker", 101 | "result_key": "InstanceProfiles" 102 | }, 103 | "ListMFADevices": { 104 | "input_token": "Marker", 105 | "limit_key": "MaxItems", 106 | "more_results": "IsTruncated", 107 | "output_token": "Marker", 108 | "result_key": "MFADevices" 109 | }, 110 | "ListPolicies": { 111 | "input_token": "Marker", 112 | "limit_key": "MaxItems", 113 | "more_results": "IsTruncated", 114 | "output_token": "Marker", 115 | "result_key": "Policies" 116 | }, 117 | "ListPolicyVersions": { 118 | "input_token": "Marker", 119 | "limit_key": "MaxItems", 120 | "more_results": "IsTruncated", 121 | "output_token": "Marker", 122 | "result_key": "Versions" 123 | }, 124 | "ListRolePolicies": { 125 | "input_token": "Marker", 126 | "limit_key": "MaxItems", 127 | "more_results": "IsTruncated", 128 | "output_token": "Marker", 129 | "result_key": "PolicyNames" 130 | }, 131 | "ListRoles": { 132 | "input_token": "Marker", 133 | "limit_key": "MaxItems", 134 | "more_results": "IsTruncated", 135 | "output_token": "Marker", 136 | "result_key": "Roles" 137 | }, 138 | "ListSAMLProviders": { 139 | "result_key": "SAMLProviderList" 140 | }, 141 | "ListServerCertificates": { 142 | "input_token": "Marker", 143 | "limit_key": "MaxItems", 144 | "more_results": "IsTruncated", 145 | "output_token": "Marker", 146 | "result_key": "ServerCertificateMetadataList" 147 | }, 148 | "ListSigningCertificates": { 149 | "input_token": "Marker", 150 | "limit_key": "MaxItems", 151 | "more_results": "IsTruncated", 152 | "output_token": "Marker", 153 | "result_key": "Certificates" 154 | }, 155 | "ListSSHPublicKeys": { 156 | "input_token": "Marker", 157 | "limit_key": "MaxItems", 158 | "more_results": "IsTruncated", 159 | "output_token": "Marker", 160 | "result_key": "SSHPublicKeys" 161 | }, 162 | "ListUserPolicies": { 163 | "input_token": "Marker", 164 | "limit_key": "MaxItems", 165 | "more_results": "IsTruncated", 166 | "output_token": "Marker", 167 | "result_key": "PolicyNames" 168 | }, 169 | "ListUsers": { 170 | "input_token": "Marker", 171 | "limit_key": "MaxItems", 172 | "more_results": "IsTruncated", 173 | "output_token": "Marker", 174 | "result_key": "Users" 175 | }, 176 | "ListVirtualMFADevices": { 177 | "input_token": "Marker", 178 | "limit_key": "MaxItems", 179 | "more_results": "IsTruncated", 180 | "output_token": "Marker", 181 | "result_key": "VirtualMFADevices" 182 | }, 183 | "SimulateCustomPolicy": { 184 | "input_token": "Marker", 185 | "limit_key": "MaxItems", 186 | "more_results": "IsTruncated", 187 | "output_token": "Marker", 188 | "result_key": "EvaluationResults" 189 | }, 190 | "SimulatePrincipalPolicy": { 191 | "input_token": "Marker", 192 | "limit_key": "MaxItems", 193 | "more_results": "IsTruncated", 194 | "output_token": "Marker", 195 | "result_key": "EvaluationResults" 196 | } 197 | } 198 | } -------------------------------------------------------------------------------- /apis/iam-2010-05-08.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "InstanceProfileExists": { 5 | "delay": 1, 6 | "operation": "GetInstanceProfile", 7 | "maxAttempts": 40, 8 | "acceptors": [ 9 | { 10 | "expected": 200, 11 | "matcher": "status", 12 | "state": "success" 13 | }, 14 | { 15 | "state": "retry", 16 | "matcher": "status", 17 | "expected": 404 18 | } 19 | ] 20 | }, 21 | "UserExists": { 22 | "delay": 1, 23 | "operation": "GetUser", 24 | "maxAttempts": 20, 25 | "acceptors": [ 26 | { 27 | "state": "success", 28 | "matcher": "status", 29 | "expected": 200 30 | }, 31 | { 32 | "state": "retry", 33 | "matcher": "error", 34 | "expected": "NoSuchEntity" 35 | } 36 | ] 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /apis/importexport-2010-06-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListJobs": { 4 | "input_token": "Marker", 5 | "output_token": "Jobs[-1].JobId", 6 | "more_results": "IsTruncated", 7 | "limit_key": "MaxJobs", 8 | "result_key": "Jobs" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /apis/iot-data-2015-05-28.min.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "metadata": { 4 | "uid": "iot-data-2015-05-28", 5 | "apiVersion": "2015-05-28", 6 | "endpointPrefix": "data.iot", 7 | "protocol": "rest-json", 8 | "serviceFullName": "AWS IoT Data Plane", 9 | "signatureVersion": "v4", 10 | "signingName": "iotdata" 11 | }, 12 | "operations": { 13 | "DeleteThingShadow": { 14 | "http": { 15 | "method": "DELETE", 16 | "requestUri": "/things/{thingName}/shadow" 17 | }, 18 | "input": { 19 | "type": "structure", 20 | "required": [ 21 | "thingName" 22 | ], 23 | "members": { 24 | "thingName": { 25 | "location": "uri", 26 | "locationName": "thingName" 27 | } 28 | } 29 | }, 30 | "output": { 31 | "type": "structure", 32 | "required": [ 33 | "payload" 34 | ], 35 | "members": { 36 | "payload": { 37 | "type": "blob" 38 | } 39 | }, 40 | "payload": "payload" 41 | } 42 | }, 43 | "GetThingShadow": { 44 | "http": { 45 | "method": "GET", 46 | "requestUri": "/things/{thingName}/shadow" 47 | }, 48 | "input": { 49 | "type": "structure", 50 | "required": [ 51 | "thingName" 52 | ], 53 | "members": { 54 | "thingName": { 55 | "location": "uri", 56 | "locationName": "thingName" 57 | } 58 | } 59 | }, 60 | "output": { 61 | "type": "structure", 62 | "members": { 63 | "payload": { 64 | "type": "blob" 65 | } 66 | }, 67 | "payload": "payload" 68 | } 69 | }, 70 | "Publish": { 71 | "http": { 72 | "requestUri": "/topics/{topic}" 73 | }, 74 | "input": { 75 | "type": "structure", 76 | "required": [ 77 | "topic" 78 | ], 79 | "members": { 80 | "topic": { 81 | "location": "uri", 82 | "locationName": "topic" 83 | }, 84 | "qos": { 85 | "location": "querystring", 86 | "locationName": "qos", 87 | "type": "integer" 88 | }, 89 | "payload": { 90 | "type": "blob" 91 | } 92 | }, 93 | "payload": "payload" 94 | } 95 | }, 96 | "UpdateThingShadow": { 97 | "http": { 98 | "requestUri": "/things/{thingName}/shadow" 99 | }, 100 | "input": { 101 | "type": "structure", 102 | "required": [ 103 | "thingName", 104 | "payload" 105 | ], 106 | "members": { 107 | "thingName": { 108 | "location": "uri", 109 | "locationName": "thingName" 110 | }, 111 | "payload": { 112 | "type": "blob" 113 | } 114 | }, 115 | "payload": "payload" 116 | }, 117 | "output": { 118 | "type": "structure", 119 | "members": { 120 | "payload": { 121 | "type": "blob" 122 | } 123 | }, 124 | "payload": "payload" 125 | } 126 | } 127 | }, 128 | "shapes": {} 129 | } -------------------------------------------------------------------------------- /apis/kinesis-2013-12-02.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeStream": { 4 | "input_token": "ExclusiveStartShardId", 5 | "limit_key": "Limit", 6 | "more_results": "StreamDescription.HasMoreShards", 7 | "output_token": "StreamDescription.Shards[-1].ShardId", 8 | "result_key": "StreamDescription.Shards" 9 | }, 10 | "ListStreams": { 11 | "input_token": "ExclusiveStartStreamName", 12 | "limit_key": "Limit", 13 | "more_results": "HasMoreStreams", 14 | "output_token": "StreamNames[-1]", 15 | "result_key": "StreamNames" 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apis/kinesis-2013-12-02.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "StreamExists": { 5 | "delay": 10, 6 | "operation": "DescribeStream", 7 | "maxAttempts": 18, 8 | "acceptors": [ 9 | { 10 | "expected": "ACTIVE", 11 | "matcher": "path", 12 | "state": "success", 13 | "argument": "StreamDescription.StreamStatus" 14 | } 15 | ] 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apis/kms-2014-11-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListAliases": { 4 | "limit_key": "Limit", 5 | "input_token": "Marker", 6 | "output_token": "NextMarker", 7 | "more_results": "Truncated", 8 | "result_key": "Aliases" 9 | }, 10 | "ListGrants": { 11 | "limit_key": "Limit", 12 | "input_token": "Marker", 13 | "output_token": "NextMarker", 14 | "more_results": "Truncated", 15 | "result_key": "Grants" 16 | }, 17 | "ListKeyPolicies": { 18 | "limit_key": "Limit", 19 | "input_token": "Marker", 20 | "output_token": "NextMarker", 21 | "more_results": "Truncated", 22 | "result_key": "PolicyNames" 23 | }, 24 | "ListKeys": { 25 | "limit_key": "Limit", 26 | "input_token": "Marker", 27 | "output_token": "NextMarker", 28 | "more_results": "Truncated", 29 | "result_key": "Keys" 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /apis/lambda-2014-11-11.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListEventSources": { 4 | "input_token": "Marker", 5 | "output_token": "NextMarker", 6 | "limit_key": "MaxItems", 7 | "result_key": "EventSources" 8 | }, 9 | "ListFunctions": { 10 | "input_token": "Marker", 11 | "output_token": "NextMarker", 12 | "limit_key": "MaxItems", 13 | "result_key": "Functions" 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /apis/lambda-2015-03-31.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListEventSourceMappings": { 4 | "input_token": "Marker", 5 | "output_token": "NextMarker", 6 | "limit_key": "MaxItems", 7 | "result_key": "EventSourceMappings" 8 | }, 9 | "ListFunctions": { 10 | "input_token": "Marker", 11 | "output_token": "NextMarker", 12 | "limit_key": "MaxItems", 13 | "result_key": "Functions" 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /apis/logs-2014-03-28.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeDestinations": { 4 | "input_token": "nextToken", 5 | "output_token": "nextToken", 6 | "limit_key": "limit", 7 | "result_key": "destinations" 8 | }, 9 | "DescribeLogGroups": { 10 | "input_token": "nextToken", 11 | "output_token": "nextToken", 12 | "limit_key": "limit", 13 | "result_key": "logGroups" 14 | }, 15 | "DescribeLogStreams": { 16 | "input_token": "nextToken", 17 | "output_token": "nextToken", 18 | "limit_key": "limit", 19 | "result_key": "logStreams" 20 | }, 21 | "DescribeMetricFilters": { 22 | "input_token": "nextToken", 23 | "output_token": "nextToken", 24 | "limit_key": "limit", 25 | "result_key": "metricFilters" 26 | }, 27 | "DescribeSubscriptionFilters": { 28 | "input_token": "nextToken", 29 | "output_token": "nextToken", 30 | "limit_key": "limit", 31 | "result_key": "subscriptionFilters" 32 | }, 33 | "FilterLogEvents": { 34 | "input_token": "nextToken", 35 | "output_token": "nextToken", 36 | "limit_key": "limit", 37 | "result_key": [ 38 | "events", 39 | "searchedLogStreams" 40 | ] 41 | }, 42 | "GetLogEvents": { 43 | "input_token": "nextToken", 44 | "output_token": "nextForwardToken", 45 | "limit_key": "limit", 46 | "result_key": "events" 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /apis/machinelearning-2014-12-12.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeBatchPredictions": { 4 | "limit_key": "Limit", 5 | "output_token": "NextToken", 6 | "input_token": "NextToken", 7 | "result_key": "Results" 8 | }, 9 | "DescribeDataSources": { 10 | "limit_key": "Limit", 11 | "output_token": "NextToken", 12 | "input_token": "NextToken", 13 | "result_key": "Results" 14 | }, 15 | "DescribeEvaluations": { 16 | "limit_key": "Limit", 17 | "output_token": "NextToken", 18 | "input_token": "NextToken", 19 | "result_key": "Results" 20 | }, 21 | "DescribeMLModels": { 22 | "limit_key": "Limit", 23 | "output_token": "NextToken", 24 | "input_token": "NextToken", 25 | "result_key": "Results" 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /apis/machinelearning-2014-12-12.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "DataSourceAvailable": { 5 | "delay": 30, 6 | "operation": "DescribeDataSources", 7 | "maxAttempts": 60, 8 | "acceptors": [ 9 | { 10 | "expected": "COMPLETED", 11 | "matcher": "pathAll", 12 | "state": "success", 13 | "argument": "Results[].Status" 14 | }, 15 | { 16 | "expected": "FAILED", 17 | "matcher": "pathAny", 18 | "state": "failure", 19 | "argument": "Results[].Status" 20 | } 21 | ] 22 | }, 23 | "MLModelAvailable": { 24 | "delay": 30, 25 | "operation": "DescribeMLModels", 26 | "maxAttempts": 60, 27 | "acceptors": [ 28 | { 29 | "expected": "COMPLETED", 30 | "matcher": "pathAll", 31 | "state": "success", 32 | "argument": "Results[].Status" 33 | }, 34 | { 35 | "expected": "FAILED", 36 | "matcher": "pathAny", 37 | "state": "failure", 38 | "argument": "Results[].Status" 39 | } 40 | ] 41 | }, 42 | "EvaluationAvailable": { 43 | "delay": 30, 44 | "operation": "DescribeEvaluations", 45 | "maxAttempts": 60, 46 | "acceptors": [ 47 | { 48 | "expected": "COMPLETED", 49 | "matcher": "pathAll", 50 | "state": "success", 51 | "argument": "Results[].Status" 52 | }, 53 | { 54 | "expected": "FAILED", 55 | "matcher": "pathAny", 56 | "state": "failure", 57 | "argument": "Results[].Status" 58 | } 59 | ] 60 | }, 61 | "BatchPredictionAvailable": { 62 | "delay": 30, 63 | "operation": "DescribeBatchPredictions", 64 | "maxAttempts": 60, 65 | "acceptors": [ 66 | { 67 | "expected": "COMPLETED", 68 | "matcher": "pathAll", 69 | "state": "success", 70 | "argument": "Results[].Status" 71 | }, 72 | { 73 | "expected": "FAILED", 74 | "matcher": "pathAny", 75 | "state": "failure", 76 | "argument": "Results[].Status" 77 | } 78 | ] 79 | } 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /apis/marketplacecommerceanalytics-2015-07-01.min.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "metadata": { 4 | "apiVersion": "2015-07-01", 5 | "endpointPrefix": "marketplacecommerceanalytics", 6 | "jsonVersion": "1.1", 7 | "protocol": "json", 8 | "serviceFullName": "AWS Marketplace Commerce Analytics", 9 | "signatureVersion": "v4", 10 | "signingName": "marketplacecommerceanalytics", 11 | "targetPrefix": "MarketplaceCommerceAnalytics20150701", 12 | "uid": "marketplacecommerceanalytics-2015-07-01" 13 | }, 14 | "operations": { 15 | "GenerateDataSet": { 16 | "input": { 17 | "type": "structure", 18 | "required": [ 19 | "dataSetType", 20 | "dataSetPublicationDate", 21 | "roleNameArn", 22 | "destinationS3BucketName", 23 | "snsTopicArn" 24 | ], 25 | "members": { 26 | "dataSetType": {}, 27 | "dataSetPublicationDate": { 28 | "type": "timestamp" 29 | }, 30 | "roleNameArn": {}, 31 | "destinationS3BucketName": {}, 32 | "destinationS3Prefix": {}, 33 | "snsTopicArn": {}, 34 | "customerDefinedValues": { 35 | "shape": "S8" 36 | } 37 | } 38 | }, 39 | "output": { 40 | "type": "structure", 41 | "members": { 42 | "dataSetRequestId": {} 43 | } 44 | } 45 | }, 46 | "StartSupportDataExport": { 47 | "input": { 48 | "type": "structure", 49 | "required": [ 50 | "dataSetType", 51 | "fromDate", 52 | "roleNameArn", 53 | "destinationS3BucketName", 54 | "snsTopicArn" 55 | ], 56 | "members": { 57 | "dataSetType": {}, 58 | "fromDate": { 59 | "type": "timestamp" 60 | }, 61 | "roleNameArn": {}, 62 | "destinationS3BucketName": {}, 63 | "destinationS3Prefix": {}, 64 | "snsTopicArn": {}, 65 | "customerDefinedValues": { 66 | "shape": "S8" 67 | } 68 | } 69 | }, 70 | "output": { 71 | "type": "structure", 72 | "members": { 73 | "dataSetRequestId": {} 74 | } 75 | } 76 | } 77 | }, 78 | "shapes": { 79 | "S8": { 80 | "type": "map", 81 | "key": {}, 82 | "value": {} 83 | } 84 | } 85 | } -------------------------------------------------------------------------------- /apis/meteringmarketplace-2016-01-14.min.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "metadata": { 4 | "uid": "meteringmarketplace-2016-01-14", 5 | "apiVersion": "2016-01-14", 6 | "endpointPrefix": "metering.marketplace", 7 | "jsonVersion": "1.1", 8 | "protocol": "json", 9 | "serviceFullName": "AWSMarketplace Metering", 10 | "signatureVersion": "v4", 11 | "signingName": "aws-marketplace", 12 | "targetPrefix": "AWSMPMeteringService" 13 | }, 14 | "operations": { 15 | "BatchMeterUsage": { 16 | "input": { 17 | "type": "structure", 18 | "required": [ 19 | "UsageRecords", 20 | "ProductCode" 21 | ], 22 | "members": { 23 | "UsageRecords": { 24 | "shape": "S2" 25 | }, 26 | "ProductCode": {} 27 | } 28 | }, 29 | "output": { 30 | "type": "structure", 31 | "members": { 32 | "Results": { 33 | "type": "list", 34 | "member": { 35 | "type": "structure", 36 | "members": { 37 | "UsageRecord": { 38 | "shape": "S3" 39 | }, 40 | "MeteringRecordId": {}, 41 | "Status": {} 42 | } 43 | } 44 | }, 45 | "UnprocessedRecords": { 46 | "shape": "S2" 47 | } 48 | } 49 | } 50 | }, 51 | "MeterUsage": { 52 | "input": { 53 | "type": "structure", 54 | "required": [ 55 | "ProductCode", 56 | "Timestamp", 57 | "UsageDimension", 58 | "UsageQuantity", 59 | "DryRun" 60 | ], 61 | "members": { 62 | "ProductCode": {}, 63 | "Timestamp": { 64 | "type": "timestamp" 65 | }, 66 | "UsageDimension": {}, 67 | "UsageQuantity": { 68 | "type": "integer" 69 | }, 70 | "DryRun": { 71 | "type": "boolean" 72 | } 73 | } 74 | }, 75 | "output": { 76 | "type": "structure", 77 | "members": { 78 | "MeteringRecordId": {} 79 | } 80 | } 81 | }, 82 | "ResolveCustomer": { 83 | "input": { 84 | "type": "structure", 85 | "required": [ 86 | "RegistrationToken" 87 | ], 88 | "members": { 89 | "RegistrationToken": {} 90 | } 91 | }, 92 | "output": { 93 | "type": "structure", 94 | "members": { 95 | "CustomerIdentifier": {}, 96 | "ProductCode": {} 97 | } 98 | } 99 | } 100 | }, 101 | "shapes": { 102 | "S2": { 103 | "type": "list", 104 | "member": { 105 | "shape": "S3" 106 | } 107 | }, 108 | "S3": { 109 | "type": "structure", 110 | "required": [ 111 | "Timestamp", 112 | "CustomerIdentifier", 113 | "Dimension", 114 | "Quantity" 115 | ], 116 | "members": { 117 | "Timestamp": { 118 | "type": "timestamp" 119 | }, 120 | "CustomerIdentifier": {}, 121 | "Dimension": {}, 122 | "Quantity": { 123 | "type": "integer" 124 | } 125 | } 126 | } 127 | } 128 | } -------------------------------------------------------------------------------- /apis/mobileanalytics-2014-06-05.min.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "metadata": { 4 | "apiVersion": "2014-06-05", 5 | "endpointPrefix": "mobileanalytics", 6 | "serviceFullName": "Amazon Mobile Analytics", 7 | "signatureVersion": "v4", 8 | "protocol": "rest-json" 9 | }, 10 | "operations": { 11 | "PutEvents": { 12 | "http": { 13 | "requestUri": "/2014-06-05/events", 14 | "responseCode": 202 15 | }, 16 | "input": { 17 | "type": "structure", 18 | "required": [ 19 | "events", 20 | "clientContext" 21 | ], 22 | "members": { 23 | "events": { 24 | "type": "list", 25 | "member": { 26 | "type": "structure", 27 | "required": [ 28 | "eventType", 29 | "timestamp" 30 | ], 31 | "members": { 32 | "eventType": {}, 33 | "timestamp": {}, 34 | "session": { 35 | "type": "structure", 36 | "members": { 37 | "id": {}, 38 | "duration": { 39 | "type": "long" 40 | }, 41 | "startTimestamp": {}, 42 | "stopTimestamp": {} 43 | } 44 | }, 45 | "version": {}, 46 | "attributes": { 47 | "type": "map", 48 | "key": {}, 49 | "value": {} 50 | }, 51 | "metrics": { 52 | "type": "map", 53 | "key": {}, 54 | "value": { 55 | "type": "double" 56 | } 57 | } 58 | } 59 | } 60 | }, 61 | "clientContext": { 62 | "location": "header", 63 | "locationName": "x-amz-Client-Context" 64 | }, 65 | "clientContextEncoding": { 66 | "location": "header", 67 | "locationName": "x-amz-Client-Context-Encoding" 68 | } 69 | } 70 | } 71 | } 72 | }, 73 | "shapes": {} 74 | } -------------------------------------------------------------------------------- /apis/mobileanalytics-2014-06-05.normal.json: -------------------------------------------------------------------------------- 1 | { 2 | "version":"2.0", 3 | "metadata":{ 4 | "apiVersion":"2014-06-05", 5 | "endpointPrefix":"mobileanalytics", 6 | "serviceFullName":"Amazon Mobile Analytics", 7 | "signatureVersion":"v4", 8 | "protocol":"rest-json" 9 | }, 10 | "documentation":"

Amazon Mobile Analytics is a service for collecting, visualizing, and understanding app usage data at scale.

", 11 | "operations":{ 12 | "PutEvents":{ 13 | "name":"PutEvents", 14 | "http":{ 15 | "method":"POST", 16 | "requestUri":"/2014-06-05/events", 17 | "responseCode":202 18 | }, 19 | "input":{ 20 | "shape":"PutEventsInput", 21 | "documentation":"

A container for the data needed for a PutEvent operation

" 22 | }, 23 | "errors":[ 24 | { 25 | "shape":"BadRequestException", 26 | "error":{"httpStatusCode":400}, 27 | "exception":true, 28 | "documentation":"

An exception object returned when a request fails.

" 29 | } 30 | ], 31 | "documentation":"

The PutEvents operation records one or more events. You can have up to 1,500 unique custom events per app, any combination of up to 40 attributes and metrics per custom event, and any number of attribute or metric values.

" 32 | } 33 | }, 34 | "shapes":{ 35 | "BadRequestException":{ 36 | "type":"structure", 37 | "members":{ 38 | "message":{ 39 | "shape":"String", 40 | "documentation":"

A text description associated with the BadRequestException object.

" 41 | } 42 | }, 43 | "error":{"httpStatusCode":400}, 44 | "exception":true, 45 | "documentation":"

An exception object returned when a request fails.

" 46 | }, 47 | "Double":{"type":"double"}, 48 | "Event":{ 49 | "type":"structure", 50 | "required":[ 51 | "eventType", 52 | "timestamp" 53 | ], 54 | "members":{ 55 | "eventType":{ 56 | "shape":"String50Chars", 57 | "documentation":"

A name signifying an event that occurred in your app. This is used for grouping and aggregating like events together for reporting purposes.

" 58 | }, 59 | "timestamp":{ 60 | "shape":"ISO8601Timestamp", 61 | "documentation":"

The time the event occurred in ISO 8601 standard date time format. For example, 2014-06-30T19:07:47.885Z

" 62 | }, 63 | "session":{ 64 | "shape":"Session", 65 | "documentation":"

The session the event occured within.

" 66 | }, 67 | "version":{ 68 | "shape":"String10Chars", 69 | "documentation":"

The version of the event.

" 70 | }, 71 | "attributes":{ 72 | "shape":"MapOfStringToString", 73 | "documentation":"

A collection of key-value pairs that give additional context to the event. The key-value pairs are specified by the developer.

This collection can be empty or the attribute object can be omitted.

" 74 | }, 75 | "metrics":{ 76 | "shape":"MapOfStringToNumber", 77 | "documentation":"

A collection of key-value pairs that gives additional, measurable context to the event. The key-value pairs are specified by the developer.

This collection can be empty or the attribute object can be omitted.

" 78 | } 79 | }, 80 | "documentation":"

A JSON object representing a batch of unique event occurrences in your app.

" 81 | }, 82 | "EventListDefinition":{ 83 | "type":"list", 84 | "member":{"shape":"Event"} 85 | }, 86 | "ISO8601Timestamp":{"type":"string"}, 87 | "Long":{"type":"long"}, 88 | "MapOfStringToNumber":{ 89 | "type":"map", 90 | "key":{"shape":"String50Chars"}, 91 | "value":{"shape":"Double"}, 92 | "min":0, 93 | "max":50 94 | }, 95 | "MapOfStringToString":{ 96 | "type":"map", 97 | "key":{"shape":"String50Chars"}, 98 | "value":{"shape":"String0to1000Chars"}, 99 | "min":0, 100 | "max":50 101 | }, 102 | "PutEventsInput":{ 103 | "type":"structure", 104 | "required":[ 105 | "events", 106 | "clientContext" 107 | ], 108 | "members":{ 109 | "events":{ 110 | "shape":"EventListDefinition", 111 | "documentation":"

An array of Event JSON objects

" 112 | }, 113 | "clientContext":{ 114 | "shape":"String", 115 | "location":"header", 116 | "locationName":"x-amz-Client-Context", 117 | "documentation":"

The client context including the client ID, app title, app version and package name.

" 118 | }, 119 | "clientContextEncoding":{ 120 | "shape":"String", 121 | "location":"header", 122 | "locationName":"x-amz-Client-Context-Encoding", 123 | "documentation":"

The encoding used for the client context.

" 124 | } 125 | }, 126 | "documentation":"

A container for the data needed for a PutEvent operation

" 127 | }, 128 | "Session":{ 129 | "type":"structure", 130 | "members":{ 131 | "id":{ 132 | "shape":"String50Chars", 133 | "documentation":"

A unique identifier for the session

" 134 | }, 135 | "duration":{ 136 | "shape":"Long", 137 | "documentation":"

The duration of the session.

" 138 | }, 139 | "startTimestamp":{ 140 | "shape":"ISO8601Timestamp", 141 | "documentation":"

The time the event started in ISO 8601 standard date time format. For example, 2014-06-30T19:07:47.885Z

" 142 | }, 143 | "stopTimestamp":{ 144 | "shape":"ISO8601Timestamp", 145 | "documentation":"

The time the event terminated in ISO 8601 standard date time format. For example, 2014-06-30T19:07:47.885Z

" 146 | } 147 | }, 148 | "documentation":"

Describes the session. Session information is required on ALL events.

" 149 | }, 150 | "String":{"type":"string"}, 151 | "String0to1000Chars":{ 152 | "type":"string", 153 | "min":0, 154 | "max":1000 155 | }, 156 | "String10Chars":{ 157 | "type":"string", 158 | "min":1, 159 | "max":10 160 | }, 161 | "String50Chars":{ 162 | "type":"string", 163 | "min":1, 164 | "max":50 165 | } 166 | } 167 | } 168 | -------------------------------------------------------------------------------- /apis/monitoring-2010-08-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeAlarmHistory": { 4 | "input_token": "NextToken", 5 | "output_token": "NextToken", 6 | "limit_key": "MaxRecords", 7 | "result_key": "AlarmHistoryItems" 8 | }, 9 | "DescribeAlarms": { 10 | "input_token": "NextToken", 11 | "output_token": "NextToken", 12 | "limit_key": "MaxRecords", 13 | "result_key": "MetricAlarms" 14 | }, 15 | "DescribeAlarmsForMetric": { 16 | "result_key": "MetricAlarms" 17 | }, 18 | "ListMetrics": { 19 | "input_token": "NextToken", 20 | "output_token": "NextToken", 21 | "result_key": "Metrics" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /apis/monitoring-2010-08-01.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "AlarmExists": { 5 | "delay": 5, 6 | "maxAttempts": 40, 7 | "operation": "DescribeAlarms", 8 | "acceptors": [ 9 | { 10 | "matcher": "path", 11 | "expected": true, 12 | "argument": "length(MetricAlarms[]) > `0`", 13 | "state": "success" 14 | } 15 | ] 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apis/opsworks-2013-02-18.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeApps": { 4 | "result_key": "Apps" 5 | }, 6 | "DescribeCommands": { 7 | "result_key": "Commands" 8 | }, 9 | "DescribeDeployments": { 10 | "result_key": "Deployments" 11 | }, 12 | "DescribeEcsClusters": { 13 | "input_token": "NextToken", 14 | "output_token": "NextToken", 15 | "limit_key": "MaxResults", 16 | "result_key": "EcsClusters" 17 | }, 18 | "DescribeElasticIps": { 19 | "result_key": "ElasticIps" 20 | }, 21 | "DescribeElasticLoadBalancers": { 22 | "result_key": "ElasticLoadBalancers" 23 | }, 24 | "DescribeInstances": { 25 | "result_key": "Instances" 26 | }, 27 | "DescribeLayers": { 28 | "result_key": "Layers" 29 | }, 30 | "DescribeLoadBasedAutoScaling": { 31 | "result_key": "LoadBasedAutoScalingConfigurations" 32 | }, 33 | "DescribePermissions": { 34 | "result_key": "Permissions" 35 | }, 36 | "DescribeRaidArrays": { 37 | "result_key": "RaidArrays" 38 | }, 39 | "DescribeServiceErrors": { 40 | "result_key": "ServiceErrors" 41 | }, 42 | "DescribeStacks": { 43 | "result_key": "Stacks" 44 | }, 45 | "DescribeTimeBasedAutoScaling": { 46 | "result_key": "TimeBasedAutoScalingConfigurations" 47 | }, 48 | "DescribeUserProfiles": { 49 | "result_key": "UserProfiles" 50 | }, 51 | "DescribeVolumes": { 52 | "result_key": "Volumes" 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /apis/polly-2016-06-10.examples.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "examples": { 4 | "DeleteLexicon": [ 5 | { 6 | "input": { 7 | "Name": "example" 8 | }, 9 | "output": { 10 | }, 11 | "comments": { 12 | "input": { 13 | }, 14 | "output": { 15 | } 16 | }, 17 | "description": "Deletes a specified pronunciation lexicon stored in an AWS Region.", 18 | "id": "to-delete-a-lexicon-1481922498332", 19 | "title": "To delete a lexicon" 20 | } 21 | ], 22 | "DescribeVoices": [ 23 | { 24 | "input": { 25 | "LanguageCode": "en-GB" 26 | }, 27 | "output": { 28 | "Voices": [ 29 | { 30 | "Gender": "Female", 31 | "Id": "Emma", 32 | "LanguageCode": "en-GB", 33 | "LanguageName": "British English", 34 | "Name": "Emma" 35 | }, 36 | { 37 | "Gender": "Male", 38 | "Id": "Brian", 39 | "LanguageCode": "en-GB", 40 | "LanguageName": "British English", 41 | "Name": "Brian" 42 | }, 43 | { 44 | "Gender": "Female", 45 | "Id": "Amy", 46 | "LanguageCode": "en-GB", 47 | "LanguageName": "British English", 48 | "Name": "Amy" 49 | } 50 | ] 51 | }, 52 | "comments": { 53 | "input": { 54 | }, 55 | "output": { 56 | } 57 | }, 58 | "description": "Returns the list of voices that are available for use when requesting speech synthesis. Displayed languages are those within the specified language code. If no language code is specified, voices for all available languages are displayed.", 59 | "id": "to-describe-available-voices-1482180557753", 60 | "title": "To describe available voices" 61 | } 62 | ], 63 | "GetLexicon": [ 64 | { 65 | "input": { 66 | "Name": "" 67 | }, 68 | "output": { 69 | "Lexicon": { 70 | "Content": "\r\n\r\n \r\n W3C\r\n World Wide Web Consortium\r\n \r\n", 71 | "Name": "example" 72 | }, 73 | "LexiconAttributes": { 74 | "Alphabet": "ipa", 75 | "LanguageCode": "en-US", 76 | "LastModified": 1478542980.117, 77 | "LexemesCount": 1, 78 | "LexiconArn": "arn:aws:polly:us-east-1:123456789012:lexicon/example", 79 | "Size": 503 80 | } 81 | }, 82 | "comments": { 83 | "input": { 84 | }, 85 | "output": { 86 | } 87 | }, 88 | "description": "Returns the content of the specified pronunciation lexicon stored in an AWS Region.", 89 | "id": "to-retrieve-a-lexicon-1481912870836", 90 | "title": "To retrieve a lexicon" 91 | } 92 | ], 93 | "ListLexicons": [ 94 | { 95 | "input": { 96 | }, 97 | "output": { 98 | "Lexicons": [ 99 | { 100 | "Attributes": { 101 | "Alphabet": "ipa", 102 | "LanguageCode": "en-US", 103 | "LastModified": 1478542980.117, 104 | "LexemesCount": 1, 105 | "LexiconArn": "arn:aws:polly:us-east-1:123456789012:lexicon/example", 106 | "Size": 503 107 | }, 108 | "Name": "example" 109 | } 110 | ] 111 | }, 112 | "comments": { 113 | "input": { 114 | }, 115 | "output": { 116 | } 117 | }, 118 | "description": "Returns a list of pronunciation lexicons stored in an AWS Region.", 119 | "id": "to-list-all-lexicons-in-a-region-1481842106487", 120 | "title": "To list all lexicons in a region" 121 | } 122 | ], 123 | "PutLexicon": [ 124 | { 125 | "input": { 126 | "Content": "file://example.pls", 127 | "Name": "W3C" 128 | }, 129 | "output": { 130 | }, 131 | "comments": { 132 | "input": { 133 | }, 134 | "output": { 135 | } 136 | }, 137 | "description": "Stores a pronunciation lexicon in an AWS Region.", 138 | "id": "to-save-a-lexicon-1482272584088", 139 | "title": "To save a lexicon" 140 | } 141 | ], 142 | "SynthesizeSpeech": [ 143 | { 144 | "input": { 145 | "LexiconNames": [ 146 | "example" 147 | ], 148 | "OutputFormat": "mp3", 149 | "SampleRate": "8000", 150 | "Text": "All Gaul is divided into three parts", 151 | "TextType": "text", 152 | "VoiceId": "Joanna" 153 | }, 154 | "output": { 155 | "AudioStream": "TEXT", 156 | "ContentType": "audio/mpeg", 157 | "RequestCharacters": 37 158 | }, 159 | "comments": { 160 | "input": { 161 | }, 162 | "output": { 163 | } 164 | }, 165 | "description": "Synthesizes plain text or SSML into a file of human-like speech.", 166 | "id": "to-synthesize-speech-1482186064046", 167 | "title": "To synthesize speech" 168 | } 169 | ] 170 | } 171 | } 172 | -------------------------------------------------------------------------------- /apis/rds-2013-01-10.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeDBEngineVersions": { 4 | "input_token": "Marker", 5 | "limit_key": "MaxRecords", 6 | "output_token": "Marker", 7 | "result_key": "DBEngineVersions" 8 | }, 9 | "DescribeDBInstances": { 10 | "input_token": "Marker", 11 | "limit_key": "MaxRecords", 12 | "output_token": "Marker", 13 | "result_key": "DBInstances" 14 | }, 15 | "DescribeDBParameterGroups": { 16 | "input_token": "Marker", 17 | "limit_key": "MaxRecords", 18 | "output_token": "Marker", 19 | "result_key": "DBParameterGroups" 20 | }, 21 | "DescribeDBParameters": { 22 | "input_token": "Marker", 23 | "limit_key": "MaxRecords", 24 | "output_token": "Marker", 25 | "result_key": "Parameters" 26 | }, 27 | "DescribeDBSecurityGroups": { 28 | "input_token": "Marker", 29 | "limit_key": "MaxRecords", 30 | "output_token": "Marker", 31 | "result_key": "DBSecurityGroups" 32 | }, 33 | "DescribeDBSnapshots": { 34 | "input_token": "Marker", 35 | "limit_key": "MaxRecords", 36 | "output_token": "Marker", 37 | "result_key": "DBSnapshots" 38 | }, 39 | "DescribeDBSubnetGroups": { 40 | "input_token": "Marker", 41 | "limit_key": "MaxRecords", 42 | "output_token": "Marker", 43 | "result_key": "DBSubnetGroups" 44 | }, 45 | "DescribeEngineDefaultParameters": { 46 | "input_token": "Marker", 47 | "limit_key": "MaxRecords", 48 | "output_token": "EngineDefaults.Marker", 49 | "result_key": "EngineDefaults.Parameters" 50 | }, 51 | "DescribeEventSubscriptions": { 52 | "input_token": "Marker", 53 | "limit_key": "MaxRecords", 54 | "output_token": "Marker", 55 | "result_key": "EventSubscriptionsList" 56 | }, 57 | "DescribeEvents": { 58 | "input_token": "Marker", 59 | "limit_key": "MaxRecords", 60 | "output_token": "Marker", 61 | "result_key": "Events" 62 | }, 63 | "DescribeOptionGroupOptions": { 64 | "input_token": "Marker", 65 | "limit_key": "MaxRecords", 66 | "output_token": "Marker", 67 | "result_key": "OptionGroupOptions" 68 | }, 69 | "DescribeOptionGroups": { 70 | "input_token": "Marker", 71 | "limit_key": "MaxRecords", 72 | "output_token": "Marker", 73 | "result_key": "OptionGroupsList" 74 | }, 75 | "DescribeOrderableDBInstanceOptions": { 76 | "input_token": "Marker", 77 | "limit_key": "MaxRecords", 78 | "output_token": "Marker", 79 | "result_key": "OrderableDBInstanceOptions" 80 | }, 81 | "DescribeReservedDBInstances": { 82 | "input_token": "Marker", 83 | "limit_key": "MaxRecords", 84 | "output_token": "Marker", 85 | "result_key": "ReservedDBInstances" 86 | }, 87 | "DescribeReservedDBInstancesOfferings": { 88 | "input_token": "Marker", 89 | "limit_key": "MaxRecords", 90 | "output_token": "Marker", 91 | "result_key": "ReservedDBInstancesOfferings" 92 | }, 93 | "ListTagsForResource": { 94 | "result_key": "TagList" 95 | } 96 | } 97 | } -------------------------------------------------------------------------------- /apis/rds-2013-02-12.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeDBEngineVersions": { 4 | "input_token": "Marker", 5 | "limit_key": "MaxRecords", 6 | "output_token": "Marker", 7 | "result_key": "DBEngineVersions" 8 | }, 9 | "DescribeDBInstances": { 10 | "input_token": "Marker", 11 | "limit_key": "MaxRecords", 12 | "output_token": "Marker", 13 | "result_key": "DBInstances" 14 | }, 15 | "DescribeDBLogFiles": { 16 | "input_token": "Marker", 17 | "limit_key": "MaxRecords", 18 | "output_token": "Marker", 19 | "result_key": "DescribeDBLogFiles" 20 | }, 21 | "DescribeDBParameterGroups": { 22 | "input_token": "Marker", 23 | "limit_key": "MaxRecords", 24 | "output_token": "Marker", 25 | "result_key": "DBParameterGroups" 26 | }, 27 | "DescribeDBParameters": { 28 | "input_token": "Marker", 29 | "limit_key": "MaxRecords", 30 | "output_token": "Marker", 31 | "result_key": "Parameters" 32 | }, 33 | "DescribeDBSecurityGroups": { 34 | "input_token": "Marker", 35 | "limit_key": "MaxRecords", 36 | "output_token": "Marker", 37 | "result_key": "DBSecurityGroups" 38 | }, 39 | "DescribeDBSnapshots": { 40 | "input_token": "Marker", 41 | "limit_key": "MaxRecords", 42 | "output_token": "Marker", 43 | "result_key": "DBSnapshots" 44 | }, 45 | "DescribeDBSubnetGroups": { 46 | "input_token": "Marker", 47 | "limit_key": "MaxRecords", 48 | "output_token": "Marker", 49 | "result_key": "DBSubnetGroups" 50 | }, 51 | "DescribeEngineDefaultParameters": { 52 | "input_token": "Marker", 53 | "limit_key": "MaxRecords", 54 | "output_token": "EngineDefaults.Marker", 55 | "result_key": "EngineDefaults.Parameters" 56 | }, 57 | "DescribeEventSubscriptions": { 58 | "input_token": "Marker", 59 | "limit_key": "MaxRecords", 60 | "output_token": "Marker", 61 | "result_key": "EventSubscriptionsList" 62 | }, 63 | "DescribeEvents": { 64 | "input_token": "Marker", 65 | "limit_key": "MaxRecords", 66 | "output_token": "Marker", 67 | "result_key": "Events" 68 | }, 69 | "DescribeOptionGroupOptions": { 70 | "input_token": "Marker", 71 | "limit_key": "MaxRecords", 72 | "output_token": "Marker", 73 | "result_key": "OptionGroupOptions" 74 | }, 75 | "DescribeOptionGroups": { 76 | "input_token": "Marker", 77 | "limit_key": "MaxRecords", 78 | "output_token": "Marker", 79 | "result_key": "OptionGroupsList" 80 | }, 81 | "DescribeOrderableDBInstanceOptions": { 82 | "input_token": "Marker", 83 | "limit_key": "MaxRecords", 84 | "output_token": "Marker", 85 | "result_key": "OrderableDBInstanceOptions" 86 | }, 87 | "DescribeReservedDBInstances": { 88 | "input_token": "Marker", 89 | "limit_key": "MaxRecords", 90 | "output_token": "Marker", 91 | "result_key": "ReservedDBInstances" 92 | }, 93 | "DescribeReservedDBInstancesOfferings": { 94 | "input_token": "Marker", 95 | "limit_key": "MaxRecords", 96 | "output_token": "Marker", 97 | "result_key": "ReservedDBInstancesOfferings" 98 | }, 99 | "DownloadDBLogFilePortion": { 100 | "input_token": "Marker", 101 | "limit_key": "NumberOfLines", 102 | "more_results": "AdditionalDataPending", 103 | "output_token": "Marker", 104 | "result_key": "LogFileData" 105 | }, 106 | "ListTagsForResource": { 107 | "result_key": "TagList" 108 | } 109 | } 110 | } -------------------------------------------------------------------------------- /apis/rds-2013-09-09.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeDBEngineVersions": { 4 | "input_token": "Marker", 5 | "limit_key": "MaxRecords", 6 | "output_token": "Marker", 7 | "result_key": "DBEngineVersions" 8 | }, 9 | "DescribeDBInstances": { 10 | "input_token": "Marker", 11 | "limit_key": "MaxRecords", 12 | "output_token": "Marker", 13 | "result_key": "DBInstances" 14 | }, 15 | "DescribeDBLogFiles": { 16 | "input_token": "Marker", 17 | "limit_key": "MaxRecords", 18 | "output_token": "Marker", 19 | "result_key": "DescribeDBLogFiles" 20 | }, 21 | "DescribeDBParameterGroups": { 22 | "input_token": "Marker", 23 | "limit_key": "MaxRecords", 24 | "output_token": "Marker", 25 | "result_key": "DBParameterGroups" 26 | }, 27 | "DescribeDBParameters": { 28 | "input_token": "Marker", 29 | "limit_key": "MaxRecords", 30 | "output_token": "Marker", 31 | "result_key": "Parameters" 32 | }, 33 | "DescribeDBSecurityGroups": { 34 | "input_token": "Marker", 35 | "limit_key": "MaxRecords", 36 | "output_token": "Marker", 37 | "result_key": "DBSecurityGroups" 38 | }, 39 | "DescribeDBSnapshots": { 40 | "input_token": "Marker", 41 | "limit_key": "MaxRecords", 42 | "output_token": "Marker", 43 | "result_key": "DBSnapshots" 44 | }, 45 | "DescribeDBSubnetGroups": { 46 | "input_token": "Marker", 47 | "limit_key": "MaxRecords", 48 | "output_token": "Marker", 49 | "result_key": "DBSubnetGroups" 50 | }, 51 | "DescribeEngineDefaultParameters": { 52 | "input_token": "Marker", 53 | "limit_key": "MaxRecords", 54 | "output_token": "EngineDefaults.Marker", 55 | "result_key": "EngineDefaults.Parameters" 56 | }, 57 | "DescribeEventSubscriptions": { 58 | "input_token": "Marker", 59 | "limit_key": "MaxRecords", 60 | "output_token": "Marker", 61 | "result_key": "EventSubscriptionsList" 62 | }, 63 | "DescribeEvents": { 64 | "input_token": "Marker", 65 | "limit_key": "MaxRecords", 66 | "output_token": "Marker", 67 | "result_key": "Events" 68 | }, 69 | "DescribeOptionGroupOptions": { 70 | "input_token": "Marker", 71 | "limit_key": "MaxRecords", 72 | "output_token": "Marker", 73 | "result_key": "OptionGroupOptions" 74 | }, 75 | "DescribeOptionGroups": { 76 | "input_token": "Marker", 77 | "limit_key": "MaxRecords", 78 | "output_token": "Marker", 79 | "result_key": "OptionGroupsList" 80 | }, 81 | "DescribeOrderableDBInstanceOptions": { 82 | "input_token": "Marker", 83 | "limit_key": "MaxRecords", 84 | "output_token": "Marker", 85 | "result_key": "OrderableDBInstanceOptions" 86 | }, 87 | "DescribeReservedDBInstances": { 88 | "input_token": "Marker", 89 | "limit_key": "MaxRecords", 90 | "output_token": "Marker", 91 | "result_key": "ReservedDBInstances" 92 | }, 93 | "DescribeReservedDBInstancesOfferings": { 94 | "input_token": "Marker", 95 | "limit_key": "MaxRecords", 96 | "output_token": "Marker", 97 | "result_key": "ReservedDBInstancesOfferings" 98 | }, 99 | "DownloadDBLogFilePortion": { 100 | "input_token": "Marker", 101 | "limit_key": "NumberOfLines", 102 | "more_results": "AdditionalDataPending", 103 | "output_token": "Marker", 104 | "result_key": "LogFileData" 105 | }, 106 | "ListTagsForResource": { 107 | "result_key": "TagList" 108 | } 109 | } 110 | } -------------------------------------------------------------------------------- /apis/rds-2013-09-09.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "DBInstanceAvailable": { 5 | "delay": 30, 6 | "operation": "DescribeDBInstances", 7 | "maxAttempts": 60, 8 | "acceptors": [ 9 | { 10 | "expected": "available", 11 | "matcher": "pathAll", 12 | "state": "success", 13 | "argument": "DBInstances[].DBInstanceStatus" 14 | }, 15 | { 16 | "expected": "deleted", 17 | "matcher": "pathAny", 18 | "state": "failure", 19 | "argument": "DBInstances[].DBInstanceStatus" 20 | }, 21 | { 22 | "expected": "deleting", 23 | "matcher": "pathAny", 24 | "state": "failure", 25 | "argument": "DBInstances[].DBInstanceStatus" 26 | }, 27 | { 28 | "expected": "failed", 29 | "matcher": "pathAny", 30 | "state": "failure", 31 | "argument": "DBInstances[].DBInstanceStatus" 32 | }, 33 | { 34 | "expected": "incompatible-restore", 35 | "matcher": "pathAny", 36 | "state": "failure", 37 | "argument": "DBInstances[].DBInstanceStatus" 38 | }, 39 | { 40 | "expected": "incompatible-parameters", 41 | "matcher": "pathAny", 42 | "state": "failure", 43 | "argument": "DBInstances[].DBInstanceStatus" 44 | }, 45 | { 46 | "expected": "incompatible-parameters", 47 | "matcher": "pathAny", 48 | "state": "failure", 49 | "argument": "DBInstances[].DBInstanceStatus" 50 | }, 51 | { 52 | "expected": "incompatible-restore", 53 | "matcher": "pathAny", 54 | "state": "failure", 55 | "argument": "DBInstances[].DBInstanceStatus" 56 | } 57 | ] 58 | }, 59 | "DBInstanceDeleted": { 60 | "delay": 30, 61 | "operation": "DescribeDBInstances", 62 | "maxAttempts": 60, 63 | "acceptors": [ 64 | { 65 | "expected": "deleted", 66 | "matcher": "pathAll", 67 | "state": "success", 68 | "argument": "DBInstances[].DBInstanceStatus" 69 | }, 70 | { 71 | "expected": "creating", 72 | "matcher": "pathAny", 73 | "state": "failure", 74 | "argument": "DBInstances[].DBInstanceStatus" 75 | }, 76 | { 77 | "expected": "modifying", 78 | "matcher": "pathAny", 79 | "state": "failure", 80 | "argument": "DBInstances[].DBInstanceStatus" 81 | }, 82 | { 83 | "expected": "rebooting", 84 | "matcher": "pathAny", 85 | "state": "failure", 86 | "argument": "DBInstances[].DBInstanceStatus" 87 | }, 88 | { 89 | "expected": "resetting-master-credentials", 90 | "matcher": "pathAny", 91 | "state": "failure", 92 | "argument": "DBInstances[].DBInstanceStatus" 93 | } 94 | ] 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /apis/rds-2014-10-31.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeDBEngineVersions": { 4 | "input_token": "Marker", 5 | "limit_key": "MaxRecords", 6 | "output_token": "Marker", 7 | "result_key": "DBEngineVersions" 8 | }, 9 | "DescribeDBInstances": { 10 | "input_token": "Marker", 11 | "limit_key": "MaxRecords", 12 | "output_token": "Marker", 13 | "result_key": "DBInstances" 14 | }, 15 | "DescribeDBLogFiles": { 16 | "input_token": "Marker", 17 | "limit_key": "MaxRecords", 18 | "output_token": "Marker", 19 | "result_key": "DescribeDBLogFiles" 20 | }, 21 | "DescribeDBParameterGroups": { 22 | "input_token": "Marker", 23 | "limit_key": "MaxRecords", 24 | "output_token": "Marker", 25 | "result_key": "DBParameterGroups" 26 | }, 27 | "DescribeDBParameters": { 28 | "input_token": "Marker", 29 | "limit_key": "MaxRecords", 30 | "output_token": "Marker", 31 | "result_key": "Parameters" 32 | }, 33 | "DescribeDBSecurityGroups": { 34 | "input_token": "Marker", 35 | "limit_key": "MaxRecords", 36 | "output_token": "Marker", 37 | "result_key": "DBSecurityGroups" 38 | }, 39 | "DescribeDBSnapshots": { 40 | "input_token": "Marker", 41 | "limit_key": "MaxRecords", 42 | "output_token": "Marker", 43 | "result_key": "DBSnapshots" 44 | }, 45 | "DescribeDBSubnetGroups": { 46 | "input_token": "Marker", 47 | "limit_key": "MaxRecords", 48 | "output_token": "Marker", 49 | "result_key": "DBSubnetGroups" 50 | }, 51 | "DescribeEngineDefaultParameters": { 52 | "input_token": "Marker", 53 | "limit_key": "MaxRecords", 54 | "output_token": "EngineDefaults.Marker", 55 | "result_key": "EngineDefaults.Parameters" 56 | }, 57 | "DescribeEventSubscriptions": { 58 | "input_token": "Marker", 59 | "limit_key": "MaxRecords", 60 | "output_token": "Marker", 61 | "result_key": "EventSubscriptionsList" 62 | }, 63 | "DescribeEvents": { 64 | "input_token": "Marker", 65 | "limit_key": "MaxRecords", 66 | "output_token": "Marker", 67 | "result_key": "Events" 68 | }, 69 | "DescribeOptionGroupOptions": { 70 | "input_token": "Marker", 71 | "limit_key": "MaxRecords", 72 | "output_token": "Marker", 73 | "result_key": "OptionGroupOptions" 74 | }, 75 | "DescribeOptionGroups": { 76 | "input_token": "Marker", 77 | "limit_key": "MaxRecords", 78 | "output_token": "Marker", 79 | "result_key": "OptionGroupsList" 80 | }, 81 | "DescribeOrderableDBInstanceOptions": { 82 | "input_token": "Marker", 83 | "limit_key": "MaxRecords", 84 | "output_token": "Marker", 85 | "result_key": "OrderableDBInstanceOptions" 86 | }, 87 | "DescribeReservedDBInstances": { 88 | "input_token": "Marker", 89 | "limit_key": "MaxRecords", 90 | "output_token": "Marker", 91 | "result_key": "ReservedDBInstances" 92 | }, 93 | "DescribeReservedDBInstancesOfferings": { 94 | "input_token": "Marker", 95 | "limit_key": "MaxRecords", 96 | "output_token": "Marker", 97 | "result_key": "ReservedDBInstancesOfferings" 98 | }, 99 | "DownloadDBLogFilePortion": { 100 | "input_token": "Marker", 101 | "limit_key": "NumberOfLines", 102 | "more_results": "AdditionalDataPending", 103 | "output_token": "Marker", 104 | "result_key": "LogFileData" 105 | }, 106 | "ListTagsForResource": { 107 | "result_key": "TagList" 108 | } 109 | } 110 | } -------------------------------------------------------------------------------- /apis/rds-2014-10-31.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "DBInstanceAvailable": { 5 | "delay": 30, 6 | "operation": "DescribeDBInstances", 7 | "maxAttempts": 60, 8 | "acceptors": [ 9 | { 10 | "expected": "available", 11 | "matcher": "pathAll", 12 | "state": "success", 13 | "argument": "DBInstances[].DBInstanceStatus" 14 | }, 15 | { 16 | "expected": "deleted", 17 | "matcher": "pathAny", 18 | "state": "failure", 19 | "argument": "DBInstances[].DBInstanceStatus" 20 | }, 21 | { 22 | "expected": "deleting", 23 | "matcher": "pathAny", 24 | "state": "failure", 25 | "argument": "DBInstances[].DBInstanceStatus" 26 | }, 27 | { 28 | "expected": "failed", 29 | "matcher": "pathAny", 30 | "state": "failure", 31 | "argument": "DBInstances[].DBInstanceStatus" 32 | }, 33 | { 34 | "expected": "incompatible-restore", 35 | "matcher": "pathAny", 36 | "state": "failure", 37 | "argument": "DBInstances[].DBInstanceStatus" 38 | }, 39 | { 40 | "expected": "incompatible-parameters", 41 | "matcher": "pathAny", 42 | "state": "failure", 43 | "argument": "DBInstances[].DBInstanceStatus" 44 | } 45 | ] 46 | }, 47 | "DBInstanceDeleted": { 48 | "delay": 30, 49 | "operation": "DescribeDBInstances", 50 | "maxAttempts": 60, 51 | "acceptors": [ 52 | { 53 | "expected": "deleted", 54 | "matcher": "pathAll", 55 | "state": "success", 56 | "argument": "DBInstances[].DBInstanceStatus" 57 | }, 58 | { 59 | "expected": "DBInstanceNotFound", 60 | "matcher": "error", 61 | "state": "success" 62 | }, 63 | { 64 | "expected": "creating", 65 | "matcher": "pathAny", 66 | "state": "failure", 67 | "argument": "DBInstances[].DBInstanceStatus" 68 | }, 69 | { 70 | "expected": "modifying", 71 | "matcher": "pathAny", 72 | "state": "failure", 73 | "argument": "DBInstances[].DBInstanceStatus" 74 | }, 75 | { 76 | "expected": "rebooting", 77 | "matcher": "pathAny", 78 | "state": "failure", 79 | "argument": "DBInstances[].DBInstanceStatus" 80 | }, 81 | { 82 | "expected": "resetting-master-credentials", 83 | "matcher": "pathAny", 84 | "state": "failure", 85 | "argument": "DBInstances[].DBInstanceStatus" 86 | } 87 | ] 88 | } 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /apis/redshift-2012-12-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeClusterParameterGroups": { 4 | "input_token": "Marker", 5 | "output_token": "Marker", 6 | "limit_key": "MaxRecords", 7 | "result_key": "ParameterGroups" 8 | }, 9 | "DescribeClusterParameters": { 10 | "input_token": "Marker", 11 | "output_token": "Marker", 12 | "limit_key": "MaxRecords", 13 | "result_key": "Parameters" 14 | }, 15 | "DescribeClusterSecurityGroups": { 16 | "input_token": "Marker", 17 | "output_token": "Marker", 18 | "limit_key": "MaxRecords", 19 | "result_key": "ClusterSecurityGroups" 20 | }, 21 | "DescribeClusterSnapshots": { 22 | "input_token": "Marker", 23 | "output_token": "Marker", 24 | "limit_key": "MaxRecords", 25 | "result_key": "Snapshots" 26 | }, 27 | "DescribeClusterSubnetGroups": { 28 | "input_token": "Marker", 29 | "output_token": "Marker", 30 | "limit_key": "MaxRecords", 31 | "result_key": "ClusterSubnetGroups" 32 | }, 33 | "DescribeClusterVersions": { 34 | "input_token": "Marker", 35 | "output_token": "Marker", 36 | "limit_key": "MaxRecords", 37 | "result_key": "ClusterVersions" 38 | }, 39 | "DescribeClusters": { 40 | "input_token": "Marker", 41 | "output_token": "Marker", 42 | "limit_key": "MaxRecords", 43 | "result_key": "Clusters" 44 | }, 45 | "DescribeDefaultClusterParameters": { 46 | "input_token": "Marker", 47 | "output_token": "DefaultClusterParameters.Marker", 48 | "limit_key": "MaxRecords", 49 | "result_key": "DefaultClusterParameters.Parameters" 50 | }, 51 | "DescribeEventSubscriptions": { 52 | "input_token": "Marker", 53 | "output_token": "Marker", 54 | "limit_key": "MaxRecords", 55 | "result_key": "EventSubscriptionsList" 56 | }, 57 | "DescribeEvents": { 58 | "input_token": "Marker", 59 | "output_token": "Marker", 60 | "limit_key": "MaxRecords", 61 | "result_key": "Events" 62 | }, 63 | "DescribeHsmClientCertificates": { 64 | "input_token": "Marker", 65 | "output_token": "Marker", 66 | "limit_key": "MaxRecords", 67 | "result_key": "HsmClientCertificates" 68 | }, 69 | "DescribeHsmConfigurations": { 70 | "input_token": "Marker", 71 | "output_token": "Marker", 72 | "limit_key": "MaxRecords", 73 | "result_key": "HsmConfigurations" 74 | }, 75 | "DescribeOrderableClusterOptions": { 76 | "input_token": "Marker", 77 | "output_token": "Marker", 78 | "limit_key": "MaxRecords", 79 | "result_key": "OrderableClusterOptions" 80 | }, 81 | "DescribeReservedNodeOfferings": { 82 | "input_token": "Marker", 83 | "output_token": "Marker", 84 | "limit_key": "MaxRecords", 85 | "result_key": "ReservedNodeOfferings" 86 | }, 87 | "DescribeReservedNodes": { 88 | "input_token": "Marker", 89 | "output_token": "Marker", 90 | "limit_key": "MaxRecords", 91 | "result_key": "ReservedNodes" 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /apis/redshift-2012-12-01.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "ClusterAvailable": { 5 | "delay": 60, 6 | "operation": "DescribeClusters", 7 | "maxAttempts": 30, 8 | "acceptors": [ 9 | { 10 | "expected": "available", 11 | "matcher": "pathAll", 12 | "state": "success", 13 | "argument": "Clusters[].ClusterStatus" 14 | }, 15 | { 16 | "expected": "deleting", 17 | "matcher": "pathAny", 18 | "state": "failure", 19 | "argument": "Clusters[].ClusterStatus" 20 | }, 21 | { 22 | "expected": "ClusterNotFound", 23 | "matcher": "error", 24 | "state": "retry" 25 | } 26 | ] 27 | }, 28 | "ClusterDeleted": { 29 | "delay": 60, 30 | "operation": "DescribeClusters", 31 | "maxAttempts": 30, 32 | "acceptors": [ 33 | { 34 | "expected": "ClusterNotFound", 35 | "matcher": "error", 36 | "state": "success" 37 | }, 38 | { 39 | "expected": "creating", 40 | "matcher": "pathAny", 41 | "state": "failure", 42 | "argument": "Clusters[].ClusterStatus" 43 | }, 44 | { 45 | "expected": "modifying", 46 | "matcher": "pathAny", 47 | "state": "failure", 48 | "argument": "Clusters[].ClusterStatus" 49 | } 50 | ] 51 | }, 52 | "ClusterRestored": { 53 | "operation": "DescribeClusters", 54 | "maxAttempts": 30, 55 | "delay": 60, 56 | "acceptors": [ 57 | { 58 | "state": "success", 59 | "matcher": "pathAll", 60 | "argument": "Clusters[].RestoreStatus.Status", 61 | "expected": "completed" 62 | }, 63 | { 64 | "state": "failure", 65 | "matcher": "pathAny", 66 | "argument": "Clusters[].ClusterStatus", 67 | "expected": "deleting" 68 | } 69 | ] 70 | }, 71 | "SnapshotAvailable": { 72 | "delay": 15, 73 | "operation": "DescribeClusterSnapshots", 74 | "maxAttempts": 20, 75 | "acceptors": [ 76 | { 77 | "expected": "available", 78 | "matcher": "pathAll", 79 | "state": "success", 80 | "argument": "Snapshots[].Status" 81 | }, 82 | { 83 | "expected": "failed", 84 | "matcher": "pathAny", 85 | "state": "failure", 86 | "argument": "Snapshots[].Status" 87 | }, 88 | { 89 | "expected": "deleted", 90 | "matcher": "pathAny", 91 | "state": "failure", 92 | "argument": "Snapshots[].Status" 93 | } 94 | ] 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /apis/rekognition-2016-06-27.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListCollections": { 4 | "input_token": "NextToken", 5 | "limit_key": "MaxResults", 6 | "output_token": "NextToken", 7 | "result_key": "CollectionIds" 8 | }, 9 | "ListFaces": { 10 | "input_token": "NextToken", 11 | "limit_key": "MaxResults", 12 | "output_token": "NextToken", 13 | "result_key": "Faces" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /apis/route53-2013-04-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListHealthChecks": { 4 | "input_token": "Marker", 5 | "limit_key": "MaxItems", 6 | "more_results": "IsTruncated", 7 | "output_token": "NextMarker", 8 | "result_key": "HealthChecks" 9 | }, 10 | "ListHostedZones": { 11 | "input_token": "Marker", 12 | "limit_key": "MaxItems", 13 | "more_results": "IsTruncated", 14 | "output_token": "NextMarker", 15 | "result_key": "HostedZones" 16 | }, 17 | "ListResourceRecordSets": { 18 | "input_token": [ 19 | "StartRecordName", 20 | "StartRecordType", 21 | "StartRecordIdentifier" 22 | ], 23 | "limit_key": "MaxItems", 24 | "more_results": "IsTruncated", 25 | "output_token": [ 26 | "NextRecordName", 27 | "NextRecordType", 28 | "NextRecordIdentifier" 29 | ], 30 | "result_key": "ResourceRecordSets" 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /apis/route53-2013-04-01.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "ResourceRecordSetsChanged": { 5 | "delay": 30, 6 | "maxAttempts": 60, 7 | "operation": "GetChange", 8 | "acceptors": [ 9 | { 10 | "matcher": "path", 11 | "expected": "INSYNC", 12 | "argument": "ChangeInfo.Status", 13 | "state": "success" 14 | } 15 | ] 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /apis/route53domains-2014-05-15.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "pagination": { 4 | "ListDomains": { 5 | "limit_key": "MaxItems", 6 | "input_token": "Marker", 7 | "output_token": "NextPageMarker", 8 | "result_key": "Domains" 9 | }, 10 | "ListOperations": { 11 | "limit_key": "MaxItems", 12 | "input_token": "Marker", 13 | "output_token": "NextPageMarker", 14 | "result_key": "Operations" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /apis/s3-2006-03-01.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListBuckets": { 4 | "result_key": "Buckets" 5 | }, 6 | "ListMultipartUploads": { 7 | "limit_key": "MaxUploads", 8 | "more_results": "IsTruncated", 9 | "output_token": [ 10 | "NextKeyMarker", 11 | "NextUploadIdMarker" 12 | ], 13 | "input_token": [ 14 | "KeyMarker", 15 | "UploadIdMarker" 16 | ], 17 | "result_key": [ 18 | "Uploads", 19 | "CommonPrefixes" 20 | ] 21 | }, 22 | "ListObjectVersions": { 23 | "more_results": "IsTruncated", 24 | "limit_key": "MaxKeys", 25 | "output_token": [ 26 | "NextKeyMarker", 27 | "NextVersionIdMarker" 28 | ], 29 | "input_token": [ 30 | "KeyMarker", 31 | "VersionIdMarker" 32 | ], 33 | "result_key": [ 34 | "Versions", 35 | "DeleteMarkers", 36 | "CommonPrefixes" 37 | ] 38 | }, 39 | "ListObjects": { 40 | "more_results": "IsTruncated", 41 | "limit_key": "MaxKeys", 42 | "output_token": "NextMarker || Contents[-1].Key", 43 | "input_token": "Marker", 44 | "result_key": [ 45 | "Contents", 46 | "CommonPrefixes" 47 | ] 48 | }, 49 | "ListObjectsV2": { 50 | "limit_key": "MaxKeys", 51 | "output_token": "NextContinuationToken", 52 | "input_token": "ContinuationToken", 53 | "result_key": [ 54 | "Contents", 55 | "CommonPrefixes" 56 | ] 57 | }, 58 | "ListParts": { 59 | "more_results": "IsTruncated", 60 | "limit_key": "MaxParts", 61 | "output_token": "NextPartNumberMarker", 62 | "input_token": "PartNumberMarker", 63 | "result_key": "Parts" 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /apis/s3-2006-03-01.waiters2.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "waiters": { 4 | "BucketExists": { 5 | "delay": 5, 6 | "operation": "HeadBucket", 7 | "maxAttempts": 20, 8 | "acceptors": [ 9 | { 10 | "expected": 200, 11 | "matcher": "status", 12 | "state": "success" 13 | }, 14 | { 15 | "expected": 301, 16 | "matcher": "status", 17 | "state": "success" 18 | }, 19 | { 20 | "expected": 403, 21 | "matcher": "status", 22 | "state": "success" 23 | }, 24 | { 25 | "expected": 404, 26 | "matcher": "status", 27 | "state": "retry" 28 | } 29 | ] 30 | }, 31 | "BucketNotExists": { 32 | "delay": 5, 33 | "operation": "HeadBucket", 34 | "maxAttempts": 20, 35 | "acceptors": [ 36 | { 37 | "expected": 404, 38 | "matcher": "status", 39 | "state": "success" 40 | } 41 | ] 42 | }, 43 | "ObjectExists": { 44 | "delay": 5, 45 | "operation": "HeadObject", 46 | "maxAttempts": 20, 47 | "acceptors": [ 48 | { 49 | "expected": 200, 50 | "matcher": "status", 51 | "state": "success" 52 | }, 53 | { 54 | "expected": 404, 55 | "matcher": "status", 56 | "state": "retry" 57 | } 58 | ] 59 | }, 60 | "ObjectNotExists": { 61 | "delay": 5, 62 | "operation": "HeadObject", 63 | "maxAttempts": 20, 64 | "acceptors": [ 65 | { 66 | "expected": 404, 67 | "matcher": "status", 68 | "state": "success" 69 | } 70 | ] 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /apis/sdb-2009-04-15.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListDomains": { 4 | "input_token": "NextToken", 5 | "output_token": "NextToken", 6 | "limit_key": "MaxNumberOfDomains", 7 | "result_key": "DomainNames" 8 | }, 9 | "Select": { 10 | "input_token": "NextToken", 11 | "output_token": "NextToken", 12 | "result_key": "Items" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /apis/sms-2016-10-24.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination":{ 3 | "GetReplicationJobs": { 4 | "input_token": "nextToken", 5 | "output_token": "nextToken", 6 | "limit_key": "maxResults", 7 | "result_key": "replicationJobList" 8 | }, 9 | "GetReplicationRuns": { 10 | "input_token": "nextToken", 11 | "output_token": "nextToken", 12 | "limit_key": "maxResults", 13 | "result_key": "replicationRunList" 14 | }, 15 | "GetConnectors": { 16 | "input_token": "nextToken", 17 | "output_token": "nextToken", 18 | "limit_key": "maxResults", 19 | "result_key": "connectorList" 20 | }, 21 | "GetServers": { 22 | "input_token": "nextToken", 23 | "output_token": "nextToken", 24 | "limit_key": "maxResults", 25 | "result_key": "serverList" 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /apis/snowball-2016-06-30.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListJobs": { 4 | "limit_key": "MaxResults", 5 | "output_token": "NextToken", 6 | "input_token": "NextToken", 7 | "result_key": "JobListEntries" 8 | }, 9 | "DescribeAddresses": { 10 | "limit_key": "MaxResults", 11 | "output_token": "NextToken", 12 | "input_token": "NextToken", 13 | "result_key": "Addresses" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /apis/sns-2010-03-31.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListEndpointsByPlatformApplication": { 4 | "input_token": "NextToken", 5 | "output_token": "NextToken", 6 | "result_key": "Endpoints" 7 | }, 8 | "ListPlatformApplications": { 9 | "input_token": "NextToken", 10 | "output_token": "NextToken", 11 | "result_key": "PlatformApplications" 12 | }, 13 | "ListSubscriptions": { 14 | "input_token": "NextToken", 15 | "output_token": "NextToken", 16 | "result_key": "Subscriptions" 17 | }, 18 | "ListSubscriptionsByTopic": { 19 | "input_token": "NextToken", 20 | "output_token": "NextToken", 21 | "result_key": "Subscriptions" 22 | }, 23 | "ListTopics": { 24 | "input_token": "NextToken", 25 | "output_token": "NextToken", 26 | "result_key": "Topics" 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /apis/sqs-2012-11-05.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "ListQueues": { 4 | "result_key": "QueueUrls" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /apis/ssm-2014-11-06.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeInstanceInformation": { 4 | "input_token": "NextToken", 5 | "output_token": "NextToken", 6 | "limit_key": "MaxResults", 7 | "result_key": "InstanceInformationList" 8 | }, 9 | "ListAssociations": { 10 | "input_token": "NextToken", 11 | "output_token": "NextToken", 12 | "limit_key": "MaxResults", 13 | "result_key": "Associations" 14 | }, 15 | "ListCommandInvocations": { 16 | "input_token": "NextToken", 17 | "output_token": "NextToken", 18 | "limit_key": "MaxResults", 19 | "result_key": "CommandInvocations" 20 | }, 21 | "ListCommands": { 22 | "input_token": "NextToken", 23 | "output_token": "NextToken", 24 | "limit_key": "MaxResults", 25 | "result_key": "Commands" 26 | }, 27 | "ListDocuments": { 28 | "input_token": "NextToken", 29 | "output_token": "NextToken", 30 | "limit_key": "MaxResults", 31 | "result_key": "DocumentIdentifiers" 32 | }, 33 | "DescribeActivations": { 34 | "input_token": "NextToken", 35 | "output_token": "NextToken", 36 | "limit_key": "MaxResults", 37 | "result_key": "ActivationList" 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /apis/states-2016-11-23.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "GetExecutionHistory": { 4 | "input_token": "nextToken", 5 | "output_token": "nextToken", 6 | "limit_key": "maxResults", 7 | "result_key": "events" 8 | }, 9 | "ListActivities": { 10 | "input_token": "nextToken", 11 | "output_token": "nextToken", 12 | "limit_key": "maxResults", 13 | "result_key": "activities" 14 | }, 15 | "ListExecutions": { 16 | "input_token": "nextToken", 17 | "output_token": "nextToken", 18 | "limit_key": "maxResults", 19 | "result_key": "executions" 20 | }, 21 | "ListStateMachines": { 22 | "input_token": "nextToken", 23 | "output_token": "nextToken", 24 | "limit_key": "maxResults", 25 | "result_key": "stateMachines" 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /apis/storagegateway-2013-06-30.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeCachediSCSIVolumes": { 4 | "result_key": "CachediSCSIVolumes" 5 | }, 6 | "DescribeStorediSCSIVolumes": { 7 | "result_key": "StorediSCSIVolumes" 8 | }, 9 | "DescribeTapeArchives": { 10 | "input_token": "Marker", 11 | "limit_key": "Limit", 12 | "output_token": "Marker", 13 | "result_key": "TapeArchives" 14 | }, 15 | "DescribeTapeRecoveryPoints": { 16 | "input_token": "Marker", 17 | "limit_key": "Limit", 18 | "output_token": "Marker", 19 | "result_key": "TapeRecoveryPointInfos" 20 | }, 21 | "DescribeTapes": { 22 | "input_token": "Marker", 23 | "limit_key": "Limit", 24 | "output_token": "Marker", 25 | "result_key": "Tapes" 26 | }, 27 | "DescribeVTLDevices": { 28 | "input_token": "Marker", 29 | "limit_key": "Limit", 30 | "output_token": "Marker", 31 | "result_key": "VTLDevices" 32 | }, 33 | "ListGateways": { 34 | "input_token": "Marker", 35 | "limit_key": "Limit", 36 | "output_token": "Marker", 37 | "result_key": "Gateways" 38 | }, 39 | "ListLocalDisks": { 40 | "result_key": "Disks" 41 | }, 42 | "ListVolumeRecoveryPoints": { 43 | "result_key": "VolumeRecoveryPointInfos" 44 | }, 45 | "ListVolumes": { 46 | "input_token": "Marker", 47 | "limit_key": "Limit", 48 | "output_token": "Marker", 49 | "result_key": "VolumeInfos" 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /apis/support-2013-04-15.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeCases": { 4 | "input_token": "nextToken", 5 | "output_token": "nextToken", 6 | "limit_key": "maxResults", 7 | "result_key": "cases" 8 | }, 9 | "DescribeCommunications": { 10 | "input_token": "nextToken", 11 | "output_token": "nextToken", 12 | "limit_key": "maxResults", 13 | "result_key": "communications" 14 | }, 15 | "DescribeServices": { 16 | "result_key": "services" 17 | }, 18 | "DescribeTrustedAdvisorCheckRefreshStatuses": { 19 | "result_key": "statuses" 20 | }, 21 | "DescribeTrustedAdvisorCheckSummaries": { 22 | "result_key": "summaries" 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /apis/swf-2012-01-25.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "GetWorkflowExecutionHistory": { 4 | "limit_key": "maximumPageSize", 5 | "input_token": "nextPageToken", 6 | "output_token": "nextPageToken", 7 | "result_key": "events" 8 | }, 9 | "ListActivityTypes": { 10 | "limit_key": "maximumPageSize", 11 | "input_token": "nextPageToken", 12 | "output_token": "nextPageToken", 13 | "result_key": "typeInfos" 14 | }, 15 | "ListClosedWorkflowExecutions": { 16 | "limit_key": "maximumPageSize", 17 | "input_token": "nextPageToken", 18 | "output_token": "nextPageToken", 19 | "result_key": "executionInfos" 20 | }, 21 | "ListDomains": { 22 | "limit_key": "maximumPageSize", 23 | "input_token": "nextPageToken", 24 | "output_token": "nextPageToken", 25 | "result_key": "domainInfos" 26 | }, 27 | "ListOpenWorkflowExecutions": { 28 | "limit_key": "maximumPageSize", 29 | "input_token": "nextPageToken", 30 | "output_token": "nextPageToken", 31 | "result_key": "executionInfos" 32 | }, 33 | "ListWorkflowTypes": { 34 | "limit_key": "maximumPageSize", 35 | "input_token": "nextPageToken", 36 | "output_token": "nextPageToken", 37 | "result_key": "typeInfos" 38 | }, 39 | "PollForDecisionTask": { 40 | "limit_key": "maximumPageSize", 41 | "input_token": "nextPageToken", 42 | "output_token": "nextPageToken", 43 | "result_key": "events" 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /apis/workspaces-2015-04-08.paginators.json: -------------------------------------------------------------------------------- 1 | { 2 | "pagination": { 3 | "DescribeWorkspaceBundles": { 4 | "input_token": "NextToken", 5 | "output_token": "NextToken", 6 | "result_key": "Bundles" 7 | }, 8 | "DescribeWorkspaceDirectories": { 9 | "input_token": "NextToken", 10 | "output_token": "NextToken", 11 | "result_key": "Directories" 12 | }, 13 | "DescribeWorkspaces": { 14 | "limit_key": "Limit", 15 | "input_token": "NextToken", 16 | "output_token": "NextToken", 17 | "result_key": "Workspaces" 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /circle.yml: -------------------------------------------------------------------------------- 1 | machine: 2 | node: 3 | version: 6.2.2 4 | 5 | dependencies: 6 | cache_directories: 7 | - ~/sysconfcpus 8 | - node_modules 9 | - elm-stuff 10 | override: 11 | - npm install 12 | - ./scripts/ci-elm-hack.sh 13 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | Config.elm 2 | -------------------------------------------------------------------------------- /demo/README.md: -------------------------------------------------------------------------------- 1 | # AWS SDK for elm demo 2 | 3 | Using this to test making requests to real AWS services. 4 | 5 | __Note that the SDK is currently under development. This demo is intended for developers of the AWS SDK for elm to test making calls to real AWS services.__ 6 | 7 | ## Setup 8 | 9 | Create a file `Config.elm`: 10 | 11 | ```elm 12 | module Config exposing (..) 13 | 14 | 15 | accessKeyId : String 16 | accessKeyId = 17 | "YOUR_ACCESS_KEY" 18 | 19 | 20 | secretAccessKey : String 21 | secretAccessKey = 22 | "YOUR_SECRET_KEY" 23 | 24 | 25 | region : String 26 | region = 27 | "us-east-1" 28 | ``` 29 | 30 | This file is imported by `Main` but ignored by version control. I think in a production SPA the better way would be to use AWS Cognito, but for this simple test page loading the credentials directly is easier. 31 | 32 | ## Running 33 | 34 | ```shell 35 | $ elm reactor 36 | ``` 37 | 38 | Then visit [http://localhost:8000/Main.elm](http://localhost:8000/Main.elm). For now we don't have any UI, so you can open up your browser dev tools to see the network activity. 39 | -------------------------------------------------------------------------------- /demo/elm-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.0", 3 | "summary": "Demonstrate usage of AWS package", 4 | "repository": "https://github.com/ktonon/aws-sdk-elm.git", 5 | "license": "BSD3", 6 | "source-directories": [ 7 | ".", 8 | "../src" 9 | ], 10 | "exposed-modules": [], 11 | "native-modules": true, 12 | "dependencies": { 13 | "Bogdanp/elm-querystring": "1.0.0 <= v < 2.0.0", 14 | "NoRedInk/elm-decode-pipeline": "3.0.0 <= v < 4.0.0", 15 | "elm-community/array-extra": "1.0.2 <= v < 2.0.0", 16 | "elm-community/json-extra": "2.1.0 <= v < 3.0.0", 17 | "elm-lang/core": "5.0.0 <= v < 6.0.0", 18 | "elm-lang/html": "2.0.0 <= v < 3.0.0", 19 | "elm-lang/http": "1.0.0 <= v < 2.0.0", 20 | "justinmimbs/elm-date-extra": "2.0.3 <= v < 3.0.0", 21 | "ktonon/elm-crypto": "1.1.0 <= v < 2.0.0", 22 | "ktonon/elm-word": "2.0.0 <= v < 3.0.0" 23 | }, 24 | "elm-version": "0.18.0 <= v < 0.19.0" 25 | } 26 | -------------------------------------------------------------------------------- /elm-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.0", 3 | "summary": "AWS SDK for elm", 4 | "repository": "https://github.com/ktonon/aws-sdk-elm.git", 5 | "license": "Apache-2.0", 6 | "source-directories": [ 7 | "src" 8 | ], 9 | "exposed-modules": [ 10 | "AWS.Enum", 11 | "AWS.Services.ACM", 12 | "AWS.Services.APIGateway", 13 | "AWS.Services.ApplicationAutoScaling", 14 | "AWS.Services.AppStream", 15 | "AWS.Services.AutoScaling", 16 | "AWS.Services.Batch", 17 | "AWS.Services.Budgets", 18 | "AWS.Services.CloudDirectory", 19 | "AWS.Services.CloudFormation", 20 | "AWS.Services.CloudFront", 21 | "AWS.Services.CloudHSM", 22 | "AWS.Services.CloudSearch", 23 | "AWS.Services.CloudSearchDomain", 24 | "AWS.Services.CloudTrail", 25 | "AWS.Services.CodeBuild", 26 | "AWS.Services.CodeCommit", 27 | "AWS.Services.CodeDeploy", 28 | "AWS.Services.CodePipeline", 29 | "AWS.Services.CognitoIdentity", 30 | "AWS.Services.CognitoIdentityProvider", 31 | "AWS.Services.CognitoSync", 32 | "AWS.Services.ConfigService", 33 | "AWS.Services.CostandUsageReportService", 34 | "AWS.Services.DataPipeline", 35 | "AWS.Services.DeviceFarm", 36 | "AWS.Services.DirectConnect", 37 | "AWS.Services.ApplicationDiscoveryService", 38 | "AWS.Services.DatabaseMigrationService", 39 | "AWS.Services.DirectoryService", 40 | "AWS.Services.EC2", 41 | "AWS.Services.ECR", 42 | "AWS.Services.ECS", 43 | "AWS.Services.ElastiCache", 44 | "AWS.Services.ElasticBeanstalk", 45 | "AWS.Services.EFS", 46 | "AWS.Services.ElasticLoadBalancing", 47 | "AWS.Services.ElasticLoadBalancingv2", 48 | "AWS.Services.ElasticTranscoder", 49 | "AWS.Services.SES", 50 | "AWS.Services.ElasticsearchService", 51 | "AWS.Services.CloudWatchEvents", 52 | "AWS.Services.Firehose", 53 | "AWS.Services.GameLift", 54 | "AWS.Services.Glacier", 55 | "AWS.Services.Health", 56 | "AWS.Services.IAM", 57 | "AWS.Services.ImportExport", 58 | "AWS.Services.Inspector", 59 | "AWS.Services.IoT", 60 | "AWS.Services.IoTDataPlane", 61 | "AWS.Services.Kinesis", 62 | "AWS.Services.KinesisAnalytics", 63 | "AWS.Services.KMS", 64 | "AWS.Services.Lambda", 65 | "AWS.Services.Lightsail", 66 | "AWS.Services.CloudWatchLogs", 67 | "AWS.Services.MachineLearning", 68 | "AWS.Services.MarketplaceCommerceAnalytics", 69 | "AWS.Services.MarketplaceMetering", 70 | "AWS.Services.MobileAnalytics", 71 | "AWS.Services.CloudWatch", 72 | "AWS.Services.OpsWorks", 73 | "AWS.Services.OpsWorksCM", 74 | "AWS.Services.Polly", 75 | "AWS.Services.RDS", 76 | "AWS.Services.Redshift", 77 | "AWS.Services.Rekognition", 78 | "AWS.Services.Route53", 79 | "AWS.Services.Route53Domains", 80 | "AWS.Services.S3", 81 | "AWS.Services.ServiceCatalog", 82 | "AWS.Services.Shield", 83 | "AWS.Services.SMS", 84 | "AWS.Services.Snowball", 85 | "AWS.Services.SNS", 86 | "AWS.Services.SQS", 87 | "AWS.Services.SSM", 88 | "AWS.Services.SFN", 89 | "AWS.Services.StorageGateway", 90 | "AWS.Services.STS", 91 | "AWS.Services.Support", 92 | "AWS.Services.SWF", 93 | "AWS.Services.WAF", 94 | "AWS.Services.WAFRegional", 95 | "AWS.Services.WorkSpaces", 96 | "AWS.Services.XRay", 97 | "AWS" 98 | ], 99 | "dependencies": { 100 | "Bogdanp/elm-querystring": "1.0.0 <= v < 2.0.0", 101 | "NoRedInk/elm-decode-pipeline": "3.0.0 <= v < 4.0.0", 102 | "elm-community/json-extra": "2.1.0 <= v < 3.0.0", 103 | "elm-lang/core": "5.0.0 <= v < 6.0.0", 104 | "elm-lang/http": "1.0.0 <= v < 2.0.0", 105 | "justinmimbs/elm-date-extra": "2.0.3 <= v < 3.0.0", 106 | "ktonon/elm-crypto": "1.0.0 <= v < 2.0.0", 107 | "ktonon/elm-word": "2.0.0 <= v < 3.0.0" 108 | }, 109 | "elm-version": "0.18.0 <= v < 0.19.0" 110 | } 111 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | module.exports = 'not-yet-implemented'; 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-sdk-elm", 3 | "version": "0.0.2", 4 | "description": "WIP -- AWS SDK for elm", 5 | "main": "index.js", 6 | "scripts": { 7 | "clean": "rm -rf src/AWS/Services/*.elm", 8 | "build:gen": "node scripts/generate-sdk.js", 9 | "build:docs": "elm package install -y && elm make --docs=docs.json", 10 | "build": "npm run clean && npm run build:gen && npm run build:docs", 11 | "prepublish": "elm format src/AWS/Services --yes", 12 | "test": "npm run build && elm test", 13 | "posttest": "eslint ." 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/ktonon/aws-sdk-elm.git" 18 | }, 19 | "keywords": [ 20 | "aws", 21 | "sdk", 22 | "elm" 23 | ], 24 | "author": "Kevin Tonon ", 25 | "license": "Apache-2.0", 26 | "bugs": { 27 | "url": "https://github.com/ktonon/aws-sdk-elm/issues" 28 | }, 29 | "homepage": "https://github.com/ktonon/aws-sdk-elm#readme", 30 | "dependencies": { 31 | "aws-sdk": "^2.9.0" 32 | }, 33 | "devDependencies": { 34 | "camelize": "^1.0.0", 35 | "dot": "^1.1.1", 36 | "elm": "^0.18.0", 37 | "elm-test": "0.18.7", 38 | "eslint": "^3.15.0", 39 | "eslint-config-airbnb": "^14.0.0", 40 | "eslint-plugin-import": "^2.2.0", 41 | "eslint-plugin-jsx-a11y": "^3.0.2", 42 | "eslint-plugin-react": "^6.9.0", 43 | "fuzzy": "^0.1.3" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /scripts/ci-elm-hack.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | SYSCONFCPUS="$HOME/sysconfcpus" 6 | ELM_MAKE="$HOME/$CIRCLE_PROJECT_REPONAME/node_modules/.bin/elm-make" 7 | 8 | # Check if we have already patched it 9 | if [ -f "${ELM_MAKE}-old" ]; 10 | then 11 | echo "Skipping ci-elm-hack" 12 | exit 0 13 | fi 14 | 15 | # Workaround for extremely slow elm compilation 16 | # see https://github.com/elm-lang/elm-compiler/issues/1473#issuecomment-245704142 17 | if [ ! -d "$SYSCONFCPUS/bin" ]; 18 | then 19 | git clone https://github.com/obmarg/libsysconfcpus.git "$SYSCONFCPUS" 20 | pushd "$SYSCONFCPUS" 21 | ./configure --prefix="$SYSCONFCPUS" 22 | make && make install 23 | popd 24 | fi 25 | 26 | mv "$ELM_MAKE" "$ELM_MAKE-old" 27 | printf '%s\n\n' \ 28 | '#!/bin/bash' \ 29 | 'echo "Running elm-make with sysconfcpus -n 2"' \ 30 | "$SYSCONFCPUS"'/bin/sysconfcpus -n 2 '"$ELM_MAKE"'-old "$@"' \ 31 | > "$ELM_MAKE" 32 | chmod +x "$ELM_MAKE" 33 | -------------------------------------------------------------------------------- /scripts/generate-sdk.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const sysPath = require('path'); 3 | const dots = require('./util/dots'); 4 | const findLatestSources = require('./util/find-latest-sources'); 5 | const processService = require('./process-service'); 6 | 7 | const serviceRoot = sysPath.resolve(`${__dirname}/../apis`); 8 | if (!fs.existsSync(serviceRoot)) { 9 | process.stdout.write('Run `npm install` before running this script\n'); 10 | process.exit(1); 11 | } 12 | 13 | const sources = findLatestSources(serviceRoot) 14 | .filter(source => /^(?!(streams\.)?dynamo|elasticmap)/.test(source)) 15 | .map((filename) => { 16 | const path = `${serviceRoot}/${filename}`; 17 | if (fs.existsSync(path)) { 18 | const desc = JSON.parse(fs.readFileSync(path, 'utf8')); 19 | if (desc.version === '2.0') { 20 | process.stdout.write('.'); 21 | return processService(desc); 22 | } 23 | process.stdout.write('s'); 24 | } else { 25 | process.stderr.write(`no such file: ${filename}\n`); 26 | } 27 | return null; 28 | }) 29 | .filter(x => x); 30 | 31 | fs.writeFileSync( 32 | sysPath.resolve(`${__dirname}/../elm-package.json`), 33 | dots.elmPackage(sources), 34 | 'utf8'); 35 | 36 | process.stdout.write('\n'); 37 | -------------------------------------------------------------------------------- /scripts/process-service.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const sysPath = require('path'); 3 | const dots = require('./util/dots'); 4 | const moduleName = require('./util/module-name'); 5 | const replacePathParams = require('./util/replace-path-params'); 6 | const resolveTypes = require('./util/resolve-types'); 7 | const { lowCam, upCam } = require('./util/case-conversions'); 8 | const { unique } = require('./util/set'); 9 | 10 | const outRoot = sysPath.resolve(`${__dirname}/../src/AWS/Services`); 11 | 12 | const findIOShapes = (ops, io) => 13 | Object.keys(ops).map((key) => { 14 | const op = ops[key]; 15 | return op[io] && upCam(op[io].shape); 16 | }).filter(x => x); 17 | 18 | module.exports = (data) => { 19 | const types = resolveTypes(data.shapes, { 20 | inputShapes: findIOShapes(data.operations, 'input'), 21 | outputShapes: findIOShapes(data.operations, 'output'), 22 | }); 23 | const mod = moduleName(data.metadata); 24 | 25 | const sumExtraImports = types.reduce((acc, t) => acc.concat(t.extraImports || []), []); 26 | 27 | const operations = Object.keys(data.operations) 28 | .map((key) => { 29 | const op = data.operations[key]; 30 | const params = op.input 31 | ? types.findByShape(op.input.shape).members 32 | : []; 33 | const requiredParams = params.filter(m => m.required); 34 | const optionalParams = params.filter(m => !m.required); 35 | const { requestPath, extraImports, unusedParams } = 36 | replacePathParams(op.http.requestUri, requiredParams); 37 | (extraImports || []).forEach(extraImport => sumExtraImports.push(extraImport)); 38 | 39 | if (!op.http) { 40 | throw new Error(`${mod}: ${key} doesn't have an http attribute!`); 41 | } 42 | return { 43 | name: lowCam(key), 44 | actionName: upCam(key), 45 | protocol: data.metadata.protocol, 46 | optionsName: `${key}Options`, 47 | doc: op.documentation, 48 | http: op.http, 49 | requestPath, 50 | requiredParams, 51 | requiredUnusedParams: unusedParams, 52 | optionalParams, 53 | input: op.input && types.findByShape(op.input.shape), 54 | output: op.output 55 | ? types.findByShape(op.output.shape) 56 | : { 57 | type: '()', 58 | decoder: '(JD.succeed ())', 59 | }, 60 | outputResultWrapper: op.output 61 | ? op.output.resultWrapper || op.output.shape 62 | : '()', 63 | errors: op.errors, 64 | }; 65 | }); 66 | 67 | const categories = [ 68 | 'response', 69 | 'record', 70 | 'union', 71 | 'exception', 72 | ].map(key => ({ 73 | key, 74 | name: `${upCam(key)}s`, 75 | types: types.filter(t => t.category === key), 76 | })).filter(c => c.types.length > 0); 77 | 78 | const context = { 79 | categories, 80 | documentation: data.documentation, 81 | extraImports: unique(sumExtraImports), 82 | isRegional: !data.metadata.globalEndpoint, 83 | metadata: data.metadata, 84 | mod, 85 | operationNames: operations.reduce((acc, op) => 86 | acc.concat(op.optionalParams.length 87 | ? [op.name, op.optionsName] 88 | : [op.name]), 89 | []), 90 | operations: operations.map(dots.defineOperation), 91 | signatureVersion: `${upCam(data.metadata.signatureVersion)}Signature`, 92 | types, 93 | }; 94 | 95 | fs.writeFileSync( 96 | `${outRoot}/${mod}.elm`, 97 | dots.api(context), 98 | 'utf8'); 99 | 100 | return context; 101 | }; 102 | -------------------------------------------------------------------------------- /scripts/util/case-conversions.js: -------------------------------------------------------------------------------- 1 | const camelize = require('camelize'); 2 | 3 | module.exports = camelize; 4 | 5 | module.exports.lowCam = (x) => { 6 | const y = camelize(x); 7 | return y.length ? y[0].toLowerCase() + y.slice(1) : ''; 8 | }; 9 | 10 | module.exports.upCam = (x) => { 11 | const y = camelize(x); 12 | return y.length ? y[0].toUpperCase() + y.slice(1) : ''; 13 | }; 14 | 15 | module.exports.safeIdentifier = x => x 16 | .replace(/[^a-z0-9_]+/ig, '_') 17 | .replace(/^(type|port)$/, '$1_') 18 | ; 19 | -------------------------------------------------------------------------------- /scripts/util/dots.js: -------------------------------------------------------------------------------- 1 | const dot = require('dot'); 2 | const sysPath = require('path'); 3 | 4 | dot.log = false; 5 | 6 | module.exports = dot.process({ 7 | path: sysPath.resolve(`${__dirname}/../../templates`), 8 | templateSettings: { 9 | strip: false, 10 | }, 11 | }); 12 | -------------------------------------------------------------------------------- /scripts/util/find-latest-sources.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | const filenamePattern = /^(.*?)-(\d{4}-\d{2}-\d{2})\.normal\.json$/; 4 | 5 | module.exports = (serviceRoot) => { 6 | const sources = {}; 7 | 8 | fs.readdirSync(serviceRoot) 9 | .forEach((filename) => { 10 | const m = filename.match(filenamePattern); 11 | if (m) { 12 | const key = m[1]; 13 | const version = Date.parse(m[2]); 14 | if (!sources[key] || sources[key].version < version) { 15 | sources[key] = { filename, version }; 16 | } 17 | } 18 | }); 19 | 20 | return Object.keys(sources).map(key => 21 | sources[key].filename); 22 | }; 23 | -------------------------------------------------------------------------------- /scripts/util/module-name.js: -------------------------------------------------------------------------------- 1 | module.exports = metadata => ( 2 | (metadata.serviceAbbreviation || metadata.serviceFullName) 3 | .replace(/^(AWS|Amazon)/, '') 4 | .replace(/[^a-z0-9]/ig, '') 5 | ); 6 | -------------------------------------------------------------------------------- /scripts/util/render.js: -------------------------------------------------------------------------------- 1 | const dots = require('./dots'); 2 | 3 | const render = {}; 4 | 5 | render.nothing = sh => Object.assign({ 6 | exposeAs: null, 7 | }, sh); 8 | 9 | render.enum = sh => Object.assign({ 10 | exposeAs: `${sh.type}(..)`, 11 | typeDef: dots.defineUnionType(sh), 12 | decoderDef: dots.defineUnionDecoder(sh), 13 | }, sh); 14 | 15 | render.enumDoc = dots.defineUnionDoc; 16 | 17 | const memberType = ({ required, key, value }) => ( 18 | required 19 | ? `${key} : ${value.type}` 20 | : `${key} : Maybe ${value.type}` 21 | ); 22 | 23 | render.structure = sh => Object.assign({ 24 | exposeAs: sh.category !== 'request' ? sh.type : null, 25 | typeDef: dots.defineRecordType(Object.assign({ memberType }, sh)), 26 | decoderDef: dots.defineRecordDecoder(sh), 27 | jsonEncoderDef: dots.defineRecordJsonEncoder(sh), 28 | queryEncoderDef: dots.defineRecordQueryEncoder(sh), 29 | }, sh); 30 | 31 | module.exports = render; 32 | -------------------------------------------------------------------------------- /scripts/util/replace-path-params.js: -------------------------------------------------------------------------------- 1 | const fuzzy = require('fuzzy'); 2 | 3 | const normalize = key => key.toLowerCase().replace(/[^a-z0-9]/, ''); 4 | 5 | const toString = (param) => { 6 | if (param.value.enum) { 7 | return { 8 | key: param.key, 9 | value: `(AWS.Enum.toString ${param.key} |> Result.withDefault "")`, 10 | extraImport: 'import AWS.Enum', 11 | }; 12 | } else if (param.value.type === 'String') { 13 | return { 14 | key: param.key, 15 | value: param.key, 16 | }; 17 | } 18 | return { 19 | key: param.key, 20 | value: `(toString ${param.key})`, 21 | }; 22 | }; 23 | 24 | /* 25 | We have to do a fuzzy find on the list of input keys to the operation, because 26 | the name in the path param does not always exactly match. For example, 27 | 28 | apigateway CreateResource "/restapis/{restapi_id}/resources/{parent_id}" 29 | 30 | the path param is called `restapi_id` but the CreateResourceRequest member key 31 | that matches is called `restApiId`. 32 | */ 33 | const fuzzyFind = (fuzzyTerm, params) => { 34 | const term = normalize(fuzzyTerm); 35 | const keys = params.map(p => p.key); 36 | 37 | const shortList = fuzzy.filter(term, keys); 38 | if (shortList.length) { 39 | const key = shortList[0].original; 40 | return toString(params.find(p => p.key === key)); 41 | } 42 | const param = params.find(p => 43 | fuzzy.filter(p.key, [term]).length); 44 | if (param) { 45 | return toString(param); 46 | } 47 | throw new Error(`Could not find parameter for path term ${fuzzyTerm} among ${keys}`); 48 | }; 49 | 50 | const pathParamPattern = /(\{(.+?)[+]?\})/g; 51 | 52 | const replaceAll = (path, params) => { 53 | const extraImports = []; 54 | const usedKeys = []; 55 | const sumValue = path.replace(pathParamPattern, (m, g1, g2) => { 56 | const { key, value, extraImport } = fuzzyFind(g2, params); 57 | if (extraImport) { 58 | extraImports.push(extraImport); 59 | } 60 | usedKeys.push(key); 61 | return `" ++ ${value} ++ "`; 62 | }); 63 | return { 64 | value: sumValue, 65 | extraImports, 66 | unusedParams: params.filter(p => usedKeys.indexOf(p.key) === -1), 67 | }; 68 | }; 69 | 70 | module.exports = (path, params) => { 71 | if (!pathParamPattern.test(path)) { 72 | return { 73 | requestPath: `"${path}"`, 74 | extraImports: [], 75 | unusedParams: params, 76 | }; 77 | } 78 | const { value, extraImports, unusedParams } = replaceAll(path, params); 79 | return { 80 | requestPath: `("${value}")`, 81 | extraImports, 82 | unusedParams, 83 | }; 84 | }; 85 | -------------------------------------------------------------------------------- /scripts/util/set.js: -------------------------------------------------------------------------------- 1 | module.exports.unique = array => 2 | Array.from(new Set(array)); 3 | -------------------------------------------------------------------------------- /src/AWS.elm: -------------------------------------------------------------------------------- 1 | module AWS 2 | exposing 3 | ( credentials 4 | , defaultOptions 5 | , responseData 6 | , toTask 7 | , AccessKeyId 8 | , Credentials 9 | , Region 10 | , Request(UnsignedRequest) 11 | , Response 12 | , SecretAccessKey 13 | , ServiceConfig(ServiceConfig) 14 | , SessionToken 15 | ) 16 | 17 | {-| AWS SDK for elm. 18 | 19 | __Experimental: Work in progress__ 20 | 21 | @docs ServiceConfig, Region, Credentials, credentials, AccessKeyId, SecretAccessKey, SessionToken 22 | 23 | ## Request 24 | 25 | @docs Request, defaultOptions, toTask 26 | 27 | ## Response 28 | 29 | @docs Response, responseData 30 | -} 31 | 32 | import AWS.Config 33 | import AWS.Decode 34 | import AWS.Signers.V4 as V4 35 | import AWS.Http 36 | import Date exposing (Date) 37 | import Http 38 | import Task 39 | 40 | 41 | {-| Credentials for accessing AWS services. 42 | -} 43 | type Credentials 44 | = Credentials AWS.Config.Credentials 45 | 46 | 47 | {-| The AWS access key ID. 48 | -} 49 | type alias AccessKeyId = 50 | String 51 | 52 | 53 | {-| The AWS secret access key. 54 | -} 55 | type alias SecretAccessKey = 56 | String 57 | 58 | 59 | {-| An optional AWS session token. 60 | -} 61 | type alias SessionToken = 62 | String 63 | 64 | 65 | {-| Constructor for AWS Credentials 66 | -} 67 | credentials : AccessKeyId -> SecretAccessKey -> Maybe SessionToken -> Credentials 68 | credentials accessKeyId secretAccessKey maybeToken = 69 | AWS.Config.Credentials accessKeyId secretAccessKey maybeToken 70 | |> Credentials 71 | 72 | 73 | {-| Configuration for an AWS service. 74 | 75 | Each service module exposes a `config` function which returns a ServiceConfig 76 | for use with that service. 77 | -} 78 | type ServiceConfig 79 | = ServiceConfig AWS.Config.Service 80 | 81 | 82 | {-| String representing an AWS region. 83 | 84 | For example, `"us-east-1"` 85 | -} 86 | type alias Region = 87 | String 88 | 89 | 90 | {-| An unsigned AWS Request. 91 | 92 | Call signV4 to produce a signed Http.Request 93 | -} 94 | type Request a 95 | = UnsignedRequest (AWS.Http.UnsignedRequest a) 96 | 97 | 98 | {-| Leaves the default options unchanged. 99 | 100 | Alias for the identity function. 101 | -} 102 | defaultOptions : a -> a 103 | defaultOptions options = 104 | options 105 | 106 | 107 | sign : 108 | ServiceConfig 109 | -> Credentials 110 | -> Date 111 | -> Request a 112 | -> Http.Request a 113 | sign serviceConfig credentials date req = 114 | case 115 | ( serviceConfig, credentials, req ) 116 | of 117 | ( ServiceConfig config, Credentials creds, UnsignedRequest unsignedReq ) -> 118 | case config.signatureVersion of 119 | AWS.Config.V4Signature -> 120 | V4.sign config creds date unsignedReq 121 | 122 | _ -> 123 | Debug.crash "Unsupported signature" 124 | 125 | 126 | {-| Signs and sends an AWS Request. 127 | -} 128 | toTask : 129 | ServiceConfig 130 | -> Credentials 131 | -> Request a 132 | -> Task.Task Http.Error a 133 | toTask serviceConfig credentials req = 134 | Date.now 135 | |> Task.andThen 136 | (\date -> 137 | sign serviceConfig credentials date req 138 | |> Http.toTask 139 | ) 140 | 141 | 142 | {-| Response from an AWS service. 143 | -} 144 | type alias Response a = 145 | AWS.Decode.ResponseWrapper a 146 | 147 | 148 | {-| Extract the data from the AWS response 149 | -} 150 | responseData : Response a -> a 151 | responseData resp = 152 | resp.response.data 153 | -------------------------------------------------------------------------------- /src/AWS/Config.elm: -------------------------------------------------------------------------------- 1 | module AWS.Config exposing (..) 2 | 3 | 4 | type alias Credentials = 5 | { accessKeyId : String 6 | , secretAccessKey : String 7 | , sessionToken : Maybe String 8 | } 9 | 10 | 11 | type alias EndpointPrefix = 12 | String 13 | 14 | 15 | type alias Region = 16 | String 17 | 18 | 19 | type alias Host = 20 | String 21 | 22 | 23 | type Endpoint 24 | = RegionalEndpoint EndpointPrefix Region 25 | | GlobalEndpoint Host 26 | 27 | 28 | type SignatureVersion 29 | = V4Signature 30 | | V2Signature 31 | | S3Signature 32 | 33 | 34 | type alias Service = 35 | { serviceName : String 36 | , endpoint : Endpoint 37 | , signatureVersion : SignatureVersion 38 | , version : String 39 | , xAmzJsonVersion : Maybe String 40 | , xAmzTargetPrefix : String 41 | } 42 | -------------------------------------------------------------------------------- /src/AWS/Decode.elm: -------------------------------------------------------------------------------- 1 | module AWS.Decode 2 | exposing 3 | ( Metadata 4 | , Response 5 | , ResponseWrapper 6 | , ResultDecoder(..) 7 | , dict 8 | , optional 9 | , required 10 | , responseWrapperDecoder 11 | ) 12 | 13 | import Dict exposing (Dict) 14 | import Json.Decode as JD 15 | import Json.Decode.Pipeline as JDP 16 | 17 | 18 | type alias ResponseWrapper a = 19 | { response : Response a } 20 | 21 | 22 | type alias Response a = 23 | { data : a 24 | , metadata : Metadata 25 | } 26 | 27 | 28 | type alias Metadata = 29 | { requestId : String } 30 | 31 | 32 | type ResultDecoder a 33 | = ResultDecoder String (JD.Decoder a) 34 | | FixedResult a 35 | 36 | 37 | responseWrapperDecoder : String -> ResultDecoder a -> JD.Decoder (ResponseWrapper a) 38 | responseWrapperDecoder actionName resultDecoder = 39 | JDP.decode ResponseWrapper 40 | |> JDP.required (actionName ++ "Response") 41 | (JDP.decode Response 42 | |> resultWrapperDecoder resultDecoder 43 | |> JDP.required "ResponseMetadata" 44 | (JDP.decode Metadata 45 | |> JDP.required "RequestId" JD.string 46 | ) 47 | ) 48 | 49 | 50 | resultWrapperDecoder : ResultDecoder a -> JD.Decoder (a -> b) -> JD.Decoder b 51 | resultWrapperDecoder resultDecoder = 52 | case resultDecoder of 53 | ResultDecoder dataName dataDecoder -> 54 | JDP.required dataName dataDecoder 55 | 56 | FixedResult value -> 57 | JDP.hardcoded value 58 | 59 | 60 | 61 | -- required and optional member decoders 62 | 63 | 64 | required : List String -> JD.Decoder a -> JD.Decoder a 65 | required fields decoder = 66 | tryFields fields decoder 67 | |> JD.andThen 68 | (\maybeValue -> 69 | case maybeValue of 70 | Nothing -> 71 | JD.fail ("Missing required fields with key of either: " ++ (toString fields)) 72 | 73 | Just value -> 74 | case JD.decodeValue decoder value of 75 | Ok x -> 76 | JD.succeed x 77 | 78 | Err err -> 79 | JD.fail (toString err) 80 | ) 81 | 82 | 83 | optional : List String -> JD.Decoder a -> JD.Decoder (Maybe a) 84 | optional fields decoder = 85 | tryFields fields decoder 86 | |> JD.andThen 87 | (\maybeValue -> 88 | case maybeValue of 89 | Nothing -> 90 | JD.succeed Nothing 91 | 92 | Just value -> 93 | case JD.decodeValue decoder value of 94 | Ok x -> 95 | JD.succeed (Just x) 96 | 97 | Err err -> 98 | JD.fail (toString err) 99 | ) 100 | 101 | 102 | tryFields : List String -> JD.Decoder a -> JD.Decoder (Maybe JD.Value) 103 | tryFields fields decoder = 104 | fields 105 | |> List.map (\field -> JD.field field JD.value) 106 | |> JD.oneOf 107 | |> JD.maybe 108 | 109 | 110 | 111 | -- dict and helpers 112 | 113 | 114 | dict : JD.Decoder a -> JD.Decoder (Dict String a) 115 | dict valueDecoder = 116 | [ JD.dict valueDecoder 117 | , dictAsList valueDecoder 118 | ] 119 | |> JD.oneOf 120 | 121 | 122 | dictAsList : JD.Decoder a -> JD.Decoder (Dict String a) 123 | dictAsList valueDecoder = 124 | JD.list (nameValueDecoder valueDecoder) 125 | |> JD.map 126 | (List.map (\pair -> ( pair.name, pair.value )) 127 | >> Dict.fromList 128 | ) 129 | 130 | 131 | type alias NameValuePair a = 132 | { name : String 133 | , value : a 134 | } 135 | 136 | 137 | nameValueDecoder : JD.Decoder a -> JD.Decoder (NameValuePair a) 138 | nameValueDecoder valueDecoder = 139 | JDP.decode NameValuePair 140 | |> JDP.required "Name" JD.string 141 | |> JDP.required "Value" valueDecoder 142 | -------------------------------------------------------------------------------- /src/AWS/Encode.elm: -------------------------------------------------------------------------------- 1 | module AWS.Encode 2 | exposing 3 | ( addListToQueryArgs 4 | , addOneToQueryArgs 5 | , addRecordToQueryArgs 6 | , bool 7 | , optionalMember 8 | , unchangedQueryArgs 9 | , uri 10 | ) 11 | 12 | import Char 13 | import Http 14 | import Regex exposing (HowMany(All), regex) 15 | import Word.Hex as Hex 16 | 17 | 18 | {-| We don't use Http.encodeUri because it misses some characters. It uses the 19 | native `encodeURIComponent` under the hood: 20 | 21 | encodeURIComponent escapes all characters except the following: 22 | alphabetic, decimal digits, - _ . ! ~ * ' ( ) 23 | 24 | - from https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent 25 | 26 | For AWS only "Unreserved Characters" are allowed. 27 | See 28 | Section 2.3 29 | 30 | So basically we need to also cover: ! * ' ( ) 31 | 32 | -} 33 | uri : String -> String 34 | uri x = 35 | x 36 | |> Http.encodeUri 37 | |> Regex.replace All 38 | (regex "[!*'()]") 39 | (\match -> 40 | match.match 41 | |> String.toList 42 | |> List.head 43 | |> Maybe.map 44 | (\char -> 45 | char 46 | |> Char.toCode 47 | |> Hex.fromByte 48 | |> String.toUpper 49 | |> (++) "%" 50 | ) 51 | |> Maybe.withDefault "" 52 | ) 53 | 54 | 55 | 56 | -- QUERY ENCODE SIMPLE TYPES 57 | 58 | 59 | bool : Bool -> String 60 | bool val = 61 | if val then 62 | "true" 63 | else 64 | "false" 65 | 66 | 67 | 68 | -- QUERY ENCODE IN A PIPELINE 69 | 70 | 71 | unchangedQueryArgs : List ( String, String ) -> List ( String, String ) 72 | unchangedQueryArgs args = 73 | args 74 | 75 | 76 | addOneToQueryArgs : (a -> String) -> String -> a -> List ( String, String ) -> List ( String, String ) 77 | addOneToQueryArgs transform key value = 78 | (::) ( key, transform value ) 79 | 80 | 81 | addListToQueryArgs : 82 | Bool 83 | -> (a -> List ( String, String ) -> List ( String, String )) 84 | -> String 85 | -> List a 86 | -> List ( String, String ) 87 | -> List ( String, String ) 88 | addListToQueryArgs flattened transform base values = 89 | values 90 | |> List.indexedMap 91 | (\index rawValue -> 92 | transform rawValue [] 93 | |> List.map 94 | (\( key, value ) -> 95 | ( listItemKey flattened index base key 96 | , value 97 | ) 98 | ) 99 | ) 100 | |> List.concat 101 | |> List.append 102 | 103 | 104 | listItemKey : Bool -> Int -> String -> String -> String 105 | listItemKey flattened index base key = 106 | base 107 | ++ (if flattened then 108 | "." 109 | else 110 | ".member." 111 | ) 112 | ++ toString (index + 1) 113 | ++ (if String.isEmpty key then 114 | "" 115 | else 116 | "." ++ key 117 | ) 118 | 119 | 120 | addRecordToQueryArgs : 121 | (record -> List ( String, String )) 122 | -> String 123 | -> record 124 | -> List ( String, String ) 125 | -> List ( String, String ) 126 | addRecordToQueryArgs transform base record = 127 | let 128 | prefix = 129 | if String.isEmpty base then 130 | "" 131 | else 132 | base ++ "." 133 | in 134 | record 135 | |> transform 136 | |> List.map 137 | (\( key, value ) -> 138 | ( prefix ++ key 139 | , value 140 | ) 141 | ) 142 | |> List.append 143 | 144 | 145 | optionalMember : 146 | (a -> b) 147 | -> ( String, Maybe a ) 148 | -> List ( String, b ) 149 | -> List ( String, b ) 150 | optionalMember encode ( key, maybeValue ) members = 151 | case maybeValue of 152 | Nothing -> 153 | members 154 | 155 | Just value -> 156 | ( key, encode value ) :: members 157 | -------------------------------------------------------------------------------- /src/AWS/Enum.elm: -------------------------------------------------------------------------------- 1 | module AWS.Enum exposing (toString, toFloat) 2 | 3 | {-| Convert AWS enums values to basic values 4 | 5 | @docs toString,toFloat 6 | -} 7 | 8 | import Regex exposing (contains, regex) 9 | 10 | 11 | crop : a -> Maybe (List String) 12 | crop = 13 | Basics.toString >> String.split ("_") >> List.tail 14 | 15 | 16 | {-| Convert an AWS enum value to a string 17 | 18 | Enum.toString IntegrationType_HTTP_PROXY -- Ok "HTTP_PROXY" 19 | -} 20 | toString : a -> Result String String 21 | toString value = 22 | case crop value of 23 | Just tail -> 24 | case tail of 25 | [] -> 26 | "Not an enum value: " ++ (Basics.toString value) |> Err 27 | 28 | t -> 29 | let 30 | w = 31 | t |> String.join ("_") 32 | in 33 | if contains (regex "[^_A-Za-z0-9]") w then 34 | "Not an enum value, contains invalid characters: " ++ (Basics.toString value) |> Err 35 | else 36 | Ok w 37 | 38 | Nothing -> 39 | "Not an enum value: " ++ (Basics.toString value) |> Err 40 | 41 | 42 | {-| Convert an AWS enum value to a float 43 | 44 | Enum.toFloat CacheClusterSize_0_5 -- Ok 0.5 45 | -} 46 | toFloat : a -> Result String Float 47 | toFloat value = 48 | case crop value of 49 | Just tail -> 50 | tail 51 | |> String.join (".") 52 | |> String.toFloat 53 | |> Result.andThen Ok 54 | 55 | Nothing -> 56 | "Not an enum value: " ++ (Basics.toString value) |> Err 57 | -------------------------------------------------------------------------------- /src/AWS/Http.elm: -------------------------------------------------------------------------------- 1 | module AWS.Http exposing (..) 2 | 3 | import AWS.Config exposing (..) 4 | import AWS.Encode 5 | import Json.Encode as JE 6 | import Json.Decode as JD 7 | import Http 8 | import QueryString exposing (QueryString) 9 | 10 | 11 | type alias QueryParams = 12 | List ( String, String ) 13 | 14 | 15 | type RequestBody 16 | = NoBody 17 | | JsonBody JE.Value 18 | 19 | 20 | type alias UnsignedRequest a = 21 | { method : String 22 | , path : String 23 | , query : QueryParams 24 | , body : RequestBody 25 | , decoder : JD.Decoder a 26 | } 27 | 28 | 29 | unsignedRequest : 30 | String 31 | -> String 32 | -> String 33 | -> QueryParams 34 | -> RequestBody 35 | -> JD.Decoder a 36 | -> UnsignedRequest a 37 | unsignedRequest target method uri query body decoder = 38 | UnsignedRequest 39 | method 40 | uri 41 | query 42 | body 43 | decoder 44 | 45 | 46 | url : Endpoint -> String -> QueryParams -> String 47 | url endpoint path params = 48 | "https://" 49 | ++ (host endpoint) 50 | ++ path 51 | ++ (queryString params) 52 | 53 | 54 | host : Endpoint -> String 55 | host endpoint = 56 | case endpoint of 57 | RegionalEndpoint prefix region -> 58 | prefix ++ "." ++ region ++ ".amazonaws.com" 59 | 60 | GlobalEndpoint host -> 61 | host 62 | 63 | 64 | queryString : QueryParams -> String 65 | queryString params = 66 | case params of 67 | [] -> 68 | "" 69 | 70 | _ -> 71 | params 72 | |> List.foldl 73 | (\( key, val ) qs -> 74 | qs |> QueryString.add (AWS.Encode.uri key) val 75 | ) 76 | QueryString.empty 77 | |> QueryString.render 78 | 79 | 80 | body : RequestBody -> Http.Body 81 | body body = 82 | case body of 83 | JsonBody value -> 84 | Http.jsonBody value 85 | 86 | NoBody -> 87 | Http.emptyBody 88 | -------------------------------------------------------------------------------- /src/AWS/Services/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ktonon/aws-sdk-elm/b18706aeb4a9eddab644bbdcc6266b4b6b793a28/src/AWS/Services/.gitkeep -------------------------------------------------------------------------------- /src/AWS/Signers/Canonical.elm: -------------------------------------------------------------------------------- 1 | module AWS.Signers.Canonical exposing (..) 2 | 3 | import AWS.Encode 4 | import AWS.Http exposing (QueryParams, RequestBody(..), UnsignedRequest) 5 | import Crypto.Hash exposing (sha256) 6 | import Json.Encode as JE 7 | import Regex exposing (HowMany(All), regex) 8 | 9 | 10 | -- http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html 11 | 12 | 13 | canonical : String -> String -> List ( String, String ) -> QueryParams -> RequestBody -> String 14 | canonical method path headers params body = 15 | canonicalRaw method path headers params body 16 | |> sha256 17 | 18 | 19 | canonicalRaw : String -> String -> List ( String, String ) -> QueryParams -> RequestBody -> String 20 | canonicalRaw method path headers params body = 21 | [ String.toUpper method 22 | , canonicalUri path 23 | , canonicalQueryString params 24 | , canonicalHeaders headers 25 | , "" 26 | , signedHeaders headers 27 | , canonicalPayload body 28 | ] 29 | |> String.join "\n" 30 | 31 | 32 | canonicalUri : String -> String 33 | canonicalUri path = 34 | if String.isEmpty path then 35 | "/" 36 | else 37 | -- TODO: vvv 38 | -- In exception to this, you do not normalize URI paths for requests to 39 | -- Amazon S3. For example, if you have a bucket with an object named 40 | -- 41 | -- my-object//example//photo.user 42 | -- 43 | -- use that path. Normalizing the path to 44 | -- my-object/example/photo.user 45 | -- 46 | -- will cause the request to fail. For more information, see 47 | -- Task 1: Create a Canonical Request in the Amazon Simple Storage 48 | -- Service API Reference: 49 | -- http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html#canonical-request 50 | path 51 | |> Regex.replace All (regex "/{2,}") (\_ -> "/") 52 | |> resolveRelativePath 53 | |> String.split "/" 54 | |> List.map AWS.Encode.uri 55 | |> String.join "/" 56 | 57 | 58 | canonicalQueryString : QueryParams -> String 59 | canonicalQueryString params = 60 | params 61 | |> List.sort 62 | |> List.map (encode2Tuple "=") 63 | |> String.join "&" 64 | 65 | 66 | canonicalHeaders : List ( String, String ) -> String 67 | canonicalHeaders headers = 68 | headers 69 | |> List.map normalizeHeader 70 | |> List.foldl mergeSameHeaders [] 71 | |> List.map joinHeader 72 | |> List.sort 73 | |> String.join "\n" 74 | 75 | 76 | signedHeaders : List ( String, String ) -> String 77 | signedHeaders headers = 78 | headers 79 | |> List.foldl mergeSameHeaders [] 80 | |> List.map (\( a, _ ) -> String.toLower a) 81 | |> List.sort 82 | |> String.join ";" 83 | 84 | 85 | canonicalPayload : RequestBody -> String 86 | canonicalPayload body = 87 | (case body of 88 | JsonBody value -> 89 | JE.encode 0 value 90 | 91 | NoBody -> 92 | "" 93 | ) 94 | |> sha256 95 | 96 | 97 | 98 | -- HELPERS 99 | 100 | 101 | resolveRelativePath : String -> String 102 | resolveRelativePath path = 103 | let 104 | rel = 105 | regex "(([^/]+)/[.]{2}|/[.])/?" 106 | in 107 | if Regex.contains rel path then 108 | path 109 | |> Regex.replace All 110 | rel 111 | (\{ match } -> 112 | if match == "/./" || match == "/." then 113 | "/" 114 | else 115 | "" 116 | ) 117 | |> resolveRelativePath 118 | else 119 | path 120 | 121 | 122 | normalizeHeader : ( String, String ) -> ( String, String ) 123 | normalizeHeader ( key, val ) = 124 | ( String.toLower key 125 | , val 126 | |> Regex.replace All (regex "\\s*?\n\\s*") (\_ -> ",") 127 | |> Regex.replace All (regex "(^\\s*|\\s*$)") (\_ -> "") 128 | |> Regex.replace All (regex "\\s{2,}") (\_ -> " ") 129 | ) 130 | 131 | 132 | mergeSameHeaders : ( String, String ) -> List ( String, String ) -> List ( String, String ) 133 | mergeSameHeaders ( key1, val1 ) acc = 134 | case acc of 135 | ( key0, val0 ) :: rest -> 136 | if key0 == key1 then 137 | ( key0, val0 ++ "," ++ val1 ) :: rest 138 | else 139 | ( key1, val1 ) :: ( key0, val0 ) :: rest 140 | 141 | _ -> 142 | ( key1, val1 ) :: acc 143 | 144 | 145 | joinHeader : ( String, String ) -> String 146 | joinHeader ( key, val ) = 147 | key ++ ":" ++ val 148 | 149 | 150 | encode2Tuple : String -> ( String, String ) -> String 151 | encode2Tuple separator ( a, b ) = 152 | [ AWS.Encode.uri a, AWS.Encode.uri b ] |> String.join separator 153 | -------------------------------------------------------------------------------- /src/AWS/Signers/V4.elm: -------------------------------------------------------------------------------- 1 | module AWS.Signers.V4 exposing (..) 2 | 3 | import AWS.Config exposing (Credentials) 4 | import AWS.Http exposing (QueryParams, RequestBody(..), UnsignedRequest) 5 | import AWS.Signers.Canonical exposing (canonical, signedHeaders) 6 | import Crypto.HMAC exposing (sha256) 7 | import Date exposing (Date) 8 | import Date.Extra exposing (toUtcIsoString) 9 | import Http 10 | import Regex exposing (HowMany(All), regex) 11 | import Word.Bytes as Bytes 12 | import Word.Hex as Hex 13 | 14 | 15 | -- http://docs.aws.amazon.com/waf/latest/developerguide/authenticating-requests.html 16 | 17 | 18 | sign : 19 | AWS.Config.Service 20 | -> AWS.Config.Credentials 21 | -> Date 22 | -> UnsignedRequest a 23 | -> Http.Request a 24 | sign config creds date req = 25 | Http.request 26 | { method = req.method 27 | , headers = 28 | headers config 29 | |> addAuthorization config creds date req 30 | |> addSessionToken creds 31 | |> List.map (\( key, val ) -> Http.header key val) 32 | , url = AWS.Http.url config.endpoint req.path req.query 33 | , body = AWS.Http.body req.body 34 | , expect = Http.expectJson req.decoder 35 | , timeout = Nothing 36 | , withCredentials = False 37 | } 38 | 39 | 40 | algorithm : String 41 | algorithm = 42 | "AWS4-HMAC-SHA256" 43 | 44 | 45 | headers : AWS.Config.Service -> List ( String, String ) 46 | headers config = 47 | [ ( "Accept", "application/json" ) 48 | , ( "Content-Type", jsonContentType config ) 49 | ] 50 | 51 | 52 | formatDate : Date -> String 53 | formatDate date = 54 | date 55 | |> toUtcIsoString 56 | |> Regex.replace All 57 | (regex "([-:]|\\.\\d{3})") 58 | (\_ -> "") 59 | 60 | 61 | addSessionToken : 62 | AWS.Config.Credentials 63 | -> List ( String, String ) 64 | -> List ( String, String ) 65 | addSessionToken creds headers = 66 | creds.sessionToken 67 | |> Maybe.map 68 | (\token -> 69 | ( "x-amz-security-token", token ) :: headers 70 | ) 71 | |> Maybe.withDefault headers 72 | 73 | 74 | addAuthorization : 75 | AWS.Config.Service 76 | -> AWS.Config.Credentials 77 | -> Date 78 | -> UnsignedRequest a 79 | -> List ( String, String ) 80 | -> List ( String, String ) 81 | addAuthorization config creds date req headers = 82 | [ ( "X-Amz-Date", formatDate date ) 83 | , ( "Authorization" 84 | , authorization creds 85 | date 86 | config 87 | req 88 | (headers |> (::) ( "Host", AWS.Http.host config.endpoint )) 89 | ) 90 | ] 91 | |> List.append headers 92 | 93 | 94 | authorization : 95 | Credentials 96 | -> Date 97 | -> AWS.Config.Service 98 | -> UnsignedRequest a 99 | -> List ( String, String ) 100 | -> String 101 | authorization creds date config req headers = 102 | let 103 | canon = 104 | canonical req.method req.path headers req.query req.body 105 | 106 | scope = 107 | credentialScope date creds config 108 | in 109 | [ "AWS4-HMAC-SHA256 Credential=" 110 | ++ creds.accessKeyId 111 | ++ "/" 112 | ++ scope 113 | , "SignedHeaders=" 114 | ++ signedHeaders headers 115 | , "Signature=" 116 | ++ signature creds config date (stringToSign algorithm date scope canon) 117 | ] 118 | |> String.join ", " 119 | 120 | 121 | credentialScope : Date -> AWS.Config.Credentials -> AWS.Config.Service -> String 122 | credentialScope date creds config = 123 | [ date |> formatDate |> String.slice 0 8 124 | , config.endpoint |> regionForAuth 125 | , config.serviceName 126 | , "aws4_request" 127 | ] 128 | |> String.join "/" 129 | 130 | 131 | signature : Credentials -> AWS.Config.Service -> Date -> String -> String 132 | signature creds config date toSign = 133 | let 134 | digest = 135 | \message key -> 136 | Crypto.HMAC.digestBytes sha256 137 | key 138 | (Bytes.fromUTF8 message) 139 | in 140 | ("AWS4" ++ creds.secretAccessKey) 141 | |> Bytes.fromUTF8 142 | |> digest (formatDate date |> String.slice 0 8) 143 | |> digest (regionForAuth config.endpoint) 144 | |> digest config.serviceName 145 | |> digest "aws4_request" 146 | |> digest toSign 147 | |> Hex.fromByteList 148 | 149 | 150 | regionForAuth : AWS.Config.Endpoint -> String 151 | regionForAuth endpoint = 152 | case endpoint of 153 | AWS.Config.RegionalEndpoint _ region -> 154 | region 155 | 156 | AWS.Config.GlobalEndpoint _ -> 157 | -- See http://docs.aws.amazon.com/general/latest/gr/sigv4_changes.html 158 | "us-east-1" 159 | 160 | 161 | stringToSign : String -> Date -> String -> String -> String 162 | stringToSign algorithm date scope canon = 163 | [ algorithm 164 | , date |> formatDate 165 | , scope 166 | , canon 167 | ] 168 | |> String.join "\n" 169 | 170 | 171 | jsonContentType : AWS.Config.Service -> String 172 | jsonContentType config = 173 | (case config.xAmzJsonVersion of 174 | Just version -> 175 | "application/x-amz-json-" ++ version 176 | 177 | Nothing -> 178 | "application/json" 179 | ) 180 | ++ "; charset=utf-8" 181 | -------------------------------------------------------------------------------- /templates/api.dot: -------------------------------------------------------------------------------- 1 | module AWS.Services.{{= it.mod }} 2 | exposing 3 | ( config 4 | , {{= it.operationNames.join('\n , ')}} 5 | , {{= it.types.filter(t => t.exposeAs).map(t => t.exposeAs).join('\n , ')}} 6 | ) 7 | 8 | {-| {{= it.documentation }} 9 | 10 | @docs config 11 | 12 | ## Table of Contents 13 | 14 | * [Operations](#operations){{~ it.categories :c }} 15 | * [{{= c.name }}](#{{= c.name.toLowerCase() }}){{~}} 16 | 17 | ## Operations 18 | 19 | {{~ it.operationNames :name }}* [{{= name }}](#{{= name }}) 20 | {{~}} 21 | 22 | @docs {{= it.operationNames.join(',') }} 23 | {{~ it.categories :c }} 24 | ## {{= c.name }} 25 | 26 | {{~ c.types.filter(t => t.exposeAs).map(t => t.type) :t }}* [{{= t }}](#{{= t }}) 27 | {{~}} 28 | 29 | @docs {{= c.types.filter(t => t.exposeAs).map(t => t.type).join(',') }} 30 | {{~}} 31 | -} 32 | 33 | import AWS 34 | import AWS.Config 35 | import AWS.Decode 36 | import AWS.Encode 37 | import AWS.Http 38 | import Json.Decode as JD 39 | import Json.Decode.Pipeline as JDP 40 | import Json.Encode as JE 41 | {{~ it.extraImports :importExtra }}{{= importExtra }} 42 | {{~}} 43 | 44 | {-| Configuration for this service 45 | -} 46 | config : {{? it.isRegional }}AWS.Region -> {{?}}AWS.ServiceConfig 47 | config {{? it.isRegional }}region {{?}}= 48 | AWS.Config.Service 49 | "{{= it.metadata.endpointPrefix }}" 50 | (AWS.Config.{{= it.isRegional ? `RegionalEndpoint "${it.metadata.endpointPrefix}" region` : `GlobalEndpoint "${it.metadata.globalEndpoint}"` }}) 51 | AWS.Config.{{= it.signatureVersion }} 52 | "{{= it.metadata.apiVersion }}" 53 | {{= it.metadata.jsonVersion ? `(Just "${it.metadata.jsonVersion}")` : 'Nothing' }} 54 | "AWS{{= it.metadata.endpointPrefix.toUpperCase() }}_{{= it.metadata.apiVersion.replace(/-/g, '') }}." 55 | |> AWS.ServiceConfig 56 | 57 | 58 | 59 | -- OPERATIONS 60 | 61 | {{= it.operations.join('\n\n') }} 62 | 63 | {{~ it.types.filter(t => t.exposeAs) :t }} 64 | {{= t.typeDef }} 65 | 66 | {{? t.decoderDef }} 67 | {{= t.decoderDef }} 68 | {{?}} 69 | {{~}} 70 | 71 | 72 | {{~ it.types.filter(t => t.category === 'request') :t }} 73 | {{= t.typeDef }} 74 | {{~}} 75 | 76 | 77 | {{~ it.types.filter(t => t.exposeAs || t.category === 'request') :t }} 78 | {{? it.metadata.protocol === 'json' && t.jsonEncoderDef }} 79 | {{= t.jsonEncoderDef }} 80 | {{?}} 81 | 82 | {{? it.metadata.protocol === 'query' && t.queryEncoderDef }} 83 | {{= t.queryEncoderDef }} 84 | {{?}} 85 | {{~}} 86 | -------------------------------------------------------------------------------- /templates/defineOperation.dot: -------------------------------------------------------------------------------- 1 | {-| {{= it.doc }} 2 | {{? it.requiredParams }} 3 | __Required Parameters__ 4 | 5 | {{~ it.requiredParams :p }}* `{{= p.key }}` __:__ `{{= p.value.type }}` 6 | {{~}} 7 | {{?}} 8 | -} 9 | 10 | {{= it.name }} : 11 | {{~ it.requiredParams :p }} 12 | {{= p.value.type }} -> 13 | {{~}} 14 | {{? it.optionalParams.length }} 15 | ( {{= it.optionsName }} -> {{= it.optionsName }} ) -> 16 | {{?}} 17 | AWS.Request (AWS.Response {{= it.output.type }}) 18 | 19 | {{= it.name }} {{~ it.requiredParams :p }}{{= p.key }} {{~}}{{? it.optionalParams.length }}setOptions {{?}}= 20 | {{? it.input }} 21 | let 22 | requestInput = {{= it.input.type }} 23 | {{~ it.input.members :m }} 24 | {{= m.required ? m.key : `options.${m.key}` }} 25 | {{~}} 26 | {{? it.optionalParams.length }} 27 | options = setOptions ({{= it.optionsName }} {{= it.optionalParams.map(() => 'Nothing').join(' ') }}) 28 | {{?}} 29 | in 30 | {{?}} 31 | AWS.Http.unsignedRequest 32 | "{{= it.actionName }}" 33 | "{{= it.http.method }}" 34 | {{= it.requestPath }} 35 | 36 | {{? it.protocol === 'query' }} 37 | ([("Action", "{{= it.actionName }}")] 38 | {{? it.input }} 39 | |> {{= it.input.queryEncoder("") }} requestInput 40 | {{?}} 41 | ) 42 | {{?? true }} 43 | [] 44 | {{?}} 45 | 46 | {{? it.protocol === 'json' && it.input }} 47 | (requestInput 48 | |> {{= it.input.jsonEncoder }} 49 | |> AWS.Http.JsonBody 50 | ) 51 | {{?? true }} 52 | AWS.Http.NoBody 53 | {{?}} 54 | 55 | (AWS.Decode.responseWrapperDecoder 56 | "{{= it.actionName }}" 57 | {{? it.outputResultWrapper === "()" }} 58 | (AWS.Decode.FixedResult ()) 59 | {{?? true }} 60 | (AWS.Decode.ResultDecoder "{{= it.outputResultWrapper }}" {{= it.output.decoder }}) 61 | {{?}} 62 | ) 63 | |> AWS.UnsignedRequest 64 | 65 | 66 | {{? it.optionalParams.length }} 67 | {-| Options for a {{= it.name }} request 68 | -} 69 | type alias {{= it.optionsName }} = 70 | { 71 | {{= it.optionalParams.map(p => `${p.key} : Maybe ${p.value.type}`).join(',') }} 72 | } 73 | {{?}} 74 | -------------------------------------------------------------------------------- /templates/defineRecordDecoder.dot: -------------------------------------------------------------------------------- 1 | {{= it.decoder }} : JD.Decoder {{= it.type }} 2 | {{= it.decoder }} = 3 | JDP.decode {{= it.type }} 4 | {{~ it.members :m }} 5 | |> JDP.custom (AWS.Decode.{{= m.required ? 'required' : 'optional' }} 6 | ["{{= m.decodeKeys.join('", "') }}"] 7 | {{= m.value.decoder }} 8 | ) 9 | {{~}} 10 | -------------------------------------------------------------------------------- /templates/defineRecordJsonEncoder.dot: -------------------------------------------------------------------------------- 1 | {{= it.jsonEncoder }} : {{= it.type }} -> JE.Value 2 | {{= it.jsonEncoder }} data = 3 | [] 4 | {{~ it.members :m }} 5 | {{? m.required }} 6 | |> (::) ("{{= m.rawKey }}", data.{{= m.key }} |> ({{= m.value.jsonEncoder }})) 7 | {{?? true }} 8 | |> AWS.Encode.optionalMember 9 | ({{= m.value.jsonEncoder }}) 10 | ("{{= m.rawKey }}", data.{{= m.key }}) 11 | {{?}} 12 | {{~}} 13 | |> JE.object 14 | -------------------------------------------------------------------------------- /templates/defineRecordQueryEncoder.dot: -------------------------------------------------------------------------------- 1 | {{= it.queryEncoderType }} : {{= it.type }} -> List (String, String) 2 | {{= it.queryEncoderType }} data = 3 | [] 4 | {{~ it.members :m }} 5 | {{? m.required }} 6 | |> {{= m.value.queryEncoder(m.rawKey) }} data.{{= m.key }} 7 | {{?? true }} 8 | |> (case data.{{= m.key }} of 9 | Just value -> 10 | {{= m.value.queryEncoder(m.rawKey) }} value 11 | Nothing -> 12 | AWS.Encode.unchangedQueryArgs 13 | ) 14 | {{?}} 15 | {{~}} 16 | -------------------------------------------------------------------------------- /templates/defineRecordType.dot: -------------------------------------------------------------------------------- 1 | {-| {{= it.doc }} 2 | -} 3 | type alias {{= it.type }} = 4 | { {{= it.members.map(it.memberType).join('\n , ') }} 5 | } 6 | -------------------------------------------------------------------------------- /templates/defineUnionDecoder.dot: -------------------------------------------------------------------------------- 1 | {{= it.decoder }} : JD.Decoder {{= it.type }} 2 | {{= it.decoder }} = 3 | JD.string 4 | |> JD.andThen 5 | (\w -> 6 | case w of{{~ it.enum :val }} 7 | "{{= val }}" -> 8 | JD.succeed {{= it.type }}_{{= val}} 9 | {{~}} 10 | 11 | _ -> 12 | JD.fail "bad thing" 13 | ) 14 | -------------------------------------------------------------------------------- /templates/defineUnionDoc.dot: -------------------------------------------------------------------------------- 1 | {{? it.doc }}{{= it.doc }} 2 | 3 | {{?}}One of 4 | {{~ it.enum :val }} 5 | * `{{= it.name }}_{{= val }}`{{~}} 6 | -------------------------------------------------------------------------------- /templates/defineUnionType.dot: -------------------------------------------------------------------------------- 1 | {-| {{= it.doc }} 2 | -} 3 | type {{= it.type }} 4 | = {{= it.type }}_{{= it.enum.join(`\n | ${it.type}_`) }} 5 | -------------------------------------------------------------------------------- /templates/elmPackage.dot: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.0", 3 | "summary": "AWS SDK for elm", 4 | "repository": "https://github.com/ktonon/aws-sdk-elm.git", 5 | "license": "Apache-2.0", 6 | "source-directories": [ 7 | "src" 8 | ], 9 | "exposed-modules": [ 10 | "AWS.Enum",{{~ it :source }} 11 | "AWS.Services.{{= source.mod }}",{{~}} 12 | "AWS" 13 | ], 14 | "dependencies": { 15 | "Bogdanp/elm-querystring": "1.0.0 <= v < 2.0.0", 16 | "NoRedInk/elm-decode-pipeline": "3.0.0 <= v < 4.0.0", 17 | "elm-community/json-extra": "2.1.0 <= v < 3.0.0", 18 | "elm-lang/core": "5.0.0 <= v < 6.0.0", 19 | "elm-lang/http": "1.0.0 <= v < 2.0.0", 20 | "justinmimbs/elm-date-extra": "2.0.3 <= v < 3.0.0", 21 | "ktonon/elm-crypto": "1.0.0 <= v < 2.0.0", 22 | "ktonon/elm-word": "2.0.0 <= v < 3.0.0" 23 | }, 24 | "elm-version": "0.18.0 <= v < 0.19.0" 25 | } 26 | -------------------------------------------------------------------------------- /tests/.gitignore: -------------------------------------------------------------------------------- 1 | /elm-stuff/ 2 | -------------------------------------------------------------------------------- /tests/DecodeTests.elm: -------------------------------------------------------------------------------- 1 | module DecodeTests exposing (compositionTests, dictTests, optionalTests, requiredTests) 2 | 3 | import AWS.Decode exposing (Metadata, Response, ResponseWrapper) 4 | import AWS.Services.SQS exposing (GetQueueAttributesResult) 5 | import Dict exposing (Dict) 6 | import Json.Decode as JD 7 | import Json.Decode.Pipeline as JDP 8 | import Test exposing (Test, describe, test) 9 | import Test.Extra exposing (DecoderExpectation(..), describeDecoder) 10 | 11 | 12 | requiredTests : Test 13 | requiredTests = 14 | let 15 | missingKeyMsg = 16 | "I ran into a `fail` decoder: Missing required fields with key of either: [\"FooBar\",\"fooBar\"]" 17 | in 18 | describeDecoder """required [ "FooBar", "fooBar" ] string""" 19 | (AWS.Decode.required [ "FooBar", "fooBar" ] JD.string) 20 | [ ( """{ "fooBar": "car" }""", DecodesTo "car" ) 21 | , ( """{ "FooBar": "car" }""", DecodesTo "car" ) 22 | , ( """{ "fooBar": 4 }""", FailsToDecode ) 23 | , ( """{ "FOOBAR": "car" }""", FailsToDecodeWith missingKeyMsg ) 24 | , ( """{}""", FailsToDecodeWith missingKeyMsg ) 25 | ] 26 | 27 | 28 | optionalTests : Test 29 | optionalTests = 30 | describeDecoder """optional [ "FooBar", "fooBar" ] int""" 31 | (AWS.Decode.optional [ "FooBar", "fooBar" ] JD.int) 32 | [ ( """{ "fooBar": 4 }""", DecodesTo (Just 4) ) 33 | , ( """{ "FooBar": 5 }""", DecodesTo (Just 5) ) 34 | , ( """{ "fooBar": "car" }""", FailsToDecode ) 35 | , ( """{ "FOOBAR": 4 }""", DecodesTo Nothing ) 36 | , ( """{}""", DecodesTo Nothing ) 37 | ] 38 | 39 | 40 | dictTests : Test 41 | dictTests = 42 | describeDecoder "dict string" 43 | (AWS.Decode.dict JD.string) 44 | [ ( """{}""", DecodesTo Dict.empty ) 45 | , ( """{ "foo": "bar", "baz": "car" }""" 46 | , DecodesTo (Dict.fromList [ ( "foo", "bar" ), ( "baz", "car" ) ]) 47 | ) 48 | , ( """[]""", DecodesTo Dict.empty ) 49 | , ( """[ 50 | { "Name": "foo", "Value": "bar" }, 51 | { "Name": "baz", "Value": "car" } 52 | ]""" 53 | , DecodesTo (Dict.fromList [ ( "foo", "bar" ), ( "baz", "car" ) ]) 54 | ) 55 | ] 56 | 57 | 58 | compositionTests : Test 59 | compositionTests = 60 | describe "more complex decoders" 61 | [ describeDecoder "response wrapped getQueueAttributes decoder" 62 | (AWS.Decode.responseWrapperDecoder 63 | "GetQueueAttributes" 64 | (AWS.Decode.ResultDecoder 65 | "GetQueueAttributesResult" 66 | (JDP.decode GetQueueAttributesResult 67 | |> JDP.custom 68 | (AWS.Decode.optional 69 | [ "Attributes", "attributes" ] 70 | (AWS.Decode.dict JD.string) 71 | ) 72 | ) 73 | ) 74 | ) 75 | [ ( """{ 76 | "GetQueueAttributesResponse": { 77 | "GetQueueAttributesResult": { 78 | "Attributes": [ 79 | { 80 | "Name": "QueueArn", 81 | "Value": "arn:aws:sqs:us-east-1:1234567890:elm-test-queue" 82 | }, 83 | { 84 | "Name": "ApproximateNumberOfMessages", 85 | "Value": "0" 86 | }, 87 | { 88 | "Name": "ApproximateNumberOfMessagesNotVisible", 89 | "Value": "0" 90 | } 91 | ] 92 | }, 93 | "ResponseMetadata": { 94 | "RequestId": "some-id" 95 | } 96 | } 97 | }""" 98 | , DecodesTo 99 | (ResponseWrapper 100 | (Response 101 | (GetQueueAttributesResult 102 | (Just 103 | (Dict.fromList 104 | [ ( "QueueArn", "arn:aws:sqs:us-east-1:1234567890:elm-test-queue" ) 105 | , ( "ApproximateNumberOfMessages", "0" ) 106 | , ( "ApproximateNumberOfMessagesNotVisible", "0" ) 107 | ] 108 | ) 109 | ) 110 | ) 111 | (Metadata "some-id") 112 | ) 113 | ) 114 | ) 115 | ] 116 | ] 117 | -------------------------------------------------------------------------------- /tests/EncodeTests.elm: -------------------------------------------------------------------------------- 1 | module EncodeTests exposing (all) 2 | 3 | import AWS.Encode 4 | import Expect 5 | import Test exposing (Test, describe, test) 6 | 7 | 8 | all : Test 9 | all = 10 | describe "Encode.uri" 11 | [ test "handles utf8" <| 12 | \_ -> 13 | "ሴ" 14 | |> AWS.Encode.uri 15 | |> Expect.equal "%E1%88%B4" 16 | ] 17 | -------------------------------------------------------------------------------- /tests/EnumTests.elm: -------------------------------------------------------------------------------- 1 | module EnumTests exposing (toFloatTests, toStringTests) 2 | 3 | import AWS.Enum as Enum 4 | import AWS.Services.APIGateway exposing (CacheClusterSize(..), IntegrationType(..)) 5 | import Test exposing (Test, describe) 6 | import TestHelpers exposing (..) 7 | 8 | 9 | toStringTests : Test 10 | toStringTests = 11 | describe "toString" 12 | [ testResult Enum.toString IntegrationType_HTTP_PROXY <| 13 | ExpectOk "HTTP_PROXY" 14 | , testResult Enum.toString 3 <| 15 | ExpectAnyErr 16 | , testResult Enum.toString "FooBar_Car" <| 17 | ExpectAnyErr 18 | ] 19 | 20 | 21 | toFloatTests : Test 22 | toFloatTests = 23 | describe "toFloat" 24 | [ testResult Enum.toFloat IntegrationType_HTTP_PROXY <| 25 | ExpectAnyErr 26 | , testResult Enum.toFloat CacheClusterSize_0_5 <| 27 | ExpectOk 0.5 28 | , testResult Enum.toFloat 5.5 <| 29 | ExpectAnyErr 30 | ] 31 | -------------------------------------------------------------------------------- /tests/HttpTests.elm: -------------------------------------------------------------------------------- 1 | module HttpTests exposing (queryStringTests) 2 | 3 | import AWS.Http exposing (..) 4 | import Expect 5 | import Test exposing (Test, describe, test) 6 | 7 | 8 | queryStringTests : Test 9 | queryStringTests = 10 | describe "queryString" 11 | [ test "An empty list produces an empty string" <| 12 | \_ -> 13 | [] 14 | |> queryString 15 | |> Expect.equal "" 16 | , test "When query params are present they are prefixed with ?" <| 17 | \_ -> 18 | [ ( "key", "value" ) ] 19 | |> queryString 20 | |> Expect.equal "?key=value" 21 | , test "Multiple args are separated with &" <| 22 | \_ -> 23 | [ ( "key0", "value0" ), ( "key1", "value1" ) ] 24 | |> queryString 25 | |> Expect.equal "?key0=value0&key1=value1" 26 | , test "Keys and values are uri encoded" <| 27 | \_ -> 28 | [ ( "key with spaces", "=&" ) ] 29 | |> queryString 30 | |> Expect.equal "?key%20with%20spaces=%3D%26" 31 | ] 32 | -------------------------------------------------------------------------------- /tests/TestHelpers.elm: -------------------------------------------------------------------------------- 1 | module TestHelpers exposing (..) 2 | 3 | import Expect exposing (..) 4 | import Regex exposing (regex, Regex) 5 | import Test exposing (..) 6 | 7 | 8 | type ExpectResult a 9 | = ExpectOk a 10 | | ExpectAnyErr 11 | 12 | 13 | describeResulter : 14 | String 15 | -> (c -> Result a b) 16 | -> List ( c, ExpectResult b ) 17 | -> Test 18 | describeResulter label func testCases = 19 | testCases 20 | |> List.map 21 | (\( input, er ) -> testResult func input er) 22 | |> describe label 23 | 24 | 25 | testResult : (c -> Result a b) -> c -> ExpectResult b -> Test 26 | testResult func input er = 27 | test (toString input) <| 28 | \_ -> 29 | resultExpectation (func input) er 30 | 31 | 32 | resultExpectation : Result a b -> ExpectResult b -> Expectation 33 | resultExpectation r er = 34 | case ( r, er ) of 35 | ( Ok actual, ExpectOk expected ) -> 36 | Expect.equal actual expected 37 | 38 | ( Err _, ExpectAnyErr ) -> 39 | Expect.pass 40 | 41 | ( Ok _, ExpectAnyErr ) -> 42 | "Expected a failure result but got: " ++ (toString r) |> Expect.fail 43 | 44 | ( Err err, ExpectOk expected ) -> 45 | "Expected (Ok " 46 | ++ (toString expected) 47 | ++ ") but got: " 48 | ++ (toString err) 49 | |> Expect.fail 50 | 51 | 52 | expectMatches : String -> String -> Expectation 53 | expectMatches pattern string = 54 | string 55 | |> Regex.contains (regex pattern) 56 | |> Expect.true 57 | ("Expected string '" 58 | ++ string 59 | ++ "' to match Regex /" 60 | ++ pattern 61 | ++ "/" 62 | ) 63 | -------------------------------------------------------------------------------- /tests/elm-package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0.0", 3 | "summary": "Sample Elm Test", 4 | "repository": "https://github.com/ktonon/aws-sdk-elm.git", 5 | "license": "BSD-3-Clause", 6 | "source-directories": [ 7 | ".", 8 | "../src" 9 | ], 10 | "exposed-modules": [], 11 | "dependencies": { 12 | "Bogdanp/elm-querystring": "1.0.0 <= v < 2.0.0", 13 | "NoRedInk/elm-decode-pipeline": "3.0.0 <= v < 4.0.0", 14 | "elm-community/elm-test": "4.0.0 <= v < 5.0.0", 15 | "elm-community/json-extra": "2.1.0 <= v < 3.0.0", 16 | "elm-lang/core": "5.0.0 <= v < 6.0.0", 17 | "elm-lang/http": "1.0.0 <= v < 2.0.0", 18 | "justinmimbs/elm-date-extra": "2.0.3 <= v < 3.0.0", 19 | "ktonon/elm-crypto": "1.1.0 <= v < 2.0.0", 20 | "ktonon/elm-test-extra": "1.4.0 <= v < 2.0.0", 21 | "ktonon/elm-word": "2.0.0 <= v < 3.0.0", 22 | "mgold/elm-random-pcg": "4.0.2 <= v < 5.0.0" 23 | }, 24 | "elm-version": "0.18.0 <= v < 0.19.0" 25 | } 26 | --------------------------------------------------------------------------------