@contember/client 1.0.0-rc.2 → 1.0.0-rc.4

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 (142) hide show
  1. package/dist/types/content/formatContentApiRelativeUrl.d.ts +2 -0
  2. package/dist/types/content/formatContentApiRelativeUrl.d.ts.map +1 -0
  3. package/dist/types/content/index.d.ts +4 -0
  4. package/dist/types/content/index.d.ts.map +1 -0
  5. package/dist/types/content/params/index.d.ts +2 -0
  6. package/dist/types/content/params/index.d.ts.map +1 -0
  7. package/dist/types/content/params/whereToFilter.d.ts +4 -0
  8. package/dist/types/content/params/whereToFilter.d.ts.map +1 -0
  9. package/dist/types/content/upload/FileUploadError.d.ts +9 -0
  10. package/dist/types/content/upload/FileUploadError.d.ts.map +1 -0
  11. package/dist/types/content/upload/FileUploadProgress.d.ts +4 -0
  12. package/dist/types/content/upload/FileUploadProgress.d.ts.map +1 -0
  13. package/dist/types/content/upload/FileUploader.d.ts +15 -0
  14. package/dist/types/content/upload/FileUploader.d.ts.map +1 -0
  15. package/dist/types/content/upload/GenerateUploadUrlMutationBuilder.d.ts +30 -0
  16. package/dist/types/content/upload/GenerateUploadUrlMutationBuilder.d.ts.map +1 -0
  17. package/dist/types/content/upload/S3FileUploader.d.ts +26 -0
  18. package/dist/types/content/upload/S3FileUploader.d.ts.map +1 -0
  19. package/dist/types/content/upload/SwitchFileUploader.d.ts +13 -0
  20. package/dist/types/content/upload/SwitchFileUploader.d.ts.map +1 -0
  21. package/dist/types/content/upload/UploadedFileMetadata.d.ts +4 -0
  22. package/dist/types/content/upload/UploadedFileMetadata.d.ts.map +1 -0
  23. package/dist/types/content/upload/index.d.ts +8 -0
  24. package/dist/types/content/upload/index.d.ts.map +1 -0
  25. package/dist/types/crudQueryBuilder/CrudQueryBuilder.d.ts +21 -0
  26. package/dist/types/crudQueryBuilder/CrudQueryBuilder.d.ts.map +1 -0
  27. package/dist/types/crudQueryBuilder/CrudQueryBuilderError.d.ts +3 -0
  28. package/dist/types/crudQueryBuilder/CrudQueryBuilderError.d.ts.map +1 -0
  29. package/dist/types/crudQueryBuilder/ErrorsRelationBuilder.d.ts +5 -0
  30. package/dist/types/crudQueryBuilder/ErrorsRelationBuilder.d.ts.map +1 -0
  31. package/dist/types/crudQueryBuilder/ReadBuilder.d.ts +31 -0
  32. package/dist/types/crudQueryBuilder/ReadBuilder.d.ts.map +1 -0
  33. package/dist/types/crudQueryBuilder/ValidationRelationBuilder.d.ts +5 -0
  34. package/dist/types/crudQueryBuilder/ValidationRelationBuilder.d.ts.map +1 -0
  35. package/dist/types/crudQueryBuilder/WriteBuilder.d.ts +24 -0
  36. package/dist/types/crudQueryBuilder/WriteBuilder.d.ts.map +1 -0
  37. package/dist/types/crudQueryBuilder/WriteDataBuilder.d.ts +24 -0
  38. package/dist/types/crudQueryBuilder/WriteDataBuilder.d.ts.map +1 -0
  39. package/dist/types/crudQueryBuilder/WriteManyRelationBuilder.d.ts +27 -0
  40. package/dist/types/crudQueryBuilder/WriteManyRelationBuilder.d.ts.map +1 -0
  41. package/dist/types/crudQueryBuilder/WriteOneRelationBuilder.d.ts +28 -0
  42. package/dist/types/crudQueryBuilder/WriteOneRelationBuilder.d.ts.map +1 -0
  43. package/dist/types/crudQueryBuilder/index.d.ts +8 -0
  44. package/dist/types/crudQueryBuilder/index.d.ts.map +1 -0
  45. package/dist/types/crudQueryBuilder/types.d.ts +45 -0
  46. package/dist/types/crudQueryBuilder/types.d.ts.map +1 -0
  47. package/dist/types/graphQlBuilder/GraphQlBuilderError.d.ts +3 -0
  48. package/dist/types/graphQlBuilder/GraphQlBuilderError.d.ts.map +1 -0
  49. package/dist/types/graphQlBuilder/GraphQlLiteral.d.ts +6 -0
  50. package/dist/types/graphQlBuilder/GraphQlLiteral.d.ts.map +1 -0
  51. package/dist/types/graphQlBuilder/ObjectBuilder.d.ts +28 -0
  52. package/dist/types/graphQlBuilder/ObjectBuilder.d.ts.map +1 -0
  53. package/dist/types/graphQlBuilder/QueryBuilder.d.ts +17 -0
  54. package/dist/types/graphQlBuilder/QueryBuilder.d.ts.map +1 -0
  55. package/dist/types/graphQlBuilder/QueryCompiler.d.ts +13 -0
  56. package/dist/types/graphQlBuilder/QueryCompiler.d.ts.map +1 -0
  57. package/dist/types/graphQlBuilder/RootObjectBuilder.d.ts +17 -0
  58. package/dist/types/graphQlBuilder/RootObjectBuilder.d.ts.map +1 -0
  59. package/dist/types/graphQlBuilder/index.d.ts +6 -0
  60. package/dist/types/graphQlBuilder/index.d.ts.map +1 -0
  61. package/dist/types/graphQlClient/GraphQlClient.d.ts +19 -0
  62. package/dist/types/graphQlClient/GraphQlClient.d.ts.map +1 -0
  63. package/dist/types/graphQlClient/index.d.ts +2 -0
  64. package/dist/types/graphQlClient/index.d.ts.map +1 -0
  65. package/dist/types/index.d.ts +10 -0
  66. package/dist/types/index.d.ts.map +1 -0
  67. package/dist/types/system/events/RelationFilter.d.ts +5 -0
  68. package/dist/types/system/events/RelationFilter.d.ts.map +1 -0
  69. package/dist/types/system/events/SystemEvent.d.ts +10 -0
  70. package/dist/types/system/events/SystemEvent.d.ts.map +1 -0
  71. package/dist/types/system/events/TreeFilter.d.ts +7 -0
  72. package/dist/types/system/events/TreeFilter.d.ts.map +1 -0
  73. package/dist/types/system/events/index.d.ts +4 -0
  74. package/dist/types/system/events/index.d.ts.map +1 -0
  75. package/dist/types/system/formatSystemApiRelativeUrl.d.ts +2 -0
  76. package/dist/types/system/formatSystemApiRelativeUrl.d.ts.map +1 -0
  77. package/dist/types/system/index.d.ts +3 -0
  78. package/dist/types/system/index.d.ts.map +1 -0
  79. package/dist/types/tenant/index.d.ts +4 -0
  80. package/dist/types/tenant/index.d.ts.map +1 -0
  81. package/dist/types/tenant/loginMutation.d.ts +32 -0
  82. package/dist/types/tenant/loginMutation.d.ts.map +1 -0
  83. package/dist/types/tenant/tenantApiRelativeUrl.d.ts +2 -0
  84. package/dist/types/tenant/tenantApiRelativeUrl.d.ts.map +1 -0
  85. package/dist/types/tenant/tenantErrorMessages.d.ts +5 -0
  86. package/dist/types/tenant/tenantErrorMessages.d.ts.map +1 -0
  87. package/dist/types/tsconfig.tsbuildinfo +1 -0
  88. package/dist/types/utils/index.d.ts +3 -0
  89. package/dist/types/utils/index.d.ts.map +1 -0
  90. package/dist/types/utils/isEmptyObject.d.ts +2 -0
  91. package/dist/types/utils/isEmptyObject.d.ts.map +1 -0
  92. package/dist/types/utils/readFileAsArrayBuffer.d.ts +2 -0
  93. package/dist/types/utils/readFileAsArrayBuffer.d.ts.map +1 -0
  94. package/package.json +4 -5
  95. package/src/content/formatContentApiRelativeUrl.ts +2 -0
  96. package/src/content/index.ts +4 -0
  97. package/src/content/params/index.ts +1 -0
  98. package/src/content/params/whereToFilter.ts +19 -0
  99. package/src/content/upload/FileUploadError.ts +10 -0
  100. package/src/content/upload/FileUploadProgress.ts +3 -0
  101. package/src/content/upload/FileUploader.ts +19 -0
  102. package/src/content/upload/GenerateUploadUrlMutationBuilder.ts +58 -0
  103. package/src/content/upload/S3FileUploader.ts +121 -0
  104. package/src/content/upload/SwitchFileUploader.ts +40 -0
  105. package/src/content/upload/UploadedFileMetadata.ts +3 -0
  106. package/src/content/upload/index.ts +7 -0
  107. package/src/crudQueryBuilder/CrudQueryBuilder.ts +160 -0
  108. package/src/crudQueryBuilder/CrudQueryBuilderError.ts +1 -0
  109. package/src/crudQueryBuilder/ErrorsRelationBuilder.ts +17 -0
  110. package/src/crudQueryBuilder/ReadBuilder.ts +106 -0
  111. package/src/crudQueryBuilder/ValidationRelationBuilder.ts +18 -0
  112. package/src/crudQueryBuilder/WriteBuilder.ts +79 -0
  113. package/src/crudQueryBuilder/WriteDataBuilder.ts +153 -0
  114. package/src/crudQueryBuilder/WriteManyRelationBuilder.ts +141 -0
  115. package/src/crudQueryBuilder/WriteOneRelationBuilder.ts +101 -0
  116. package/src/crudQueryBuilder/index.ts +7 -0
  117. package/src/crudQueryBuilder/types.ts +73 -0
  118. package/src/graphQlBuilder/GraphQlBuilderError.ts +1 -0
  119. package/src/graphQlBuilder/GraphQlLiteral.ts +7 -0
  120. package/src/graphQlBuilder/ObjectBuilder.ts +87 -0
  121. package/src/graphQlBuilder/QueryBuilder.ts +34 -0
  122. package/src/graphQlBuilder/QueryCompiler.ts +115 -0
  123. package/src/graphQlBuilder/RootObjectBuilder.ts +36 -0
  124. package/src/graphQlBuilder/index.ts +5 -0
  125. package/src/graphQlClient/GraphQlClient.ts +52 -0
  126. package/src/graphQlClient/index.ts +1 -0
  127. package/src/index.ts +11 -0
  128. package/src/system/events/RelationFilter.ts +4 -0
  129. package/src/system/events/SystemEvent.ts +9 -0
  130. package/src/system/events/TreeFilter.ts +7 -0
  131. package/src/system/events/index.ts +3 -0
  132. package/src/system/formatSystemApiRelativeUrl.ts +1 -0
  133. package/src/system/index.ts +2 -0
  134. package/src/tenant/index.ts +3 -0
  135. package/src/tenant/loginMutation.ts +61 -0
  136. package/src/tenant/tenantApiRelativeUrl.ts +1 -0
  137. package/src/tenant/tenantErrorMessages.ts +14 -0
  138. package/src/tsconfig.json +6 -0
  139. package/src/utils/index.ts +2 -0
  140. package/src/utils/isEmptyObject.ts +9 -0
  141. package/src/utils/readFileAsArrayBuffer.ts +12 -0
  142. package/dist/client.d.ts +0 -716
