From 9f559413621dcc4a4a5158a129e575371c6d8c35 Mon Sep 17 00:00:00 2001 From: Zeyu Li Date: Fri, 12 Apr 2024 12:20:45 -0700 Subject: [PATCH] fix: use standalone ajv validation for model introspection schema (#807) * fix: use standalone ajv validation for model introspection schema * test: add unit tests for validator --- .eslintrc.js | 5 ++- packages/appsync-modelgen-plugin/package.json | 7 ++-- .../generateStandaloneValidationFunction.ts | 14 +++++++ .../src/__tests__/validate.test.ts | 41 +++++++++++++++++++ .../src/validate-cjs.js | 1 + .../appsync-model-introspection-visitor.ts | 15 +++---- .../appsync-modelgen-plugin/tsconfig.json | 6 ++- yarn.lock | 2 +- 8 files changed, 74 insertions(+), 17 deletions(-) create mode 100644 packages/appsync-modelgen-plugin/scripts/generateStandaloneValidationFunction.ts create mode 100644 packages/appsync-modelgen-plugin/src/__tests__/validate.test.ts create mode 100644 packages/appsync-modelgen-plugin/src/validate-cjs.js diff --git a/.eslintrc.js b/.eslintrc.js index b2ecda1d..f491b32a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -268,6 +268,9 @@ module.exports = { '/packages/*/CHANGELOG.md', // Ignore lint in e2e test apps - 'test-apps' + 'test-apps', + + // Ignore lint for standalone JSON validation function + '/packages/appsync-modelgen-plugin/src/validate-cjs.js' ] }; diff --git a/packages/appsync-modelgen-plugin/package.json b/packages/appsync-modelgen-plugin/package.json index c333a6ca..abc48881 100644 --- a/packages/appsync-modelgen-plugin/package.json +++ b/packages/appsync-modelgen-plugin/package.json @@ -18,18 +18,18 @@ "codegen" ], "scripts": { - "build": "tsc", + "build": "yarn generate-schemas && yarn generate-standalone-validation-function && tsc", "watch": "tsc -w", "test-watch": "jest --watch", "test": "jest", - "generate-schemas": "ts-node ./scripts/generateSchemas.ts", + "generate-schemas": "ts-node ./scripts/generateSchemas.ts --overwrite", + "generate-standalone-validation-function": "ts-node ./scripts/generateStandaloneValidationFunction.ts", "extract-api": "ts-node ../../scripts/extract-api.ts" }, "dependencies": { "@graphql-codegen/plugin-helpers": "^1.18.8", "@graphql-codegen/visitor-plugin-common": "^1.22.0", "@graphql-tools/utils": "^6.0.18", - "ajv": "^6.10.0", "chalk": "^3.0.0", "change-case": "^4.1.1", "graphql-transformer-common": "^4.25.1", @@ -45,6 +45,7 @@ "@types/fs-extra": "^8.1.2", "@types/node": "^12.12.6", "@types/pluralize": "0.0.29", + "ajv": "^8.12.0", "graphql": "^15.5.0", "java-ast": "^0.3.0", "ts-json-schema-generator": "1.0.0" diff --git a/packages/appsync-modelgen-plugin/scripts/generateStandaloneValidationFunction.ts b/packages/appsync-modelgen-plugin/scripts/generateStandaloneValidationFunction.ts new file mode 100644 index 00000000..361f82f7 --- /dev/null +++ b/packages/appsync-modelgen-plugin/scripts/generateStandaloneValidationFunction.ts @@ -0,0 +1,14 @@ +import Ajv from 'ajv'; +import modelIntrospectionSchemaDefinition from '../schemas/introspection/1/ModelIntrospectionSchema.json' +import { join } from 'path'; +import { writeFileSync } from 'fs'; + +const standaloneCode = require("ajv/dist/standalone").default + +const ajv = new Ajv({ code: { source: true } }); +const validate = ajv.compile(modelIntrospectionSchemaDefinition); + +let moduleCode = standaloneCode(ajv, validate) + +// Now you can write the module code to file +writeFileSync(join(__dirname, "../src/validate-cjs.js"), moduleCode) \ No newline at end of file diff --git a/packages/appsync-modelgen-plugin/src/__tests__/validate.test.ts b/packages/appsync-modelgen-plugin/src/__tests__/validate.test.ts new file mode 100644 index 00000000..68eba9fd --- /dev/null +++ b/packages/appsync-modelgen-plugin/src/__tests__/validate.test.ts @@ -0,0 +1,41 @@ +const validateModelIntrospectionSchema = require('../validate-cjs'); +import { ModelIntrospectionSchema } from '../interfaces/introspection' + +describe('Standalone validation function', () => { + const validSchema: ModelIntrospectionSchema = { + version: 1, + models: {}, + nonModels: {}, + enums: {}, + } + it('should pass on the valid schema', () => { + const result = validateModelIntrospectionSchema(validSchema); + expect(result).toBe(true); + }); + describe('should fail on the invalid schema', () => { + it('invalid version', () => { + const schema = { + ...validSchema, + version: 100, + }; + const result = validateModelIntrospectionSchema(schema); + expect(result).toBe(false); + }); + it('invalid fields', () => { + const schema = { + ...validSchema, + invalidField: {} + }; + const result = validateModelIntrospectionSchema(schema); + expect(result).toBe(false); + }); + it('missing required fields', () => { + const schema = { + ...validSchema, + }; + delete (schema as any).models; + const result = validateModelIntrospectionSchema(schema); + expect(result).toBe(false); + }); + }); +}); \ 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 new file mode 100644 index 00000000..4e47e237 --- /dev/null +++ b/packages/appsync-modelgen-plugin/src/validate-cjs.js @@ -0,0 +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 extends AppSyncModelVisitor { private readonly introspectionVersion = 1; - private schemaValidator: Ajv.ValidateFunction; constructor( schema: GraphQLSchema, rawConfig: TRawConfig, @@ -26,9 +24,6 @@ export class AppSyncModelIntrospectionVisitor< defaultScalars: NormalizedScalarsMap = DEFAULT_SCALARS, ) { super(schema, rawConfig, additionalConfig, defaultScalars); - const modelIntrospectionSchemaText = fs.readFileSync(path.join(__dirname, '..', '..', 'schemas', 'introspection', this.introspectionVersion.toString(), 'ModelIntrospectionSchema.json'), 'utf8'); - const modelIntrospectionSchema = JSON.parse(modelIntrospectionSchemaText); - this.schemaValidator = new Ajv().compile(modelIntrospectionSchema); } generate(): string { @@ -43,8 +38,8 @@ export class AppSyncModelIntrospectionVisitor< ); const modelIntrosepctionSchema = this.generateModelIntrospectionSchema(); - if (!this.schemaValidator(modelIntrosepctionSchema)) { - throw new Error(`Data did not validate against the supplied schema. Underlying errors were ${JSON.stringify(this.schemaValidator.errors)}`); + if (!validateModelIntrospectionSchema(modelIntrosepctionSchema)) { + throw new Error(`Data did not validate against the supplied schema. Underlying errors were ${JSON.stringify(validateModelIntrospectionSchema.errors)}`); } return JSON.stringify(modelIntrosepctionSchema, null, 4); } diff --git a/packages/appsync-modelgen-plugin/tsconfig.json b/packages/appsync-modelgen-plugin/tsconfig.json index 965e8efc..a4b4fde1 100644 --- a/packages/appsync-modelgen-plugin/tsconfig.json +++ b/packages/appsync-modelgen-plugin/tsconfig.json @@ -2,12 +2,14 @@ "extends": "../../tsconfig.base.json", "compilerOptions": { "rootDir": "src", - "outDir": "lib" + "outDir": "lib", + "allowJs": true, }, "exclude": [ "scripts", "schemas", "lib", - "src/__tests__" + "src/__tests__", + "coverage", ] } diff --git a/yarn.lock b/yarn.lock index 9c33c6d1..f35f46fa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6125,7 +6125,7 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.6, ajv@~6.12.6: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1, ajv@^8.11.0: +ajv@^8.0.1, ajv@^8.11.0, ajv@^8.12.0: version "8.12.0" resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==