From 309e00258bfc560d94cd88b7dc3843de1eeeb4bd Mon Sep 17 00:00:00 2001 From: sorenhoyer Date: Thu, 15 Oct 2020 00:56:38 +0200 Subject: [PATCH 1/8] Add ReScript support --- .../language-plugin/src/FindGraphQLTags.ts | 23 +++++++++++++++---- .../reason-relay/language-plugin/src/index.ts | 4 ++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/packages/reason-relay/language-plugin/src/FindGraphQLTags.ts b/packages/reason-relay/language-plugin/src/FindGraphQLTags.ts index eb8d1951..7ef478d5 100755 --- a/packages/reason-relay/language-plugin/src/FindGraphQLTags.ts +++ b/packages/reason-relay/language-plugin/src/FindGraphQLTags.ts @@ -3,12 +3,12 @@ import { GraphQLTag } from "relay-compiler/lib/language/RelayLanguagePluginInter const invariant = require("invariant"); function parseFile(text: string, file: string) { - if (!text.includes("[%relay.")) { + if (!text.includes("[%relay.") && !text.includes("%relay.")) { return []; } invariant( - text.indexOf("[%relay.") >= 0, + text.indexOf("[%relay.") >= 0 || text.indexOf("%relay.") >= 0, "RelayFileIRParser: Files should be filtered before passed to the " + "parser, got unfiltered file `%s`.", file @@ -19,19 +19,32 @@ function parseFile(text: string, file: string) { * regexp, but this will do just to get things working. */ - const matched = text.match( + const matchedReason = text.match( /(?<=\[%relay\.(query|fragment|mutation|subscription))([\s\S]*?)(?=];)/g ); - if (matched) { + if (matchedReason) { // Removes {||} used in multiline Reason strings - return matched.map(text => ({ + return matchedReason.map(text => ({ template: text.replace(/({\||\|})/g, ""), keyName: null, sourceLocationOffset: { line: 1, column: 1 } })); } + const matchedReScript = text.match( + /(?<=%relay\.(query|fragment|mutation|subscription)\()([\s\S]*?)(?=\))/g + ); + + if (matchedReScript) { + // Removes `` used in multiline ReScript strings + return matchedReScript.map(text => ({ + template: text.replace(/`/g, ""), + keyName: null, + sourceLocationOffset: { line: 1, column: 1 } + })); + } + return []; } diff --git a/packages/reason-relay/language-plugin/src/index.ts b/packages/reason-relay/language-plugin/src/index.ts index ef5171d5..1877dc2c 100755 --- a/packages/reason-relay/language-plugin/src/index.ts +++ b/packages/reason-relay/language-plugin/src/index.ts @@ -19,12 +19,12 @@ function getFileFilter(baseDir: string) { ); return false; } - return text.indexOf("[%relay.") >= 0; + return text.indexOf("[%relay.") >= 0 || text.indexOf("%relay.") >= 0; }; } module.exports = () => ({ - inputExtensions: ["re"], + inputExtensions: ["re", "res"], outputExtension: "re", schemaExtensions: [], typeGenerator: RelayReasonGenerator, From 99616477e0b64462909d32ecb6b43ad360279045 Mon Sep 17 00:00:00 2001 From: sorenhoyer Date: Fri, 23 Oct 2020 22:23:14 +0200 Subject: [PATCH 2/8] Fix the regex for ReScript --- packages/reason-relay/language-plugin/src/FindGraphQLTags.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reason-relay/language-plugin/src/FindGraphQLTags.ts b/packages/reason-relay/language-plugin/src/FindGraphQLTags.ts index 7ef478d5..76aa2d5a 100755 --- a/packages/reason-relay/language-plugin/src/FindGraphQLTags.ts +++ b/packages/reason-relay/language-plugin/src/FindGraphQLTags.ts @@ -33,7 +33,7 @@ function parseFile(text: string, file: string) { } const matchedReScript = text.match( - /(?<=%relay\.(query|fragment|mutation|subscription)\()([\s\S]*?)(?=\))/g + /(?<=%relay\.(query|fragment|mutation|subscription)\()([\s\S]*?)(?=(\`\s*)\))(\`)/g ); if (matchedReScript) { From 71da6f7e595cc263e8063357d89d1beca7da76c1 Mon Sep 17 00:00:00 2001 From: sorenhoyer Date: Sun, 25 Oct 2020 20:26:23 +0100 Subject: [PATCH 3/8] Fixes snapshots so tests are working again --- .../languagePlugin-tests.ts.snap | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/packages/reason-relay/language-plugin/src/__tests__/__snapshots__/languagePlugin-tests.ts.snap b/packages/reason-relay/language-plugin/src/__tests__/__snapshots__/languagePlugin-tests.ts.snap index 0d478928..8cb84b1e 100644 --- a/packages/reason-relay/language-plugin/src/__tests__/__snapshots__/languagePlugin-tests.ts.snap +++ b/packages/reason-relay/language-plugin/src/__tests__/__snapshots__/languagePlugin-tests.ts.snap @@ -49,7 +49,7 @@ module Internal = { let wrapResponseConverterMap = (); let convertWrapResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( wrapResponseConverter, wrapResponseConverterMap, Js.null, @@ -62,7 +62,7 @@ module Internal = { let responseConverterMap = (); let convertResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( responseConverter, responseConverterMap, Js.undefined, @@ -80,7 +80,7 @@ module Internal = { let variablesConverterMap = (); let convertVariables = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( variablesConverter, variablesConverterMap, Js.undefined, @@ -136,7 +136,7 @@ module Internal = { let fragmentConverterMap = (); let convertFragment = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( fragmentConverter, fragmentConverterMap, Js.undefined, @@ -173,7 +173,7 @@ module Internal = { let fragmentConverterMap = (); let convertFragment = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( fragmentConverter, fragmentConverterMap, Js.undefined, @@ -210,7 +210,7 @@ module Internal = { let fragmentConverterMap = (); let convertFragment = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( fragmentConverter, fragmentConverterMap, Js.undefined, @@ -269,7 +269,7 @@ module Internal = { let wrapResponseConverterMap = (); let convertWrapResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( wrapResponseConverter, wrapResponseConverterMap, Js.null, @@ -282,7 +282,7 @@ module Internal = { let responseConverterMap = (); let convertResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( responseConverter, responseConverterMap, Js.undefined, @@ -300,7 +300,7 @@ module Internal = { let variablesConverterMap = (); let convertVariables = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( variablesConverter, variablesConverterMap, Js.undefined, @@ -380,7 +380,7 @@ module Internal = { let wrapResponseConverterMap = (); let convertWrapResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( wrapResponseConverter, wrapResponseConverterMap, Js.null, @@ -393,7 +393,7 @@ module Internal = { let responseConverterMap = (); let convertResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( responseConverter, responseConverterMap, Js.undefined, @@ -411,7 +411,7 @@ module Internal = { let variablesConverterMap = (); let convertVariables = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( variablesConverter, variablesConverterMap, Js.undefined, @@ -473,7 +473,7 @@ module Internal = { let fragmentConverterMap = (); let convertFragment = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( fragmentConverter, fragmentConverterMap, Js.undefined, @@ -531,7 +531,7 @@ module Internal = { let wrapResponseConverterMap = (); let convertWrapResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( wrapResponseConverter, wrapResponseConverterMap, Js.null, @@ -544,7 +544,7 @@ module Internal = { let responseConverterMap = (); let convertResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( responseConverter, responseConverterMap, Js.undefined, @@ -562,7 +562,7 @@ module Internal = { let variablesConverterMap = (); let convertVariables = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( variablesConverter, variablesConverterMap, Js.undefined, @@ -630,7 +630,7 @@ module Internal = { let responseConverterMap = (); let convertResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( responseConverter, responseConverterMap, Js.undefined, @@ -645,7 +645,7 @@ module Internal = { let variablesConverterMap = (); let convertVariables = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( variablesConverter, variablesConverterMap, Js.undefined, @@ -734,7 +734,7 @@ module Internal = { }; let convertFragment = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( fragmentConverter, fragmentConverterMap, Js.undefined, @@ -809,7 +809,7 @@ module Internal = { let fragmentConverterMap = (); let convertFragment = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( fragmentConverter, fragmentConverterMap, Js.undefined, @@ -881,7 +881,7 @@ module Internal = { let fragmentConverterMap = (); let convertFragment = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( fragmentConverter, fragmentConverterMap, Js.undefined, @@ -953,7 +953,7 @@ module Internal = { let responseConverterMap = (); let convertResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( responseConverter, responseConverterMap, Js.undefined, @@ -968,7 +968,7 @@ module Internal = { let variablesConverterMap = (); let convertVariables = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( variablesConverter, variablesConverterMap, Js.undefined, @@ -1015,7 +1015,7 @@ module Internal = { let responseConverterMap = (); let convertResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( responseConverter, responseConverterMap, Js.undefined, @@ -1030,7 +1030,7 @@ module Internal = { let variablesConverterMap = (); let convertVariables = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( variablesConverter, variablesConverterMap, Js.undefined, @@ -1073,7 +1073,7 @@ module Internal = { let fragmentConverterMap = (); let convertFragment = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( fragmentConverter, fragmentConverterMap, Js.undefined, @@ -1111,7 +1111,7 @@ module Internal = { let fragmentConverterMap = (); let convertFragment = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( fragmentConverter, fragmentConverterMap, Js.undefined, @@ -1198,7 +1198,7 @@ module Internal = { }; let convertResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( responseConverter, responseConverterMap, Js.undefined, @@ -1213,7 +1213,7 @@ module Internal = { let variablesConverterMap = (); let convertVariables = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( variablesConverter, variablesConverterMap, Js.undefined, @@ -1304,7 +1304,7 @@ module Internal = { }; let convertResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( responseConverter, responseConverterMap, Js.undefined, @@ -1319,7 +1319,7 @@ module Internal = { let variablesConverterMap = (); let convertVariables = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( variablesConverter, variablesConverterMap, Js.undefined, @@ -1397,7 +1397,7 @@ module Internal = { let fragmentConverterMap = {\\"fragment\\": unwrap_fragment}; let convertFragment = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( fragmentConverter, fragmentConverterMap, Js.undefined, @@ -1539,7 +1539,7 @@ module Internal = { }; let convertResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( responseConverter, responseConverterMap, Js.undefined, @@ -1554,7 +1554,7 @@ module Internal = { let variablesConverterMap = (); let convertVariables = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( variablesConverter, variablesConverterMap, Js.undefined, @@ -1600,7 +1600,7 @@ module Internal = { let responseConverterMap = (); let convertResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( responseConverter, responseConverterMap, Js.undefined, @@ -1613,7 +1613,7 @@ module Internal = { let rawResponseConverterMap = (); let convertRawResponse = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( rawResponseConverter, rawResponseConverterMap, Js.undefined, @@ -1625,7 +1625,7 @@ module Internal = { let variablesConverterMap = (); let convertVariables = v => v - ->ReasonRelay._convertObj( + ->ReasonRelay.convertObj( variablesConverter, variablesConverterMap, Js.undefined, From 2180142abe82cbe7b6c3d9733bfc5441e2c8f742 Mon Sep 17 00:00:00 2001 From: sorenhoyer Date: Sun, 25 Oct 2020 20:28:25 +0100 Subject: [PATCH 4/8] First test for FindGraphQLTags.ts --- .../src/__tests__/FindGraphQLTags-tests.ts | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 packages/reason-relay/language-plugin/src/__tests__/FindGraphQLTags-tests.ts diff --git a/packages/reason-relay/language-plugin/src/__tests__/FindGraphQLTags-tests.ts b/packages/reason-relay/language-plugin/src/__tests__/FindGraphQLTags-tests.ts new file mode 100644 index 00000000..347726b0 --- /dev/null +++ b/packages/reason-relay/language-plugin/src/__tests__/FindGraphQLTags-tests.ts @@ -0,0 +1,34 @@ +import { find } from "../FindGraphQLTags"; + +describe("Language plugin tests", () => { + describe("ReScript Syntax", () => { + describe("Query", () => { + it("parses graphql query with variable", () => { + let parsed = find( + "module Query = %relay.query( \ + ` \ + query appQuery($userId: ID!) { \ + user(id: $userId) { \ + id \ + firstName \ + } \ + } \ + ` \ + )" + , + "test" + ); + + expect( + parsed.length + ).toBeGreaterThan(0); + }); + }); + + describe("Mutation", () => {}); + + describe("Subscription", () => {}); + + describe("Fragment", () => {}); + }); +}); From f51888dacad199be9ccf62ade81f1996be4c0b8d Mon Sep 17 00:00:00 2001 From: sorenhoyer Date: Tue, 27 Oct 2020 23:18:52 +0100 Subject: [PATCH 5/8] Added test with multiple tags and validation of the graphql by parsing it + Moved functions from languagePlugin-tests.ts to test-utils/* for reuse in FindGraphQLTags-tests.ts --- .../language-plugin/src/@typings/graphql.ts | 5 ++ .../src/@typings/relay-compiler.d.ts | 14 +++ .../src/__tests__/FindGraphQLTags-tests.ts | 88 +++++++++++++----- .../src/__tests__/languagePlugin-tests.ts | 90 ++----------------- .../src/test-utils/collapseString.ts | 4 + .../src/test-utils/generate.ts | 36 ++++++++ .../src/test-utils/generateRelaySchema.ts | 11 +++ .../src/test-utils/generateSchema.ts | 10 +++ .../language-plugin/src/test-utils/index.ts | 13 +++ .../src/test-utils/parseGraphQLText.ts | 33 +++++++ .../testSchema.graphql | 0 11 files changed, 198 insertions(+), 106 deletions(-) create mode 100644 packages/reason-relay/language-plugin/src/@typings/graphql.ts create mode 100644 packages/reason-relay/language-plugin/src/@typings/relay-compiler.d.ts create mode 100644 packages/reason-relay/language-plugin/src/test-utils/collapseString.ts create mode 100644 packages/reason-relay/language-plugin/src/test-utils/generate.ts create mode 100644 packages/reason-relay/language-plugin/src/test-utils/generateRelaySchema.ts create mode 100644 packages/reason-relay/language-plugin/src/test-utils/generateSchema.ts create mode 100644 packages/reason-relay/language-plugin/src/test-utils/index.ts create mode 100644 packages/reason-relay/language-plugin/src/test-utils/parseGraphQLText.ts rename packages/reason-relay/language-plugin/src/{__tests__ => test-utils}/testSchema.graphql (100%) diff --git a/packages/reason-relay/language-plugin/src/@typings/graphql.ts b/packages/reason-relay/language-plugin/src/@typings/graphql.ts new file mode 100644 index 00000000..9157e20a --- /dev/null +++ b/packages/reason-relay/language-plugin/src/@typings/graphql.ts @@ -0,0 +1,5 @@ +import "graphql"; + +declare module "graphql" { + const stripIgnoredCharacters: (source: string) => string; +} diff --git a/packages/reason-relay/language-plugin/src/@typings/relay-compiler.d.ts b/packages/reason-relay/language-plugin/src/@typings/relay-compiler.d.ts new file mode 100644 index 00000000..e372f755 --- /dev/null +++ b/packages/reason-relay/language-plugin/src/@typings/relay-compiler.d.ts @@ -0,0 +1,14 @@ +import { DefinitionNode, DocumentNode } from "graphql"; +import "relay-compiler"; +import { Fragment, Parser, Root, Schema } from "relay-compiler"; + +declare module "relay-compiler" { + const convertASTDocuments: ( + extendedSchema: Schema, + ast: DocumentNode[], + parser: ( + schema: Schema, + documents: DefinitionNode[] + ) => readonly (Root | Fragment)[] + ) => readonly (Fragment | Root)[]; +} diff --git a/packages/reason-relay/language-plugin/src/__tests__/FindGraphQLTags-tests.ts b/packages/reason-relay/language-plugin/src/__tests__/FindGraphQLTags-tests.ts index 347726b0..737c6ea2 100644 --- a/packages/reason-relay/language-plugin/src/__tests__/FindGraphQLTags-tests.ts +++ b/packages/reason-relay/language-plugin/src/__tests__/FindGraphQLTags-tests.ts @@ -1,34 +1,74 @@ +import { stripIgnoredCharacters } from "graphql"; +import { join, resolve } from "path"; +import { SourceLocation } from "relay-compiler/lib/core/IR"; import { find } from "../FindGraphQLTags"; +import { + generateRelaySchema, + generateSchema, + parseGraphQLText, +} from "../test-utils"; + +const relaySchema = generateRelaySchema( + generateSchema( + resolve(join(__dirname, "..", "test-utils", "testSchema.graphql")) + ) +); + +const fragment = ` +fragment SomeComponent_user on User { + id +} +`; + +const query = ` +query appQuery($userId: ID!) { + user(id: $userId) { + id + firstName + } +} +`; describe("Language plugin tests", () => { - describe("ReScript Syntax", () => { - describe("Query", () => { - it("parses graphql query with variable", () => { - let parsed = find( - "module Query = %relay.query( \ - ` \ - query appQuery($userId: ID!) { \ - user(id: $userId) { \ - id \ - firstName \ - } \ - } \ - ` \ - )" - , + describe("RelayFindGraphQLTags", () => { + describe("ReScript Syntax", () => { + it("parses graphql templates", () => { + const graphqlTags = find( + ` + module Fragment = %relay.fragment( + \` + ${fragment} + \` + ) + + module Query = %relay.query( + \` + ${query} + \` + ) + `, "test" ); - expect( - parsed.length - ).toBeGreaterThan(0); - }); - }); - - describe("Mutation", () => {}); + const parsedBodies = graphqlTags.map((tag) => { + const { definitions, schema } = parseGraphQLText( + relaySchema, + tag.template + ); - describe("Subscription", () => {}); + return definitions && definitions.length && schema + ? stripIgnoredCharacters( + ((definitions[0] as any).loc as SourceLocation).source.body + ) + : undefined; + }); - describe("Fragment", () => {}); + expect(parsedBodies).toEqual([ + stripIgnoredCharacters(fragment), + stripIgnoredCharacters(query), + ]); + }); + // describe("ReScript Syntax", () => {}); + }); }); }); diff --git a/packages/reason-relay/language-plugin/src/__tests__/languagePlugin-tests.ts b/packages/reason-relay/language-plugin/src/__tests__/languagePlugin-tests.ts index 97c332d6..7951e3d8 100644 --- a/packages/reason-relay/language-plugin/src/__tests__/languagePlugin-tests.ts +++ b/packages/reason-relay/language-plugin/src/__tests__/languagePlugin-tests.ts @@ -1,87 +1,13 @@ -import { Source, parse } from "graphql"; -import * as fs from "fs"; -import * as path from "path"; -import * as RelayReasonGenerator from "../RelayReasonGenerator"; -const getLanguagePlugin = require("../index"); -import { printCode } from "../generator/Printer.gen"; - -const CompilerContext = require("relay-compiler/lib/core/CompilerContext"); - -import * as RelayIRTransforms from "relay-compiler/lib/core/RelayIRTransforms"; - +import { join, resolve } from "path"; import { - Parser, - // @ts-ignore - convertASTDocuments, - Root, - Schema, - Fragment, -} from "relay-compiler"; - -const create = require("relay-compiler").Schema.create; - -function parseGraphQLText( - schema: any, - text: string -): { - definitions: ReadonlyArray; - schema: any; -} { - const ast = parse(text); - const extendedSchema = schema.extend(ast); - const definitions = convertASTDocuments( - extendedSchema, - [ast], - Parser.transform.bind(Parser) - ); - return { - definitions, - schema: extendedSchema, - }; -} - -const testSchema = create( - new Source( - fs.readFileSync( - path.resolve(path.join(__dirname, "testSchema.graphql")), - "utf8" - ) - ) -); + collapseString, + generate as generateCurryFunc, + generateSchema, +} from "../test-utils"; -function collapseString(str: string) { - return str.replace(/\r?\n|\r|\t/g, "").replace(/\s+/g, " "); -} - -function generate(text: string, options?: any, extraDefs: string = "") { - const relaySchema = testSchema.extend([ - ...RelayIRTransforms.schemaExtensions, - ...getLanguagePlugin().schemaExtensions, - extraDefs, - ]); - const { definitions, schema: extendedSchema } = parseGraphQLText( - relaySchema, - text - ); - - const ctx = new CompilerContext(extendedSchema) - .addAll(definitions) - .applyTransforms(RelayReasonGenerator.transforms); - - return ctx - .documents() - .map( - (doc: any) => - `// ${doc.name}.graphql\n${printCode( - RelayReasonGenerator.generate(extendedSchema, doc, { - normalizationIR: ctx.get(doc.name), - optionalInputFields: [], - ...options, - }) - )}` - ) - .join("\n\n"); -} +const generate = generateCurryFunc( + generateSchema(resolve(join(__dirname, "..", "test-utils", "testSchema.graphql"))) +); describe("Language plugin tests", () => { describe("Query", () => { diff --git a/packages/reason-relay/language-plugin/src/test-utils/collapseString.ts b/packages/reason-relay/language-plugin/src/test-utils/collapseString.ts new file mode 100644 index 00000000..b6671ebf --- /dev/null +++ b/packages/reason-relay/language-plugin/src/test-utils/collapseString.ts @@ -0,0 +1,4 @@ +const collapseString = (str: string): string => + str.replace(/\r?\n|\r|\t/g, "").replace(/\s+/g, " "); + +export default collapseString; diff --git a/packages/reason-relay/language-plugin/src/test-utils/generate.ts b/packages/reason-relay/language-plugin/src/test-utils/generate.ts new file mode 100644 index 00000000..1663d572 --- /dev/null +++ b/packages/reason-relay/language-plugin/src/test-utils/generate.ts @@ -0,0 +1,36 @@ +import { CompilerContext, Schema } from "relay-compiler"; +import { printCode } from "../generator/Printer.gen"; +import * as RelayReasonGenerator from "../RelayReasonGenerator"; +import generateRelaySchema from "./generateRelaySchema"; +import parseGraphQLText from "./parseGraphQLText"; + +const generate = (testSchema: Schema) => ( + text: string, + options?: any, + extraDefs: string = "" +): string => { + const { definitions, schema: extendedSchema } = parseGraphQLText( + generateRelaySchema(testSchema, extraDefs), + text + ); + + const ctx = new CompilerContext(extendedSchema) + .addAll(definitions) + .applyTransforms(RelayReasonGenerator.transforms); + + return ctx + .documents() + .map( + (doc: any) => + `// ${doc.name}.graphql\n${printCode( + RelayReasonGenerator.generate(extendedSchema, doc, { + normalizationIR: ctx.get(doc.name), + optionalInputFields: [], + ...options, + }) + )}` + ) + .join("\n\n"); +}; + +export default generate; diff --git a/packages/reason-relay/language-plugin/src/test-utils/generateRelaySchema.ts b/packages/reason-relay/language-plugin/src/test-utils/generateRelaySchema.ts new file mode 100644 index 00000000..ff959a8a --- /dev/null +++ b/packages/reason-relay/language-plugin/src/test-utils/generateRelaySchema.ts @@ -0,0 +1,11 @@ +import { IRTransforms, Schema } from "relay-compiler"; +const getLanguagePlugin = require("../index"); + +const generateRelaySchema = (testSchema: Schema, extraDefs: string = "") => + testSchema.extend([ + ...IRTransforms.schemaExtensions, + ...getLanguagePlugin().schemaExtensions, + extraDefs, + ]); + +export default generateRelaySchema; diff --git a/packages/reason-relay/language-plugin/src/test-utils/generateSchema.ts b/packages/reason-relay/language-plugin/src/test-utils/generateSchema.ts new file mode 100644 index 00000000..76796f76 --- /dev/null +++ b/packages/reason-relay/language-plugin/src/test-utils/generateSchema.ts @@ -0,0 +1,10 @@ +import { readFileSync } from "fs"; +import { Source } from "graphql"; +import { Schema } from "relay-compiler"; + +const create = require("relay-compiler").Schema.create; + +const generateSchema = (path: string): Schema => + create(new Source(readFileSync(path, "utf8"))); + +export default generateSchema; diff --git a/packages/reason-relay/language-plugin/src/test-utils/index.ts b/packages/reason-relay/language-plugin/src/test-utils/index.ts new file mode 100644 index 00000000..27546b29 --- /dev/null +++ b/packages/reason-relay/language-plugin/src/test-utils/index.ts @@ -0,0 +1,13 @@ +import collapseString from "./collapseString"; +import generate from "./generate"; +import generateRelaySchema from "./generateRelaySchema"; +import generateSchema from "./generateSchema"; +import parseGraphQLText from "./parseGraphQLText"; + +export { + collapseString, + generate, + generateRelaySchema, + generateSchema, + parseGraphQLText, +}; diff --git a/packages/reason-relay/language-plugin/src/test-utils/parseGraphQLText.ts b/packages/reason-relay/language-plugin/src/test-utils/parseGraphQLText.ts new file mode 100644 index 00000000..7e3ddae9 --- /dev/null +++ b/packages/reason-relay/language-plugin/src/test-utils/parseGraphQLText.ts @@ -0,0 +1,33 @@ +import { parse } from "graphql"; +import { + convertASTDocuments, + Fragment, + Parser, + Root, + Schema, +} from "relay-compiler"; + +const parseGraphQLText = ( + schema: Schema, + text: string +): { + definitions: ReadonlyArray; + schema: Schema; +} => { + const ast = parse(text); + + const extendedSchema = schema.extend(ast); + + const definitions = convertASTDocuments( + extendedSchema, + [ast], + Parser.transform.bind(Parser) + ); + + return { + definitions, + schema: extendedSchema, + }; +}; + +export default parseGraphQLText; diff --git a/packages/reason-relay/language-plugin/src/__tests__/testSchema.graphql b/packages/reason-relay/language-plugin/src/test-utils/testSchema.graphql similarity index 100% rename from packages/reason-relay/language-plugin/src/__tests__/testSchema.graphql rename to packages/reason-relay/language-plugin/src/test-utils/testSchema.graphql From 1efb339dbf23ecda28589b9ee7e2948c18ba10c8 Mon Sep 17 00:00:00 2001 From: sorenhoyer Date: Wed, 28 Oct 2020 23:17:54 +0100 Subject: [PATCH 6/8] Search for the string "%relay" instead of both "[%relay." and "%relay." when parsing a file --- packages/reason-relay/language-plugin/src/FindGraphQLTags.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reason-relay/language-plugin/src/FindGraphQLTags.ts b/packages/reason-relay/language-plugin/src/FindGraphQLTags.ts index 76aa2d5a..be5714cc 100755 --- a/packages/reason-relay/language-plugin/src/FindGraphQLTags.ts +++ b/packages/reason-relay/language-plugin/src/FindGraphQLTags.ts @@ -3,12 +3,12 @@ import { GraphQLTag } from "relay-compiler/lib/language/RelayLanguagePluginInter const invariant = require("invariant"); function parseFile(text: string, file: string) { - if (!text.includes("[%relay.") && !text.includes("%relay.")) { + if (!text.includes("%relay")) { return []; } invariant( - text.indexOf("[%relay.") >= 0 || text.indexOf("%relay.") >= 0, + text.indexOf("%relay") >= 0, "RelayFileIRParser: Files should be filtered before passed to the " + "parser, got unfiltered file `%s`.", file From ab8013e90bc8deeb0cd016ea58be50c1bb48dab4 Mon Sep 17 00:00:00 2001 From: sorenhoyer Date: Thu, 29 Oct 2020 15:17:12 +0100 Subject: [PATCH 7/8] Updated CHANGELOG.md --- CHANGELOG.md | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfea348c..4f68b40b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,19 @@ -# master +# Master -- Bind `readInlineData` for fragments annotated with `@inline` -- Generate a `commitLocalPayload` for any query annotated with `@raw_response_type`, to allow comitting local only payloads in a type safe way. -- _BREAKING CHANGE_ replace unsetValue with setValueToUndefined and setValueToNull -- clean bindings, renamed internal raw types and functions with names ending with `Raw`, -- use abstract records instead of Js.t objects for a more robust type-check and to avoid undefined fields +## Breaking changes + +- _BREAKING CHANGE_ Replace unsetValue with setValueToUndefined and setValueToNull [#105](https://github.com/zth/reason-relay/pull/105) ([@tsnobip](https://github.com/tsnobip)) + +## New bindings + +- Bind `readInlineData` for fragments annotated with `@inline` [#117](https://github.com/zth/reason-relay/pull/117) ([@zth](https://github.com/zth)) +- Clean bindings, renamed internal raw types and functions with names ending with `Raw` [#105](https://github.com/zth/reason-relay/pull/105) ([@tsnobip](https://github.com/tsnobip)) + +## Fixes & misc + +- Generate a `commitLocalPayload` for any query annotated with `@raw_response_type`, to allow comitting local only payloads in a type safe way. [#118](https://github.com/zth/reason-relay/pull/118) ([@zth](https://github.com/zth)) +- Use abstract records instead of Js.t objects for a more robust type-check and to avoid undefined fields [#105](https://github.com/zth/reason-relay/pull/105) ([@tsnobip](https://github.com/tsnobip)) +- Add support for parsing ReScript (.res) files [#115](https://github.com/zth/reason-relay/pull/115) ([@sorenhoyer](https://github.com/sorenhoyer)) # 0.11.0 From 3a3bbd7eb3350984b05f158c4281ea7e599aa8a4 Mon Sep 17 00:00:00 2001 From: sorenhoyer Date: Thu, 29 Oct 2020 15:20:43 +0100 Subject: [PATCH 8/8] Undo typo --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f68b40b..af01b8e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# Master +# master ## Breaking changes