@nixxie-cms/core 1.0.3 → 1.1.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 (202) hide show
  1. package/CHANGES-1.1.md +134 -0
  2. package/context/dist/nixxie-cms-core-context.cjs.js +4 -3
  3. package/context/dist/nixxie-cms-core-context.esm.js +3 -2
  4. package/dist/declarations/src/access.d.ts +2 -2
  5. package/dist/declarations/src/access.d.ts.map +1 -1
  6. package/dist/declarations/src/admin-ui/components/Navigation.d.ts +2 -2
  7. package/dist/declarations/src/admin-ui/components/Navigation.d.ts.map +1 -1
  8. package/dist/declarations/src/admin-ui/context.d.ts +6 -6
  9. package/dist/declarations/src/admin-ui/context.d.ts.map +1 -1
  10. package/dist/declarations/src/admin-ui/utils/Fields.d.ts +3 -3
  11. package/dist/declarations/src/admin-ui/utils/Fields.d.ts.map +1 -1
  12. package/dist/declarations/src/admin-ui/utils/filters.d.ts +5 -5
  13. package/dist/declarations/src/admin-ui/utils/filters.d.ts.map +1 -1
  14. package/dist/declarations/src/admin-ui/utils/useCreateItem.d.ts +3 -3
  15. package/dist/declarations/src/admin-ui/utils/useCreateItem.d.ts.map +1 -1
  16. package/dist/declarations/src/admin-ui/utils/utils.d.ts +2 -2
  17. package/dist/declarations/src/admin-ui/utils/utils.d.ts.map +1 -1
  18. package/dist/declarations/src/context.d.ts +1 -1
  19. package/dist/declarations/src/context.d.ts.map +1 -1
  20. package/dist/declarations/src/fields/types/bigInt/index.d.ts +3 -3
  21. package/dist/declarations/src/fields/types/bigInt/index.d.ts.map +1 -1
  22. package/dist/declarations/src/fields/types/bytes/index.d.ts +3 -3
  23. package/dist/declarations/src/fields/types/bytes/index.d.ts.map +1 -1
  24. package/dist/declarations/src/fields/types/calendarDay/index.d.ts +3 -3
  25. package/dist/declarations/src/fields/types/calendarDay/index.d.ts.map +1 -1
  26. package/dist/declarations/src/fields/types/checkbox/index.d.ts +3 -3
  27. package/dist/declarations/src/fields/types/checkbox/index.d.ts.map +1 -1
  28. package/dist/declarations/src/fields/types/decimal/index.d.ts +3 -3
  29. package/dist/declarations/src/fields/types/decimal/index.d.ts.map +1 -1
  30. package/dist/declarations/src/fields/types/file/index.d.ts +4 -4
  31. package/dist/declarations/src/fields/types/file/index.d.ts.map +1 -1
  32. package/dist/declarations/src/fields/types/float/index.d.ts +3 -3
  33. package/dist/declarations/src/fields/types/float/index.d.ts.map +1 -1
  34. package/dist/declarations/src/fields/types/image/index.d.ts +4 -4
  35. package/dist/declarations/src/fields/types/image/index.d.ts.map +1 -1
  36. package/dist/declarations/src/fields/types/integer/index.d.ts +3 -3
  37. package/dist/declarations/src/fields/types/integer/index.d.ts.map +1 -1
  38. package/dist/declarations/src/fields/types/json/index.d.ts +3 -3
  39. package/dist/declarations/src/fields/types/json/index.d.ts.map +1 -1
  40. package/dist/declarations/src/fields/types/multiselect/index.d.ts +3 -3
  41. package/dist/declarations/src/fields/types/multiselect/index.d.ts.map +1 -1
  42. package/dist/declarations/src/fields/types/multiselect/views/index.d.ts.map +1 -1
  43. package/dist/declarations/src/fields/types/password/index.d.ts +3 -3
  44. package/dist/declarations/src/fields/types/password/index.d.ts.map +1 -1
  45. package/dist/declarations/src/fields/types/relationship/index.d.ts +8 -8
  46. package/dist/declarations/src/fields/types/relationship/index.d.ts.map +1 -1
  47. package/dist/declarations/src/fields/types/relationship/views/ComboboxMany.d.ts +3 -3
  48. package/dist/declarations/src/fields/types/relationship/views/ComboboxMany.d.ts.map +1 -1
  49. package/dist/declarations/src/fields/types/relationship/views/ComboboxSingle.d.ts +3 -3
  50. package/dist/declarations/src/fields/types/relationship/views/ComboboxSingle.d.ts.map +1 -1
  51. package/dist/declarations/src/fields/types/relationship/views/index.d.ts +3 -3
  52. package/dist/declarations/src/fields/types/relationship/views/index.d.ts.map +1 -1
  53. package/dist/declarations/src/fields/types/relationship/views/types.d.ts +3 -3
  54. package/dist/declarations/src/fields/types/relationship/views/types.d.ts.map +1 -1
  55. package/dist/declarations/src/fields/types/select/index.d.ts +3 -3
  56. package/dist/declarations/src/fields/types/select/index.d.ts.map +1 -1
  57. package/dist/declarations/src/fields/types/text/index.d.ts +3 -3
  58. package/dist/declarations/src/fields/types/text/index.d.ts.map +1 -1
  59. package/dist/declarations/src/fields/types/timestamp/index.d.ts +3 -3
  60. package/dist/declarations/src/fields/types/timestamp/index.d.ts.map +1 -1
  61. package/dist/declarations/src/fields/types/virtual/index.d.ts +7 -7
  62. package/dist/declarations/src/fields/types/virtual/index.d.ts.map +1 -1
  63. package/dist/declarations/src/helpers.d.ts +249 -13
  64. package/dist/declarations/src/helpers.d.ts.map +1 -1
  65. package/dist/declarations/src/index.d.ts +9 -4
  66. package/dist/declarations/src/index.d.ts.map +1 -1
  67. package/dist/declarations/src/internal-unstable/admin-ui/pages/ListPage/index.d.ts.map +1 -1
  68. package/dist/declarations/src/lib/admin-meta.d.ts +11 -11
  69. package/dist/declarations/src/lib/admin-meta.d.ts.map +1 -1
  70. package/dist/declarations/src/lib/core/access-control.d.ts +18 -18
  71. package/dist/declarations/src/lib/core/access-control.d.ts.map +1 -1
  72. package/dist/declarations/src/lib/core/cascade.d.ts +47 -0
  73. package/dist/declarations/src/lib/core/cascade.d.ts.map +1 -0
  74. package/dist/declarations/src/lib/core/initialise-lists.d.ts +27 -24
  75. package/dist/declarations/src/lib/core/initialise-lists.d.ts.map +1 -1
  76. package/dist/declarations/src/lib/env.d.ts +9 -0
  77. package/dist/declarations/src/lib/env.d.ts.map +1 -0
  78. package/dist/declarations/src/lib/system.d.ts +1 -1
  79. package/dist/declarations/src/lib/system.d.ts.map +1 -1
  80. package/dist/declarations/src/list-features.d.ts +162 -0
  81. package/dist/declarations/src/list-features.d.ts.map +1 -0
  82. package/dist/declarations/src/schema.d.ts +24 -23
  83. package/dist/declarations/src/schema.d.ts.map +1 -1
  84. package/dist/declarations/src/session.d.ts +75 -0
  85. package/dist/declarations/src/session.d.ts.map +1 -1
  86. package/dist/declarations/src/types/admin-meta.d.ts +11 -11
  87. package/dist/declarations/src/types/admin-meta.d.ts.map +1 -1
  88. package/dist/declarations/src/types/config/access-control.d.ts +42 -42
  89. package/dist/declarations/src/types/config/access-control.d.ts.map +1 -1
  90. package/dist/declarations/src/types/config/fields.d.ts +19 -19
  91. package/dist/declarations/src/types/config/fields.d.ts.map +1 -1
  92. package/dist/declarations/src/types/config/hooks.d.ts +131 -131
  93. package/dist/declarations/src/types/config/hooks.d.ts.map +1 -1
  94. package/dist/declarations/src/types/config/index.d.ts +171 -8
  95. package/dist/declarations/src/types/config/index.d.ts.map +1 -1
  96. package/dist/declarations/src/types/config/lists.d.ts +146 -108
  97. package/dist/declarations/src/types/config/lists.d.ts.map +1 -1
  98. package/dist/declarations/src/types/context.d.ts +349 -47
  99. package/dist/declarations/src/types/context.d.ts.map +1 -1
  100. package/dist/declarations/src/types/next-fields.d.ts +28 -28
  101. package/dist/declarations/src/types/next-fields.d.ts.map +1 -1
  102. package/dist/declarations/src/types/type-info.d.ts +3 -3
  103. package/dist/declarations/src/types/type-info.d.ts.map +1 -1
  104. package/dist/{express-7559ca2d.esm.js → express-0abbce07.esm.js} +6 -6
  105. package/dist/{express-455ae20c.cjs.js → express-7ca6f76a.cjs.js} +6 -6
  106. package/dist/{index-15c8f81e.esm.js → index-5d8b0b4e.esm.js} +363 -183
  107. package/dist/index-6055753b.cjs.js +393 -0
  108. package/dist/{index-42045902.cjs.js → index-ac29f382.cjs.js} +363 -185
  109. package/dist/index-f1703b7b.esm.js +386 -0
  110. package/dist/nixxie-cms-core.cjs.js +1387 -30
  111. package/dist/nixxie-cms-core.esm.js +1361 -24
  112. package/dist/{non-null-graphql-add6bb3d.cjs.js → non-null-graphql-4a44c122.cjs.js} +1 -1
  113. package/dist/{non-null-graphql-a84ed64d.esm.js → non-null-graphql-8c5feaae.esm.js} +1 -1
  114. package/dist/{resolve-hooks-165a9ce2.cjs.js → resolve-hooks-10a5f84c.cjs.js} +240 -6
  115. package/dist/{resolve-hooks-6813a045.esm.js → resolve-hooks-9e676794.esm.js} +238 -7
  116. package/dist/{system-03e49e4f.esm.js → system-4d2a2648.esm.js} +32 -7
  117. package/dist/{system-a321642d.cjs.js → system-69e1a285.cjs.js} +32 -7
  118. package/fields/dist/nixxie-cms-core-fields.cjs.js +29 -576
  119. package/fields/dist/nixxie-cms-core-fields.esm.js +18 -565
  120. package/fields/types/bytes/dist/nixxie-cms-core-fields-types-bytes.cjs.js +4 -2
  121. package/fields/types/bytes/dist/nixxie-cms-core-fields-types-bytes.esm.js +4 -2
  122. package/fields/types/multiselect/views/dist/nixxie-cms-core-fields-types-multiselect-views.cjs.js +1 -6
  123. package/fields/types/multiselect/views/dist/nixxie-cms-core-fields-types-multiselect-views.esm.js +1 -6
  124. package/fields/types/password/dist/nixxie-cms-core-fields-types-password.cjs.js +4 -2
  125. package/fields/types/password/dist/nixxie-cms-core-fields-types-password.esm.js +4 -2
  126. package/internal-unstable/artifacts/dist/nixxie-cms-core-internal-unstable-artifacts.cjs.js +4 -3
  127. package/internal-unstable/artifacts/dist/nixxie-cms-core-internal-unstable-artifacts.esm.js +4 -3
  128. package/package.json +4 -4
  129. package/scripts/cli/dist/nixxie-cms-core-scripts-cli.cjs.js +4 -3
  130. package/scripts/cli/dist/nixxie-cms-core-scripts-cli.esm.js +4 -3
  131. package/scripts/dist/nixxie-cms-core-scripts.cjs.js +4 -3
  132. package/scripts/dist/nixxie-cms-core-scripts.esm.js +4 -3
  133. package/session/dist/nixxie-cms-core-session.cjs.js +286 -0
  134. package/session/dist/nixxie-cms-core-session.esm.js +279 -1
  135. package/src/access.ts +25 -25
  136. package/src/admin-ui/admin-meta-graphql.ts +5 -5
  137. package/src/admin-ui/components/CreateButtonLink.tsx +46 -46
  138. package/src/admin-ui/components/Navigation.tsx +3 -3
  139. package/src/admin-ui/context.tsx +6 -6
  140. package/src/admin-ui/utils/Fields.tsx +241 -241
  141. package/src/admin-ui/utils/actionData.ts +36 -36
  142. package/src/admin-ui/utils/filters.ts +148 -148
  143. package/src/admin-ui/utils/useCreateItem.ts +171 -171
  144. package/src/admin-ui/utils/utils.tsx +127 -127
  145. package/src/context.ts +1 -1
  146. package/src/fields/non-null-graphql.ts +115 -115
  147. package/src/fields/types/bigInt/index.ts +6 -6
  148. package/src/fields/types/bytes/index.ts +6 -6
  149. package/src/fields/types/calendarDay/index.ts +18 -19
  150. package/src/fields/types/checkbox/index.ts +6 -6
  151. package/src/fields/types/decimal/index.ts +6 -6
  152. package/src/fields/types/file/index.ts +8 -8
  153. package/src/fields/types/float/index.ts +6 -6
  154. package/src/fields/types/image/index.ts +8 -8
  155. package/src/fields/types/integer/index.ts +6 -6
  156. package/src/fields/types/json/index.ts +5 -5
  157. package/src/fields/types/multiselect/index.ts +7 -7
  158. package/src/fields/types/multiselect/views/index.tsx +149 -151
  159. package/src/fields/types/password/index.ts +6 -6
  160. package/src/fields/types/relationship/index.ts +13 -13
  161. package/src/fields/types/relationship/views/ComboboxMany.tsx +110 -110
  162. package/src/fields/types/relationship/views/ComboboxSingle.tsx +115 -115
  163. package/src/fields/types/relationship/views/ContextualActions.tsx +139 -139
  164. package/src/fields/types/relationship/views/index.tsx +492 -492
  165. package/src/fields/types/relationship/views/types.ts +46 -46
  166. package/src/fields/types/relationship/views/useApolloQuery.ts +185 -185
  167. package/src/fields/types/relationship/views/useFilter.tsx +109 -109
  168. package/src/fields/types/select/index.ts +6 -6
  169. package/src/fields/types/text/index.ts +6 -6
  170. package/src/fields/types/timestamp/index.ts +23 -21
  171. package/src/fields/types/virtual/index.ts +11 -11
  172. package/src/helpers.ts +773 -42
  173. package/src/index.ts +66 -24
  174. package/src/internal-unstable/admin-ui/pages/ItemPage/common.tsx +4 -4
  175. package/src/internal-unstable/admin-ui/pages/ItemPage/index.tsx +5 -5
  176. package/src/internal-unstable/admin-ui/pages/ListPage/index.tsx +8 -8
  177. package/src/lib/admin-meta.ts +369 -369
  178. package/src/lib/context/createContext.ts +5 -0
  179. package/src/lib/core/access-control.ts +434 -434
  180. package/src/lib/core/cascade.ts +236 -0
  181. package/src/lib/core/initialise-lists.ts +49 -33
  182. package/src/lib/core/mutations/index.ts +7 -0
  183. package/src/lib/core/mutations/nested-mutation-many-input-resolvers.ts +145 -145
  184. package/src/lib/core/mutations/nested-mutation-one-input-resolvers.ts +71 -71
  185. package/src/lib/core/queries/output-field.ts +178 -178
  186. package/src/lib/env.ts +50 -0
  187. package/src/lib/id-field.ts +2 -2
  188. package/src/lib/system.ts +221 -207
  189. package/src/lib/typescript-schema-printer.ts +227 -227
  190. package/src/list-features.ts +476 -0
  191. package/src/schema.ts +91 -22
  192. package/src/session.ts +225 -0
  193. package/src/types/admin-meta.ts +218 -218
  194. package/src/types/config/access-control.ts +186 -186
  195. package/src/types/config/fields.ts +96 -96
  196. package/src/types/config/hooks.ts +529 -529
  197. package/src/types/config/index.ts +185 -7
  198. package/src/types/config/lists.ts +606 -565
  199. package/src/types/context.ts +426 -55
  200. package/src/types/next-fields.ts +31 -31
  201. package/src/types/type-info.ts +38 -38
  202. package/src/types/type-tests.ts +21 -21