@@ -0,0 +1,153 @@
1
+ import type { Input, Value } from '@contember/schema'
2
+ import { GraphQlLiteral } from '../graphQlBuilder'
3
+ import { isEmptyObject } from '../utils'
4
+ import { CrudQueryBuilderError } from './CrudQueryBuilderError'
5
+ import type { WriteOperation } from './types'
6
+ import { WriteManyRelationBuilder } from './WriteManyRelationBuilder'
7
+ import { WriteOneRelationBuilder } from './WriteOneRelationBuilder'
8
+
9
+ class WriteDataBuilder<Op extends WriteOperation.ContentfulOperation> {
10
+ public readonly data: WriteDataBuilder.DataFormat[Op['op']]
11
+
12
+ public constructor(data?: WriteDataBuilder.DataFormat[Op['op']]) {
13
+ this.data = data || {}
14
+ }
15
+
16
+ public static resolveData<Op extends WriteOperation.ContentfulOperation>(
17
+ dataLike: WriteDataBuilder.DataLike<Op>,
18
+ ): WriteDataBuilder.DataFormat[Op['op']] | undefined {
19
+ let resolvedData: WriteDataBuilder.DataFormat[Op['op']]
20
+
21
+ if (dataLike instanceof WriteDataBuilder) {
22
+ resolvedData = dataLike.data
23
+ } else if (typeof dataLike === 'function') {
24
+ resolvedData = dataLike(new WriteDataBuilder()).data
25
+ } else {
26
+ resolvedData = dataLike
27
+ }
28
+
29
+ if (isEmptyObject(resolvedData)) {
30
+ return undefined
31
+ }
32
+ return resolvedData
33
+ }
34
+
35
+ public set(fieldName: string, value: Input.ColumnValue<GraphQlLiteral>) {
36
+ return new WriteDataBuilder<Op>({ ...this.data, [fieldName]: value })
37
+ }
38
+
39
+ public many(fieldName: string, data: WriteManyRelationBuilder.BuilderFactory<Op>): WriteDataBuilder<Op> {
40
+ const resolvedData = WriteManyRelationBuilder.instantiateFromFactory(data).data
41
+ return resolvedData === undefined || resolvedData.length === 0
42
+ ? this
43
+ : new WriteDataBuilder<Op>(this.mergeInFreshData(this.data, fieldName, resolvedData))
44
+ }
45
+
46
+ public one(fieldName: string, data: WriteOneRelationBuilder.BuilderFactory<Op>): WriteDataBuilder<Op> {
47
+ const resolvedData = WriteOneRelationBuilder.instantiateFromFactory(data).data
48
+ return resolvedData === undefined || isEmptyObject(resolvedData)
49
+ ? this
50
+ : new WriteDataBuilder<Op>(this.mergeInFreshData(this.data, fieldName, resolvedData))
51
+ }
52
+
53
+ private mergeInFreshData(
54
+ original: WriteDataBuilder.DataFormat[Op['op']],
55
+ fieldName: string,
56
+ fresh: WriteManyRelationBuilder.DataFormat[Op['op']] | WriteOneRelationBuilder.DataFormat[Op['op']],
57
+ ): WriteDataBuilder.DataFormat[Op['op']] {
58
+ if (fieldName in original) {
59
+ const existingValue = original[fieldName]
60
+ if (Array.isArray(existingValue)) {
61
+ if (Array.isArray(fresh)) {
62
+ return { ...original, [fieldName]: [...existingValue, ...fresh] }
63
+ }
64
+ throw new CrudQueryBuilderError(`Inconsistent data.`)
65
+ }
66
+ if (Array.isArray(fresh)) {
67
+ throw new CrudQueryBuilderError(`Inconsistent data.`)
68
+ }
69
+ return { ...original, [fieldName]: this.mergeUpdateOne(existingValue, fresh) }
70
+ }
71
+ return { ...original, [fieldName]: fresh }
72
+ }
73
+
74
+ private mergeUpdateOne(
75
+ original:
76
+ | Value.FieldValue<GraphQlLiteral>
77
+ | Input.CreateOneRelationInput<GraphQlLiteral>
78
+ | Input.UpdateOneRelationInput<GraphQlLiteral>,
79
+ fresh:
80
+ | Value.FieldValue<GraphQlLiteral>
81
+ | Input.CreateOneRelationInput<GraphQlLiteral>
82
+ | Input.UpdateOneRelationInput<GraphQlLiteral>,
83
+ ):
84
+ | Value.FieldValue<GraphQlLiteral>
85
+ | Input.CreateOneRelationInput<GraphQlLiteral>
86
+ | Input.UpdateOneRelationInput<GraphQlLiteral> {
87
+ // TODO This implementation pretty bad but it will have to do for now.
88
+ if (original instanceof GraphQlLiteral) {
89
+ if (fresh instanceof GraphQlLiteral) {
90
+ if (original.value === fresh.value) {
91
+ return original
92
+ }
93
+ }
94
+ throw new CrudQueryBuilderError(`Inconsistent data.`)
95
+ }
96
+ if (fresh instanceof GraphQlLiteral) {
97
+ throw new CrudQueryBuilderError(`Inconsistent data.`)
98
+ }
99
+
100
+ if (Array.isArray(original)) {
101
+ if (Array.isArray(fresh)) {
102
+ return [...original, ...fresh]
103
+ }
104
+ throw new CrudQueryBuilderError(`Inconsistent data.`)
105
+ }
106
+ if (Array.isArray(fresh)) {
107
+ throw new CrudQueryBuilderError(`Inconsistent data.`)
108
+ }
109
+
110
+ if (original === null) {
111
+ if (fresh === null) {
112
+ return original
113
+ }
114
+ }
115
+ if (fresh === null) {
116
+ throw new CrudQueryBuilderError(`Inconsistent data.`)
117
+ }
118
+
119
+ if (typeof original === 'object') {
120
+ if (typeof fresh === 'object') {
121
+ const composite: any = { ...original }
122
+ for (const field in fresh) {
123
+ const fromFresh = (fresh as any)[field]
124
+ composite[field] = field in composite ? this.mergeUpdateOne(composite[field], fromFresh) : fromFresh
125
+ }
126
+ return composite
127
+ }
128
+ throw new CrudQueryBuilderError(`Inconsistent data.`)
129
+ }
130
+ if (typeof fresh === 'object') {
131
+ throw new CrudQueryBuilderError(`Inconsistent data.`)
132
+ }
133
+
134
+ if (original === fresh) {
135
+ return original
136
+ }
137
+ throw new CrudQueryBuilderError(`Inconsistent data.`)
138
+ }
139
+ }
140
+
141
+ namespace WriteDataBuilder {
142
+ export interface DataFormat {
143
+ create: Input.CreateDataInput<GraphQlLiteral>
144
+ update: Input.UpdateDataInput<GraphQlLiteral>
145
+ }
146
+
147
+ export type DataLike<Op extends WriteOperation.ContentfulOperation> =
148
+ | DataFormat[Op['op']]
149
+ | WriteDataBuilder<Op>
150
+ | ((builder: WriteDataBuilder<Op>) => WriteDataBuilder<Op>)
151
+ }
152
+
153
+ export { WriteDataBuilder }
@@ -0,0 +1,141 @@
1
+ import type { Input } from '@contember/schema'
2
+ import type { GraphQlLiteral } from '../graphQlBuilder'
3
+ import type { WriteOperation, WriteRelationOps } from './types'
4
+ import { WriteDataBuilder } from './WriteDataBuilder'
5
+
6
+ class WriteManyRelationBuilder<
7
+ Op extends WriteOperation.ContentfulOperation,
8
+ Allowed extends WriteRelationOps[Op['op']],
9
+ > {
10
+ private constructor(public readonly data: WriteManyRelationBuilder.DataFormat[Op['op']] = []) {}
11
+
12
+ public static instantiate<
13
+ Op extends WriteOperation.ContentfulOperation,
14
+ Allowed extends WriteRelationOps[Op['op']] = WriteRelationOps[Op['op']],
15
+ >(data: WriteManyRelationBuilder.DataFormat[Op['op']] = []): WriteManyRelationBuilder.Builder<Op, Allowed> {
16
+ return new WriteManyRelationBuilder<Op, Allowed>(data)
17
+ }
18
+
19
+ public static instantiateFromFactory<
20
+ Op extends WriteOperation.ContentfulOperation,
21
+ Allowed extends WriteRelationOps[Op['op']],
22
+ >(builder: WriteManyRelationBuilder.BuilderFactory<Op, Allowed>): WriteManyRelationBuilder.Builder<Op, never> {
23
+ if (typeof builder === 'function') {
24
+ return builder(WriteManyRelationBuilder.instantiate())
25
+ }
26
+ if ('data' in builder) {
27
+ return WriteManyRelationBuilder.instantiate(builder.data)
28
+ }
29
+ return WriteManyRelationBuilder.instantiate(builder)
30
+ }
31
+
32
+ public create(
33
+ data: WriteDataBuilder.DataLike<WriteOperation.Create>,
34
+ alias?: string,
35
+ ): WriteManyRelationBuilder.Builder<Op> {
36
+ const resolvedData = WriteDataBuilder.resolveData(data)
37
+ return (
38
+ resolvedData === undefined
39
+ ? this
40
+ : WriteManyRelationBuilder.instantiate<Op>([
41
+ ...this.data,
42
+ this.withAlias({ create: resolvedData }, alias),
43
+ ] as WriteManyRelationBuilder.DataFormat[WriteOperation.Create['op']])
44
+ ) as WriteManyRelationBuilder.Builder<Op>
45
+ }
46
+
47
+ public connect(where: Input.UniqueWhere<GraphQlLiteral>, alias?: string) {
48
+ return WriteManyRelationBuilder.instantiate<Op>([
49
+ ...this.data,
50
+ this.withAlias({ connect: where }, alias),
51
+ ] as WriteManyRelationBuilder.DataFormat[Op['op']])
52
+ }
53
+
54
+ public delete(where: Input.UniqueWhere<GraphQlLiteral>, alias?: string) {
55
+ return WriteManyRelationBuilder.instantiate<WriteOperation.Update>([
56
+ ...this.data,
57
+ this.withAlias({ delete: where }, alias),
58
+ ])
59
+ }
60
+
61
+ public disconnect(where: Input.UniqueWhere<GraphQlLiteral>, alias?: string) {
62
+ return WriteManyRelationBuilder.instantiate<WriteOperation.Update>([
63
+ ...this.data,
64
+ this.withAlias({ disconnect: where }, alias),
65
+ ])
66
+ }
67
+
68
+ public update(
69
+ where: Input.UniqueWhere<GraphQlLiteral>,
70
+ data: WriteDataBuilder.DataLike<WriteOperation.Update>,
71
+ alias?: string,
72
+ ): WriteManyRelationBuilder.Builder<WriteOperation.Update> {
73
+ const resolvedData = WriteDataBuilder.resolveData(data)
74
+ return (
75
+ resolvedData === undefined
76
+ ? this
77
+ : WriteManyRelationBuilder.instantiate<WriteOperation.Update>([
78
+ ...this.data,
79
+ this.withAlias({ update: { by: where, data: resolvedData } }, alias),
80
+ ])
81
+ ) as WriteManyRelationBuilder.Builder<WriteOperation.Update>
82
+ }
83
+
84
+ public upsert(
85
+ where: Input.UniqueWhere<GraphQlLiteral>,
86
+ update: WriteDataBuilder.DataLike<WriteOperation.Update>,
87
+ create: WriteDataBuilder.DataLike<WriteOperation.Create>,
88
+ alias?: string,
89
+ ): WriteManyRelationBuilder.Builder<WriteOperation.Update> {
90
+ const resolvedUpdate = WriteDataBuilder.resolveData(update)
91
+ const resolvedCreate = WriteDataBuilder.resolveData(create)
92
+ return (
93
+ resolvedUpdate === undefined && resolvedCreate === undefined
94
+ ? this
95
+ : WriteManyRelationBuilder.instantiate<WriteOperation.Update>([
96
+ ...this.data,
97
+ this.withAlias(
98
+ {
99
+ upsert: {
100
+ by: where,
101
+ update: resolvedUpdate || {},
102
+ create: resolvedCreate || {},
103
+ },
104
+ },
105
+ alias,
106
+ ),
107
+ ])
108
+ ) as WriteManyRelationBuilder.Builder<WriteOperation.Update>
109
+ }
110
+
111
+ private withAlias<
112
+ D extends Input.CreateOneRelationInput<GraphQlLiteral> | Input.UpdateManyRelationInputItem<GraphQlLiteral>,
113
+ >(data: D, alias?: string): D {
114
+ if (alias !== undefined) {
115
+ data.alias = alias
116
+ }
117
+ return data
118
+ }
119
+ }
120
+
121
+ namespace WriteManyRelationBuilder {
122
+ export interface DataFormat {
123
+ create: Input.CreateManyRelationInput<GraphQlLiteral>
124
+ update: Input.UpdateManyRelationInput<GraphQlLiteral>
125
+ }
126
+
127
+ export type Builder<
128
+ Op extends WriteOperation.ContentfulOperation,
129
+ Allowed extends WriteRelationOps[Op['op']] = WriteRelationOps[Op['op']],
130
+ > = Omit<
131
+ WriteManyRelationBuilder<Op, Allowed>,
132
+ Exclude<WriteRelationOps[WriteOperation.ContentfulOperation['op']], Allowed>
133
+ >
134
+
135
+ export type BuilderFactory<
136
+ Op extends WriteOperation.ContentfulOperation,
137
+ Allowed extends WriteRelationOps[Op['op']] = WriteRelationOps[Op['op']],
138
+ > = DataFormat[Op['op']] | Builder<Op, never> | ((builder: Builder<Op, Allowed>) => Builder<Op, never>)
139
+ }
140
+
141
+ export { WriteManyRelationBuilder }
@@ -0,0 +1,101 @@
1
+ import type { Input } from '@contember/schema'
2
+ import type { GraphQlLiteral } from '../graphQlBuilder'
3
+ import type { WriteOperation, WriteRelationOps } from './types'
4
+ import { WriteDataBuilder } from './WriteDataBuilder'
5
+
6
+ class WriteOneRelationBuilder<
7
+ Op extends WriteOperation.ContentfulOperation,
8
+ Allowed extends WriteRelationOps[Op['op']] = WriteRelationOps[Op['op']],
9
+ D extends WriteOneRelationBuilder.DataFormat[Op['op']] | undefined = WriteOneRelationBuilder.DataFormat[Op['op']],
10
+ > {
11
+ protected constructor(public readonly data: D = undefined as D) {}
12
+
13
+ public static instantiate<
14
+ Op extends WriteOperation.ContentfulOperation,
15
+ Allowed extends WriteRelationOps[Op['op']] = WriteRelationOps[Op['op']],
16
+ D extends WriteOneRelationBuilder.DataFormat[Op['op']] | undefined = WriteOneRelationBuilder.DataFormat[Op['op']],
17
+ >(data: D = undefined as D): WriteOneRelationBuilder.Builder<Op, Allowed, D> {
18
+ return new WriteOneRelationBuilder<Op, Allowed, D>(data)
19
+ }
20
+
21
+ public static instantiateFromFactory<
22
+ Op extends WriteOperation.ContentfulOperation,
23
+ Allowed extends WriteRelationOps[Op['op']] = WriteRelationOps[Op['op']],
24
+ D extends WriteOneRelationBuilder.DataFormat[Op['op']] | undefined = WriteOneRelationBuilder.DataFormat[Op['op']],
25
+ >(builder: WriteOneRelationBuilder.BuilderFactory<Op, Allowed, D>): WriteOneRelationBuilder.Builder<Op, never, D> {
26
+ if (typeof builder === 'function') {
27
+ return builder(WriteOneRelationBuilder.instantiate())
28
+ }
29
+ if (builder && 'data' in builder!) {
30
+ return WriteOneRelationBuilder.instantiate(builder.data)
31
+ }
32
+ return WriteOneRelationBuilder.instantiate(builder)
33
+ }
34
+
35
+ public create(data: WriteDataBuilder.DataLike<WriteOperation.Create>) {
36
+ const resolvedData = WriteDataBuilder.resolveData(data)
37
+ return resolvedData === undefined
38
+ ? this
39
+ : WriteOneRelationBuilder.instantiate<Op, never>({
40
+ create: resolvedData,
41
+ })
42
+ }
43
+
44
+ public connect(where: Input.UniqueWhere<GraphQlLiteral>) {
45
+ return WriteOneRelationBuilder.instantiate<Op, never>({ connect: where })
46
+ }
47
+
48
+ public delete() {
49
+ return WriteOneRelationBuilder.instantiate<WriteOperation.Update, never>({ delete: true })
50
+ }
51
+
52
+ public disconnect() {
53
+ return WriteOneRelationBuilder.instantiate<WriteOperation.Update, never>({ disconnect: true })
54
+ }
55
+
56
+ public update(data: WriteDataBuilder.DataLike<WriteOperation.Update>) {
57
+ const resolvedData = WriteDataBuilder.resolveData(data)
58
+ return resolvedData === undefined ? this : new WriteOneRelationBuilder({ update: resolvedData })
59
+ }
60
+
61
+ public upsert(
62
+ update: WriteDataBuilder.DataLike<WriteOperation.Update>,
63
+ create: WriteDataBuilder.DataLike<WriteOperation.Create>,
64
+ ) {
65
+ const resolvedCreate = WriteDataBuilder.resolveData(create)
66
+ const resolvedUpdate = WriteDataBuilder.resolveData(update)
67
+
68
+ return resolvedUpdate === undefined && resolvedCreate === undefined
69
+ ? this
70
+ : WriteOneRelationBuilder.instantiate<WriteOperation.Update, never>({
71
+ upsert: {
72
+ update: resolvedUpdate || {},
73
+ create: resolvedCreate || {},
74
+ },
75
+ })
76
+ }
77
+ }
78
+
79
+ namespace WriteOneRelationBuilder {
80
+ export interface DataFormat {
81
+ create: Input.CreateOneRelationInput<GraphQlLiteral>
82
+ update: Input.UpdateOneRelationInput<GraphQlLiteral>
83
+ }
84
+
85
+ export type Builder<
86
+ Op extends WriteOperation.ContentfulOperation,
87
+ Allowed extends WriteRelationOps[Op['op']] = WriteRelationOps[Op['op']],
88
+ D extends WriteOneRelationBuilder.DataFormat[Op['op']] | undefined = WriteOneRelationBuilder.DataFormat[Op['op']],
89
+ > = Omit<
90
+ WriteOneRelationBuilder<Op, Allowed, D>,
91
+ Exclude<WriteRelationOps[WriteOperation.ContentfulOperation['op']], Allowed>
92
+ >
93
+
94
+ export type BuilderFactory<
95
+ Op extends WriteOperation.ContentfulOperation,
96
+ Allowed extends WriteRelationOps[Op['op']] = WriteRelationOps[Op['op']],
97
+ D extends WriteOneRelationBuilder.DataFormat[Op['op']] | undefined = WriteOneRelationBuilder.DataFormat[Op['op']],
98
+ > = D | Builder<Op, never, D> | ((builder: Builder<Op, Allowed, D>) => Builder<Op, never, D>)
99
+ }
100
+
101
+ export { WriteOneRelationBuilder }
@@ -0,0 +1,7 @@
1
+ export * from './CrudQueryBuilder'
2
+ export * from './ReadBuilder'
3
+ export * from './types'
4
+ export * from './WriteBuilder'
5
+ export * from './WriteDataBuilder'
6
+ export * from './WriteManyRelationBuilder'
7
+ export * from './WriteOneRelationBuilder'
@@ -0,0 +1,73 @@
1
+ import type { GraphQlBuilder } from '../index'
2
+
3
+ export type Mutations = 'create' | 'update' | 'delete'
4
+
5
+ export type Queries = 'get' | 'list' | 'paginate'
6
+
7
+ export type GetQueryArguments = 'by'
8
+
9
+ export type ListQueryArguments = 'filter' | 'orderBy' | 'offset' | 'limit'
10
+
11
+ export type PaginateQueryArguments = 'filter' | 'orderBy' | 'skip' | 'first'
12
+
13
+ export type CreateMutationArguments = 'data'
14
+
15
+ export type UpdateMutationArguments = 'data' | 'by'
16
+
17
+ export type DeleteMutationArguments = 'by'
18
+
19
+ export type ReductionArguments = 'filter' | 'by'
20
+
21
+ export type HasOneArguments = 'filter'
22
+
23
+ export type HasManyArguments = 'filter' | 'orderBy' | 'offset' | 'limit'
24
+
25
+ export type UpdateMutationFields = 'ok' | 'validation' | 'errors' | 'errorMessage' | 'node'
26
+
27
+ export type CreateMutationFields = 'ok' | 'validation' | 'errors' | 'errorMessage' | 'node'
28
+
29
+ export type DeleteMutationFields = 'ok' | 'node' | 'errors' | 'errorMessage'
30
+
31
+ export type WriteArguments = CreateMutationArguments | UpdateMutationArguments | DeleteMutationArguments
32
+
33
+ export type WriteFields = UpdateMutationFields | CreateMutationFields
34
+
35
+ export type ReadArguments =
36
+ | GetQueryArguments
37
+ | ListQueryArguments
38
+ | PaginateQueryArguments
39
+ | HasOneArguments
40
+ | HasManyArguments
41
+
42
+ export interface WriteRelationOps {
43
+ create: 'create' | 'connect'
44
+ update: 'create' | 'connect' | 'delete' | 'disconnect' | 'update' | 'upsert'
45
+ }
46
+
47
+ export type OrderDirection = GraphQlBuilder.GraphQlLiteral<'asc'> | GraphQlBuilder.GraphQlLiteral<'desc'>
48
+
49
+ // TODO Silly enums because TS does not support enum extension 🙄
50
+ // https://github.com/Microsoft/TypeScript/issues/17592
51
+ export namespace WriteOperation {
52
+ export interface Operation {
53
+ op: 'create' | 'update' | 'delete'
54
+ }
55
+ export abstract class Operation implements Operation {}
56
+
57
+ export interface ContentfulOperation {
58
+ op: 'create' | 'update'
59
+ }
60
+ export abstract class ContentfulOperation extends Operation implements ContentfulOperation {}
61
+
62
+ export class Update extends ContentfulOperation {
63
+ override readonly op = 'update' as const
64
+ }
65
+
66
+ export class Create extends ContentfulOperation {
67
+ override readonly op = 'create' as const
68
+ }
69
+
70
+ export class Delete extends Operation {
71
+ override readonly op = 'delete' as const
72
+ }
73
+ }
@@ -0,0 +1 @@
1
+ export class GraphQlBuilderError extends Error {}
@@ -0,0 +1,7 @@
1
+ export class GraphQlLiteral<Value extends string = string> {
2
+ constructor(public readonly value: Value) {}
3
+
4
+ public toString() {
5
+ return `Literal(${this.value})`
6
+ }
7
+ }
@@ -0,0 +1,87 @@
1
+ export class ObjectBuilder {
2
+ constructor(
3
+ public readonly fields: string[] = [],
4
+ public readonly objects: { [name: string]: ObjectBuilder } = {},
5
+ public readonly args: { [name: string]: any } = {},
6
+ public readonly fragmentApplications: string[] = [],
7
+ public readonly inlineFragments: { [typeName: string]: ObjectBuilder } = {},
8
+ public readonly objectName?: string,
9
+ ) {}
10
+
11
+ public argument(name: string, value: any): ObjectBuilder {
12
+ return new ObjectBuilder(
13
+ this.fields,
14
+ this.objects,
15
+ { ...this.args, [name]: value },
16
+ this.fragmentApplications,
17
+ this.inlineFragments,
18
+ this.objectName,
19
+ )
20
+ }
21
+
22
+ public name(name: string): ObjectBuilder {
23
+ return new ObjectBuilder(
24
+ this.fields,
25
+ this.objects,
26
+ this.args,
27
+ this.fragmentApplications,
28
+ this.inlineFragments,
29
+ name,
30
+ )
31
+ }
32
+
33
+ public field(name: string): ObjectBuilder {
34
+ return new ObjectBuilder(
35
+ [...this.fields, name],
36
+ this.objects,
37
+ this.args,
38
+ this.fragmentApplications,
39
+ this.inlineFragments,
40
+ this.objectName,
41
+ )
42
+ }
43
+
44
+ public object(name: string, builder: ((builder: ObjectBuilder) => ObjectBuilder) | ObjectBuilder): ObjectBuilder {
45
+ if (!(builder instanceof ObjectBuilder)) {
46
+ builder = builder(new ObjectBuilder())
47
+ }
48
+
49
+ return new ObjectBuilder(
50
+ this.fields,
51
+ { ...this.objects, [name]: builder },
52
+ this.args,
53
+ this.fragmentApplications,
54
+ this.inlineFragments,
55
+ this.objectName,
56
+ )
57
+ }
58
+
59
+ public inlineFragment(
60
+ typeName: string,
61
+ builder: ((builder: ObjectBuilder) => ObjectBuilder) | ObjectBuilder,
62
+ ): ObjectBuilder {
63
+ if (!(builder instanceof ObjectBuilder)) {
64
+ builder = builder(new ObjectBuilder())
65
+ }
66
+
67
+ return new ObjectBuilder(
68
+ this.fields,
69
+ this.objects,
70
+ this.args,
71
+ this.fragmentApplications,
72
+ { ...this.inlineFragments, [typeName]: builder },
73
+ this.objectName,
74
+ )
75
+ }
76
+
77
+ public applyFragment(fragmentName: string): ObjectBuilder {
78
+ return new ObjectBuilder(
79
+ this.fields,
80
+ this.objects,
81
+ this.args,
82
+ [...this.fragmentApplications, fragmentName],
83
+ this.inlineFragments,
84
+ this.objectName,
85
+ )
86
+ }
87
+ }
@@ -0,0 +1,34 @@
1
+ import type { GraphQlLiteral } from './GraphQlLiteral'
2
+ import { QueryCompiler } from './QueryCompiler'
3
+ import { RootObjectBuilder } from './RootObjectBuilder'
4
+
5
+ class QueryBuilder {
6
+ query(builder: ((builder: RootObjectBuilder) => RootObjectBuilder) | RootObjectBuilder): string {
7
+ if (!(builder instanceof RootObjectBuilder)) {
8
+ builder = builder(new RootObjectBuilder())
9
+ }
10
+ const compiler = new QueryCompiler('query', builder)
11
+ return compiler.create()
12
+ }
13
+
14
+ mutation(builder: ((builder: RootObjectBuilder) => RootObjectBuilder) | RootObjectBuilder): string {
15
+ if (!(builder instanceof RootObjectBuilder)) {
16
+ builder = builder(new RootObjectBuilder())
17
+ }
18
+ const compiler = new QueryCompiler('mutation', builder)
19
+ return compiler.create()
20
+ }
21
+ }
22
+
23
+ namespace QueryBuilder {
24
+ export interface Object {
25
+ [key: string]: Value
26
+ }
27
+
28
+ export interface List extends Array<Value> {}
29
+
30
+ export type AtomicValue = string | null | number | boolean | GraphQlLiteral
31
+ export type Value = AtomicValue | QueryBuilder.Object | List
32
+ }
33
+
34
+ export { QueryBuilder }