diff --git a/packages/appsync-modelgen-plugin/schemas/introspection/1/ModelIntrospectionSchema.json b/packages/appsync-modelgen-plugin/schemas/introspection/1/ModelIntrospectionSchema.json index d92926be2..bf7722f33 100644 --- a/packages/appsync-modelgen-plugin/schemas/introspection/1/ModelIntrospectionSchema.json +++ b/packages/appsync-modelgen-plugin/schemas/introspection/1/ModelIntrospectionSchema.json @@ -26,6 +26,9 @@ }, "inputs": { "$ref": "#/definitions/SchemaInputs" + }, + "generations": { + "$ref": "#/definitions/SchemaQueries" } }, "required": [ diff --git a/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-model-introspection-visitor.test.ts.snap b/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-model-introspection-visitor.test.ts.snap index 9b7dc4dfb..752fb2336 100644 --- a/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-model-introspection-visitor.test.ts.snap +++ b/packages/appsync-modelgen-plugin/src/__tests__/visitors/__snapshots__/appsync-model-introspection-visitor.test.ts.snap @@ -1976,6 +1976,75 @@ exports[`Custom queries/mutations/subscriptions & input type tests should genera }" `; +exports[`Generation Route Introspection Visitor Metadata snapshot should generate correct model intropection file validated by JSON schema 1`] = ` +"{ + \\"version\\": 1, + \\"models\\": {}, + \\"enums\\": {}, + \\"nonModels\\": { + \\"Recipe\\": { + \\"name\\": \\"Recipe\\", + \\"fields\\": { + \\"name\\": { + \\"name\\": \\"name\\", + \\"isArray\\": false, + \\"type\\": \\"String\\", + \\"isRequired\\": false, + \\"attributes\\": [] + }, + \\"ingredients\\": { + \\"name\\": \\"ingredients\\", + \\"isArray\\": true, + \\"type\\": \\"String\\", + \\"isRequired\\": false, + \\"attributes\\": [], + \\"isArrayNullable\\": true + }, + \\"instructions\\": { + \\"name\\": \\"instructions\\", + \\"isArray\\": false, + \\"type\\": \\"String\\", + \\"isRequired\\": false, + \\"attributes\\": [] + } + } + } + }, + \\"generations\\": { + \\"generateRecipe\\": { + \\"name\\": \\"generateRecipe\\", + \\"isArray\\": false, + \\"type\\": { + \\"nonModel\\": \\"Recipe\\" + }, + \\"isRequired\\": false, + \\"arguments\\": { + \\"description\\": { + \\"name\\": \\"description\\", + \\"isArray\\": false, + \\"type\\": \\"String\\", + \\"isRequired\\": false + } + } + }, + \\"summarize\\": { + \\"name\\": \\"summarize\\", + \\"isArray\\": false, + \\"type\\": \\"String\\", + \\"isRequired\\": false, + \\"arguments\\": { + \\"text\\": { + \\"name\\": \\"text\\", + \\"isArray\\": false, + \\"type\\": \\"String\\", + \\"isRequired\\": false + } + } + } + } +}" +`; + exports[`Model Introspection Visitor Metadata snapshot should generate correct model intropection file validated by JSON schema 1`] = ` "{ \\"version\\": 1, diff --git a/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-model-introspection-visitor.test.ts b/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-model-introspection-visitor.test.ts index 49be70b1f..62cdedc60 100644 --- a/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-model-introspection-visitor.test.ts +++ b/packages/appsync-modelgen-plugin/src/__tests__/visitors/appsync-model-introspection-visitor.test.ts @@ -1,6 +1,6 @@ import { buildSchema, GraphQLSchema, parse, visit } from 'graphql'; import { METADATA_SCALAR_MAP } from '../../scalars'; -import { AppSyncDirectives, DefaultDirectives, V1Directives, DeprecatedDirective, Directive } from '@aws-amplify/graphql-directives'; +import { AppSyncDirectives, DefaultDirectives, V1Directives, DeprecatedDirective, Directive, V2Directives } from '@aws-amplify/graphql-directives'; import { scalars } from '../../scalars/supported-scalars'; import { AppSyncModelIntrospectionVisitor } from '../../visitors/appsync-model-introspection-visitor'; @@ -806,3 +806,45 @@ describe('custom references', () => { .toThrowError(`Error processing @belongsTo directive on SqlRelated.primary. @hasOne or @hasMany directive with references ["primaryId"] was not found in connected model SqlPrimary`); }); }); + +describe('Generation Route Introspection Visitor', () => { + const schema = /* GraphQL */ ` + type Recipe { + name: String + ingredients: [String] + instructions: String + } + + type Query { + generateRecipe(description: String): Recipe + @generation(aiModel: "anthropic.claude-3-haiku-20240307-v1:0", systemPrompt: "You are a recipe generator.") + + summarize(text: String): String + @generation(aiModel: "anthropic.claude-3-haiku-20240307-v1:0", systemPrompt: "You are a text summarizer.") + } + `; + + const generationDirective: Directive = { + name: 'generation', + definition: /* GraphQL */ ` + directive @generation( + aiModel: String! + systemPrompt: String! + inferenceConfiguration: GenerationInferenceConfiguration + ) on FIELD_DEFINITION + + input GenerationInferenceConfiguration { + maxTokens: Int + temperature: Float + topP: Float + } + `, + defaults: {}, + } + const visitor: AppSyncModelIntrospectionVisitor = getVisitor(schema, {}, [...V2Directives, generationDirective]); + describe('Metadata snapshot', () => { + it('should generate correct model intropection file validated by JSON schema', () => { + expect(visitor.generate()).toMatchSnapshot(); + }); + }); +}); \ No newline at end of file diff --git a/packages/appsync-modelgen-plugin/src/interfaces/introspection/model-schema.ts b/packages/appsync-modelgen-plugin/src/interfaces/introspection/model-schema.ts index 146e78b99..298b32ba4 100644 --- a/packages/appsync-modelgen-plugin/src/interfaces/introspection/model-schema.ts +++ b/packages/appsync-modelgen-plugin/src/interfaces/introspection/model-schema.ts @@ -19,6 +19,7 @@ mutations?: SchemaMutations; subscriptions?: SchemaSubscriptions; inputs?: SchemaInputs; + generations?: SchemaQueries; }; /** * Top-level Entities on a Schema diff --git a/packages/appsync-modelgen-plugin/src/utils/constants.ts b/packages/appsync-modelgen-plugin/src/utils/constants.ts index 3fe0033e6..f757feef8 100644 --- a/packages/appsync-modelgen-plugin/src/utils/constants.ts +++ b/packages/appsync-modelgen-plugin/src/utils/constants.ts @@ -8,6 +8,7 @@ export const TransformerV2DirectiveName = { INDEX: 'index', DEFAULT: 'default', SEARCHABLE: 'searchable', + GENERATION: 'generation', }; export const DEFAULT_HASH_KEY_FIELD = 'id'; export const DEFAULT_CREATED_TIME = 'createdAt'; diff --git a/packages/appsync-modelgen-plugin/src/utils/fieldUtils.ts b/packages/appsync-modelgen-plugin/src/utils/fieldUtils.ts index 5a14e7f3d..8de358653 100644 --- a/packages/appsync-modelgen-plugin/src/utils/fieldUtils.ts +++ b/packages/appsync-modelgen-plugin/src/utils/fieldUtils.ts @@ -1,4 +1,4 @@ -import { CodeGenDirective, CodeGenField, CodeGenModel } from '../visitors/appsync-visitor'; +import { CodeGenDirective, CodeGenField, CodeGenModel, CodeGenQuery } from '../visitors/appsync-visitor'; import { TransformerV2DirectiveName } from './constants'; export function addFieldToModel(model: CodeGenModel, field: CodeGenField): void { @@ -40,4 +40,8 @@ export function getModelPrimaryKeyComponentFields(model: CodeGenModel): CodeGenF }; } return keyFields; +} + +export function containsGenerationDirective(queryField: CodeGenQuery): boolean { + return queryField.directives.some((directive) => directive.name === TransformerV2DirectiveName.GENERATION); } \ No newline at end of file diff --git a/packages/appsync-modelgen-plugin/src/validate-cjs.js b/packages/appsync-modelgen-plugin/src/validate-cjs.js index 4e47e2375..f9ee9cf90 100644 --- a/packages/appsync-modelgen-plugin/src/validate-cjs.js +++ b/packages/appsync-modelgen-plugin/src/validate-cjs.js @@ -1 +1 @@ -"use strict";module.exports = validate10;module.exports.default = validate10;const schema11 = {"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"version":{"type":"number","const":1},"models":{"$ref":"#/definitions/SchemaModels"},"nonModels":{"$ref":"#/definitions/SchemaNonModels"},"enums":{"$ref":"#/definitions/SchemaEnums"},"queries":{"$ref":"#/definitions/SchemaQueries"},"mutations":{"$ref":"#/definitions/SchemaMutations"},"subscriptions":{"$ref":"#/definitions/SchemaSubscriptions"},"inputs":{"$ref":"#/definitions/SchemaInputs"}},"required":["version","models","nonModels","enums"],"additionalProperties":false,"description":"Root Schema Representation","definitions":{"SchemaModels":{"$ref":"#/definitions/Record%3Cstring%2CSchemaModel%3E","description":"Top-level Entities on a Schema"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaModel"}},"SchemaModel":{"type":"object","properties":{"name":{"type":"string"},"attributes":{"type":"array","items":{"$ref":"#/definitions/ModelAttribute"}},"fields":{"$ref":"#/definitions/Fields"},"pluralName":{"type":"string"},"syncable":{"type":"boolean"},"primaryKeyInfo":{"$ref":"#/definitions/PrimaryKeyInfo"}},"required":["name","fields","pluralName","primaryKeyInfo"],"additionalProperties":false},"ModelAttribute":{"type":"object","properties":{"type":{"type":"string"},"properties":{"type":"object"}},"required":["type"],"additionalProperties":false},"Fields":{"$ref":"#/definitions/Record%3Cstring%2CField%3E","description":"Field Definition"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/Field"}},"Field":{"type":"object","properties":{"name":{"type":"string"},"type":{"$ref":"#/definitions/FieldType"},"isArray":{"type":"boolean"},"isRequired":{"type":"boolean"},"isReadOnly":{"type":"boolean"},"isArrayNullable":{"type":"boolean"},"attributes":{"type":"array","items":{"$ref":"#/definitions/FieldAttribute"}},"association":{"$ref":"#/definitions/AssociationType"},"arguments":{"$ref":"#/definitions/Arguments"}},"required":["name","type","isArray","isRequired"],"additionalProperties":false},"FieldType":{"anyOf":[{"$ref":"#/definitions/ScalarType"},{"type":"object","properties":{"enum":{"type":"string"}},"required":["enum"],"additionalProperties":false},{"type":"object","properties":{"model":{"type":"string"}},"required":["model"],"additionalProperties":false},{"type":"object","properties":{"nonModel":{"type":"string"}},"required":["nonModel"],"additionalProperties":false}]},"ScalarType":{"type":"string","enum":["ID","String","Int","Float","AWSDate","AWSTime","AWSDateTime","AWSTimestamp","AWSEmail","AWSURL","AWSIPAddress","Boolean","AWSJSON","AWSPhone"]},"FieldAttribute":{"$ref":"#/definitions/ModelAttribute"},"AssociationType":{"anyOf":[{"$ref":"#/definitions/AssociationHasMany"},{"$ref":"#/definitions/AssociationHasOne"},{"$ref":"#/definitions/AssociationBelongsTo"}]},"AssociationHasMany":{"type":"object","additionalProperties":false,"properties":{"connectionType":{"$ref":"#/definitions/CodeGenConnectionType"},"associatedWith":{"type":"array","items":{"type":"string"}}},"required":["associatedWith","connectionType"]},"CodeGenConnectionType":{"type":"string","enum":["HAS_ONE","BELONGS_TO","HAS_MANY"],"description":"Field-level Relationship Definitions"},"AssociationHasOne":{"type":"object","additionalProperties":false,"properties":{"connectionType":{"$ref":"#/definitions/CodeGenConnectionType"},"associatedWith":{"type":"array","items":{"type":"string"}},"targetNames":{"type":"array","items":{"type":"string"}}},"required":["associatedWith","connectionType","targetNames"]},"AssociationBelongsTo":{"type":"object","additionalProperties":false,"properties":{"connectionType":{"$ref":"#/definitions/CodeGenConnectionType"},"targetNames":{"type":"array","items":{"type":"string"}}},"required":["connectionType","targetNames"]},"Arguments":{"$ref":"#/definitions/Record%3Cstring%2CArgument%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/Argument"}},"Argument":{"type":"object","properties":{"name":{"type":"string"},"type":{"$ref":"#/definitions/InputFieldType"},"isArray":{"type":"boolean"},"isRequired":{"type":"boolean"},"isArrayNullable":{"type":"boolean"}},"required":["name","type","isArray","isRequired"],"additionalProperties":false},"InputFieldType":{"anyOf":[{"$ref":"#/definitions/ScalarType"},{"type":"object","properties":{"enum":{"type":"string"}},"required":["enum"],"additionalProperties":false},{"type":"object","properties":{"input":{"type":"string"}},"required":["input"],"additionalProperties":false}]},"PrimaryKeyInfo":{"type":"object","properties":{"isCustomPrimaryKey":{"type":"boolean"},"primaryKeyFieldName":{"type":"string"},"sortKeyFieldNames":{"type":"array","items":{"type":"string"}}},"required":["isCustomPrimaryKey","primaryKeyFieldName","sortKeyFieldNames"],"additionalProperties":false},"SchemaNonModels":{"$ref":"#/definitions/Record%3Cstring%2CSchemaNonModel%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaNonModel"}},"SchemaNonModel":{"type":"object","properties":{"name":{"type":"string"},"fields":{"$ref":"#/definitions/Fields"}},"required":["name","fields"],"additionalProperties":false},"SchemaEnums":{"$ref":"#/definitions/Record%3Cstring%2CSchemaEnum%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaEnum"}},"SchemaEnum":{"type":"object","properties":{"name":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}},"required":["name","values"],"additionalProperties":false},"SchemaQueries":{"$ref":"#/definitions/Record%3Cstring%2CSchemaQuery%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaQuery"}},"SchemaQuery":{"$ref":"#/definitions/Pick%3CField%2C(%22name%22%7C%22type%22%7C%22isArray%22%7C%22isRequired%22%7C%22isArrayNullable%22%7C%22arguments%22)%3E"},"Pick":{"type":"object","properties":{"name":{"type":"string"},"type":{"$ref":"#/definitions/FieldType"},"isArray":{"type":"boolean"},"isRequired":{"type":"boolean"},"isArrayNullable":{"type":"boolean"},"arguments":{"$ref":"#/definitions/Arguments"}},"required":["name","type","isArray","isRequired"],"additionalProperties":false},"SchemaMutations":{"$ref":"#/definitions/Record%3Cstring%2CSchemaMutation%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaMutation"}},"SchemaMutation":{"$ref":"#/definitions/SchemaQuery"},"SchemaSubscriptions":{"$ref":"#/definitions/Record%3Cstring%2CSchemaSubscription%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaSubscription"}},"SchemaSubscription":{"$ref":"#/definitions/SchemaQuery"},"SchemaInputs":{"$ref":"#/definitions/Record%3Cstring%2CInput%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/Input"}},"Input":{"type":"object","properties":{"name":{"type":"string"},"attributes":{"$ref":"#/definitions/Arguments"}},"required":["name","attributes"],"additionalProperties":false,"description":"Input Definition"}}};const schema12 = {"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaModel"}};const schema13 = {"type":"object","properties":{"name":{"type":"string"},"attributes":{"type":"array","items":{"$ref":"#/definitions/ModelAttribute"}},"fields":{"$ref":"#/definitions/Fields"},"pluralName":{"type":"string"},"syncable":{"type":"boolean"},"primaryKeyInfo":{"$ref":"#/definitions/PrimaryKeyInfo"}},"required":["name","fields","pluralName","primaryKeyInfo"],"additionalProperties":false};const schema14 = {"type":"object","properties":{"type":{"type":"string"},"properties":{"type":"object"}},"required":["type"],"additionalProperties":false};const schema31 = {"type":"object","properties":{"isCustomPrimaryKey":{"type":"boolean"},"primaryKeyFieldName":{"type":"string"},"sortKeyFieldNames":{"type":"array","items":{"type":"string"}}},"required":["isCustomPrimaryKey","primaryKeyFieldName","sortKeyFieldNames"],"additionalProperties":false};const schema15 = {"type":"object","additionalProperties":{"$ref":"#/definitions/Field"}};const schema16 = {"type":"object","properties":{"name":{"type":"string"},"type":{"$ref":"#/definitions/FieldType"},"isArray":{"type":"boolean"},"isRequired":{"type":"boolean"},"isReadOnly":{"type":"boolean"},"isArrayNullable":{"type":"boolean"},"attributes":{"type":"array","items":{"$ref":"#/definitions/FieldAttribute"}},"association":{"$ref":"#/definitions/AssociationType"},"arguments":{"$ref":"#/definitions/Arguments"}},"required":["name","type","isArray","isRequired"],"additionalProperties":false};const func2 = Object.prototype.hasOwnProperty;const schema17 = {"anyOf":[{"$ref":"#/definitions/ScalarType"},{"type":"object","properties":{"enum":{"type":"string"}},"required":["enum"],"additionalProperties":false},{"type":"object","properties":{"model":{"type":"string"}},"required":["model"],"additionalProperties":false},{"type":"object","properties":{"nonModel":{"type":"string"}},"required":["nonModel"],"additionalProperties":false}]};const schema18 = {"type":"string","enum":["ID","String","Int","Float","AWSDate","AWSTime","AWSDateTime","AWSTimestamp","AWSEmail","AWSURL","AWSIPAddress","Boolean","AWSJSON","AWSPhone"]};function validate15(data, {instancePath="", parentData, parentDataProperty, rootData=data}={}){let vErrors = null;let errors = 0;const _errs0 = errors;let valid0 = false;const _errs1 = errors;if(typeof data !== "string"){const err0 = {instancePath,schemaPath:"#/definitions/ScalarType/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}if(!((((((((((((((data === "ID") || (data === "String")) || (data === "Int")) || (data === "Float")) || (data === "AWSDate")) || (data === "AWSTime")) || (data === "AWSDateTime")) || (data === "AWSTimestamp")) || (data === "AWSEmail")) || (data === "AWSURL")) || (data === "AWSIPAddress")) || (data === "Boolean")) || (data === "AWSJSON")) || (data === "AWSPhone"))){const err1 = {instancePath,schemaPath:"#/definitions/ScalarType/enum",keyword:"enum",params:{allowedValues: schema18.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}var _valid0 = _errs1 === errors;valid0 = valid0 || _valid0;if(!valid0){const _errs4 = errors;if(errors === _errs4){if(data && typeof data == "object" && !Array.isArray(data)){let missing0;if((data.enum === undefined) && (missing0 = "enum")){const err2 = {instancePath,schemaPath:"#/anyOf/1/required",keyword:"required",params:{missingProperty: missing0},message:"must have required property '"+missing0+"'"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}else {const _errs6 = errors;for(const key0 in data){if(!(key0 === "enum")){const err3 = {instancePath,schemaPath:"#/anyOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;break;}}if(_errs6 === errors){if(data.enum !== undefined){if(typeof data.enum !== "string"){const err4 = {instancePath:instancePath+"/enum",schemaPath:"#/anyOf/1/properties/enum/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}}}}else {const err5 = {instancePath,schemaPath:"#/anyOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}var _valid0 = _errs4 === errors;valid0 = valid0 || _valid0;if(!valid0){const _errs9 = errors;if(errors === _errs9){if(data && typeof data == "object" && !Array.isArray(data)){let missing1;if((data.model === undefined) && (missing1 = "model")){const err6 = {instancePath,schemaPath:"#/anyOf/2/required",keyword:"required",params:{missingProperty: missing1},message:"must have required property '"+missing1+"'"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}else {const _errs11 = errors;for(const key1 in data){if(!(key1 === "model")){const err7 = {instancePath,schemaPath:"#/anyOf/2/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key1},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;break;}}if(_errs11 === errors){if(data.model !== undefined){if(typeof data.model !== "string"){const err8 = {instancePath:instancePath+"/model",schemaPath:"#/anyOf/2/properties/model/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}}}}else {const err9 = {instancePath,schemaPath:"#/anyOf/2/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}var _valid0 = _errs9 === errors;valid0 = valid0 || _valid0;if(!valid0){const _errs14 = errors;if(errors === _errs14){if(data && typeof data == "object" && !Array.isArray(data)){let missing2;if((data.nonModel === undefined) && (missing2 = "nonModel")){const err10 = {instancePath,schemaPath:"#/anyOf/3/required",keyword:"required",params:{missingProperty: missing2},message:"must have required property '"+missing2+"'"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}else {const _errs16 = errors;for(const key2 in data){if(!(key2 === "nonModel")){const err11 = {instancePath,schemaPath:"#/anyOf/3/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key2},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;break;}}if(_errs16 === errors){if(data.nonModel !== undefined){if(typeof data.nonModel !== "string"){const err12 = {instancePath:instancePath+"/nonModel",schemaPath:"#/anyOf/3/properties/nonModel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}}}}else {const err13 = {instancePath,schemaPath:"#/anyOf/3/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}}var _valid0 = _errs14 === errors;valid0 = valid0 || _valid0;}}}if(!valid0){const err14 = {instancePath,schemaPath:"#/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;validate15.errors = vErrors;return false;}else {errors = _errs0;if(vErrors !== null){if(_errs0){vErrors.length = _errs0;}else {vErrors = null;}}}validate15.errors = vErrors;return errors === 0;}const schema20 = {"anyOf":[{"$ref":"#/definitions/AssociationHasMany"},{"$ref":"#/definitions/AssociationHasOne"},{"$ref":"#/definitions/AssociationBelongsTo"}]};const schema21 = {"type":"object","additionalProperties":false,"properties":{"connectionType":{"$ref":"#/definitions/CodeGenConnectionType"},"associatedWith":{"type":"array","items":{"type":"string"}}},"required":["associatedWith","connectionType"]};const schema22 = {"type":"string","enum":["HAS_ONE","BELONGS_TO","HAS_MANY"],"description":"Field-level Relationship Definitions"};function validate18(data, {instancePath="", parentData, parentDataProperty, rootData=data}={}){let vErrors = null;let errors = 0;if(errors === 0){if(data && typeof data == "object" && !Array.isArray(data)){let missing0;if(((data.associatedWith === undefined) && (missing0 = "associatedWith")) || ((data.connectionType === undefined) && (missing0 = "connectionType"))){validate18.errors = [{instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: missing0},message:"must have required property '"+missing0+"'"}];return false;}else {const _errs1 = errors;for(const key0 in data){if(!((key0 === "connectionType") || (key0 === "associatedWith"))){validate18.errors = [{instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"}];return false;break;}}if(_errs1 === errors){if(data.connectionType !== undefined){let data0 = data.connectionType;const _errs2 = errors;if(typeof data0 !== "string"){validate18.errors = [{instancePath:instancePath+"/connectionType",schemaPath:"#/definitions/CodeGenConnectionType/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}if(!(((data0 === "HAS_ONE") || (data0 === "BELONGS_TO")) || (data0 === "HAS_MANY"))){validate18.errors = [{instancePath:instancePath+"/connectionType",schemaPath:"#/definitions/CodeGenConnectionType/enum",keyword:"enum",params:{allowedValues: schema22.enum},message:"must be equal to one of the allowed values"}];return false;}var valid0 = _errs2 === errors;}else {var valid0 = true;}if(valid0){if(data.associatedWith !== undefined){let data1 = data.associatedWith;const _errs5 = errors;if(errors === _errs5){if(Array.isArray(data1)){var valid2 = true;const len0 = data1.length;for(let i0=0; i0":{"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaModel"}},"SchemaModel":{"type":"object","properties":{"name":{"type":"string"},"attributes":{"type":"array","items":{"$ref":"#/definitions/ModelAttribute"}},"fields":{"$ref":"#/definitions/Fields"},"pluralName":{"type":"string"},"syncable":{"type":"boolean"},"primaryKeyInfo":{"$ref":"#/definitions/PrimaryKeyInfo"}},"required":["name","fields","pluralName","primaryKeyInfo"],"additionalProperties":false},"ModelAttribute":{"type":"object","properties":{"type":{"type":"string"},"properties":{"type":"object"}},"required":["type"],"additionalProperties":false},"Fields":{"$ref":"#/definitions/Record%3Cstring%2CField%3E","description":"Field Definition"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/Field"}},"Field":{"type":"object","properties":{"name":{"type":"string"},"type":{"$ref":"#/definitions/FieldType"},"isArray":{"type":"boolean"},"isRequired":{"type":"boolean"},"isReadOnly":{"type":"boolean"},"isArrayNullable":{"type":"boolean"},"attributes":{"type":"array","items":{"$ref":"#/definitions/FieldAttribute"}},"association":{"$ref":"#/definitions/AssociationType"},"arguments":{"$ref":"#/definitions/Arguments"}},"required":["name","type","isArray","isRequired"],"additionalProperties":false},"FieldType":{"anyOf":[{"$ref":"#/definitions/ScalarType"},{"type":"object","properties":{"enum":{"type":"string"}},"required":["enum"],"additionalProperties":false},{"type":"object","properties":{"model":{"type":"string"}},"required":["model"],"additionalProperties":false},{"type":"object","properties":{"nonModel":{"type":"string"}},"required":["nonModel"],"additionalProperties":false}]},"ScalarType":{"type":"string","enum":["ID","String","Int","Float","AWSDate","AWSTime","AWSDateTime","AWSTimestamp","AWSEmail","AWSURL","AWSIPAddress","Boolean","AWSJSON","AWSPhone"]},"FieldAttribute":{"$ref":"#/definitions/ModelAttribute"},"AssociationType":{"anyOf":[{"$ref":"#/definitions/AssociationHasMany"},{"$ref":"#/definitions/AssociationHasOne"},{"$ref":"#/definitions/AssociationBelongsTo"}]},"AssociationHasMany":{"type":"object","additionalProperties":false,"properties":{"connectionType":{"$ref":"#/definitions/CodeGenConnectionType"},"associatedWith":{"type":"array","items":{"type":"string"}}},"required":["associatedWith","connectionType"]},"CodeGenConnectionType":{"type":"string","enum":["HAS_ONE","BELONGS_TO","HAS_MANY"],"description":"Field-level Relationship Definitions"},"AssociationHasOne":{"type":"object","additionalProperties":false,"properties":{"connectionType":{"$ref":"#/definitions/CodeGenConnectionType"},"associatedWith":{"type":"array","items":{"type":"string"}},"targetNames":{"type":"array","items":{"type":"string"}}},"required":["associatedWith","connectionType","targetNames"]},"AssociationBelongsTo":{"type":"object","additionalProperties":false,"properties":{"connectionType":{"$ref":"#/definitions/CodeGenConnectionType"},"targetNames":{"type":"array","items":{"type":"string"}}},"required":["connectionType","targetNames"]},"Arguments":{"$ref":"#/definitions/Record%3Cstring%2CArgument%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/Argument"}},"Argument":{"type":"object","properties":{"name":{"type":"string"},"type":{"$ref":"#/definitions/InputFieldType"},"isArray":{"type":"boolean"},"isRequired":{"type":"boolean"},"isArrayNullable":{"type":"boolean"}},"required":["name","type","isArray","isRequired"],"additionalProperties":false},"InputFieldType":{"anyOf":[{"$ref":"#/definitions/ScalarType"},{"type":"object","properties":{"enum":{"type":"string"}},"required":["enum"],"additionalProperties":false},{"type":"object","properties":{"input":{"type":"string"}},"required":["input"],"additionalProperties":false}]},"PrimaryKeyInfo":{"type":"object","properties":{"isCustomPrimaryKey":{"type":"boolean"},"primaryKeyFieldName":{"type":"string"},"sortKeyFieldNames":{"type":"array","items":{"type":"string"}}},"required":["isCustomPrimaryKey","primaryKeyFieldName","sortKeyFieldNames"],"additionalProperties":false},"SchemaNonModels":{"$ref":"#/definitions/Record%3Cstring%2CSchemaNonModel%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaNonModel"}},"SchemaNonModel":{"type":"object","properties":{"name":{"type":"string"},"fields":{"$ref":"#/definitions/Fields"}},"required":["name","fields"],"additionalProperties":false},"SchemaEnums":{"$ref":"#/definitions/Record%3Cstring%2CSchemaEnum%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaEnum"}},"SchemaEnum":{"type":"object","properties":{"name":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}},"required":["name","values"],"additionalProperties":false},"SchemaQueries":{"$ref":"#/definitions/Record%3Cstring%2CSchemaQuery%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaQuery"}},"SchemaQuery":{"$ref":"#/definitions/Pick%3CField%2C(%22name%22%7C%22type%22%7C%22isArray%22%7C%22isRequired%22%7C%22isArrayNullable%22%7C%22arguments%22)%3E"},"Pick":{"type":"object","properties":{"name":{"type":"string"},"type":{"$ref":"#/definitions/FieldType"},"isArray":{"type":"boolean"},"isRequired":{"type":"boolean"},"isArrayNullable":{"type":"boolean"},"arguments":{"$ref":"#/definitions/Arguments"}},"required":["name","type","isArray","isRequired"],"additionalProperties":false},"SchemaMutations":{"$ref":"#/definitions/Record%3Cstring%2CSchemaMutation%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaMutation"}},"SchemaMutation":{"$ref":"#/definitions/SchemaQuery"},"SchemaSubscriptions":{"$ref":"#/definitions/Record%3Cstring%2CSchemaSubscription%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaSubscription"}},"SchemaSubscription":{"$ref":"#/definitions/SchemaQuery"},"SchemaInputs":{"$ref":"#/definitions/Record%3Cstring%2CInput%3E"},"Record":{"type":"object","additionalProperties":{"$ref":"#/definitions/Input"}},"Input":{"type":"object","properties":{"name":{"type":"string"},"attributes":{"$ref":"#/definitions/Arguments"}},"required":["name","attributes"],"additionalProperties":false,"description":"Input Definition"}}};const func2 = Object.prototype.hasOwnProperty;const schema12 = {"type":"object","additionalProperties":{"$ref":"#/definitions/SchemaModel"}};const schema13 = {"type":"object","properties":{"name":{"type":"string"},"attributes":{"type":"array","items":{"$ref":"#/definitions/ModelAttribute"}},"fields":{"$ref":"#/definitions/Fields"},"pluralName":{"type":"string"},"syncable":{"type":"boolean"},"primaryKeyInfo":{"$ref":"#/definitions/PrimaryKeyInfo"}},"required":["name","fields","pluralName","primaryKeyInfo"],"additionalProperties":false};const schema14 = {"type":"object","properties":{"type":{"type":"string"},"properties":{"type":"object"}},"required":["type"],"additionalProperties":false};const schema31 = {"type":"object","properties":{"isCustomPrimaryKey":{"type":"boolean"},"primaryKeyFieldName":{"type":"string"},"sortKeyFieldNames":{"type":"array","items":{"type":"string"}}},"required":["isCustomPrimaryKey","primaryKeyFieldName","sortKeyFieldNames"],"additionalProperties":false};const schema15 = {"type":"object","additionalProperties":{"$ref":"#/definitions/Field"}};const schema16 = {"type":"object","properties":{"name":{"type":"string"},"type":{"$ref":"#/definitions/FieldType"},"isArray":{"type":"boolean"},"isRequired":{"type":"boolean"},"isReadOnly":{"type":"boolean"},"isArrayNullable":{"type":"boolean"},"attributes":{"type":"array","items":{"$ref":"#/definitions/FieldAttribute"}},"association":{"$ref":"#/definitions/AssociationType"},"arguments":{"$ref":"#/definitions/Arguments"}},"required":["name","type","isArray","isRequired"],"additionalProperties":false};const schema17 = {"anyOf":[{"$ref":"#/definitions/ScalarType"},{"type":"object","properties":{"enum":{"type":"string"}},"required":["enum"],"additionalProperties":false},{"type":"object","properties":{"model":{"type":"string"}},"required":["model"],"additionalProperties":false},{"type":"object","properties":{"nonModel":{"type":"string"}},"required":["nonModel"],"additionalProperties":false}]};const schema18 = {"type":"string","enum":["ID","String","Int","Float","AWSDate","AWSTime","AWSDateTime","AWSTimestamp","AWSEmail","AWSURL","AWSIPAddress","Boolean","AWSJSON","AWSPhone"]};function validate15(data, {instancePath="", parentData, parentDataProperty, rootData=data}={}){let vErrors = null;let errors = 0;const _errs0 = errors;let valid0 = false;const _errs1 = errors;if(typeof data !== "string"){const err0 = {instancePath,schemaPath:"#/definitions/ScalarType/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err0];}else {vErrors.push(err0);}errors++;}if(!((((((((((((((data === "ID") || (data === "String")) || (data === "Int")) || (data === "Float")) || (data === "AWSDate")) || (data === "AWSTime")) || (data === "AWSDateTime")) || (data === "AWSTimestamp")) || (data === "AWSEmail")) || (data === "AWSURL")) || (data === "AWSIPAddress")) || (data === "Boolean")) || (data === "AWSJSON")) || (data === "AWSPhone"))){const err1 = {instancePath,schemaPath:"#/definitions/ScalarType/enum",keyword:"enum",params:{allowedValues: schema18.enum},message:"must be equal to one of the allowed values"};if(vErrors === null){vErrors = [err1];}else {vErrors.push(err1);}errors++;}var _valid0 = _errs1 === errors;valid0 = valid0 || _valid0;if(!valid0){const _errs4 = errors;if(errors === _errs4){if(data && typeof data == "object" && !Array.isArray(data)){let missing0;if((data.enum === undefined) && (missing0 = "enum")){const err2 = {instancePath,schemaPath:"#/anyOf/1/required",keyword:"required",params:{missingProperty: missing0},message:"must have required property '"+missing0+"'"};if(vErrors === null){vErrors = [err2];}else {vErrors.push(err2);}errors++;}else {const _errs6 = errors;for(const key0 in data){if(!(key0 === "enum")){const err3 = {instancePath,schemaPath:"#/anyOf/1/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err3];}else {vErrors.push(err3);}errors++;break;}}if(_errs6 === errors){if(data.enum !== undefined){if(typeof data.enum !== "string"){const err4 = {instancePath:instancePath+"/enum",schemaPath:"#/anyOf/1/properties/enum/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err4];}else {vErrors.push(err4);}errors++;}}}}}else {const err5 = {instancePath,schemaPath:"#/anyOf/1/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err5];}else {vErrors.push(err5);}errors++;}}var _valid0 = _errs4 === errors;valid0 = valid0 || _valid0;if(!valid0){const _errs9 = errors;if(errors === _errs9){if(data && typeof data == "object" && !Array.isArray(data)){let missing1;if((data.model === undefined) && (missing1 = "model")){const err6 = {instancePath,schemaPath:"#/anyOf/2/required",keyword:"required",params:{missingProperty: missing1},message:"must have required property '"+missing1+"'"};if(vErrors === null){vErrors = [err6];}else {vErrors.push(err6);}errors++;}else {const _errs11 = errors;for(const key1 in data){if(!(key1 === "model")){const err7 = {instancePath,schemaPath:"#/anyOf/2/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key1},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err7];}else {vErrors.push(err7);}errors++;break;}}if(_errs11 === errors){if(data.model !== undefined){if(typeof data.model !== "string"){const err8 = {instancePath:instancePath+"/model",schemaPath:"#/anyOf/2/properties/model/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err8];}else {vErrors.push(err8);}errors++;}}}}}else {const err9 = {instancePath,schemaPath:"#/anyOf/2/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err9];}else {vErrors.push(err9);}errors++;}}var _valid0 = _errs9 === errors;valid0 = valid0 || _valid0;if(!valid0){const _errs14 = errors;if(errors === _errs14){if(data && typeof data == "object" && !Array.isArray(data)){let missing2;if((data.nonModel === undefined) && (missing2 = "nonModel")){const err10 = {instancePath,schemaPath:"#/anyOf/3/required",keyword:"required",params:{missingProperty: missing2},message:"must have required property '"+missing2+"'"};if(vErrors === null){vErrors = [err10];}else {vErrors.push(err10);}errors++;}else {const _errs16 = errors;for(const key2 in data){if(!(key2 === "nonModel")){const err11 = {instancePath,schemaPath:"#/anyOf/3/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key2},message:"must NOT have additional properties"};if(vErrors === null){vErrors = [err11];}else {vErrors.push(err11);}errors++;break;}}if(_errs16 === errors){if(data.nonModel !== undefined){if(typeof data.nonModel !== "string"){const err12 = {instancePath:instancePath+"/nonModel",schemaPath:"#/anyOf/3/properties/nonModel/type",keyword:"type",params:{type: "string"},message:"must be string"};if(vErrors === null){vErrors = [err12];}else {vErrors.push(err12);}errors++;}}}}}else {const err13 = {instancePath,schemaPath:"#/anyOf/3/type",keyword:"type",params:{type: "object"},message:"must be object"};if(vErrors === null){vErrors = [err13];}else {vErrors.push(err13);}errors++;}}var _valid0 = _errs14 === errors;valid0 = valid0 || _valid0;}}}if(!valid0){const err14 = {instancePath,schemaPath:"#/anyOf",keyword:"anyOf",params:{},message:"must match a schema in anyOf"};if(vErrors === null){vErrors = [err14];}else {vErrors.push(err14);}errors++;validate15.errors = vErrors;return false;}else {errors = _errs0;if(vErrors !== null){if(_errs0){vErrors.length = _errs0;}else {vErrors = null;}}}validate15.errors = vErrors;return errors === 0;}const schema20 = {"anyOf":[{"$ref":"#/definitions/AssociationHasMany"},{"$ref":"#/definitions/AssociationHasOne"},{"$ref":"#/definitions/AssociationBelongsTo"}]};const schema21 = {"type":"object","additionalProperties":false,"properties":{"connectionType":{"$ref":"#/definitions/CodeGenConnectionType"},"associatedWith":{"type":"array","items":{"type":"string"}}},"required":["associatedWith","connectionType"]};const schema22 = {"type":"string","enum":["HAS_ONE","BELONGS_TO","HAS_MANY"],"description":"Field-level Relationship Definitions"};function validate18(data, {instancePath="", parentData, parentDataProperty, rootData=data}={}){let vErrors = null;let errors = 0;if(errors === 0){if(data && typeof data == "object" && !Array.isArray(data)){let missing0;if(((data.associatedWith === undefined) && (missing0 = "associatedWith")) || ((data.connectionType === undefined) && (missing0 = "connectionType"))){validate18.errors = [{instancePath,schemaPath:"#/required",keyword:"required",params:{missingProperty: missing0},message:"must have required property '"+missing0+"'"}];return false;}else {const _errs1 = errors;for(const key0 in data){if(!((key0 === "connectionType") || (key0 === "associatedWith"))){validate18.errors = [{instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"}];return false;break;}}if(_errs1 === errors){if(data.connectionType !== undefined){let data0 = data.connectionType;const _errs2 = errors;if(typeof data0 !== "string"){validate18.errors = [{instancePath:instancePath+"/connectionType",schemaPath:"#/definitions/CodeGenConnectionType/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}if(!(((data0 === "HAS_ONE") || (data0 === "BELONGS_TO")) || (data0 === "HAS_MANY"))){validate18.errors = [{instancePath:instancePath+"/connectionType",schemaPath:"#/definitions/CodeGenConnectionType/enum",keyword:"enum",params:{allowedValues: schema22.enum},message:"must be equal to one of the allowed values"}];return false;}var valid0 = _errs2 === errors;}else {var valid0 = true;}if(valid0){if(data.associatedWith !== undefined){let data1 = data.associatedWith;const _errs5 = errors;if(errors === _errs5){if(Array.isArray(data1)){var valid2 = true;const len0 = data1.length;for(let i0=0; i0(queryObj) }; }, {}) + const generations = Object.values(this.queryMap).reduce((acc, queryObj: CodeGenQuery) => { + if (!containsGenerationDirective(queryObj)) { + return acc; + } + return { ...acc, [queryObj.name]: this.generateGenerationMetadata(queryObj) }; + }, {}); const mutations = Object.values(this.mutationMap).reduce((acc, mutationObj: CodeGenMutation) => { // Skip the field if the field type is union/interface // TODO: Remove this skip once these types are supported for stakeholder usages @@ -95,6 +102,9 @@ export class AppSyncModelIntrospectionVisitor< if (Object.keys(queries).length > 0) { result = { ...result, queries }; } + if (Object.keys(generations).length > 0) { + result = { ...result, generations }; + } if (Object.keys(mutations).length > 0) { result = { ...result, mutations }; } @@ -236,6 +246,10 @@ export class AppSyncModelIntrospectionVisitor< return operationMeta as V; } + private generateGenerationMetadata(generationObj: CodeGenQuery): SchemaQuery { + return this.generateGraphQLOperationMetadata(generationObj); + } + protected getType(gqlType: string): FieldType | InputFieldType | UnionFieldType | InterfaceFieldType { // Todo: Handle unlisted scalars if (gqlType in METADATA_SCALAR_MAP) {