@@ -1,145 +1,145 @@
1
- import type { NixxieContext, GraphQLTypesForList } from '../../../types'
2
- import type { UniqueInputFilter } from '../where-inputs'
3
- import type { InitialisedList } from '../initialise-lists'
4
- import { isRejected, isFulfilled } from '../utils'
5
- import { userInputError } from '../graphql-errors'
6
- import type { NestedMutationState } from './'
7
- import { checkUniqueItemExists } from '../access-control'
8
- import type { InferValueFromArg, GArg } from '@graphql-ts/schema'
9
-
10
- type _CreateValueType = Exclude<
11
- InferValueFromArg<GArg<Exclude<GraphQLTypesForList['relateTo']['many']['create'], undefined>>>,
12
- null | undefined
13
- >
14
-
15
- type _UpdateValueType = Exclude<
16
- InferValueFromArg<GArg<Exclude<GraphQLTypesForList['relateTo']['many']['update'], undefined>>>,
17
- null | undefined
18
- >
19
-
20
- export class RelationshipErrors extends Error {
21
- errors: { error: Error; tag: string }[]
22
- constructor(errors: { error: Error; tag: string }[]) {
23
- super('Multiple relationship errors')
24
- this.errors = errors
25
- }
26
- }
27
-
28
- function getResolvedUniqueWheres(
29
- uniqueInputs: UniqueInputFilter[],
30
- context: NixxieContext,
31
- foreignList: InitialisedList,
32
- operation: string
33
- ) {
34
- return uniqueInputs.map(uniqueInput =>
35
- checkUniqueItemExists(uniqueInput, foreignList, context, operation)
36
- )
37
- }
38
-
39
- export function resolveRelateToManyForCreateInput(
40
- nestedMutationState: NestedMutationState,
41
- context: NixxieContext,
42
- foreignList: InitialisedList,
43
- tag: string
44
- ) {
45
- return async (value: _CreateValueType) => {
46
- if (
47
- !Array.isArray(value.connect) &&
48
- !Array.isArray(value.create) &&
49
- !Array.isArray(value.set)
50
- ) {
51
- throw userInputError(
52
- `You must provide at least one of "set", "connect" or "create" in to-many relationship inputs for "create" operations.`
53
- )
54
- }
55
-
56
- // Perform queries for the connections
57
- const connects = Promise.allSettled(
58
- getResolvedUniqueWheres(value.connect ?? [], context, foreignList, 'connect')
59
- )
60
- const sets = Promise.allSettled(
61
- getResolvedUniqueWheres(value.set ?? [], context, foreignList, 'set')
62
- )
63
-
64
- // Perform nested mutations for the creations
65
- const creates = Promise.allSettled(
66
- (value.create ?? []).map(x => nestedMutationState.create(x, foreignList))
67
- )
68
-
69
- // Resolve items
70
- const [connectResult, createResult, setResult] = await Promise.all([connects, creates, sets])
71
-
72
- // Collect all the errors
73
- const errors = [...connectResult, ...createResult, ...setResult].filter(isRejected)
74
- if (errors.length) throw new RelationshipErrors(errors.map(x => ({ error: x.reason, tag })))
75
-
76
- return {
77
- connect: [...setResult, ...connectResult, ...createResult]
78
- .filter(isFulfilled)
79
- .map(x => x.value),
80
- }
81
- }
82
- }
83
-
84
- export function resolveRelateToManyForUpdateInput(
85
- nestedMutationState: NestedMutationState,
86
- context: NixxieContext,
87
- foreignList: InitialisedList,
88
- tag: string
89
- ) {
90
- return async (value: _UpdateValueType) => {
91
- if (
92
- !Array.isArray(value.connect) &&
93
- !Array.isArray(value.create) &&
94
- !Array.isArray(value.disconnect) &&
95
- !Array.isArray(value.set)
96
- ) {
97
- throw userInputError(
98
- `You must provide at least one of "set", "connect", "create" or "disconnect" in to-many relationship inputs for "update" operations.`
99
- )
100
- }
101
-
102
- if (value.set && value.disconnect) {
103
- throw userInputError(
104
- `The "set" and "disconnect" fields cannot both be provided to to-many relationship inputs for "update" operations.`
105
- )
106
- }
107
-
108
- // Perform queries for the connections
109
- const connects = Promise.allSettled(
110
- getResolvedUniqueWheres(value.connect ?? [], context, foreignList, 'connect')
111
- )
112
- const disconnects = Promise.allSettled(
113
- getResolvedUniqueWheres(value.disconnect ?? [], context, foreignList, 'disconnect')
114
- )
115
- const sets = Promise.allSettled(
116
- getResolvedUniqueWheres(value.set ?? [], context, foreignList, 'set')
117
- )
118
-
119
- // Perform nested mutations for the creations
120
- const creates = Promise.allSettled(
121
- (value.create ?? []).map(x => nestedMutationState.create(x, foreignList))
122
- )
123
-
124
- // Resolve items
125
- const [connectResult, createResult, disconnectResult, setResult] = await Promise.all([
126
- connects,
127
- creates,
128
- disconnects,
129
- sets,
130
- ])
131
-
132
- // Collect all the errors
133
- const errors = [...connectResult, ...createResult, ...disconnectResult, ...setResult].filter(
134
- isRejected
135
- )
136
- if (errors.length) throw new RelationshipErrors(errors.map(x => ({ error: x.reason, tag })))
137
-
138
- return {
139
- // unlike all the other operations, an empty array isn't a no-op for set
140
- set: value.set ? setResult.filter(isFulfilled).map(x => x.value) : undefined,
141
- disconnect: disconnectResult.filter(isFulfilled).map(x => x.value),
142
- connect: [...connectResult, ...createResult].filter(isFulfilled).map(x => x.value),
143
- }
144
- }
145
- }
1
+ import type { NixxieContext, GraphQLTypesForCollection } from '../../../types'
2
+ import type { UniqueInputFilter } from '../where-inputs'
3
+ import type { InitialisedList } from '../initialise-lists'
4
+ import { isRejected, isFulfilled } from '../utils'
5
+ import { userInputError } from '../graphql-errors'
6
+ import type { NestedMutationState } from './'
7
+ import { checkUniqueItemExists } from '../access-control'
8
+ import type { InferValueFromArg, GArg } from '@graphql-ts/schema'
9
+
10
+ type _CreateValueType = Exclude<
11
+ InferValueFromArg<GArg<Exclude<GraphQLTypesForCollection['relateTo']['many']['create'], undefined>>>,
12
+ null | undefined
13
+ >
14
+
15
+ type _UpdateValueType = Exclude<
16
+ InferValueFromArg<GArg<Exclude<GraphQLTypesForCollection['relateTo']['many']['update'], undefined>>>,
17
+ null | undefined
18
+ >
19
+
20
+ export class RelationshipErrors extends Error {
21
+ errors: { error: Error; tag: string }[]
22
+ constructor(errors: { error: Error; tag: string }[]) {
23
+ super('Multiple relationship errors')
24
+ this.errors = errors
25
+ }
26
+ }
27
+
28
+ function getResolvedUniqueWheres(
29
+ uniqueInputs: UniqueInputFilter[],
30
+ context: NixxieContext,
31
+ foreignList: InitialisedList,
32
+ operation: string
33
+ ) {
34
+ return uniqueInputs.map(uniqueInput =>
35
+ checkUniqueItemExists(uniqueInput, foreignList, context, operation)
36
+ )
37
+ }
38
+
39
+ export function resolveRelateToManyForCreateInput(
40
+ nestedMutationState: NestedMutationState,
41
+ context: NixxieContext,
42
+ foreignList: InitialisedList,
43
+ tag: string
44
+ ) {
45
+ return async (value: _CreateValueType) => {
46
+ if (
47
+ !Array.isArray(value.connect) &&
48
+ !Array.isArray(value.create) &&
49
+ !Array.isArray(value.set)
50
+ ) {
51
+ throw userInputError(
52
+ `You must provide at least one of "set", "connect" or "create" in to-many relationship inputs for "create" operations.`
53
+ )
54
+ }
55
+
56
+ // Perform queries for the connections
57
+ const connects = Promise.allSettled(
58
+ getResolvedUniqueWheres(value.connect ?? [], context, foreignList, 'connect')
59
+ )
60
+ const sets = Promise.allSettled(
61
+ getResolvedUniqueWheres(value.set ?? [], context, foreignList, 'set')
62
+ )
63
+
64
+ // Perform nested mutations for the creations
65
+ const creates = Promise.allSettled(
66
+ (value.create ?? []).map(x => nestedMutationState.create(x, foreignList))
67
+ )
68
+
69
+ // Resolve items
70
+ const [connectResult, createResult, setResult] = await Promise.all([connects, creates, sets])
71
+
72
+ // Collect all the errors
73
+ const errors = [...connectResult, ...createResult, ...setResult].filter(isRejected)
74
+ if (errors.length) throw new RelationshipErrors(errors.map(x => ({ error: x.reason, tag })))
75
+
76
+ return {
77
+ connect: [...setResult, ...connectResult, ...createResult]
78
+ .filter(isFulfilled)
79
+ .map(x => x.value),
80
+ }
81
+ }
82
+ }
83
+
84
+ export function resolveRelateToManyForUpdateInput(
85
+ nestedMutationState: NestedMutationState,
86
+ context: NixxieContext,
87
+ foreignList: InitialisedList,
88
+ tag: string
89
+ ) {
90
+ return async (value: _UpdateValueType) => {
91
+ if (
92
+ !Array.isArray(value.connect) &&
93
+ !Array.isArray(value.create) &&
94
+ !Array.isArray(value.disconnect) &&
95
+ !Array.isArray(value.set)
96
+ ) {
97
+ throw userInputError(
98
+ `You must provide at least one of "set", "connect", "create" or "disconnect" in to-many relationship inputs for "update" operations.`
99
+ )
100
+ }
101
+
102
+ if (value.set && value.disconnect) {
103
+ throw userInputError(
104
+ `The "set" and "disconnect" fields cannot both be provided to to-many relationship inputs for "update" operations.`
105
+ )
106
+ }
107
+
108
+ // Perform queries for the connections
109
+ const connects = Promise.allSettled(
110
+ getResolvedUniqueWheres(value.connect ?? [], context, foreignList, 'connect')
111
+ )
112
+ const disconnects = Promise.allSettled(
113
+ getResolvedUniqueWheres(value.disconnect ?? [], context, foreignList, 'disconnect')
114
+ )
115
+ const sets = Promise.allSettled(
116
+ getResolvedUniqueWheres(value.set ?? [], context, foreignList, 'set')
117
+ )
118
+
119
+ // Perform nested mutations for the creations
120
+ const creates = Promise.allSettled(
121
+ (value.create ?? []).map(x => nestedMutationState.create(x, foreignList))
122
+ )
123
+
124
+ // Resolve items
125
+ const [connectResult, createResult, disconnectResult, setResult] = await Promise.all([
126
+ connects,
127
+ creates,
128
+ disconnects,
129
+ sets,
130
+ ])
131
+
132
+ // Collect all the errors
133
+ const errors = [...connectResult, ...createResult, ...disconnectResult, ...setResult].filter(
134
+ isRejected
135
+ )
136
+ if (errors.length) throw new RelationshipErrors(errors.map(x => ({ error: x.reason, tag })))
137
+
138
+ return {
139
+ // unlike all the other operations, an empty array isn't a no-op for set
140
+ set: value.set ? setResult.filter(isFulfilled).map(x => x.value) : undefined,
141
+ disconnect: disconnectResult.filter(isFulfilled).map(x => x.value),
142
+ connect: [...connectResult, ...createResult].filter(isFulfilled).map(x => x.value),
143
+ }
144
+ }
145
+ }
@@ -1,71 +1,71 @@
1
- import type { NixxieContext, GraphQLTypesForList } from '../../../types'
2
- import type { InitialisedList } from '../initialise-lists'
3
- import { userInputError } from '../graphql-errors'
4
- import type { NestedMutationState } from './'
5
- import { checkUniqueItemExists } from '../access-control'
6
- import type { InferValueFromArg, GArg, GNonNull } from '@graphql-ts/schema'
7
-
8
- type _CreateValueType = Exclude<
9
- InferValueFromArg<GArg<Exclude<GraphQLTypesForList['relateTo']['one']['create'], undefined>>>,
10
- null | undefined
11
- >
12
- type _UpdateValueType = Exclude<
13
- InferValueFromArg<
14
- GArg<GNonNull<Exclude<GraphQLTypesForList['relateTo']['one']['update'], undefined>>>
15
- >,
16
- null | undefined
17
- >
18
-
19
- async function handleCreateAndUpdate(
20
- value: _CreateValueType,
21
- nestedMutationState: NestedMutationState,
22
- context: NixxieContext,
23
- foreignList: InitialisedList
24
- ) {
25
- if (value.connect) {
26
- return { connect: await checkUniqueItemExists(value.connect, foreignList, context, 'connect') }
27
- }
28
-
29
- if (value.create) {
30
- const { id } = await nestedMutationState.create(value.create, foreignList)
31
- return { connect: { id } }
32
- }
33
- }
34
-
35
- export function resolveRelateToOneForCreateInput(
36
- nestedMutationState: NestedMutationState,
37
- context: NixxieContext,
38
- foreignList: InitialisedList
39
- ) {
40
- return async (value: _CreateValueType) => {
41
- const numOfKeys = Object.keys(value).length
42
- if (numOfKeys !== 1) {
43
- throw userInputError(
44
- `You must provide "connect" or "create" in to-one relationship inputs for "create" operations.`
45
- )
46
- }
47
- return handleCreateAndUpdate(value, nestedMutationState, context, foreignList)
48
- }
49
- }
50
-
51
- export function resolveRelateToOneForUpdateInput(
52
- nestedMutationState: NestedMutationState,
53
- context: NixxieContext,
54
- foreignList: InitialisedList
55
- ) {
56
- return async (value: _UpdateValueType) => {
57
- if (Object.keys(value).length !== 1) {
58
- throw userInputError(
59
- `You must provide one of "connect", "create" or "disconnect" in to-one relationship inputs for "update" operations.`
60
- )
61
- }
62
-
63
- if (value.connect || value.create) {
64
- return handleCreateAndUpdate(value, nestedMutationState, context, foreignList)
65
- }
66
-
67
- if (value.disconnect) {
68
- return { disconnect: true }
69
- }
70
- }
71
- }
1
+ import type { NixxieContext, GraphQLTypesForCollection } from '../../../types'
2
+ import type { InitialisedList } from '../initialise-lists'
3
+ import { userInputError } from '../graphql-errors'
4
+ import type { NestedMutationState } from './'
5
+ import { checkUniqueItemExists } from '../access-control'
6
+ import type { InferValueFromArg, GArg, GNonNull } from '@graphql-ts/schema'
7
+
8
+ type _CreateValueType = Exclude<
9
+ InferValueFromArg<GArg<Exclude<GraphQLTypesForCollection['relateTo']['one']['create'], undefined>>>,
10
+ null | undefined
11
+ >
12
+ type _UpdateValueType = Exclude<
13
+ InferValueFromArg<
14
+ GArg<GNonNull<Exclude<GraphQLTypesForCollection['relateTo']['one']['update'], undefined>>>
15
+ >,
16
+ null | undefined
17
+ >
18
+
19
+ async function handleCreateAndUpdate(
20
+ value: _CreateValueType,
21
+ nestedMutationState: NestedMutationState,
22
+ context: NixxieContext,
23
+ foreignList: InitialisedList
24
+ ) {
25
+ if (value.connect) {
26
+ return { connect: await checkUniqueItemExists(value.connect, foreignList, context, 'connect') }
27
+ }
28
+
29
+ if (value.create) {
30
+ const { id } = await nestedMutationState.create(value.create, foreignList)
31
+ return { connect: { id } }
32
+ }
33
+ }
34
+
35
+ export function resolveRelateToOneForCreateInput(
36
+ nestedMutationState: NestedMutationState,
37
+ context: NixxieContext,
38
+ foreignList: InitialisedList
39
+ ) {
40
+ return async (value: _CreateValueType) => {
41
+ const numOfKeys = Object.keys(value).length
42
+ if (numOfKeys !== 1) {
43
+ throw userInputError(
44
+ `You must provide "connect" or "create" in to-one relationship inputs for "create" operations.`
45
+ )
46
+ }
47
+ return handleCreateAndUpdate(value, nestedMutationState, context, foreignList)
48
+ }
49
+ }
50
+
51
+ export function resolveRelateToOneForUpdateInput(
52
+ nestedMutationState: NestedMutationState,
53
+ context: NixxieContext,
54
+ foreignList: InitialisedList
55
+ ) {
56
+ return async (value: _UpdateValueType) => {
57
+ if (Object.keys(value).length !== 1) {
58
+ throw userInputError(
59
+ `You must provide one of "connect", "create" or "disconnect" in to-one relationship inputs for "update" operations.`
60
+ )
61
+ }
62
+
63
+ if (value.connect || value.create) {
64
+ return handleCreateAndUpdate(value, nestedMutationState, context, foreignList)
65
+ }
66
+
67
+ if (value.disconnect) {
68
+ return { disconnect: true }
69
+ }
70
+ }
71
+ }