@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.
Files changed (124) hide show
  1. package/.eslintrc +21 -0
  2. package/.github/workflows/release.yml +24 -0
  3. package/.github/workflows/testing.yml +37 -0
  4. package/.nvmrc +1 -0
  5. package/.prettierignore +34 -0
  6. package/.prettierrc.json +1 -0
  7. package/.releaserc +27 -0
  8. package/CHANGELOG.md +6 -0
  9. package/README.md +15 -0
  10. package/dist/cjs/index.cjs +2646 -0
  11. package/dist/esm/client/gql.d.ts +1 -0
  12. package/dist/esm/client/gql.js +5 -0
  13. package/dist/esm/client/gql.js.map +1 -0
  14. package/dist/esm/client/index.d.ts +2 -0
  15. package/dist/esm/client/index.js +4 -0
  16. package/dist/esm/client/index.js.map +1 -0
  17. package/dist/esm/client/queries.d.ts +24 -0
  18. package/dist/esm/client/queries.js +152 -0
  19. package/dist/esm/client/queries.js.map +1 -0
  20. package/dist/esm/context.d.ts +30 -0
  21. package/dist/esm/context.js +2 -0
  22. package/dist/esm/context.js.map +1 -0
  23. package/dist/esm/errors.d.ts +17 -0
  24. package/dist/esm/errors.js +27 -0
  25. package/dist/esm/errors.js.map +1 -0
  26. package/dist/esm/generate/generate.d.ts +7 -0
  27. package/dist/esm/generate/generate.js +211 -0
  28. package/dist/esm/generate/generate.js.map +1 -0
  29. package/dist/esm/generate/index.d.ts +3 -0
  30. package/dist/esm/generate/index.js +5 -0
  31. package/dist/esm/generate/index.js.map +1 -0
  32. package/dist/esm/generate/mutations.d.ts +2 -0
  33. package/dist/esm/generate/mutations.js +18 -0
  34. package/dist/esm/generate/mutations.js.map +1 -0
  35. package/dist/esm/generate/utils.d.ts +22 -0
  36. package/dist/esm/generate/utils.js +150 -0
  37. package/dist/esm/generate/utils.js.map +1 -0
  38. package/dist/esm/index.d.ts +10 -0
  39. package/dist/esm/index.js +12 -0
  40. package/dist/esm/index.js.map +1 -0
  41. package/dist/esm/migrations/generate.d.ts +28 -0
  42. package/dist/esm/migrations/generate.js +516 -0
  43. package/dist/esm/migrations/generate.js.map +1 -0
  44. package/dist/esm/migrations/index.d.ts +1 -0
  45. package/dist/esm/migrations/index.js +3 -0
  46. package/dist/esm/migrations/index.js.map +1 -0
  47. package/dist/esm/models.d.ts +170 -0
  48. package/dist/esm/models.js +27 -0
  49. package/dist/esm/models.js.map +1 -0
  50. package/dist/esm/permissions/check.d.ts +15 -0
  51. package/dist/esm/permissions/check.js +162 -0
  52. package/dist/esm/permissions/check.js.map +1 -0
  53. package/dist/esm/permissions/generate.d.ts +45 -0
  54. package/dist/esm/permissions/generate.js +77 -0
  55. package/dist/esm/permissions/generate.js.map +1 -0
  56. package/dist/esm/permissions/index.d.ts +2 -0
  57. package/dist/esm/permissions/index.js +4 -0
  58. package/dist/esm/permissions/index.js.map +1 -0
  59. package/dist/esm/resolvers/arguments.d.ts +26 -0
  60. package/dist/esm/resolvers/arguments.js +88 -0
  61. package/dist/esm/resolvers/arguments.js.map +1 -0
  62. package/dist/esm/resolvers/filters.d.ts +5 -0
  63. package/dist/esm/resolvers/filters.js +126 -0
  64. package/dist/esm/resolvers/filters.js.map +1 -0
  65. package/dist/esm/resolvers/index.d.ts +7 -0
  66. package/dist/esm/resolvers/index.js +9 -0
  67. package/dist/esm/resolvers/index.js.map +1 -0
  68. package/dist/esm/resolvers/mutations.d.ts +3 -0
  69. package/dist/esm/resolvers/mutations.js +255 -0
  70. package/dist/esm/resolvers/mutations.js.map +1 -0
  71. package/dist/esm/resolvers/node.d.ts +44 -0
  72. package/dist/esm/resolvers/node.js +102 -0
  73. package/dist/esm/resolvers/node.js.map +1 -0
  74. package/dist/esm/resolvers/resolver.d.ts +5 -0
  75. package/dist/esm/resolvers/resolver.js +143 -0
  76. package/dist/esm/resolvers/resolver.js.map +1 -0
  77. package/dist/esm/resolvers/resolvers.d.ts +9 -0
  78. package/dist/esm/resolvers/resolvers.js +39 -0
  79. package/dist/esm/resolvers/resolvers.js.map +1 -0
  80. package/dist/esm/resolvers/utils.d.ts +43 -0
  81. package/dist/esm/resolvers/utils.js +125 -0
  82. package/dist/esm/resolvers/utils.js.map +1 -0
  83. package/dist/esm/utils.d.ts +25 -0
  84. package/dist/esm/utils.js +159 -0
  85. package/dist/esm/utils.js.map +1 -0
  86. package/dist/esm/values.d.ts +15 -0
  87. package/dist/esm/values.js +7 -0
  88. package/dist/esm/values.js.map +1 -0
  89. package/jest.config.ts +12 -0
  90. package/package.json +66 -0
  91. package/renovate.json +32 -0
  92. package/src/client/gql.ts +7 -0
  93. package/src/client/index.ts +4 -0
  94. package/src/client/queries.ts +251 -0
  95. package/src/context.ts +27 -0
  96. package/src/errors.ts +32 -0
  97. package/src/generate/generate.ts +273 -0
  98. package/src/generate/index.ts +5 -0
  99. package/src/generate/mutations.ts +35 -0
  100. package/src/generate/utils.ts +223 -0
  101. package/src/index.ts +12 -0
  102. package/src/migrations/generate.ts +633 -0
  103. package/src/migrations/index.ts +3 -0
  104. package/src/models.ts +228 -0
  105. package/src/permissions/check.ts +239 -0
  106. package/src/permissions/generate.ts +143 -0
  107. package/src/permissions/index.ts +4 -0
  108. package/src/resolvers/arguments.ts +129 -0
  109. package/src/resolvers/filters.ts +163 -0
  110. package/src/resolvers/index.ts +9 -0
  111. package/src/resolvers/mutations.ts +313 -0
  112. package/src/resolvers/node.ts +193 -0
  113. package/src/resolvers/resolver.ts +223 -0
  114. package/src/resolvers/resolvers.ts +40 -0
  115. package/src/resolvers/utils.ts +188 -0
  116. package/src/utils.ts +186 -0
  117. package/src/values.ts +19 -0
  118. package/tests/unit/__snapshots__/generate.spec.ts.snap +105 -0
  119. package/tests/unit/__snapshots__/resolve.spec.ts.snap +60 -0
  120. package/tests/unit/generate.spec.ts +8 -0
  121. package/tests/unit/resolve.spec.ts +128 -0
  122. package/tests/unit/utils.ts +82 -0
  123. package/tsconfig.jest.json +13 -0
  124. package/tsconfig.json +13 -0
@@ -0,0 +1,5 @@
1
+ // created from 'create-ts-index'
2
+
3
+ export * from './generate';
4
+ export * from './mutations';
5
+ export * from './utils';
@@ -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';