@contember/engine-content-api 1.1.0-alpha.6 → 1.1.0-beta.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 (123) hide show
  1. package/dist/src/acl/Authorizator.d.ts +2 -1
  2. package/dist/src/acl/Authorizator.d.ts.map +1 -1
  3. package/dist/src/acl/Authorizator.js +4 -3
  4. package/dist/src/acl/Authorizator.js.map +1 -1
  5. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts.map +1 -1
  6. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js +2 -0
  7. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js.map +1 -1
  8. package/dist/src/mapper/Mapper.d.ts.map +1 -1
  9. package/dist/src/mapper/Mapper.js +10 -12
  10. package/dist/src/mapper/Mapper.js.map +1 -1
  11. package/dist/src/mapper/select/ConditionBuilder.d.ts +1 -1
  12. package/dist/src/mapper/select/ConditionBuilder.d.ts.map +1 -1
  13. package/dist/src/mapper/select/ConditionBuilder.js +5 -5
  14. package/dist/src/mapper/select/ConditionBuilder.js.map +1 -1
  15. package/dist/src/mapper/select/JoinBuilder.js +2 -2
  16. package/dist/src/mapper/select/JoinBuilder.js.map +1 -1
  17. package/dist/src/mapper/select/JoinVisitor.js +4 -4
  18. package/dist/src/mapper/select/JoinVisitor.js.map +1 -1
  19. package/dist/src/mapper/select/OrderByBuilder.js +2 -2
  20. package/dist/src/mapper/select/OrderByBuilder.js.map +1 -1
  21. package/dist/src/mapper/select/Path.d.ts +2 -1
  22. package/dist/src/mapper/select/Path.d.ts.map +1 -1
  23. package/dist/src/mapper/select/Path.js +3 -2
  24. package/dist/src/mapper/select/Path.js.map +1 -1
  25. package/dist/src/mapper/select/RelationFetcher.js +2 -2
  26. package/dist/src/mapper/select/RelationFetcher.js.map +1 -1
  27. package/dist/src/mapper/select/SelectBuilder.d.ts +1 -1
  28. package/dist/src/mapper/select/SelectBuilder.d.ts.map +1 -1
  29. package/dist/src/mapper/select/SelectBuilder.js +7 -10
  30. package/dist/src/mapper/select/SelectBuilder.js.map +1 -1
  31. package/dist/src/mapper/select/SelectHydrator.d.ts +2 -1
  32. package/dist/src/mapper/select/SelectHydrator.d.ts.map +1 -1
  33. package/dist/src/mapper/select/SelectHydrator.js +34 -11
  34. package/dist/src/mapper/select/SelectHydrator.js.map +1 -1
  35. package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
  36. package/dist/src/mapper/select/WhereBuilder.js +5 -4
  37. package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
  38. package/dist/src/mapper/select/handlers/FieldsVisitor.js +2 -2
  39. package/dist/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
  40. package/dist/src/mapper/select/handlers/MetaHandler.js +1 -1
  41. package/dist/src/mapper/select/handlers/MetaHandler.js.map +1 -1
  42. package/dist/src/resolvers/MutationResolver.d.ts.map +1 -1
  43. package/dist/src/resolvers/MutationResolver.js +4 -3
  44. package/dist/src/resolvers/MutationResolver.js.map +1 -1
  45. package/dist/src/schema/CustomTypesProvider.d.ts.map +1 -1
  46. package/dist/src/schema/CustomTypesProvider.js +18 -3
  47. package/dist/src/schema/CustomTypesProvider.js.map +1 -1
  48. package/dist/src/schema/OrderByTypeProvider.d.ts.map +1 -1
  49. package/dist/src/schema/OrderByTypeProvider.js +2 -0
  50. package/dist/src/schema/OrderByTypeProvider.js.map +1 -1
  51. package/dist/src/tsconfig.tsbuildinfo +1 -1
  52. package/dist/tests/cases/integration/graphQlDb/update/invalidInput.test.js +0 -23
  53. package/dist/tests/cases/integration/graphQlDb/update/invalidInput.test.js.map +1 -1
  54. package/dist/tests/cases/integration/graphQlRequests/query/relations/oneHasMany.test.js +87 -0
  55. package/dist/tests/cases/integration/graphQlRequests/query/relations/oneHasMany.test.js.map +1 -1
  56. package/dist/tests/cases/integration/graphQlRequests/query/sorting/sortNulls.test.d.ts +2 -0
  57. package/dist/tests/cases/integration/graphQlRequests/query/sorting/sortNulls.test.d.ts.map +1 -0
  58. package/dist/tests/cases/integration/graphQlRequests/query/sorting/sortNulls.test.js +35 -0
  59. package/dist/tests/cases/integration/graphQlRequests/query/sorting/sortNulls.test.js.map +1 -0
  60. package/dist/tests/cases/integration/graphQlRequests/upsert/basicUpsert.test.js +45 -2
  61. package/dist/tests/cases/integration/graphQlRequests/upsert/basicUpsert.test.js.map +1 -1
  62. package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js +1 -1
  63. package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js.map +1 -1
  64. package/dist/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +2 -0
  65. package/dist/tests/cases/integration/graphQlSchema/schema-acl-predicate.gql +2 -0
  66. package/dist/tests/cases/integration/graphQlSchema/schema-acl-predicate2.gql +2 -0
  67. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +2 -0
  68. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +2 -0
  69. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +2 -0
  70. package/dist/tests/cases/integration/graphQlSchema/schema-acl.gql +2 -0
  71. package/dist/tests/cases/integration/graphQlSchema/schema-aliased-type.gql +2 -0
  72. package/dist/tests/cases/integration/graphQlSchema/schema-basic.gql +2 -0
  73. package/dist/tests/cases/integration/graphQlSchema/schema-bug-66.gql +2 -0
  74. package/dist/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +2 -0
  75. package/dist/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +2 -0
  76. package/dist/tests/cases/integration/graphQlSchema/schema-new-builder.gql +2 -0
  77. package/dist/tests/cases/integration/graphQlSchema/schema-view-entity.gql +2 -0
  78. package/dist/tests/cases/unit/uuidType.test.d.ts +2 -0
  79. package/dist/tests/cases/unit/uuidType.test.d.ts.map +1 -0
  80. package/dist/tests/cases/unit/uuidType.test.js +23 -0
  81. package/dist/tests/cases/unit/uuidType.test.js.map +1 -0
  82. package/dist/tests/src/test.js +1 -1
  83. package/dist/tests/src/test.js.map +1 -1
  84. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  85. package/package.json +10 -10
  86. package/src/acl/Authorizator.ts +5 -2
  87. package/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.ts +2 -0
  88. package/src/mapper/Mapper.ts +10 -13
  89. package/src/mapper/select/ConditionBuilder.ts +5 -4
  90. package/src/mapper/select/JoinBuilder.ts +2 -2
  91. package/src/mapper/select/JoinVisitor.ts +4 -4
  92. package/src/mapper/select/OrderByBuilder.ts +2 -2
  93. package/src/mapper/select/Path.ts +4 -2
  94. package/src/mapper/select/RelationFetcher.ts +2 -2
  95. package/src/mapper/select/SelectBuilder.ts +7 -11
  96. package/src/mapper/select/SelectHydrator.ts +52 -19
  97. package/src/mapper/select/WhereBuilder.ts +6 -3
  98. package/src/mapper/select/handlers/FieldsVisitor.ts +2 -2
  99. package/src/mapper/select/handlers/MetaHandler.ts +1 -1
  100. package/src/resolvers/MutationResolver.ts +4 -3
  101. package/src/schema/CustomTypesProvider.ts +21 -4
  102. package/src/schema/OrderByTypeProvider.ts +2 -0
  103. package/tests/cases/integration/graphQlDb/update/invalidInput.test.ts +0 -26
  104. package/tests/cases/integration/graphQlRequests/query/relations/oneHasMany.test.ts +87 -0
  105. package/tests/cases/integration/graphQlRequests/query/sorting/sortNulls.test.ts +34 -0
  106. package/tests/cases/integration/graphQlRequests/upsert/basicUpsert.test.ts +49 -2
  107. package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +1 -1
  108. package/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +2 -0
  109. package/tests/cases/integration/graphQlSchema/schema-acl-predicate.gql +2 -0
  110. package/tests/cases/integration/graphQlSchema/schema-acl-predicate2.gql +2 -0
  111. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +2 -0
  112. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +2 -0
  113. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +2 -0
  114. package/tests/cases/integration/graphQlSchema/schema-acl.gql +2 -0
  115. package/tests/cases/integration/graphQlSchema/schema-aliased-type.gql +2 -0
  116. package/tests/cases/integration/graphQlSchema/schema-basic.gql +2 -0
  117. package/tests/cases/integration/graphQlSchema/schema-bug-66.gql +2 -0
  118. package/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +2 -0
  119. package/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +2 -0
  120. package/tests/cases/integration/graphQlSchema/schema-new-builder.gql +2 -0
  121. package/tests/cases/integration/graphQlSchema/schema-view-entity.gql +2 -0
  122. package/tests/cases/unit/uuidType.test.ts +25 -0
  123. package/tests/src/test.ts +1 -1
