@smartive/graphql-magic 9.1.2 → 10.0.0

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 (120) hide show
  1. package/.eslintrc +2 -10
  2. package/.github/workflows/release.yml +1 -1
  3. package/.gqmrc.json +6 -0
  4. package/CHANGELOG.md +2 -2
  5. package/README.md +1 -1
  6. package/dist/bin/gqm.cjs +684 -330
  7. package/dist/cjs/index.cjs +998 -554
  8. package/dist/esm/api/execute.js +1 -1
  9. package/dist/esm/api/execute.js.map +1 -1
  10. package/dist/esm/client/mutations.d.ts +2 -2
  11. package/dist/esm/client/mutations.js +5 -4
  12. package/dist/esm/client/mutations.js.map +1 -1
  13. package/dist/esm/client/queries.d.ts +12 -17
  14. package/dist/esm/client/queries.js +30 -50
  15. package/dist/esm/client/queries.js.map +1 -1
  16. package/dist/esm/context.d.ts +1 -2
  17. package/dist/esm/db/generate.d.ts +3 -3
  18. package/dist/esm/db/generate.js +31 -29
  19. package/dist/esm/db/generate.js.map +1 -1
  20. package/dist/esm/migrations/generate.d.ts +3 -4
  21. package/dist/esm/migrations/generate.js +114 -107
  22. package/dist/esm/migrations/generate.js.map +1 -1
  23. package/dist/esm/models/index.d.ts +1 -0
  24. package/dist/esm/models/index.js +1 -0
  25. package/dist/esm/models/index.js.map +1 -1
  26. package/dist/esm/models/model-definitions.d.ts +189 -0
  27. package/dist/esm/models/model-definitions.js +2 -0
  28. package/dist/esm/models/model-definitions.js.map +1 -0
  29. package/dist/esm/models/models.d.ts +128 -174
  30. package/dist/esm/models/models.js +411 -1
  31. package/dist/esm/models/models.js.map +1 -1
  32. package/dist/esm/models/mutation-hook.d.ts +2 -2
  33. package/dist/esm/models/utils.d.ts +35 -497
  34. package/dist/esm/models/utils.js +21 -144
  35. package/dist/esm/models/utils.js.map +1 -1
  36. package/dist/esm/permissions/check.d.ts +3 -3
  37. package/dist/esm/permissions/check.js +14 -7
  38. package/dist/esm/permissions/check.js.map +1 -1
  39. package/dist/esm/permissions/generate.js +6 -6
  40. package/dist/esm/permissions/generate.js.map +1 -1
  41. package/dist/esm/resolvers/filters.d.ts +8 -0
  42. package/dist/esm/resolvers/filters.js +28 -25
  43. package/dist/esm/resolvers/filters.js.map +1 -1
  44. package/dist/esm/resolvers/index.d.ts +1 -0
  45. package/dist/esm/resolvers/index.js +1 -0
  46. package/dist/esm/resolvers/index.js.map +1 -1
  47. package/dist/esm/resolvers/mutations.js +85 -21
  48. package/dist/esm/resolvers/mutations.js.map +1 -1
  49. package/dist/esm/resolvers/node.d.ts +13 -15
  50. package/dist/esm/resolvers/node.js +41 -36
  51. package/dist/esm/resolvers/node.js.map +1 -1
  52. package/dist/esm/resolvers/resolver.js +19 -49
  53. package/dist/esm/resolvers/resolver.js.map +1 -1
  54. package/dist/esm/resolvers/resolvers.d.ts +1 -8
  55. package/dist/esm/resolvers/resolvers.js +15 -7
  56. package/dist/esm/resolvers/resolvers.js.map +1 -1
  57. package/dist/esm/resolvers/selects.d.ts +3 -0
  58. package/dist/esm/resolvers/selects.js +50 -0
  59. package/dist/esm/resolvers/selects.js.map +1 -0
  60. package/dist/esm/resolvers/utils.d.ts +12 -4
  61. package/dist/esm/resolvers/utils.js +30 -22
  62. package/dist/esm/resolvers/utils.js.map +1 -1
  63. package/dist/esm/schema/generate.d.ts +4 -4
  64. package/dist/esm/schema/generate.js +122 -131
  65. package/dist/esm/schema/generate.js.map +1 -1
  66. package/dist/esm/schema/utils.d.ts +1 -1
  67. package/dist/esm/schema/utils.js +2 -1
  68. package/dist/esm/schema/utils.js.map +1 -1
  69. package/knexfile.ts +31 -0
  70. package/migrations/20230912185644_setup.ts +127 -0
  71. package/package.json +16 -14
  72. package/src/api/execute.ts +1 -1
  73. package/src/bin/gqm/gqm.ts +25 -23
  74. package/src/bin/gqm/parse-models.ts +5 -5
  75. package/src/bin/gqm/settings.ts +13 -4
  76. package/src/bin/gqm/static-eval.ts +5 -0
  77. package/src/bin/gqm/templates.ts +23 -3
  78. package/src/client/mutations.ts +11 -5
  79. package/src/client/queries.ts +43 -80
  80. package/src/context.ts +1 -2
  81. package/src/db/generate.ts +41 -41
  82. package/src/migrations/generate.ts +165 -146
  83. package/src/models/index.ts +1 -0
  84. package/src/models/model-definitions.ts +168 -0
  85. package/src/models/models.ts +510 -166
  86. package/src/models/mutation-hook.ts +2 -2
  87. package/src/models/utils.ts +53 -187
  88. package/src/permissions/check.ts +19 -11
  89. package/src/permissions/generate.ts +6 -6
  90. package/src/resolvers/filters.ts +44 -28
  91. package/src/resolvers/index.ts +1 -0
  92. package/src/resolvers/mutations.ts +98 -36
  93. package/src/resolvers/node.ts +79 -51
  94. package/src/resolvers/resolver.ts +20 -74
  95. package/src/resolvers/resolvers.ts +18 -7
  96. package/src/resolvers/selects.ts +77 -0
  97. package/src/resolvers/utils.ts +41 -25
  98. package/src/schema/generate.ts +106 -127
  99. package/src/schema/utils.ts +2 -1
  100. package/tests/api/__snapshots__/inheritance.spec.ts.snap +83 -0
  101. package/tests/api/inheritance.spec.ts +130 -0
  102. package/tests/generated/api/index.ts +1174 -0
  103. package/tests/generated/client/index.ts +1163 -0
  104. package/tests/generated/client/mutations.ts +109 -0
  105. package/tests/generated/db/index.ts +291 -0
  106. package/tests/generated/db/knex.ts +14 -0
  107. package/tests/generated/models.json +675 -0
  108. package/tests/generated/schema.graphql +325 -0
  109. package/tests/unit/__snapshots__/resolve.spec.ts.snap +23 -0
  110. package/tests/unit/queries.spec.ts +5 -5
  111. package/tests/unit/resolve.spec.ts +8 -8
  112. package/tests/utils/database/knex.ts +5 -13
  113. package/tests/utils/database/seed.ts +57 -18
  114. package/tests/utils/models.ts +62 -7
  115. package/tests/utils/server.ts +5 -5
  116. package/tsconfig.eslint.json +1 -0
  117. package/tests/unit/__snapshots__/generate.spec.ts.snap +0 -128
  118. package/tests/unit/generate.spec.ts +0 -8
  119. package/tests/utils/database/schema.ts +0 -64
  120. package/tests/utils/generate-migration.ts +0 -24
