Skip to content
This repository was archived by the owner on May 10, 2018. It is now read-only.

Commit b8f784a

Browse files
authoredJan 15, 2018
feat(bindings): added prisma bindings (#36)
1 parent ccb4116 commit b8f784a

File tree

4 files changed

+145
-0
lines changed

4 files changed

+145
-0
lines changed
 

‎src/generators/index.ts

+4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import { generator as graphcooljsgenerator } from './graphcool-js'
22
import { generator as graphcooltsgenerator } from './graphcool-ts'
3+
import { generator as prismajsgenerator } from './prisma-js'
4+
import { generator as prismatsgenerator } from './prisma-ts'
35
import { generator as bindingtsgenerator } from './binding-ts'
46
import { generator as bindingjsgenerator } from './binding-js'
57
import { Generator } from '../types';
68

79
export const generators: { [key: string]: Generator} = {
810
'graphcool-js': graphcooljsgenerator,
911
'graphcool-ts': graphcooltsgenerator,
12+
'prisma-js': prismajsgenerator,
13+
'prisma-ts': prismatsgenerator,
1014
'binding-ts': bindingtsgenerator,
1115
'binding-js': bindingjsgenerator,
1216
}

‎src/generators/prisma-js.ts

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { GraphQLFieldMap, GraphQLInputObjectType, GraphQLObjectType, isListType, isWrappingType } from 'graphql';
2+
3+
import { Generator } from '../types';
4+
import { renderMainMethodFields, renderMainSubscriptionMethodFields } from './graphcool-js';
5+
6+
export const generator: Generator = {
7+
Main: renderMainMethod,
8+
Header: renderHeader,
9+
}
10+
11+
function renderHeader(schema: string): string {
12+
return `const { Prisma } = require('prisma-binding')
13+
const { GraphQLResolveInfo } = require('graphql')
14+
15+
const typeDefs = \`
16+
${schema}\``
17+
}
18+
19+
20+
function renderMainMethod(queryType: GraphQLObjectType, mutationType?: GraphQLObjectType | null, subscriptionType?: GraphQLObjectType | null) {
21+
return `module.exports.Prisma = class Binding extends Prisma {
22+
23+
constructor({ endpoint, secret, fragmentReplacements, debug }) {
24+
super({ typeDefs, endpoint, secret, fragmentReplacements, debug });
25+
26+
var self = this
27+
this.exists = {
28+
${renderExistsFields(queryType.getFields())}
29+
}
30+
31+
this.query = {
32+
${renderMainMethodFields('query', queryType.getFields())}
33+
}${mutationType ? `
34+
35+
this.mutation = {
36+
${renderMainMethodFields('mutation', mutationType.getFields())}
37+
}`: ''}${subscriptionType ? `
38+
39+
this.subscription = {
40+
${renderMainSubscriptionMethodFields('mutation', subscriptionType.getFields())}
41+
}`: ''}
42+
}
43+
44+
delegate(operation, field, args, context, info) {
45+
return super.delegate(operation, field, args, context, info)
46+
}
47+
}`
48+
}
49+
50+
export function renderExistsFields(fields: GraphQLFieldMap<any, any>) : string {
51+
return Object.keys(fields)
52+
.map(f => {
53+
const field = fields[f]
54+
let type = field.type
55+
let foundList = false
56+
// Traverse the wrapping types (if any)
57+
while (isWrappingType(type)) {
58+
type = type.ofType
59+
// One of those wrappings need to be a GraphQLList for this field to qualify
60+
foundList = foundList || isListType(type)
61+
}
62+
if (foundList) {
63+
const whereType = (field.args.find(a => a.name === 'where')!.type as GraphQLInputObjectType).name
64+
return ` ${type.name}(where) {
65+
return super.existsDelegate('query', '${field.name}', { where }, {}, '{ id }')
66+
}`
67+
}
68+
})
69+
.filter(f => f)
70+
.join(',\n')
71+
}

‎src/generators/prisma-ts.ts

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { GraphQLObjectType } from 'graphql';
2+
3+
import { Generator } from '../types';
4+
import {
5+
generator as gcgenerator,
6+
renderExistsFields,
7+
renderMainMethodFields,
8+
renderMainSubscriptionMethodFields,
9+
} from './graphcool-ts';
10+
11+
export const generator: Generator = {
12+
...gcgenerator,
13+
Main: renderMainMethod,
14+
Header: renderHeader,
15+
}
16+
17+
const scalarMapping = {
18+
Int: 'number',
19+
String: 'string',
20+
ID: 'string | number',
21+
Float: 'number',
22+
Boolean: 'boolean'
23+
}
24+
25+
function renderHeader(schema: string): string {
26+
return `import { Prisma as BasePrisma, BasePrismaOptions } from 'prisma-binding'
27+
import { GraphQLResolveInfo } from 'graphql'
28+
29+
const typeDefs = \`
30+
${schema}\``
31+
}
32+
33+
function renderMainMethod(
34+
queryType: GraphQLObjectType,
35+
mutationType?: GraphQLObjectType | null,
36+
subscriptionType?: GraphQLObjectType | null
37+
) {
38+
return `export class Prisma extends BasePrisma {
39+
40+
constructor({ endpoint, secret, fragmentReplacements, debug }: BasePrismaOptions) {
41+
super({ typeDefs, endpoint, secret, fragmentReplacements, debug });
42+
}
43+
44+
exists = {
45+
${renderExistsFields(queryType.getFields())}
46+
}
47+
48+
query: Query = {
49+
${renderMainMethodFields('query', queryType.getFields())}
50+
}${
51+
mutationType
52+
? `
53+
54+
mutation: Mutation = {
55+
${renderMainMethodFields('mutation', mutationType.getFields())}
56+
}`
57+
: ''
58+
}${
59+
subscriptionType
60+
? `
61+
62+
subscription: Subscription = {
63+
${renderMainSubscriptionMethodFields(subscriptionType.getFields())}
64+
}`
65+
: ''
66+
}
67+
}`
68+
}

‎test/test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -6802,5 +6802,7 @@ input ViewsWhereUniqueInput {
68026802

68036803
fs.writeFileSync('./testGraphcoolBinding.ts', generateCode(schema, generators['graphcool-ts']))
68046804
fs.writeFileSync('./testGraphcoolBinding.js', generateCode(schema, generators['graphcool-js']))
6805+
fs.writeFileSync('./testPrismaBinding.ts', generateCode(schema, generators['prisma-ts']))
6806+
fs.writeFileSync('./testPrismaBinding.js', generateCode(schema, generators['prisma-js']))
68056807
fs.writeFileSync('./testBinding.ts', generateCode(schema, generators['binding-ts']))
68066808
fs.writeFileSync('./testBinding.js', generateCode(schema, generators['binding-js']))

0 commit comments

Comments
 (0)
This repository has been archived.