@@ -417,3 +417,90 @@ test('Posts with paginated comments without count (one has many)', async () => {
417
417
  })
418
418
 
419
419
 
420
+ test('Posts with paginated comments (one has many)', async () => {
421
+ await execute({
422
+ schema: new SchemaBuilder()
423
+ .entity('Post', entity => entity.oneHasMany('comments', relation => relation.target('Comment').ownedBy('post')))
424
+ .entity('Comment', entity => entity.column('content').column('deletedAt', c => c.type(Model.ColumnType.DateTime)))
425
+ .buildSchema(),
426
+ query: GQL`
427
+ query {
428
+ listPost {
429
+ id
430
+ comments: paginateComments(filter: {deletedAt: {isNull: true}}, first: 1) {
431
+ pages: pageInfo {
432
+ count: totalCount
433
+ }
434
+ comments: edges {
435
+ comment: node {
436
+ content
437
+ }
438
+ }
439
+ }
440
+ }
441
+ }
442
+ `,
443
+ executes: [
444
+ {
445
+ sql: SQL`select
446
+ "root_"."id" as "root_id",
447
+ "root_"."id" as "root_id"
448
+ from "public"."post" as "root_"`,
449
+ response: {
450
+ rows: [{ root_id: testUuid(1) }],
451
+ },
452
+ },
453
+ {
454
+ sql: SQL`select
455
+ count(*) as "row_count", "root_"."post_id"
456
+ from "public"."comment" as "root_"
457
+ where "root_"."deleted_at" is null and "root_"."post_id" in (?)
458
+ group by "root_"."post_id"`,
459
+ parameters: [testUuid(1)],
460
+ response: {
461
+ rows: [
462
+ { post_id: testUuid(1), row_count: 5 },
463
+ ],
464
+ },
465
+ },
466
+ {
467
+ sql: SQL`with "data" as
468
+ (select
469
+ "root_"."post_id" as "__grouping_key",
470
+ "root_"."content" as "root_content",
471
+ "root_"."id" as "root_id",
472
+ row_number() over(partition by "root_"."post_id" order by "root_"."id" asc) as "rowNumber_"
473
+ from "public"."comment" as "root_"
474
+ where "root_"."deleted_at" is null
475
+ and "root_"."post_id" in (?)
476
+ order by "root_"."id" asc)
477
+ select "data".* from "data" where "data"."rowNumber_" <= ?`,
478
+ parameters: [testUuid(1), 1],
479
+ response: {
480
+ rows: [
481
+ { __grouping_key: testUuid(1), root_id: testUuid(3), root_content: 'Lorem ipsum' },
482
+ ],
483
+ },
484
+ },
485
+ ],
486
+ return: {
487
+ data: {
488
+ listPost: [
489
+ {
490
+ id: testUuid(1),
491
+ comments: {
492
+ pages: {
493
+ count: 5,
494
+ },
495
+ comments: [
496
+ {
497
+ comment: { content: 'Lorem ipsum' },
498
+ },
499
+ ],
500
+ },
501
+ },
502
+ ],
503
+ },
504
+ },
505
+ })
506
+ })
@@ -0,0 +1,34 @@
1
+ import { test } from 'vitest'
2
+ import { execute } from '../../../../../src/test'
3
+ import { SchemaBuilder } from '@contember/schema-definition'
4
+ import { GQL, SQL } from '../../../../../src/tags'
5
+
6
+ test('order by desc nulls last', async () => {
7
+ await execute({
8
+ schema: new SchemaBuilder()
9
+ .entity('Post', entity => entity.column('title'))
10
+ .buildSchema(),
11
+ query: GQL`
12
+ query {
13
+ listPost(orderBy: {title: descNullsLast}) {
14
+ id
15
+ }
16
+ }`,
17
+ executes: [
18
+ {
19
+ sql: SQL`select
20
+ "root_"."id" as "root_id"
21
+ from "public"."post" as "root_" order by "root_"."title" desc nulls last, "root_"."id" asc`,
22
+ response: {
23
+ rows: [],
24
+ },
25
+ },
26
+ ],
27
+ return: {
28
+ data: {
29
+ listPost: [],
30
+ },
31
+ },
32
+ })
33
+ })
34
+
@@ -98,8 +98,54 @@ test('upsert author (exists)', async () => {
98
98
  response: { rowCount: 1 },
99
99
  },
100
100
  {
101
- sql: SQL`select "root_"."id" as "root_id" from "public"."author" as "root_" where "root_"."id" = ?`,
102
- parameters: [testUuid(2)],
101
+ sql: SQL`select "root_"."id" as "root_id" from "public"."author" as "root_" where "root_"."slug" = ?`,
102
+ parameters: ['john-doe'],
103
+ response: { rows: [{ root_id: testUuid(2) }] },
104
+ },
105
+ ]),
106
+ ],
107
+ return: {
108
+ data: {
109
+ upsertAuthor: {
110
+ ok: true,
111
+ node: {
112
+ id: testUuid(2),
113
+ },
114
+ },
115
+ },
116
+ },
117
+ })
118
+ })
119
+
120
+ test('upsert author (exists) with noop update)', async () => {
121
+ await execute({
122
+ schema: new SchemaBuilder()
123
+ .entity('Author', entity =>
124
+ entity
125
+ .column('name', c => c.type(Model.ColumnType.String))
126
+ .column('slug', c => c.type(Model.ColumnType.String).unique()),
127
+ )
128
+ .buildSchema(),
129
+ query: GQL`
130
+ mutation {
131
+ upsertAuthor(by: {slug: "john-doe"}, update: {}, create: {slug: "john-doe", name: "John Doe"}) {
132
+ ok
133
+ node {
134
+ id
135
+ }
136
+ }
137
+ }`,
138
+ executes: [
139
+ ...sqlTransaction([
140
+ {
141
+ sql: SQL`select "root_"."id"
142
+ from "public"."author" as "root_" where "root_"."slug" = ?`,
143
+ parameters: ['john-doe'],
144
+ response: { rows: [{ id: testUuid(2) }] },
145
+ },
146
+ {
147
+ sql: SQL`select "root_"."id" as "root_id" from "public"."author" as "root_" where "root_"."slug" = ?`,
148
+ parameters: ['john-doe'],
103
149
  response: { rows: [{ root_id: testUuid(2) }] },
104
150
  },
105
151
  ]),
@@ -117,3 +163,4 @@ test('upsert author (exists)', async () => {
117
163
  })
118
164
  })
119
165
 
166
+
@@ -26,7 +26,7 @@ const testSchema = async (test: Test) => {
26
26
  const schema = schemaResult instanceof SchemaBuilder ? schemaResult.buildSchema() : schemaResult
27
27
  const schemaWithAcl = { ...schema, acl: { roles: {}, variables: {} } }
28
28
  const permissions = test.permissions(schemaWithAcl)
29
- const authorizator = new Authorizator(permissions)
29
+ const authorizator = new Authorizator(permissions, false)
30
30
  const graphQlSchemaBuilder = schemaFactory.create(schemaWithAcl, authorizator)
31
31
  const graphQlSchema = graphQlSchemaBuilder.build()
32
32
 
@@ -114,6 +114,8 @@ input OneHasManyEntityOrderBy {
114
114
  enum OrderDirection {
115
115
  asc
116
116
  desc
117
+ ascNullsFirst
118
+ descNullsLast
117
119
  }
118
120
 
119
121
  input RootOrderBy {
@@ -84,6 +84,8 @@ input TestOrderBy {
84
84
  enum OrderDirection {
85
85
  asc
86
86
  desc
87
+ ascNullsFirst
88
+ descNullsLast
87
89
  }
88
90
 
89
91
  type TestConnection {
@@ -84,6 +84,8 @@ input TestOrderBy {
84
84
  enum OrderDirection {
85
85
  asc
86
86
  desc
87
+ ascNullsFirst
88
+ descNullsLast
87
89
  }
88
90
 
89
91
  type TestConnection {
@@ -109,6 +109,8 @@ input OneHasManyEntityOrderBy {
109
109
  enum OrderDirection {
110
110
  asc
111
111
  desc
112
+ ascNullsFirst
113
+ descNullsLast
112
114
  }
113
115
 
114
116
  input RootOrderBy {
@@ -111,6 +111,8 @@ input OneHasManyEntityOrderBy {
111
111
  enum OrderDirection {
112
112
  asc
113
113
  desc
114
+ ascNullsFirst
115
+ descNullsLast
114
116
  }
115
117
 
116
118
  input RootOrderBy {
@@ -110,6 +110,8 @@ input OneHasManyEntityOrderBy {
110
110
  enum OrderDirection {
111
111
  asc
112
112
  desc
113
+ ascNullsFirst
114
+ descNullsLast
113
115
  }
114
116
 
115
117
  input RootOrderBy {
@@ -86,6 +86,8 @@ input TestOrderBy {
86
86
  enum OrderDirection {
87
87
  asc
88
88
  desc
89
+ ascNullsFirst
90
+ descNullsLast
89
91
  }
90
92
 
91
93
  type TestConnection {
@@ -82,6 +82,8 @@ input AuthorOrderBy {
82
82
  enum OrderDirection {
83
83
  asc
84
84
  desc
85
+ ascNullsFirst
86
+ descNullsLast
85
87
  }
86
88
 
87
89
  type AuthorConnection {
@@ -182,6 +182,8 @@ input PostLocaleOrderBy {
182
182
  enum OrderDirection {
183
183
  asc
184
184
  desc
185
+ ascNullsFirst
186
+ descNullsLast
185
187
  }
186
188
 
187
189
  input PostOrderBy {
@@ -142,6 +142,8 @@ input VideoOrderBy {
142
142
  enum OrderDirection {
143
143
  asc
144
144
  desc
145
+ ascNullsFirst
146
+ descNullsLast
145
147
  }
146
148
 
147
149
  input FrontPageOrderBy {
@@ -182,6 +182,8 @@ input PostLocaleOrderBy {
182
182
  enum OrderDirection {
183
183
  asc
184
184
  desc
185
+ ascNullsFirst
186
+ descNullsLast
185
187
  }
186
188
 
187
189
  input PostOrderBy {
@@ -137,6 +137,8 @@ input PostLocaleOrderBy {
137
137
  enum OrderDirection {
138
138
  asc
139
139
  desc
140
+ ascNullsFirst
141
+ descNullsLast
140
142
  }
141
143
 
142
144
  input PostOrderBy {
@@ -232,6 +232,8 @@ input PostOrderBy {
232
232
  enum OrderDirection {
233
233
  asc
234
234
  desc
235
+ ascNullsFirst
236
+ descNullsLast
235
237
  }
236
238
 
237
239
  input AuthorOrderBy {
@@ -84,6 +84,8 @@ input AuthorOrderBy {
84
84
  enum OrderDirection {
85
85
  asc
86
86
  desc
87
+ ascNullsFirst
88
+ descNullsLast
87
89
  }
88
90
 
89
91
  type AuthorConnection {
@@ -0,0 +1,25 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { CustomTypesProvider } from '../../../src'
3
+
4
+ describe('uuid graphql type', () => {
5
+
6
+ const customTypesProvider = new CustomTypesProvider()
7
+ it('accepts valid uuid', () => {
8
+ const validUuid = 'e0818cf9-eee3-4452-9a13-031435218473'
9
+ expect(customTypesProvider.uuidType.parseValue(validUuid)).eq(validUuid)
10
+ })
11
+
12
+ it('accepts valid uuid without dashes', () => {
13
+ const validUuid = 'e0818cf9eee344529a13031435218473'
14
+ expect(customTypesProvider.uuidType.parseValue(validUuid)).eq(validUuid)
15
+ })
16
+
17
+ it('declines invalid uuid', () => {
18
+ const invalidUuid = '818cf9-eee3-4452-9a13-031435218473'
19
+ expect(customTypesProvider.uuidType.parseValue(invalidUuid)).eq(undefined)
20
+ })
21
+
22
+ it('declines not-string', () => {
23
+ expect(customTypesProvider.uuidType.parseValue(1)).eq(undefined)
24
+ })
25
+ })
package/tests/src/test.ts CHANGED
@@ -89,7 +89,7 @@ export const failedTransaction = (executes: SqlQuery[]): SqlQuery[] => {
89
89
 
90
90
  export const execute = async (test: Test) => {
91
91
  const permissions: Acl.Permissions = test.permissions || new AllowAllPermissionFactory().create(test.schema)
92
- const authorizator = new Authorizator(permissions)
92
+ const authorizator = new Authorizator(permissions, false)
93
93
  const builder = new GraphQlSchemaBuilderFactory().create(test.schema, authorizator)
94
94
  const graphQLSchema = builder.build()
95
95