@nixxie-cms/core 1.0.3 → 2.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.
- package/CHANGELOG.md +36 -0
- package/CHANGES-1.1.md +134 -0
- package/context/dist/nixxie-cms-core-context.cjs.js +4 -3
- package/context/dist/nixxie-cms-core-context.esm.js +3 -2
- package/dist/declarations/src/access.d.ts +2 -2
- package/dist/declarations/src/access.d.ts.map +1 -1
- package/dist/declarations/src/admin-ui/components/Navigation.d.ts +2 -2
- package/dist/declarations/src/admin-ui/components/Navigation.d.ts.map +1 -1
- package/dist/declarations/src/admin-ui/context.d.ts +6 -6
- package/dist/declarations/src/admin-ui/context.d.ts.map +1 -1
- package/dist/declarations/src/admin-ui/utils/Fields.d.ts +3 -3
- package/dist/declarations/src/admin-ui/utils/Fields.d.ts.map +1 -1
- package/dist/declarations/src/admin-ui/utils/filters.d.ts +5 -5
- package/dist/declarations/src/admin-ui/utils/filters.d.ts.map +1 -1
- package/dist/declarations/src/admin-ui/utils/useCreateItem.d.ts +3 -3
- package/dist/declarations/src/admin-ui/utils/useCreateItem.d.ts.map +1 -1
- package/dist/declarations/src/admin-ui/utils/utils.d.ts +2 -2
- package/dist/declarations/src/admin-ui/utils/utils.d.ts.map +1 -1
- package/dist/declarations/src/context.d.ts +1 -1
- package/dist/declarations/src/context.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/bigInt/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/bigInt/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/bytes/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/bytes/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/calendarDay/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/calendarDay/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/checkbox/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/checkbox/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/decimal/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/decimal/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/file/index.d.ts +4 -4
- package/dist/declarations/src/fields/types/file/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/float/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/float/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/image/index.d.ts +4 -4
- package/dist/declarations/src/fields/types/image/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/integer/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/integer/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/json/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/json/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/multiselect/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/multiselect/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/multiselect/views/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/password/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/password/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/relationship/index.d.ts +8 -8
- package/dist/declarations/src/fields/types/relationship/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/relationship/views/ComboboxMany.d.ts +3 -3
- package/dist/declarations/src/fields/types/relationship/views/ComboboxMany.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/relationship/views/ComboboxSingle.d.ts +3 -3
- package/dist/declarations/src/fields/types/relationship/views/ComboboxSingle.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/relationship/views/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/relationship/views/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/relationship/views/types.d.ts +3 -3
- package/dist/declarations/src/fields/types/relationship/views/types.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/select/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/select/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/text/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/text/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/timestamp/index.d.ts +3 -3
- package/dist/declarations/src/fields/types/timestamp/index.d.ts.map +1 -1
- package/dist/declarations/src/fields/types/virtual/index.d.ts +7 -7
- package/dist/declarations/src/fields/types/virtual/index.d.ts.map +1 -1
- package/dist/declarations/src/helpers.d.ts +249 -13
- package/dist/declarations/src/helpers.d.ts.map +1 -1
- package/dist/declarations/src/index.d.ts +9 -4
- package/dist/declarations/src/index.d.ts.map +1 -1
- package/dist/declarations/src/internal-unstable/admin-ui/pages/ListPage/index.d.ts.map +1 -1
- package/dist/declarations/src/lib/admin-meta.d.ts +11 -11
- package/dist/declarations/src/lib/admin-meta.d.ts.map +1 -1
- package/dist/declarations/src/lib/core/access-control.d.ts +18 -18
- package/dist/declarations/src/lib/core/access-control.d.ts.map +1 -1
- package/dist/declarations/src/lib/core/cascade.d.ts +47 -0
- package/dist/declarations/src/lib/core/cascade.d.ts.map +1 -0
- package/dist/declarations/src/lib/core/initialise-lists.d.ts +27 -24
- package/dist/declarations/src/lib/core/initialise-lists.d.ts.map +1 -1
- package/dist/declarations/src/lib/env.d.ts +9 -0
- package/dist/declarations/src/lib/env.d.ts.map +1 -0
- package/dist/declarations/src/lib/system.d.ts +1 -1
- package/dist/declarations/src/lib/system.d.ts.map +1 -1
- package/dist/declarations/src/list-features.d.ts +162 -0
- package/dist/declarations/src/list-features.d.ts.map +1 -0
- package/dist/declarations/src/schema.d.ts +24 -23
- package/dist/declarations/src/schema.d.ts.map +1 -1
- package/dist/declarations/src/session.d.ts +75 -0
- package/dist/declarations/src/session.d.ts.map +1 -1
- package/dist/declarations/src/types/admin-meta.d.ts +11 -11
- package/dist/declarations/src/types/admin-meta.d.ts.map +1 -1
- package/dist/declarations/src/types/config/access-control.d.ts +42 -42
- package/dist/declarations/src/types/config/access-control.d.ts.map +1 -1
- package/dist/declarations/src/types/config/fields.d.ts +19 -19
- package/dist/declarations/src/types/config/fields.d.ts.map +1 -1
- package/dist/declarations/src/types/config/hooks.d.ts +131 -131
- package/dist/declarations/src/types/config/hooks.d.ts.map +1 -1
- package/dist/declarations/src/types/config/index.d.ts +190 -8
- package/dist/declarations/src/types/config/index.d.ts.map +1 -1
- package/dist/declarations/src/types/config/lists.d.ts +146 -108
- package/dist/declarations/src/types/config/lists.d.ts.map +1 -1
- package/dist/declarations/src/types/context.d.ts +507 -47
- package/dist/declarations/src/types/context.d.ts.map +1 -1
- package/dist/declarations/src/types/next-fields.d.ts +28 -28
- package/dist/declarations/src/types/next-fields.d.ts.map +1 -1
- package/dist/declarations/src/types/type-info.d.ts +3 -3
- package/dist/declarations/src/types/type-info.d.ts.map +1 -1
- package/dist/{express-455ae20c.cjs.js → express-84d534c2.cjs.js} +6 -6
- package/dist/{express-7559ca2d.esm.js → express-d0a4ce99.esm.js} +6 -6
- package/dist/{index-15c8f81e.esm.js → index-5d8b0b4e.esm.js} +363 -183
- package/dist/index-6055753b.cjs.js +393 -0
- package/dist/{index-42045902.cjs.js → index-ac29f382.cjs.js} +363 -185
- package/dist/index-f1703b7b.esm.js +386 -0
- package/dist/nixxie-cms-core.cjs.js +1388 -30
- package/dist/nixxie-cms-core.esm.js +1362 -24
- package/dist/{non-null-graphql-add6bb3d.cjs.js → non-null-graphql-4a44c122.cjs.js} +1 -1
- package/dist/{non-null-graphql-a84ed64d.esm.js → non-null-graphql-8c5feaae.esm.js} +1 -1
- package/dist/{resolve-hooks-165a9ce2.cjs.js → resolve-hooks-10a5f84c.cjs.js} +240 -6
- package/dist/{resolve-hooks-6813a045.esm.js → resolve-hooks-9e676794.esm.js} +238 -7
- package/dist/{system-a321642d.cjs.js → system-6b37a5f8.cjs.js} +33 -7
- package/dist/{system-03e49e4f.esm.js → system-e591d821.esm.js} +33 -7
- package/fields/dist/nixxie-cms-core-fields.cjs.js +29 -576
- package/fields/dist/nixxie-cms-core-fields.esm.js +18 -565
- package/fields/types/bytes/dist/nixxie-cms-core-fields-types-bytes.cjs.js +4 -2
- package/fields/types/bytes/dist/nixxie-cms-core-fields-types-bytes.esm.js +4 -2
- package/fields/types/multiselect/views/dist/nixxie-cms-core-fields-types-multiselect-views.cjs.js +1 -6
- package/fields/types/multiselect/views/dist/nixxie-cms-core-fields-types-multiselect-views.esm.js +1 -6
- package/fields/types/password/dist/nixxie-cms-core-fields-types-password.cjs.js +4 -2
- package/fields/types/password/dist/nixxie-cms-core-fields-types-password.esm.js +4 -2
- package/internal-unstable/artifacts/dist/nixxie-cms-core-internal-unstable-artifacts.cjs.js +4 -3
- package/internal-unstable/artifacts/dist/nixxie-cms-core-internal-unstable-artifacts.esm.js +4 -3
- package/package.json +4 -4
- package/scripts/cli/dist/nixxie-cms-core-scripts-cli.cjs.js +4 -3
- package/scripts/cli/dist/nixxie-cms-core-scripts-cli.esm.js +4 -3
- package/scripts/dist/nixxie-cms-core-scripts.cjs.js +4 -3
- package/scripts/dist/nixxie-cms-core-scripts.esm.js +4 -3
- package/session/dist/nixxie-cms-core-session.cjs.js +286 -0
- package/session/dist/nixxie-cms-core-session.esm.js +279 -1
- package/src/access.ts +25 -25
- package/src/admin-ui/admin-meta-graphql.ts +5 -5
- package/src/admin-ui/components/CreateButtonLink.tsx +46 -46
- package/src/admin-ui/components/Navigation.tsx +3 -3
- package/src/admin-ui/context.tsx +6 -6
- package/src/admin-ui/utils/Fields.tsx +241 -241
- package/src/admin-ui/utils/actionData.ts +36 -36
- package/src/admin-ui/utils/filters.ts +148 -148
- package/src/admin-ui/utils/useCreateItem.ts +171 -171
- package/src/admin-ui/utils/utils.tsx +127 -127
- package/src/context.ts +1 -1
- package/src/fields/non-null-graphql.ts +115 -115
- package/src/fields/types/bigInt/index.ts +6 -6
- package/src/fields/types/bytes/index.ts +6 -6
- package/src/fields/types/calendarDay/index.ts +18 -19
- package/src/fields/types/checkbox/index.ts +6 -6
- package/src/fields/types/decimal/index.ts +6 -6
- package/src/fields/types/file/index.ts +8 -8
- package/src/fields/types/float/index.ts +6 -6
- package/src/fields/types/image/index.ts +8 -8
- package/src/fields/types/integer/index.ts +6 -6
- package/src/fields/types/json/index.ts +5 -5
- package/src/fields/types/multiselect/index.ts +7 -7
- package/src/fields/types/multiselect/views/index.tsx +149 -151
- package/src/fields/types/password/index.ts +6 -6
- package/src/fields/types/relationship/index.ts +13 -13
- package/src/fields/types/relationship/views/ComboboxMany.tsx +110 -110
- package/src/fields/types/relationship/views/ComboboxSingle.tsx +115 -115
- package/src/fields/types/relationship/views/ContextualActions.tsx +139 -139
- package/src/fields/types/relationship/views/index.tsx +492 -492
- package/src/fields/types/relationship/views/types.ts +46 -46
- package/src/fields/types/relationship/views/useApolloQuery.ts +185 -185
- package/src/fields/types/relationship/views/useFilter.tsx +109 -109
- package/src/fields/types/select/index.ts +6 -6
- package/src/fields/types/text/index.ts +6 -6
- package/src/fields/types/timestamp/index.ts +23 -21
- package/src/fields/types/virtual/index.ts +11 -11
- package/src/helpers.ts +773 -42
- package/src/index.ts +66 -24
- package/src/internal-unstable/admin-ui/pages/ItemPage/common.tsx +4 -4
- package/src/internal-unstable/admin-ui/pages/ItemPage/index.tsx +5 -5
- package/src/internal-unstable/admin-ui/pages/ListPage/index.tsx +8 -8
- package/src/lib/admin-meta.ts +369 -369
- package/src/lib/context/createContext.ts +6 -0
- package/src/lib/core/access-control.ts +434 -434
- package/src/lib/core/cascade.ts +236 -0
- package/src/lib/core/initialise-lists.ts +49 -33
- package/src/lib/core/mutations/index.ts +7 -0
- package/src/lib/core/mutations/nested-mutation-many-input-resolvers.ts +145 -145
- package/src/lib/core/mutations/nested-mutation-one-input-resolvers.ts +71 -71
- package/src/lib/core/queries/output-field.ts +178 -178
- package/src/lib/env.ts +50 -0
- package/src/lib/id-field.ts +2 -2
- package/src/lib/system.ts +221 -207
- package/src/lib/typescript-schema-printer.ts +227 -227
- package/src/list-features.ts +476 -0
- package/src/schema.ts +92 -22
- package/src/session.ts +225 -0
- package/src/types/admin-meta.ts +218 -218
- package/src/types/config/access-control.ts +186 -186
- package/src/types/config/fields.ts +96 -96
- package/src/types/config/hooks.ts +529 -529
- package/src/types/config/index.ts +206 -7
- package/src/types/config/lists.ts +606 -565
- package/src/types/context.ts +592 -55
- package/src/types/next-fields.ts +31 -31
- package/src/types/type-info.ts +38 -38
- package/src/types/type-tests.ts +21 -21
|
@@ -1,145 +1,145 @@
|
|
|
1
|
-
import type { NixxieContext,
|
|
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<
|
|
12
|
-
null | undefined
|
|
13
|
-
>
|
|
14
|
-
|
|
15
|
-
type _UpdateValueType = Exclude<
|
|
16
|
-
InferValueFromArg<GArg<Exclude<
|
|
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,
|
|
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<
|
|
10
|
-
null | undefined
|
|
11
|
-
>
|
|
12
|
-
type _UpdateValueType = Exclude<
|
|
13
|
-
InferValueFromArg<
|
|
14
|
-
GArg<GNonNull<Exclude<
|
|
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
|
+
}
|