@@ -0,0 +1,325 @@
1
+ type AnotherObject {
2
+ id: ID!
3
+ name: String
4
+ myself: AnotherObject
5
+ deleted: Boolean!
6
+ deletedAt: DateTime
7
+ deletedBy: User
8
+ self(where: AnotherObjectWhere, orderBy: [AnotherObjectOrderBy!], limit: Int, offset: Int): AnotherObject
9
+ manyObjects(where: SomeObjectWhere, search: String, orderBy: [SomeObjectOrderBy!], limit: Int, offset: Int): [SomeObject!]!
10
+ }
11
+
12
+ input AnotherObjectOrderBy {
13
+ name: Order
14
+ deletedAt: Order
15
+ }
16
+
17
+ input AnotherObjectWhere {
18
+ id: [ID!]
19
+ deleted: [Boolean!]
20
+ }
21
+
22
+ input AnotherObjectWhereUnique {
23
+ id: ID
24
+ }
25
+
26
+ type Answer implements Reaction {
27
+ id: ID!
28
+ type: ReactionType!
29
+ parent: Reaction
30
+ content: String
31
+ createdAt: DateTime!
32
+ createdBy: User!
33
+ updatedAt: DateTime!
34
+ updatedBy: User!
35
+ deleted: Boolean!
36
+ deletedAt: DateTime
37
+ deletedBy: User
38
+ childReactions(where: ReactionWhere, orderBy: [ReactionOrderBy!], limit: Int, offset: Int): [Reaction!]!
39
+ childReviews(where: ReviewWhere, orderBy: [ReviewOrderBy!], limit: Int, offset: Int): [Review!]!
40
+ childQuestions(where: QuestionWhere, orderBy: [QuestionOrderBy!], limit: Int, offset: Int): [Question!]!
41
+ childAnswers(where: AnswerWhere, orderBy: [AnswerOrderBy!], limit: Int, offset: Int): [Answer!]!
42
+ }
43
+
44
+ input AnswerOrderBy {
45
+ createdAt: Order
46
+ updatedAt: Order
47
+ deletedAt: Order
48
+ }
49
+
50
+ input AnswerWhere {
51
+ id: [ID!]
52
+ deleted: [Boolean!]
53
+ }
54
+
55
+ input AnswerWhereUnique {
56
+ id: ID
57
+ }
58
+
59
+ input CreateAnswer {
60
+ content: String
61
+ }
62
+
63
+ input CreateQuestion {
64
+ content: String
65
+ }
66
+
67
+ input CreateReview {
68
+ content: String
69
+ rating: Float
70
+ }
71
+
72
+ input CreateSomeObject {
73
+ xyz: Int!
74
+ }
75
+
76
+ scalar DateTime
77
+
78
+ type Mutation {
79
+ deleteAnotherObject(where: AnotherObjectWhereUnique!, dryRun: Boolean): ID!
80
+ restoreAnotherObject(where: AnotherObjectWhereUnique!): ID!
81
+ createSomeObject(data: CreateSomeObject!): SomeObject!
82
+ updateSomeObject(where: SomeObjectWhereUnique!, data: UpdateSomeObject!): SomeObject!
83
+ deleteSomeObject(where: SomeObjectWhereUnique!, dryRun: Boolean): ID!
84
+ restoreSomeObject(where: SomeObjectWhereUnique!): ID!
85
+ createReview(data: CreateReview!): Review!
86
+ updateReview(where: ReviewWhereUnique!, data: UpdateReview!): Review!
87
+ deleteReview(where: ReviewWhereUnique!, dryRun: Boolean): ID!
88
+ restoreReview(where: ReviewWhereUnique!): ID!
89
+ createQuestion(data: CreateQuestion!): Question!
90
+ updateQuestion(where: QuestionWhereUnique!, data: UpdateQuestion!): Question!
91
+ deleteQuestion(where: QuestionWhereUnique!, dryRun: Boolean): ID!
92
+ restoreQuestion(where: QuestionWhereUnique!): ID!
93
+ createAnswer(data: CreateAnswer!): Answer!
94
+ updateAnswer(where: AnswerWhereUnique!, data: UpdateAnswer!): Answer!
95
+ deleteAnswer(where: AnswerWhereUnique!, dryRun: Boolean): ID!
96
+ restoreAnswer(where: AnswerWhereUnique!): ID!
97
+ }
98
+
99
+ enum Order {
100
+ ASC
101
+ DESC
102
+ }
103
+
104
+ type Query {
105
+ me: User
106
+ someObject(where: SomeObjectWhereUnique!): SomeObject!
107
+ reaction(where: ReactionWhereUnique!): Reaction!
108
+ review(where: ReviewWhereUnique!): Review!
109
+ question(where: QuestionWhereUnique!): Question!
110
+ answer(where: AnswerWhereUnique!): Answer!
111
+ anotherObjects(where: AnotherObjectWhere, orderBy: [AnotherObjectOrderBy!], limit: Int, offset: Int): [AnotherObject!]!
112
+ manyObjects(where: SomeObjectWhere, search: String, orderBy: [SomeObjectOrderBy!], limit: Int, offset: Int): [SomeObject!]!
113
+ reactions(where: ReactionWhere, orderBy: [ReactionOrderBy!], limit: Int, offset: Int): [Reaction!]!
114
+ reviews(where: ReviewWhere, orderBy: [ReviewOrderBy!], limit: Int, offset: Int): [Review!]!
115
+ questions(where: QuestionWhere, orderBy: [QuestionOrderBy!], limit: Int, offset: Int): [Question!]!
116
+ answers(where: AnswerWhere, orderBy: [AnswerOrderBy!], limit: Int, offset: Int): [Answer!]!
117
+ }
118
+
119
+ type Question implements Reaction {
120
+ id: ID!
121
+ type: ReactionType!
122
+ parent: Reaction
123
+ content: String
124
+ createdAt: DateTime!
125
+ createdBy: User!
126
+ updatedAt: DateTime!
127
+ updatedBy: User!
128
+ deleted: Boolean!
129
+ deletedAt: DateTime
130
+ deletedBy: User
131
+ childReactions(where: ReactionWhere, orderBy: [ReactionOrderBy!], limit: Int, offset: Int): [Reaction!]!
132
+ childReviews(where: ReviewWhere, orderBy: [ReviewOrderBy!], limit: Int, offset: Int): [Review!]!
133
+ childQuestions(where: QuestionWhere, orderBy: [QuestionOrderBy!], limit: Int, offset: Int): [Question!]!
134
+ childAnswers(where: AnswerWhere, orderBy: [AnswerOrderBy!], limit: Int, offset: Int): [Answer!]!
135
+ }
136
+
137
+ input QuestionOrderBy {
138
+ createdAt: Order
139
+ updatedAt: Order
140
+ deletedAt: Order
141
+ }
142
+
143
+ input QuestionWhere {
144
+ id: [ID!]
145
+ deleted: [Boolean!]
146
+ }
147
+
148
+ input QuestionWhereUnique {
149
+ id: ID
150
+ }
151
+
152
+ interface Reaction {
153
+ id: ID!
154
+ type: ReactionType!
155
+ parent: Reaction
156
+ content: String
157
+ createdAt: DateTime!
158
+ createdBy: User!
159
+ updatedAt: DateTime!
160
+ updatedBy: User!
161
+ deleted: Boolean!
162
+ deletedAt: DateTime
163
+ deletedBy: User
164
+ childReactions(where: ReactionWhere, orderBy: [ReactionOrderBy!], limit: Int, offset: Int): [Reaction!]!
165
+ childReviews(where: ReviewWhere, orderBy: [ReviewOrderBy!], limit: Int, offset: Int): [Review!]!
166
+ childQuestions(where: QuestionWhere, orderBy: [QuestionOrderBy!], limit: Int, offset: Int): [Question!]!
167
+ childAnswers(where: AnswerWhere, orderBy: [AnswerOrderBy!], limit: Int, offset: Int): [Answer!]!
168
+ }
169
+
170
+ input ReactionOrderBy {
171
+ createdAt: Order
172
+ updatedAt: Order
173
+ deletedAt: Order
174
+ }
175
+
176
+ enum ReactionType {
177
+ Review
178
+ Question
179
+ Answer
180
+ }
181
+
182
+ input ReactionWhere {
183
+ id: [ID!]
184
+ deleted: [Boolean!]
185
+ }
186
+
187
+ input ReactionWhereUnique {
188
+ id: ID
189
+ }
190
+
191
+ type Review implements Reaction {
192
+ id: ID!
193
+ type: ReactionType!
194
+ parent: Reaction
195
+ content: String
196
+ createdAt: DateTime!
197
+ createdBy: User!
198
+ updatedAt: DateTime!
199
+ updatedBy: User!
200
+ deleted: Boolean!
201
+ deletedAt: DateTime
202
+ deletedBy: User
203
+ rating: Float
204
+ childReactions(where: ReactionWhere, orderBy: [ReactionOrderBy!], limit: Int, offset: Int): [Reaction!]!
205
+ childReviews(where: ReviewWhere, orderBy: [ReviewOrderBy!], limit: Int, offset: Int): [Review!]!
206
+ childQuestions(where: QuestionWhere, orderBy: [QuestionOrderBy!], limit: Int, offset: Int): [Question!]!
207
+ childAnswers(where: AnswerWhere, orderBy: [AnswerOrderBy!], limit: Int, offset: Int): [Answer!]!
208
+ }
209
+
210
+ input ReviewOrderBy {
211
+ createdAt: Order
212
+ updatedAt: Order
213
+ deletedAt: Order
214
+ }
215
+
216
+ input ReviewWhere {
217
+ id: [ID!]
218
+ deleted: [Boolean!]
219
+ rating_GT: Float
220
+ rating_GTE: Float
221
+ rating_LT: Float
222
+ rating_LTE: Float
223
+ }
224
+
225
+ input ReviewWhereUnique {
226
+ id: ID
227
+ }
228
+
229
+ enum Role {
230
+ ADMIN
231
+ USER
232
+ }
233
+
234
+ enum SomeEnum {
235
+ A
236
+ B
237
+ C
238
+ }
239
+
240
+ type SomeObject {
241
+ id: ID!
242
+ field: String
243
+ another: AnotherObject!
244
+ float: Float!
245
+ list(magic: Boolean): [SomeEnum!]!
246
+ xyz: Int!
247
+ createdAt: DateTime!
248
+ createdBy: User!
249
+ updatedAt: DateTime!
250
+ updatedBy: User!
251
+ deleted: Boolean!
252
+ deletedAt: DateTime
253
+ deletedBy: User
254
+ }
255
+
256
+ input SomeObjectOrderBy {
257
+ xyz: Order
258
+ createdAt: Order
259
+ updatedAt: Order
260
+ deletedAt: Order
261
+ }
262
+
263
+ input SomeObjectWhere {
264
+ id: [ID!]
265
+ deleted: [Boolean!]
266
+ another: AnotherObjectWhere
267
+ }
268
+
269
+ input SomeObjectWhereUnique {
270
+ id: ID
271
+ }
272
+
273
+ type SomeRawObject {
274
+ field: String
275
+ }
276
+
277
+ input UpdateAnswer {
278
+ content: String
279
+ }
280
+
281
+ input UpdateQuestion {
282
+ content: String
283
+ }
284
+
285
+ input UpdateReview {
286
+ content: String
287
+ rating: Float
288
+ }
289
+
290
+ input UpdateSomeObject {
291
+ anotherId: ID
292
+ xyz: Int
293
+ }
294
+
295
+ scalar Upload
296
+
297
+ type User {
298
+ id: ID!
299
+ username: String
300
+ role: Role
301
+ deletedAnotherObjects(where: AnotherObjectWhere, orderBy: [AnotherObjectOrderBy!], limit: Int, offset: Int): [AnotherObject!]!
302
+ createdManyObjects(where: SomeObjectWhere, search: String, orderBy: [SomeObjectOrderBy!], limit: Int, offset: Int): [SomeObject!]!
303
+ updatedManyObjects(where: SomeObjectWhere, search: String, orderBy: [SomeObjectOrderBy!], limit: Int, offset: Int): [SomeObject!]!
304
+ deletedManyObjects(where: SomeObjectWhere, search: String, orderBy: [SomeObjectOrderBy!], limit: Int, offset: Int): [SomeObject!]!
305
+ createdReactions(where: ReactionWhere, orderBy: [ReactionOrderBy!], limit: Int, offset: Int): [Reaction!]!
306
+ updatedReactions(where: ReactionWhere, orderBy: [ReactionOrderBy!], limit: Int, offset: Int): [Reaction!]!
307
+ deletedReactions(where: ReactionWhere, orderBy: [ReactionOrderBy!], limit: Int, offset: Int): [Reaction!]!
308
+ createdReviews(where: ReviewWhere, orderBy: [ReviewOrderBy!], limit: Int, offset: Int): [Review!]!
309
+ updatedReviews(where: ReviewWhere, orderBy: [ReviewOrderBy!], limit: Int, offset: Int): [Review!]!
310
+ deletedReviews(where: ReviewWhere, orderBy: [ReviewOrderBy!], limit: Int, offset: Int): [Review!]!
311
+ createdQuestions(where: QuestionWhere, orderBy: [QuestionOrderBy!], limit: Int, offset: Int): [Question!]!
312
+ updatedQuestions(where: QuestionWhere, orderBy: [QuestionOrderBy!], limit: Int, offset: Int): [Question!]!
313
+ deletedQuestions(where: QuestionWhere, orderBy: [QuestionOrderBy!], limit: Int, offset: Int): [Question!]!
314
+ createdAnswers(where: AnswerWhere, orderBy: [AnswerOrderBy!], limit: Int, offset: Int): [Answer!]!
315
+ updatedAnswers(where: AnswerWhere, orderBy: [AnswerOrderBy!], limit: Int, offset: Int): [Answer!]!
316
+ deletedAnswers(where: AnswerWhere, orderBy: [AnswerOrderBy!], limit: Int, offset: Int): [Answer!]!
317
+ }
318
+
319
+ input UserWhere {
320
+ id: [ID!]
321
+ }
322
+
323
+ input UserWhereUnique {
324
+ id: ID
325
+ }
@@ -3,19 +3,42 @@
3
3
  exports[`resolvers are generated correctly 1`] = `
4
4
  {
5
5
  "Mutation": {
6
+ "createAnswer": [Function],
7
+ "createQuestion": [Function],
8
+ "createReview": [Function],
6
9
  "createSomeObject": [Function],
7
10
  "deleteAnotherObject": [Function],
11
+ "deleteAnswer": [Function],
12
+ "deleteQuestion": [Function],
13
+ "deleteReview": [Function],
8
14
  "deleteSomeObject": [Function],
9
15
  "restoreAnotherObject": [Function],
16
+ "restoreAnswer": [Function],
17
+ "restoreQuestion": [Function],
18
+ "restoreReview": [Function],
10
19
  "restoreSomeObject": [Function],
20
+ "updateAnswer": [Function],
21
+ "updateQuestion": [Function],
22
+ "updateReview": [Function],
11
23
  "updateSomeObject": [Function],
12
24
  },
13
25
  "Query": {
14
26
  "anotherObjects": [Function],
27
+ "answer": [Function],
28
+ "answers": [Function],
15
29
  "manyObjects": [Function],
16
30
  "me": [Function],
31
+ "question": [Function],
32
+ "questions": [Function],
33
+ "reaction": [Function],
34
+ "reactions": [Function],
35
+ "review": [Function],
36
+ "reviews": [Function],
17
37
  "someObject": [Function],
18
38
  },
39
+ "Reaction": {
40
+ "__resolveType": [Function],
41
+ },
19
42
  }
20
43
  `;
