@smartive/graphql-magic 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc +21 -0
- package/.github/workflows/release.yml +24 -0
- package/.github/workflows/testing.yml +37 -0
- package/.nvmrc +1 -0
- package/.prettierignore +34 -0
- package/.prettierrc.json +1 -0
- package/.releaserc +27 -0
- package/CHANGELOG.md +6 -0
- package/README.md +15 -0
- package/dist/cjs/index.cjs +2646 -0
- package/dist/esm/client/gql.d.ts +1 -0
- package/dist/esm/client/gql.js +5 -0
- package/dist/esm/client/gql.js.map +1 -0
- package/dist/esm/client/index.d.ts +2 -0
- package/dist/esm/client/index.js +4 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/client/queries.d.ts +24 -0
- package/dist/esm/client/queries.js +152 -0
- package/dist/esm/client/queries.js.map +1 -0
- package/dist/esm/context.d.ts +30 -0
- package/dist/esm/context.js +2 -0
- package/dist/esm/context.js.map +1 -0
- package/dist/esm/errors.d.ts +17 -0
- package/dist/esm/errors.js +27 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/generate/generate.d.ts +7 -0
- package/dist/esm/generate/generate.js +211 -0
- package/dist/esm/generate/generate.js.map +1 -0
- package/dist/esm/generate/index.d.ts +3 -0
- package/dist/esm/generate/index.js +5 -0
- package/dist/esm/generate/index.js.map +1 -0
- package/dist/esm/generate/mutations.d.ts +2 -0
- package/dist/esm/generate/mutations.js +18 -0
- package/dist/esm/generate/mutations.js.map +1 -0
- package/dist/esm/generate/utils.d.ts +22 -0
- package/dist/esm/generate/utils.js +150 -0
- package/dist/esm/generate/utils.js.map +1 -0
- package/dist/esm/index.d.ts +10 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/migrations/generate.d.ts +28 -0
- package/dist/esm/migrations/generate.js +516 -0
- package/dist/esm/migrations/generate.js.map +1 -0
- package/dist/esm/migrations/index.d.ts +1 -0
- package/dist/esm/migrations/index.js +3 -0
- package/dist/esm/migrations/index.js.map +1 -0
- package/dist/esm/models.d.ts +170 -0
- package/dist/esm/models.js +27 -0
- package/dist/esm/models.js.map +1 -0
- package/dist/esm/permissions/check.d.ts +15 -0
- package/dist/esm/permissions/check.js +162 -0
- package/dist/esm/permissions/check.js.map +1 -0
- package/dist/esm/permissions/generate.d.ts +45 -0
- package/dist/esm/permissions/generate.js +77 -0
- package/dist/esm/permissions/generate.js.map +1 -0
- package/dist/esm/permissions/index.d.ts +2 -0
- package/dist/esm/permissions/index.js +4 -0
- package/dist/esm/permissions/index.js.map +1 -0
- package/dist/esm/resolvers/arguments.d.ts +26 -0
- package/dist/esm/resolvers/arguments.js +88 -0
- package/dist/esm/resolvers/arguments.js.map +1 -0
- package/dist/esm/resolvers/filters.d.ts +5 -0
- package/dist/esm/resolvers/filters.js +126 -0
- package/dist/esm/resolvers/filters.js.map +1 -0
- package/dist/esm/resolvers/index.d.ts +7 -0
- package/dist/esm/resolvers/index.js +9 -0
- package/dist/esm/resolvers/index.js.map +1 -0
- package/dist/esm/resolvers/mutations.d.ts +3 -0
- package/dist/esm/resolvers/mutations.js +255 -0
- package/dist/esm/resolvers/mutations.js.map +1 -0
- package/dist/esm/resolvers/node.d.ts +44 -0
- package/dist/esm/resolvers/node.js +102 -0
- package/dist/esm/resolvers/node.js.map +1 -0
- package/dist/esm/resolvers/resolver.d.ts +5 -0
- package/dist/esm/resolvers/resolver.js +143 -0
- package/dist/esm/resolvers/resolver.js.map +1 -0
- package/dist/esm/resolvers/resolvers.d.ts +9 -0
- package/dist/esm/resolvers/resolvers.js +39 -0
- package/dist/esm/resolvers/resolvers.js.map +1 -0
- package/dist/esm/resolvers/utils.d.ts +43 -0
- package/dist/esm/resolvers/utils.js +125 -0
- package/dist/esm/resolvers/utils.js.map +1 -0
- package/dist/esm/utils.d.ts +25 -0
- package/dist/esm/utils.js +159 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/esm/values.d.ts +15 -0
- package/dist/esm/values.js +7 -0
- package/dist/esm/values.js.map +1 -0
- package/jest.config.ts +12 -0
- package/package.json +66 -0
- package/renovate.json +32 -0
- package/src/client/gql.ts +7 -0
- package/src/client/index.ts +4 -0
- package/src/client/queries.ts +251 -0
- package/src/context.ts +27 -0
- package/src/errors.ts +32 -0
- package/src/generate/generate.ts +273 -0
- package/src/generate/index.ts +5 -0
- package/src/generate/mutations.ts +35 -0
- package/src/generate/utils.ts +223 -0
- package/src/index.ts +12 -0
- package/src/migrations/generate.ts +633 -0
- package/src/migrations/index.ts +3 -0
- package/src/models.ts +228 -0
- package/src/permissions/check.ts +239 -0
- package/src/permissions/generate.ts +143 -0
- package/src/permissions/index.ts +4 -0
- package/src/resolvers/arguments.ts +129 -0
- package/src/resolvers/filters.ts +163 -0
- package/src/resolvers/index.ts +9 -0
- package/src/resolvers/mutations.ts +313 -0
- package/src/resolvers/node.ts +193 -0
- package/src/resolvers/resolver.ts +223 -0
- package/src/resolvers/resolvers.ts +40 -0
- package/src/resolvers/utils.ts +188 -0
- package/src/utils.ts +186 -0
- package/src/values.ts +19 -0
- package/tests/unit/__snapshots__/generate.spec.ts.snap +105 -0
- package/tests/unit/__snapshots__/resolve.spec.ts.snap +60 -0
- package/tests/unit/generate.spec.ts +8 -0
- package/tests/unit/resolve.spec.ts +128 -0
- package/tests/unit/utils.ts +82 -0
- package/tsconfig.jest.json +13 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import upperCase from 'lodash/upperCase';
|
|
2
|
+
import { Models } from '../models';
|
|
3
|
+
|
|
4
|
+
const constantCase = (str: string) => upperCase(str).replace(/ /g, '_');
|
|
5
|
+
|
|
6
|
+
export const generateMutations = (models: Models) => {
|
|
7
|
+
const parts: string[] = [];
|
|
8
|
+
for (const { name, creatable, updatable, deletable } of models) {
|
|
9
|
+
if (creatable) {
|
|
10
|
+
parts.push(
|
|
11
|
+
`export const CREATE_${constantCase(
|
|
12
|
+
name
|
|
13
|
+
)} = gql\`\n mutation Create${name}Mutation($data: Create${name}!) {\n create${name}(data: $data) { id }\n }\n\`;`
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (updatable) {
|
|
18
|
+
parts.push(
|
|
19
|
+
`export const UPDATE_${constantCase(
|
|
20
|
+
name
|
|
21
|
+
)} = gql\`\n mutation Update${name}Mutation($id: ID!, $data: Update${name}!) {\n update${name}(where: { id: $id }, data: $data) { id }\n }\n\`;`
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (deletable) {
|
|
26
|
+
parts.push(
|
|
27
|
+
`export const DELETE_${constantCase(
|
|
28
|
+
name
|
|
29
|
+
)} = gql\`\n mutation Delete${name}Mutation($id: ID!) {\n delete${name}(where: { id: $id })\n }\n\`;`
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return `import { gql } from "@smartive-private/graphql-magic";\n\n${parts.join('\n\n')}`;
|
|
35
|
+
};
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ArgumentNode,
|
|
3
|
+
DefinitionNode,
|
|
4
|
+
DirectiveDefinitionNode,
|
|
5
|
+
DirectiveNode,
|
|
6
|
+
DocumentNode,
|
|
7
|
+
EnumTypeDefinitionNode,
|
|
8
|
+
EnumValueDefinitionNode,
|
|
9
|
+
FieldDefinitionNode,
|
|
10
|
+
InputObjectTypeDefinitionNode,
|
|
11
|
+
InputValueDefinitionNode,
|
|
12
|
+
InterfaceTypeDefinitionNode,
|
|
13
|
+
ListTypeNode,
|
|
14
|
+
NamedTypeNode,
|
|
15
|
+
NameNode,
|
|
16
|
+
NonNullTypeNode,
|
|
17
|
+
ObjectFieldNode,
|
|
18
|
+
ObjectTypeDefinitionNode,
|
|
19
|
+
ScalarTypeDefinitionNode,
|
|
20
|
+
StringValueNode,
|
|
21
|
+
TypeNode,
|
|
22
|
+
ValueNode,
|
|
23
|
+
} from 'graphql';
|
|
24
|
+
import { DateTime } from 'luxon';
|
|
25
|
+
import { Field } from '../models';
|
|
26
|
+
import { Directive, Enum, Value, Values } from '../values';
|
|
27
|
+
|
|
28
|
+
export type DirectiveLocation =
|
|
29
|
+
| 'ARGUMENT_DEFINITION'
|
|
30
|
+
| 'INPUT_FIELD_DEFINITION'
|
|
31
|
+
| 'FIELD'
|
|
32
|
+
| 'FIELD_DEFINITION'
|
|
33
|
+
| 'OBJECT'
|
|
34
|
+
| 'INTERFACE'
|
|
35
|
+
| 'INPUT_OBJECT';
|
|
36
|
+
|
|
37
|
+
export const document = (definitions: DefinitionNode[]): DocumentNode => ({
|
|
38
|
+
kind: 'Document',
|
|
39
|
+
definitions,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
export const directive = (nme: string, locations: DirectiveLocation[], fields?: Field[]): DirectiveDefinitionNode => ({
|
|
43
|
+
name: name(nme),
|
|
44
|
+
repeatable: false,
|
|
45
|
+
kind: 'DirectiveDefinition',
|
|
46
|
+
arguments: fields && inputValues(fields),
|
|
47
|
+
locations: locations.map(name),
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
export const scalar = (nme: string): ScalarTypeDefinitionNode => ({
|
|
51
|
+
name: name(nme),
|
|
52
|
+
kind: 'ScalarTypeDefinition',
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
export const input = (nme: string, fields: Field[], dvs?: Directive[]): InputObjectTypeDefinitionNode => ({
|
|
56
|
+
name: name(nme),
|
|
57
|
+
fields: inputValues(fields),
|
|
58
|
+
kind: 'InputObjectTypeDefinition',
|
|
59
|
+
directives: directives(dvs),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
export const object = (nme: string, fds: Field[], interfaces?: string[], dvs?: Directive[]): ObjectTypeDefinitionNode => ({
|
|
63
|
+
name: name(nme),
|
|
64
|
+
fields: fields(fds),
|
|
65
|
+
kind: 'ObjectTypeDefinition',
|
|
66
|
+
interfaces: interfaces && interfaces.map((i) => namedType(i)),
|
|
67
|
+
directives: directives(dvs),
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
export const iface = (nme: string, fds: Field[], dvs?: Directive[]): InterfaceTypeDefinitionNode => ({
|
|
71
|
+
name: name(nme),
|
|
72
|
+
fields: fields(fds),
|
|
73
|
+
kind: 'InterfaceTypeDefinition',
|
|
74
|
+
directives: directives(dvs),
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
export const inputValues = (fields: Field[]): InputValueDefinitionNode[] =>
|
|
78
|
+
fields.map(
|
|
79
|
+
(field): InputValueDefinitionNode => ({
|
|
80
|
+
kind: 'InputValueDefinition',
|
|
81
|
+
name: name(field.name),
|
|
82
|
+
type: fieldType(field),
|
|
83
|
+
defaultValue: field.default === undefined ? undefined : value(field.default),
|
|
84
|
+
directives: directives(field.directives),
|
|
85
|
+
})
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
export const fields = (fields: Field[]): FieldDefinitionNode[] =>
|
|
89
|
+
fields.map(
|
|
90
|
+
(field): FieldDefinitionNode => ({
|
|
91
|
+
kind: 'FieldDefinition',
|
|
92
|
+
name: name(field.name),
|
|
93
|
+
type: fieldType(field),
|
|
94
|
+
arguments: field.args?.map((arg) => ({
|
|
95
|
+
kind: 'InputValueDefinition',
|
|
96
|
+
name: name(arg.name),
|
|
97
|
+
type: fieldType(arg),
|
|
98
|
+
defaultValue: arg.default === undefined ? undefined : value(arg.default),
|
|
99
|
+
})),
|
|
100
|
+
directives: directives(field.directives),
|
|
101
|
+
})
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
export const inputValue = (
|
|
105
|
+
nme: string,
|
|
106
|
+
type: TypeNode,
|
|
107
|
+
dvs?: Directive[],
|
|
108
|
+
description?: string,
|
|
109
|
+
defaultValue?: Value
|
|
110
|
+
): InputValueDefinitionNode => ({
|
|
111
|
+
name: name(nme),
|
|
112
|
+
type,
|
|
113
|
+
kind: 'InputValueDefinition',
|
|
114
|
+
directives: directives(dvs),
|
|
115
|
+
defaultValue: defaultValue ? value(defaultValue) : undefined,
|
|
116
|
+
description: description ? (value(description) as StringValueNode) : undefined,
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
export const directives = (directives?: Directive[]): DirectiveNode[] | undefined =>
|
|
120
|
+
directives?.map(
|
|
121
|
+
(directive): DirectiveNode => ({
|
|
122
|
+
kind: 'Directive',
|
|
123
|
+
name: name(directive.name),
|
|
124
|
+
arguments: args(directive.values),
|
|
125
|
+
})
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
export const args = (ags: Values | undefined): ReadonlyArray<ArgumentNode> | undefined =>
|
|
129
|
+
ags?.map(
|
|
130
|
+
(argument): ArgumentNode => ({
|
|
131
|
+
kind: 'Argument',
|
|
132
|
+
name: name(argument.name),
|
|
133
|
+
value: value(argument.values),
|
|
134
|
+
})
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
export const enm = (nme: string, values: string[]): EnumTypeDefinitionNode => ({
|
|
138
|
+
name: name(nme),
|
|
139
|
+
kind: 'EnumTypeDefinition',
|
|
140
|
+
values: values.map(
|
|
141
|
+
(v): EnumValueDefinitionNode => ({
|
|
142
|
+
kind: 'EnumValueDefinition',
|
|
143
|
+
name: name(v),
|
|
144
|
+
})
|
|
145
|
+
),
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
export const nonNull = (type: NamedTypeNode | ListTypeNode): NonNullTypeNode => ({
|
|
149
|
+
type,
|
|
150
|
+
kind: 'NonNullType',
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
export const namedType = (nme: string): NamedTypeNode => ({
|
|
154
|
+
kind: 'NamedType',
|
|
155
|
+
name: name(nme),
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
export const list = (type: TypeNode): ListTypeNode => ({
|
|
159
|
+
type,
|
|
160
|
+
kind: 'ListType',
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
export const name = (name: string): NameNode => ({
|
|
164
|
+
kind: 'Name',
|
|
165
|
+
value: name,
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
export const fieldType = (field: Field) => {
|
|
169
|
+
let type: TypeNode = namedType(field.type);
|
|
170
|
+
if (field.list) {
|
|
171
|
+
type = list(nonNull(type));
|
|
172
|
+
}
|
|
173
|
+
if (field.nonNull) {
|
|
174
|
+
type = nonNull(type);
|
|
175
|
+
}
|
|
176
|
+
return type;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
export const value = (val: Value = null): ValueNode =>
|
|
180
|
+
val === null
|
|
181
|
+
? {
|
|
182
|
+
kind: 'NullValue',
|
|
183
|
+
}
|
|
184
|
+
: typeof val === 'boolean'
|
|
185
|
+
? {
|
|
186
|
+
kind: 'BooleanValue',
|
|
187
|
+
value: val,
|
|
188
|
+
}
|
|
189
|
+
: typeof val === 'number'
|
|
190
|
+
? {
|
|
191
|
+
kind: 'IntValue',
|
|
192
|
+
value: `${val}`,
|
|
193
|
+
}
|
|
194
|
+
: typeof val === 'string'
|
|
195
|
+
? {
|
|
196
|
+
kind: 'StringValue',
|
|
197
|
+
value: val,
|
|
198
|
+
}
|
|
199
|
+
: val instanceof Enum
|
|
200
|
+
? {
|
|
201
|
+
kind: 'EnumValue',
|
|
202
|
+
value: val.value,
|
|
203
|
+
}
|
|
204
|
+
: Array.isArray(val)
|
|
205
|
+
? {
|
|
206
|
+
kind: 'ListValue',
|
|
207
|
+
values: val.map(value),
|
|
208
|
+
}
|
|
209
|
+
: val instanceof DateTime
|
|
210
|
+
? {
|
|
211
|
+
kind: 'StringValue',
|
|
212
|
+
value: val.toString(),
|
|
213
|
+
}
|
|
214
|
+
: {
|
|
215
|
+
kind: 'ObjectValue',
|
|
216
|
+
fields: Object.keys(val).map(
|
|
217
|
+
(nme): ObjectFieldNode => ({
|
|
218
|
+
kind: 'ObjectField',
|
|
219
|
+
name: name(nme),
|
|
220
|
+
value: value(val[nme]),
|
|
221
|
+
})
|
|
222
|
+
),
|
|
223
|
+
};
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// created from 'create-ts-index'
|
|
2
|
+
|
|
3
|
+
export * from './client';
|
|
4
|
+
export * from './generate';
|
|
5
|
+
export * from './migrations';
|
|
6
|
+
export * from './permissions';
|
|
7
|
+
export * from './resolvers';
|
|
8
|
+
export * from './context';
|
|
9
|
+
export * from './errors';
|
|
10
|
+
export * from './models';
|
|
11
|
+
export * from './utils';
|
|
12
|
+
export * from './values';
|