@suss/contract-appsync 0.33.1 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,17 +1,17 @@
1
1
  # @suss/contract-appsync
2
2
 
3
- Part of [suss](https://github.com/nimbuscloud-ai/suss), which reads both sides of every call in a repository and says where the two disagree.
3
+ Part of [suss](https://github.com/nimbuscloud-ai/suss), which reads both sides of every call in a repository and reports where the two disagree.
4
4
 
5
- Generate suss `BehavioralSummary[]` from an [AWS AppSync](https://docs.aws.amazon.com/appsync/) API declared in a CloudFormation or [SAM](https://aws.amazon.com/serverless/sam/) template. AppSync is schema-first: the SDL is authored by hand and the template binds each `(TypeName, FieldName)` pair to a data source. This reader turns that wiring into resolver summaries you can check consumers against, without deploying the stack or exporting anything from AWS.
5
+ This package builds suss `BehavioralSummary[]` from an [AWS AppSync](https://docs.aws.amazon.com/appsync/) API declared in a CloudFormation or [SAM](https://aws.amazon.com/serverless/sam/) template. AppSync is schema-first: you write the SDL by hand, and the template binds each `(TypeName, FieldName)` pair to a data source. This reader turns that wiring into resolver summaries you can check consumers against, without deploying the stack or exporting anything from AWS.
6
6
 
7
7
  ## What this package reads
8
8
 
9
- `@suss/contract-appsync` walks the template's `Resources` map and covers both ways an AppSync API gets written:
9
+ `@suss/contract-appsync` walks the template's `Resources` map, and covers both ways of writing an AppSync API:
10
10
 
11
- - **Raw resources**: `AWS::AppSync::GraphQLApi`, `AWS::AppSync::GraphQLSchema`, `AWS::AppSync::Resolver`, `AWS::AppSync::FunctionConfiguration`, and `AWS::AppSync::DataSource`.
12
- - **The SAM shorthand** `AWS::Serverless::GraphQLApi`, whose inline `SchemaInline` / `SchemaUri`, `DataSources`, `Functions`, and `Resolvers` blocks are normalized into the same model before any summary is built. Synthesized logical ids are prefixed with the API's logical id, so two GraphQL APIs in one template stay apart.
11
+ - **Raw resources**: `AWS::AppSync::GraphQLApi`, `AWS::AppSync::GraphQLSchema`, `AWS::AppSync::Resolver`, `AWS::AppSync::FunctionConfiguration` and `AWS::AppSync::DataSource`.
12
+ - **The SAM shorthand** `AWS::Serverless::GraphQLApi`. Its inline `SchemaInline` / `SchemaUri`, `DataSources`, `Functions` and `Resolvers` blocks are converted into the same model before any summary is built. Generated logical ids are prefixed with the API's logical id, so two GraphQL APIs in one template stay apart.
13
13
 
14
- The SDL comes from the inline `Definition` / `SchemaInline` property, or from a local file when `DefinitionS3Location` / `SchemaUri` is a path (resolved against the template's directory). An `s3://` or `http(s)://` URI cannot be fetched by a static reader, and neither can a location the template computes through an intrinsic. Both cases are recorded under `metadata.appsync.schemaSource` with a `status` of `"unresolved"` and a reason, so a schema the reader could not open is never silent.
14
+ The SDL comes from the inline `Definition` / `SchemaInline` property, or from a local file when `DefinitionS3Location` / `SchemaUri` is a path, resolved against the template's directory. A static reader cannot fetch an `s3://` or `http(s)://` URI, or a location the template computes with an intrinsic. Both cases are recorded under `metadata.appsync.schemaSource` with a `status` of `"unresolved"` and a reason, so a schema the reader could not open is always reported.
15
15
 
16
16
  ## What it produces
17
17
 
@@ -19,23 +19,23 @@ One `resolver`-kind summary per resolver, plus one `library`-kind summary per AP
19
19
 
20
20
  Each resolver summary has:
21
21
 
22
- - `identity.name`: `Type.field`, and a `graphql-resolver` boundary binding with `transport: "aws-https"`, `recognition: "appsync"`, plus the type and field names. That pairs against resolvers the Apollo and NestJS packs extract from code, and against clients that cross the same field.
22
+ - `identity.name`: `Type.field`, and a `graphql-resolver` boundary binding with `transport: "aws-https"`, `recognition: "appsync"`, and the type and field names. It pairs with resolvers that the Apollo and NestJS packs extract from code, and with clients that use the same field.
23
23
  - Inputs from the SDL field's arguments, each with `role: "args"` and the argument's type converted to a suss `TypeShape`.
24
- - Two transitions: a default success returning the field's declared shape, and a generic throw for the GraphQL `errors[]` path.
25
- - `metadata.appsync`: the API's logical id and name, the data source's logical id, the Lambda function behind that data source, the resolver kind (`UNIT` or `PIPELINE`), the authentication type, the `CodeUri` and runtime for SAM resolvers written as JS or VTL, whether the schema declared the field (`schemaMatched`), and, for pipeline resolvers, the ordered function chain with each step's own data source and Lambda.
24
+ - Two transitions: a default success that returns the field's declared shape, and a generic throw for the GraphQL `errors[]` path.
25
+ - `metadata.appsync`: the API's logical id and name, the data source's logical id, the Lambda function behind that data source, the resolver kind (`UNIT` or `PIPELINE`), and the authentication type. For SAM resolvers written as JS or VTL it also has the `CodeUri` and runtime. It records whether the schema declared the field (`schemaMatched`), and for pipeline resolvers, the ordered chain of functions, with each step's own data source and Lambda.
26
26
 
27
- A resolver whose field the SDL never declares still gets a summary. AppSync rejects that stack at deploy time, and reporting the boundary is more useful than dropping it. Its success transition returns `unknown` and `schemaMatched` is `false`.
27
+ A resolver whose field the SDL never declares still gets a summary. AppSync rejects that stack at deploy time, so reporting the boundary helps more than dropping it. Its success transition returns `unknown`, and `schemaMatched` is `false`.
28
28
 
29
- The `library` summary is where the SDL itself goes. Type definitions belong to the schema rather than to any one field, so each resolver points at that document through a source-document label, and the checker follows the label to resolve a consumer's nested selections against the resolver's return type. It binds to no boundary, so pairing records it as taking no part.
29
+ The `library` summary contains the SDL itself. Type definitions belong to the schema as a whole, so each resolver points at that document through a source-document label. The checker follows the label to resolve a consumer's nested selections against the resolver's return type. The `library` summary does not bind to a boundary, so pairing records it as taking no part.
30
30
 
31
- Data source types are normalized from `AWS_LAMBDA`, `AMAZON_DYNAMODB`, `AMAZON_ELASTICSEARCH`, `AMAZON_OPENSEARCH_SERVICE`, `HTTP`, `RELATIONAL_DATABASE`, `AMAZON_EVENTBRIDGE`, and `NONE`. Anything else comes back as `"unknown"`.
31
+ Data source types are normalized from `AWS_LAMBDA`, `AMAZON_DYNAMODB`, `AMAZON_ELASTICSEARCH`, `AMAZON_OPENSEARCH_SERVICE`, `HTTP`, `RELATIONAL_DATABASE`, `AMAZON_EVENTBRIDGE` and `NONE`. Anything else comes back as `"unknown"`.
32
32
 
33
33
  ## What it does not read
34
34
 
35
- - **Resolver code.** A SAM resolver's `CodeUri` and runtime are recorded, and the file behind them is never opened. VTL request and response mapping templates on raw `AWS::AppSync::Resolver` resources are ignored.
36
- - **Dynamic intrinsics.** A resolver whose `TypeName` or `FieldName` comes from a `!Ref` or an `Fn::Join` is skipped rather than guessed at. A pipeline whose `Functions` array cannot be resolved statically still reports `kind: "PIPELINE"` with an empty chain.
35
+ - **Resolver code.** A SAM resolver's `CodeUri` and runtime are recorded, but the file behind them is never opened. VTL request and response mapping templates on raw `AWS::AppSync::Resolver` resources are ignored.
36
+ - **Dynamic intrinsics.** A resolver whose `TypeName` or `FieldName` comes from a `!Ref` or an `Fn::Join` is skipped, so the reader never guesses. A pipeline whose `Functions` array cannot be resolved statically still reports `kind: "PIPELINE"`, with an empty chain.
37
37
  - **Remote schemas.** Nothing is fetched over the network.
38
- - **Authorization.** The API's `AuthenticationType` is recorded on each resolver and does not become extra transitions.
38
+ - **Authorization.** The API's `AuthenticationType` is recorded on each resolver, and does not add transitions.
39
39
  - **Nested stacks.** Only the template you point at is walked.
40
40
 
41
41
  ## Worked example
@@ -67,9 +67,9 @@ Resources:
67
67
  suss contract --from appsync template.yaml -o summaries/appsync.json
68
68
  ```
69
69
 
70
- That gives a `Query.order` resolver summary with one `id` input of type `ID`, a success transition returning a `ref` to `Order`, and the SDL under the API's schema document summary.
70
+ That produces a `Query.order` resolver summary with one `id` input of type `ID` and a success transition that returns a `ref` to `Order`. The SDL goes in the API's schema document summary.
71
71
 
72
- Or programmatically, when you already have the template in memory (a CDK `Template.fromStack`, JSON from a build tool):
72
+ If you already have the template in memory, such as a CDK `Template.fromStack` or JSON from a build tool, call it from code:
73
73
 
74
74
  ```ts
75
75
  import { appsyncToSummaries } from "@suss/contract-appsync";
@@ -79,7 +79,7 @@ const summaries = appsyncToSummaries(template, { baseDir: "infra" });
79
79
 
80
80
  ## Where it fits in suss
81
81
 
82
- Depends on `@suss/behavioral-ir` (for the IR types it produces), `@suss/contract-graphql` (for SDL parsing, the type conversion, and loading an external schema file), `@suss/manifest-aws` (for template loading, including CloudFormation YAML intrinsic shorthand), and `graphql`. It does not extract from source code and is independent of the language adapters.
82
+ The package depends on `@suss/behavioral-ir` for the IR types it produces, `@suss/contract-graphql` for SDL parsing, type conversion and loading an external schema file, `@suss/manifest-aws` for loading templates (including CloudFormation's YAML shorthand for intrinsics), and `graphql`. It does not extract from source code and does not use the language adapters.
83
83
 
84
84
  ## More
85
85
 
package/dist/index.cjs CHANGED
@@ -393,8 +393,8 @@ function parseSchema(sdl) {
393
393
  return index;
394
394
  }
395
395
  for (const def of doc.definitions) {
396
- if (def.kind !== import_graphql.Kind.OBJECT_TYPE_DEFINITION && def.kind !== import_graphql.Kind.OBJECT_TYPE_EXTENSION && def.kind !== import_graphql.Kind.INTERFACE_TYPE_DEFINITION && // A schema splits an interface the same way it splits a type, so
397
- // wherever an interface counts, so does an extension of one.
396
+ if (def.kind !== import_graphql.Kind.OBJECT_TYPE_DEFINITION && def.kind !== import_graphql.Kind.OBJECT_TYPE_EXTENSION && def.kind !== import_graphql.Kind.INTERFACE_TYPE_DEFINITION && // `extend interface` splits an interface the same way `extend type`
397
+ // splits a type.
398
398
  def.kind !== import_graphql.Kind.INTERFACE_TYPE_EXTENSION) {
399
399
  continue;
400
400
  }
@@ -570,10 +570,7 @@ function buildOne(resolver, indexes, resolvedByApi, schemasByApi, sourceFile) {
570
570
  name: ownerKey,
571
571
  exportPath: null,
572
572
  boundaryBinding: (0, import_behavioral_ir.graphqlResolverBinding)({
573
- // AppSync is invoked over HTTPS-to-AWS. Keeping transport
574
- // explicit here matches the aws-apigateway reader's posture
575
- // and leaves room for a future AWS-SDK-direct transport
576
- // ("aws-sdk") once Lambda-invoke semantics land.
573
+ // Clients reach AppSync over HTTPS to an AWS endpoint.
577
574
  transport: "aws-https",
578
575
  recognition: "appsync",
579
576
  typeName: resolver.typeName,
@@ -611,28 +608,22 @@ function buildAppsyncMetadata(resolver, api, resolved, field, indexes) {
611
608
  apiLogicalId: resolver.apiLogicalId,
612
609
  apiName: api?.name ?? null,
613
610
  dataSourceLogicalId: resolver.dataSourceLogicalId,
614
- // Lambda behind this resolver's own data source (UNIT resolvers).
615
- // PIPELINE resolvers attribute per-function below; their top-level
616
- // data source is null, so this is null too.
611
+ // Only a UNIT resolver has its own data source. A pipeline records
612
+ // the Lambda behind each of its functions instead.
617
613
  lambdaFunctionLogicalId: lambdaBehind(
618
614
  resolver.dataSourceLogicalId,
619
615
  indexes
620
616
  ),
621
617
  kind: resolver.kind,
622
618
  authenticationType: api?.authenticationType ?? null,
623
- // SAM JS/VTL resolver code location + runtime (null for raw
624
- // AWS::AppSync::Resolver resources).
625
619
  codeUri: resolver.codeUri,
626
620
  runtime: resolver.runtime,
627
- // Distinguish "schema said X" from "we didn't see a schema at all"
628
- // (field-level), and record how the SDL itself was obtained
629
- // (source-level) so a genuinely-remote schema is never silent.
621
+ // Keeps a field the SDL does not declare apart from a schema that was
622
+ // never read, such as a remote one.
630
623
  schemaMatched: field !== null,
631
624
  schemaSource: schemaSourceMetadata(resolved),
632
- // For PIPELINE resolvers, surface the ordered function chain so
633
- // downstream tools can show the dispatch path. Empty for UNIT
634
- // resolvers; empty with `kind: "PIPELINE"` means the Functions
635
- // array was dynamically-referenced and we couldn't resolve it.
625
+ // Left out for a UNIT resolver, and for a pipeline whose Functions
626
+ // list cannot be read statically.
636
627
  ...pipelineFunctions.length > 0 ? { pipelineFunctions } : {}
637
628
  };
638
629
  }
package/dist/index.d.cts CHANGED
@@ -1,5 +1,13 @@
1
1
  import { BehavioralSummary } from '@suss/behavioral-ir';
2
2
 
3
+ /**
4
+ * Reads the raw AWS::AppSync resources in a template and adds what the
5
+ * SAM AWS::Serverless::GraphQLApi reader finds, so both ways of writing
6
+ * an API reach the summary builder as one model.
7
+ *
8
+ * A value written with a dynamic intrinsic, such as `!Ref` to a
9
+ * parameter, is left unresolved and reported. The reader never guesses it.
10
+ */
3
11
  interface CfnTemplate {
4
12
  Resources?: Record<string, CfnResource | undefined>;
5
13
  }
@@ -8,27 +16,33 @@ interface CfnResource {
8
16
  Properties?: Record<string, unknown>;
9
17
  }
10
18
 
19
+ /**
20
+ * Reads an AWS AppSync API from a CloudFormation or SAM template and
21
+ * writes one resolver summary per resolver. Each is keyed by type and
22
+ * field name, the same way as a resolver found in code, so the two pair
23
+ * directly. The Lambda behind each data source is recorded so the
24
+ * summary can later be matched to handler code.
25
+ *
26
+ * The README lists the resources and schema sources this reads.
27
+ */
28
+
11
29
  interface AppsyncToSummariesOptions {
12
- /** Logical source path recorded on each summary's `location.file`. */
30
+ /** Path recorded on each summary's `location.file`. */
13
31
  source?: string;
14
32
  /**
15
- * Directory used to resolve relative external schema paths
16
- * (`DefinitionS3Location` / `SchemaUri`). `appsyncFileToSummaries`
17
- * sets this to the template's directory; in-memory callers pass it
18
- * when their schema references are relative.
33
+ * The directory a relative `DefinitionS3Location` or `SchemaUri`
34
+ * resolves against. `appsyncFileToSummaries` sets it to the template's.
19
35
  */
20
36
  baseDir?: string;
21
37
  }
22
38
  /**
23
- * Convert an already-parsed CloudFormation / SAM template to AppSync
24
- * resolver summaries. Call this when the caller has a template object in
25
- * memory (CDK `Template.fromStack`, JSON from a build tool, etc.).
39
+ * Converts a template already in memory, such as a CDK
40
+ * `Template.fromStack` result, to AppSync resolver summaries.
26
41
  */
27
42
  declare function appsyncToSummaries(template: CfnTemplate, options?: AppsyncToSummariesOptions): BehavioralSummary[];
28
43
  /**
29
- * Read a CloudFormation / SAM template from disk and emit resolver
30
- * summaries. Accepts JSON and YAML (SAM / CDK-synth shapes). Relative
31
- * external schema paths resolve against the template's directory.
44
+ * Reads a CloudFormation or SAM template, in JSON or YAML, and converts
45
+ * it. A relative schema path resolves against the template's directory.
32
46
  */
33
47
  declare function appsyncFileToSummaries(filePath: string, options?: AppsyncToSummariesOptions): BehavioralSummary[];
34
48
 
package/dist/index.d.ts CHANGED
@@ -1,5 +1,13 @@
1
1
  import { BehavioralSummary } from '@suss/behavioral-ir';
2
2
 
3
+ /**
4
+ * Reads the raw AWS::AppSync resources in a template and adds what the
5
+ * SAM AWS::Serverless::GraphQLApi reader finds, so both ways of writing
6
+ * an API reach the summary builder as one model.
7
+ *
8
+ * A value written with a dynamic intrinsic, such as `!Ref` to a
9
+ * parameter, is left unresolved and reported. The reader never guesses it.
10
+ */
3
11
  interface CfnTemplate {
4
12
  Resources?: Record<string, CfnResource | undefined>;
5
13
  }
@@ -8,27 +16,33 @@ interface CfnResource {
8
16
  Properties?: Record<string, unknown>;
9
17
  }
10
18
 
19
+ /**
20
+ * Reads an AWS AppSync API from a CloudFormation or SAM template and
21
+ * writes one resolver summary per resolver. Each is keyed by type and
22
+ * field name, the same way as a resolver found in code, so the two pair
23
+ * directly. The Lambda behind each data source is recorded so the
24
+ * summary can later be matched to handler code.
25
+ *
26
+ * The README lists the resources and schema sources this reads.
27
+ */
28
+
11
29
  interface AppsyncToSummariesOptions {
12
- /** Logical source path recorded on each summary's `location.file`. */
30
+ /** Path recorded on each summary's `location.file`. */
13
31
  source?: string;
14
32
  /**
15
- * Directory used to resolve relative external schema paths
16
- * (`DefinitionS3Location` / `SchemaUri`). `appsyncFileToSummaries`
17
- * sets this to the template's directory; in-memory callers pass it
18
- * when their schema references are relative.
33
+ * The directory a relative `DefinitionS3Location` or `SchemaUri`
34
+ * resolves against. `appsyncFileToSummaries` sets it to the template's.
19
35
  */
20
36
  baseDir?: string;
21
37
  }
22
38
  /**
23
- * Convert an already-parsed CloudFormation / SAM template to AppSync
24
- * resolver summaries. Call this when the caller has a template object in
25
- * memory (CDK `Template.fromStack`, JSON from a build tool, etc.).
39
+ * Converts a template already in memory, such as a CDK
40
+ * `Template.fromStack` result, to AppSync resolver summaries.
26
41
  */
27
42
  declare function appsyncToSummaries(template: CfnTemplate, options?: AppsyncToSummariesOptions): BehavioralSummary[];
28
43
  /**
29
- * Read a CloudFormation / SAM template from disk and emit resolver
30
- * summaries. Accepts JSON and YAML (SAM / CDK-synth shapes). Relative
31
- * external schema paths resolve against the template's directory.
44
+ * Reads a CloudFormation or SAM template, in JSON or YAML, and converts
45
+ * it. A relative schema path resolves against the template's directory.
32
46
  */
33
47
  declare function appsyncFileToSummaries(filePath: string, options?: AppsyncToSummariesOptions): BehavioralSummary[];
34
48
 
package/dist/index.js CHANGED
@@ -361,8 +361,8 @@ function parseSchema(sdl) {
361
361
  return index;
362
362
  }
363
363
  for (const def of doc.definitions) {
364
- if (def.kind !== Kind.OBJECT_TYPE_DEFINITION && def.kind !== Kind.OBJECT_TYPE_EXTENSION && def.kind !== Kind.INTERFACE_TYPE_DEFINITION && // A schema splits an interface the same way it splits a type, so
365
- // wherever an interface counts, so does an extension of one.
364
+ if (def.kind !== Kind.OBJECT_TYPE_DEFINITION && def.kind !== Kind.OBJECT_TYPE_EXTENSION && def.kind !== Kind.INTERFACE_TYPE_DEFINITION && // `extend interface` splits an interface the same way `extend type`
365
+ // splits a type.
366
366
  def.kind !== Kind.INTERFACE_TYPE_EXTENSION) {
367
367
  continue;
368
368
  }
@@ -543,10 +543,7 @@ function buildOne(resolver, indexes, resolvedByApi, schemasByApi, sourceFile) {
543
543
  name: ownerKey,
544
544
  exportPath: null,
545
545
  boundaryBinding: graphqlResolverBinding({
546
- // AppSync is invoked over HTTPS-to-AWS. Keeping transport
547
- // explicit here matches the aws-apigateway reader's posture
548
- // and leaves room for a future AWS-SDK-direct transport
549
- // ("aws-sdk") once Lambda-invoke semantics land.
546
+ // Clients reach AppSync over HTTPS to an AWS endpoint.
550
547
  transport: "aws-https",
551
548
  recognition: "appsync",
552
549
  typeName: resolver.typeName,
@@ -584,28 +581,22 @@ function buildAppsyncMetadata(resolver, api, resolved, field, indexes) {
584
581
  apiLogicalId: resolver.apiLogicalId,
585
582
  apiName: api?.name ?? null,
586
583
  dataSourceLogicalId: resolver.dataSourceLogicalId,
587
- // Lambda behind this resolver's own data source (UNIT resolvers).
588
- // PIPELINE resolvers attribute per-function below; their top-level
589
- // data source is null, so this is null too.
584
+ // Only a UNIT resolver has its own data source. A pipeline records
585
+ // the Lambda behind each of its functions instead.
590
586
  lambdaFunctionLogicalId: lambdaBehind(
591
587
  resolver.dataSourceLogicalId,
592
588
  indexes
593
589
  ),
594
590
  kind: resolver.kind,
595
591
  authenticationType: api?.authenticationType ?? null,
596
- // SAM JS/VTL resolver code location + runtime (null for raw
597
- // AWS::AppSync::Resolver resources).
598
592
  codeUri: resolver.codeUri,
599
593
  runtime: resolver.runtime,
600
- // Distinguish "schema said X" from "we didn't see a schema at all"
601
- // (field-level), and record how the SDL itself was obtained
602
- // (source-level) so a genuinely-remote schema is never silent.
594
+ // Keeps a field the SDL does not declare apart from a schema that was
595
+ // never read, such as a remote one.
603
596
  schemaMatched: field !== null,
604
597
  schemaSource: schemaSourceMetadata(resolved),
605
- // For PIPELINE resolvers, surface the ordered function chain so
606
- // downstream tools can show the dispatch path. Empty for UNIT
607
- // resolvers; empty with `kind: "PIPELINE"` means the Functions
608
- // array was dynamically-referenced and we couldn't resolve it.
598
+ // Left out for a UNIT resolver, and for a pipeline whose Functions
599
+ // list cannot be read statically.
609
600
  ...pipelineFunctions.length > 0 ? { pipelineFunctions } : {}
610
601
  };
611
602
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@suss/contract-appsync",
3
- "version": "0.33.1",
3
+ "version": "0.34.0",
4
4
  "type": "module",
5
5
  "description": "Turn the AppSync API in a CloudFormation or SAM template into a suss contract and check it against the resolvers and clients on either side of it.",
6
6
  "keywords": [
@@ -15,7 +15,7 @@
15
15
  ],
16
16
  "license": "Apache-2.0",
17
17
  "author": "Nimbus Cloud AI LLC",
18
- "homepage": "https://github.com/nimbuscloud-ai/suss/tree/main/packages/contract/appsync#readme",
18
+ "homepage": "https://suss.sh",
19
19
  "repository": {
20
20
  "type": "git",
21
21
  "url": "git+https://github.com/nimbuscloud-ai/suss.git",
@@ -48,9 +48,9 @@
48
48
  "typecheck": "tsc --noEmit"
49
49
  },
50
50
  "dependencies": {
51
- "@suss/behavioral-ir": "0.33.1",
52
- "@suss/contract-graphql": "0.33.1",
53
- "@suss/manifest-aws": "0.33.1",
51
+ "@suss/behavioral-ir": "0.34.0",
52
+ "@suss/contract-graphql": "0.34.0",
53
+ "@suss/manifest-aws": "0.34.0",
54
54
  "graphql": "^16.8.0"
55
55
  },
56
56
  "devDependencies": {