21
44
 
@@ -1,10 +1,10 @@
1
- import { getEditEntityRelationsQuery, summonByName } from "../../src";
2
- import { models } from "../utils/models";
1
+ import { getEditEntityRelationsQuery } from '../../src';
2
+ import { models } from '../utils/models';
3
3
 
4
4
  describe('queries', () => {
5
5
  describe('getEntityRelationsQuery', () => {
6
6
  it('applies filters', () => {
7
- expect(getEditEntityRelationsQuery(models, summonByName(models, 'SomeObject'), 'update')).toMatchSnapshot()
7
+ expect(getEditEntityRelationsQuery(models.getModel('SomeObject', 'entity'), 'update')).toMatchSnapshot();
8
8
  });
9
- })
10
- })
9
+ });
10
+ });
@@ -3,7 +3,8 @@ import { DateTime } from 'luxon';
3
3
  import { execute } from '../../src';
4
4
  import { gql } from '../../src/client/gql';
5
5
  import { getResolvers } from '../../src/resolvers';
6
- import { models, permissions, rawModels } from '../utils/models';
6
+ import { ADMIN_ID } from '../utils/database/seed';
7
+ import { models, permissions } from '../utils/models';
7
8
 
8
9
  const test = async (operationName: string, query: string, variables: object, responses: unknown[]) => {
9
10
  const knexInstance = knex({
@@ -21,18 +22,17 @@ const test = async (operationName: string, query: string, variables: object, res
21
22
  query.response(responses[step - 1]);
22
23
  });
23
24
 
24
- const user = await knexInstance('User').where({ id: 1 }).first();
25
+ const user = await knexInstance('User').where({ id: ADMIN_ID }).first();
25
26
  const result = await execute({
26
27
  req: null as any,
27
28
  knex: knexInstance,
28
29
  locale: 'en',
29
30
  locales: ['en'],
30
31
  user,
31
- rawModels,
32
32
  models,
33
33
  permissions,
34
34
  now: DateTime.fromISO('2020-01-01T00:00:00.000Z'),
35
- body: { operationName, query, variables }
35
+ body: { operationName, query, variables },
36
36
  });
37
37
 
38
38
  expect(result).toMatchSnapshot();
@@ -47,9 +47,9 @@ describe('resolvers', () => {
47
47
 
48
48
  it('resolve lists, many-to-one and one-to-many queries', async () => {
49
49
  await test(
50
- 'SomeQuery',
50
+ 'AnotherQuery',
51
51
  gql`
52
- query SomeQuery {
52
+ query AnotherQuery {
53
53
  manyObjects(where: { another: { id: "bar" } }, orderBy: [{ xyz: DESC }]) {
54
54
  id
55
55
  field
@@ -89,9 +89,9 @@ describe('resolvers', () => {
89
89
 
90
90
  it('resolve single query', async () => {
91
91
  await test(
92
- 'SomeQuery',
92
+ 'YetAnotherQuery',
93
93
  gql`
94
- query SomeQuery {
94
+ query YetAnotherQuery {
95
95
  someObject(where: { id: "foo" }) {
96
96
  id
97
97
  field
@@ -1,19 +1,11 @@
1
1
  import knex from 'knex';
2
+ import knexfile from '../../../knexfile';
2
3
 
3
- export const getKnex = (database = 'postgres') =>
4
+ export const getKnex = (database?: string) =>
4
5
  knex({
5
- client: 'postgresql',
6
+ ...knexfile,
6
7
  connection: {
7
- host: 'localhost',
8
- database,
9
- user: 'postgres',
10
- password: 'password',
11
- },
12
- migrations: {
13
- tableName: 'knex_migrations',
14
- },
15
- pool: {
16
- min: 0,
17
- max: 30,
8
+ ...knexfile.connection,
9
+ ...(database && { database }),
18
10
  },
19
11
  });
@@ -1,14 +1,19 @@
1
1
  import { Knex } from 'knex';
2
+ import { pick } from 'lodash';
2
3
  import { DateTime } from 'luxon';
3
- import { summonByName } from '../../../src';
4
+ import { getColumnName, isInTable, modelNeedsTable } from '../../../src';
5
+ import { SeedData } from '../../generated/db';
4
6
  import { models } from '../models';
5
7
 
6
8
  export const ADMIN_ID = '04e45b48-04cf-4b38-bb25-b9af5ae0b2c4';
7
9
 
8
10
  export const SOME_ID = '604ab55d-ec3e-4857-9f27-219158f80e64';
9
11
  export const ANOTHER_ID = '226a20e8-5c18-4423-99ca-eb0df6ff4fdd';
12
+ export const QUESTION_ID = '3d0f3254-282f-4f1f-95e3-c1f699f3c1e5';
13
+ export const ANSWER_ID = 'f2d7b3f1-8ea1-4c2c-91ec-024432da1b0d';
14
+ export const REVIEW_ID = '817c55de-2f77-4159-bd44-9837d868f889';
10
15
 
11
- export const seed = {
16
+ export const seed: SeedData = {
12
17
  User: [
13
18
  {
14
19
  id: ADMIN_ID,
@@ -26,29 +31,63 @@ export const seed = {
26
31
  {
27
32
  id: SOME_ID,
28
33
  anotherId: ANOTHER_ID,
29
- list: 0,
34
+ float: 0,
35
+ list: ['A'],
30
36
  xyz: 1,
31
37
  },
32
38
  ],
39
+ Question: [
40
+ {
41
+ id: QUESTION_ID,
42
+ content: 'What is the question?',
43
+ },
44
+ ],
45
+ Answer: [
46
+ {
47
+ id: ANSWER_ID,
48
+ content: 'I do not know but here is the answer.',
49
+ },
50
+ ],
51
+ Review: [
52
+ {
53
+ id: REVIEW_ID,
54
+ content: 'This is a review with a rating',
55
+ rating: 5,
56
+ },
57
+ ],
33
58
  };
34
59
 
35
60
  export const setupSeed = async (knex: Knex) => {
36
61
  const now = DateTime.now();
37
62
  for (const [table, entities] of Object.entries(seed)) {
38
- const model = summonByName(models, table);
39
- await knex.batchInsert(
40
- table,
41
- entities.map((entity, i) => ({
42
- ...entity,
43
- ...(model.creatable && {
44
- createdAt: now.plus({ second: i }),
45
- createdById: ADMIN_ID,
46
- }),
47
- ...(model.updatable && {
48
- updatedAt: now.plus({ second: i }),
49
- updatedById: ADMIN_ID,
50
- }),
51
- }))
52
- );
63
+ const model = models.getModel(table, 'entity');
64
+ const mappedEntities = entities.map((entity, i) => ({
65
+ ...entity,
66
+ ...(model.parent && { type: model.name }),
67
+ ...(model.creatable && {
68
+ createdAt: now.plus({ second: i }),
69
+ createdById: ADMIN_ID,
70
+ }),
71
+ ...(model.updatable && {
72
+ updatedAt: now.plus({ second: i }),
73
+ updatedById: ADMIN_ID,
74
+ }),
75
+ }));
76
+
77
+ if (model.parent) {
78
+ const parentModel = models.getModel(model.parent, 'entity');
79
+ await knex.batchInsert(
80
+ parentModel.name,
81
+ mappedEntities.map((entity) => pick(entity, parentModel.fields.map(getColumnName)))
82
+ );
83
+ if (modelNeedsTable(model)) {
84
+ await knex.batchInsert(
85
+ model.name,
86
+ mappedEntities.map((entity) => pick(entity, model.fields.filter(isInTable).map(getColumnName)))
87
+ );
88
+ }
89
+ } else {
90
+ await knex.batchInsert(table, mappedEntities);
91
+ }
53
92
  }
54
93
  };
@@ -1,8 +1,7 @@
1
- import { RawModels } from '../../src/models';
2
- import { getModels } from '../../src/models/utils';
3
- import { generatePermissions, PermissionsConfig } from '../../src/permissions/generate';
1
+ import { ModelDefinitions, Models } from '../../src/models';
2
+ import { PermissionsConfig, generatePermissions } from '../../src/permissions/generate';
4
3
 
5
- export const rawModels: RawModels = [
4
+ const modelDefinitions: ModelDefinitions = [
6
5
  {
7
6
  name: 'SomeEnum',
8
7
  kind: 'enum',
@@ -53,7 +52,7 @@ export const rawModels: RawModels = [
53
52
  name: 'myself',
54
53
  toOne: true,
55
54
  reverse: 'self',
56
- }
55
+ },
57
56
  ],
58
57
  },
59
58
  {
@@ -81,11 +80,17 @@ export const rawModels: RawModels = [
81
80
  nonNull: true,
82
81
  },
83
82
  {
84
- name: 'list',
83
+ name: 'float',
85
84
  type: 'Float',
86
85
  scale: 1,
87
86
  precision: 1,
88
87
  nonNull: true,
88
+ },
89
+ {
90
+ kind: 'enum',
91
+ name: 'list',
92
+ type: 'SomeEnum',
93
+ nonNull: true,
89
94
  list: true,
90
95
  args: [{ name: 'magic', type: 'Boolean' }],
91
96
  },
@@ -100,9 +105,59 @@ export const rawModels: RawModels = [
100
105
  },
101
106
  ],
102
107
  },
108
+ {
109
+ kind: 'entity',
110
+ root: true,
111
+ name: 'Reaction',
112
+ queriable: true,
113
+ listQueriable: true,
114
+ creatable: true,
115
+ updatable: true,
116
+ deletable: true,
117
+ fields: [
118
+ {
119
+ name: 'parent',
120
+ kind: 'relation',
121
+ reverse: 'childReactions',
122
+ type: 'Reaction',
123
+ },
124
+ {
125
+ name: 'content',
126
+ type: 'String',
127
+ creatable: true,
128
+ updatable: true,
129
+ },
130
+ ],
131
+ },
132
+ {
133
+ kind: 'entity',
134
+ parent: 'Reaction',
135
+ name: 'Review',
136
+ fields: [
137
+ {
138
+ name: 'rating',
139
+ type: 'Float',
140
+ comparable: true,
141
+ creatable: true,
142
+ updatable: true,
143
+ },
144
+ ],
145
+ },
146
+ {
147
+ kind: 'entity',
148
+ parent: 'Reaction',
149
+ name: 'Question',
150
+ fields: [],
151
+ },
152
+ {
153
+ kind: 'entity',
154
+ parent: 'Reaction',
155
+ name: 'Answer',
156
+ fields: [],
157
+ },
103
158
  ];
104
159
 
105
- export const models = getModels(rawModels);
160
+ export const models = new Models(modelDefinitions);
106
161
 
107
162
  const permissionsConfig: PermissionsConfig = {
108
163
  ADMIN: true,