@smartive/graphql-magic 16.3.7 → 16.3.8
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 +2 -2
- package/dist/bin/gqm.cjs +37 -35
- package/dist/cjs/index.cjs +51 -48
- package/dist/esm/api/execute.d.ts +1 -5
- package/dist/esm/api/execute.js.map +1 -1
- package/dist/esm/client/queries.d.ts +4 -4
- package/dist/esm/client/queries.js.map +1 -1
- package/dist/esm/db/generate.js +2 -0
- package/dist/esm/db/generate.js.map +1 -1
- package/dist/esm/migrations/generate.js +1 -1
- package/dist/esm/migrations/generate.js.map +1 -1
- package/dist/esm/models/models.d.ts +1 -1
- package/dist/esm/models/models.js.map +1 -1
- package/dist/esm/models/utils.d.ts +8 -12
- package/dist/esm/models/utils.js +3 -5
- package/dist/esm/models/utils.js.map +1 -1
- package/dist/esm/permissions/check.js +0 -15
- package/dist/esm/permissions/check.js.map +1 -1
- package/dist/esm/permissions/generate.d.ts +5 -19
- package/dist/esm/permissions/generate.js.map +1 -1
- package/dist/esm/resolvers/arguments.js.map +1 -1
- package/dist/esm/resolvers/filters.js +0 -2
- package/dist/esm/resolvers/filters.js.map +1 -1
- package/dist/esm/resolvers/mutations.js +5 -4
- package/dist/esm/resolvers/mutations.js.map +1 -1
- package/dist/esm/resolvers/node.js.map +1 -1
- package/dist/esm/resolvers/resolver.d.ts +2 -2
- package/dist/esm/resolvers/resolver.js +1 -1
- package/dist/esm/resolvers/resolver.js.map +1 -1
- package/dist/esm/resolvers/selects.js.map +1 -1
- package/dist/esm/resolvers/utils.d.ts +2 -6
- package/dist/esm/resolvers/utils.js +4 -2
- package/dist/esm/resolvers/utils.js.map +1 -1
- package/dist/esm/schema/utils.d.ts +4 -4
- package/dist/esm/schema/utils.js +31 -30
- package/dist/esm/schema/utils.js.map +1 -1
- package/dist/esm/utils/dates.d.ts +2 -4
- package/dist/esm/utils/dates.js +1 -3
- package/dist/esm/utils/dates.js.map +1 -1
- package/docs/docs/1-tutorial.md +1 -1
- package/eslint.config.mjs +42 -0
- package/migrations/20230912185644_setup.ts +1 -1
- package/package.json +6 -11
- package/src/api/execute.ts +1 -0
- package/src/bin/gqm/codegen.ts +1 -1
- package/src/client/gql.ts +1 -1
- package/src/client/mutations.ts +8 -8
- package/src/client/queries.ts +15 -14
- package/src/db/generate.ts +8 -5
- package/src/migrations/generate.ts +26 -22
- package/src/models/models.ts +24 -9
- package/src/models/mutation-hook.ts +1 -1
- package/src/models/utils.ts +8 -7
- package/src/permissions/check.ts +22 -30
- package/src/permissions/generate.ts +8 -25
- package/src/resolvers/arguments.ts +7 -2
- package/src/resolvers/filters.ts +8 -10
- package/src/resolvers/mutations.ts +19 -16
- package/src/resolvers/node.ts +3 -2
- package/src/resolvers/resolver.ts +11 -10
- package/src/resolvers/selects.ts +4 -3
- package/src/resolvers/utils.ts +15 -10
- package/src/schema/generate.ts +11 -11
- package/src/schema/utils.ts +84 -82
- package/src/utils/dates.ts +3 -3
- package/tests/generated/api/index.ts +2 -2
- package/tests/generated/client/index.ts +1 -193
- package/tests/generated/db/index.ts +4 -4
- package/tests/generated/models.json +2 -1
- package/tests/generated/schema.graphql +1 -1
- package/tests/utils/graphql-client.ts +49 -0
- package/tests/utils/models.ts +1 -0
- package/tests/utils/server.ts +4 -5
- package/tsconfig.eslint.json +18 -3
- package/tsconfig.json +3 -1
- package/.eslintrc +0 -13
package/src/resolvers/utils.ts
CHANGED
|
@@ -21,17 +21,17 @@ import { FieldResolverNode, ResolverNode } from './node';
|
|
|
21
21
|
export const ID_ALIAS = 'ID';
|
|
22
22
|
export const TYPE_ALIAS = 'TYPE';
|
|
23
23
|
|
|
24
|
-
export type VariableValues =
|
|
25
|
-
[variableName: string]: Value;
|
|
26
|
-
};
|
|
24
|
+
export type VariableValues = Record<string, Value>;
|
|
27
25
|
|
|
28
26
|
export const getTypeName = (t: TypeNode): string => {
|
|
29
27
|
switch (t.kind) {
|
|
30
28
|
case 'ListType':
|
|
31
29
|
case 'NonNullType':
|
|
32
30
|
return getTypeName(t.type);
|
|
33
|
-
|
|
31
|
+
case 'NamedType':
|
|
34
32
|
return t.name.value;
|
|
33
|
+
default:
|
|
34
|
+
throw new Error(`Unknown type node kind: ${t.kind}`);
|
|
35
35
|
}
|
|
36
36
|
};
|
|
37
37
|
|
|
@@ -67,14 +67,14 @@ export type Entry = {
|
|
|
67
67
|
|
|
68
68
|
export function hydrate<T extends Entry>(
|
|
69
69
|
node: FieldResolverNode,
|
|
70
|
-
raw:
|
|
70
|
+
raw: Record<string, undefined | null | string | Date | number>[],
|
|
71
71
|
): T[] {
|
|
72
72
|
const resultAlias = node.resultAlias;
|
|
73
73
|
const res = raw.map((entry) => {
|
|
74
74
|
const res: any = {};
|
|
75
75
|
outer: for (const [column, value] of Object.entries(entry)) {
|
|
76
76
|
let current = res;
|
|
77
|
-
const [, columnWithoutField, fieldName] = column.match(/^(.*\w)__(\w+)$/)
|
|
77
|
+
const [, columnWithoutField, fieldName] = column.match(/^(.*\w)__(\w+)$/)!;
|
|
78
78
|
const longColumn = node.ctx.aliases.getLong(columnWithoutField);
|
|
79
79
|
const longColumnWithoutRoot = longColumn.replace(new RegExp(`^${resultAlias}(__)?`), '');
|
|
80
80
|
const allParts = [resultAlias, ...(longColumnWithoutRoot ? longColumnWithoutRoot.split('__') : []), fieldName];
|
|
@@ -92,6 +92,7 @@ export function hydrate<T extends Entry>(
|
|
|
92
92
|
}
|
|
93
93
|
current[it(fieldName)] = value;
|
|
94
94
|
}
|
|
95
|
+
|
|
95
96
|
return res[resultAlias];
|
|
96
97
|
});
|
|
97
98
|
|
|
@@ -102,6 +103,7 @@ export const ors = (query: Knex.QueryBuilder, [first, ...rest]: ((query: Knex.Qu
|
|
|
102
103
|
if (!first) {
|
|
103
104
|
return query;
|
|
104
105
|
}
|
|
106
|
+
|
|
105
107
|
return query.where((subQuery) => {
|
|
106
108
|
void subQuery.where((subSubQuery) => {
|
|
107
109
|
void first(subSubQuery);
|
|
@@ -117,7 +119,7 @@ export const ors = (query: Knex.QueryBuilder, [first, ...rest]: ((query: Knex.Qu
|
|
|
117
119
|
export const getNameOrAlias = (node: FieldNode) => {
|
|
118
120
|
const name = node.alias ? node.alias.value : node.name.value;
|
|
119
121
|
|
|
120
|
-
if ([ID_ALIAS].
|
|
122
|
+
if ([ID_ALIAS].includes(name)) {
|
|
121
123
|
throw new UserInputError(`"${name}" can not be used as alias since it's a reserved word`);
|
|
122
124
|
}
|
|
123
125
|
|
|
@@ -140,7 +142,7 @@ export const applyJoins = (aliases: AliasGenerator, query: Knex.QueryBuilder, jo
|
|
|
140
142
|
void query.leftJoin(
|
|
141
143
|
`${table2Name} as ${table2ShortAlias}`,
|
|
142
144
|
`${table1ShortAlias}.${column1}`,
|
|
143
|
-
`${table2ShortAlias}.${column2}
|
|
145
|
+
`${table2ShortAlias}.${column2}`,
|
|
144
146
|
);
|
|
145
147
|
}
|
|
146
148
|
};
|
|
@@ -154,7 +156,7 @@ export const addJoin = (
|
|
|
154
156
|
table2Name: string,
|
|
155
157
|
table2Alias: string,
|
|
156
158
|
column1: string,
|
|
157
|
-
column2: string
|
|
159
|
+
column2: string,
|
|
158
160
|
) => {
|
|
159
161
|
const join = { table1Alias, table2Name, table2Alias, column1, column2 };
|
|
160
162
|
const existingJoin = joins.find((j) => j.table2Alias === join.table2Alias);
|
|
@@ -173,6 +175,7 @@ export class AliasGenerator {
|
|
|
173
175
|
public getShort(long?: string) {
|
|
174
176
|
if (!long) {
|
|
175
177
|
const short = `a${Object.keys(this.reverse).length}`;
|
|
178
|
+
|
|
176
179
|
return (this.reverse[short] = short);
|
|
177
180
|
}
|
|
178
181
|
|
|
@@ -187,6 +190,7 @@ export class AliasGenerator {
|
|
|
187
190
|
}
|
|
188
191
|
|
|
189
192
|
this.reverse[short] = long;
|
|
193
|
+
|
|
190
194
|
return short;
|
|
191
195
|
}
|
|
192
196
|
|
|
@@ -201,6 +205,7 @@ export const getColumnName = (field: EntityField) =>
|
|
|
201
205
|
field.kind === 'relation' ? field.foreignKey || `${field.name}Id` : field.name;
|
|
202
206
|
|
|
203
207
|
export const getColumn = (node: Pick<ResolverNode, 'model' | 'ctx' | 'rootTableAlias' | 'tableAlias'>, key: string) => {
|
|
204
|
-
const field = node.model.fields.find((field) => getColumnName(field) === key)
|
|
208
|
+
const field = node.model.fields.find((field) => getColumnName(field) === key)!;
|
|
209
|
+
|
|
205
210
|
return `${node.ctx.aliases.getShort(field.inherited ? node.rootTableAlias : node.tableAlias)}.${key}`;
|
|
206
211
|
};
|
package/src/schema/generate.ts
CHANGED
|
@@ -22,12 +22,12 @@ export const generateDefinitions = ({
|
|
|
22
22
|
...inputs.map((model) => input(model.name, model.fields)),
|
|
23
23
|
...objects
|
|
24
24
|
.filter((model) =>
|
|
25
|
-
entities.some((m) => m.creatable && m.fields.some((f) => f.creatable && f.kind === 'json' && f.type === model.name))
|
|
25
|
+
entities.some((m) => m.creatable && m.fields.some((f) => f.creatable && f.kind === 'json' && f.type === model.name)),
|
|
26
26
|
)
|
|
27
27
|
.map((model) => input(`Create${model.name}`, model.fields)),
|
|
28
28
|
...objects
|
|
29
29
|
.filter((model) =>
|
|
30
|
-
entities.some((m) => m.updatable && m.fields.some((f) => f.updatable && f.kind === 'json' && f.type === model.name))
|
|
30
|
+
entities.some((m) => m.updatable && m.fields.some((f) => f.updatable && f.kind === 'json' && f.type === model.name)),
|
|
31
31
|
)
|
|
32
32
|
.map((model) => input(`Update${model.name}`, model.fields)),
|
|
33
33
|
|
|
@@ -58,7 +58,7 @@ export const generateDefinitions = ({
|
|
|
58
58
|
],
|
|
59
59
|
})),
|
|
60
60
|
],
|
|
61
|
-
[...(model.parent ? [model.parent] : []), ...(model.interfaces || [])]
|
|
61
|
+
[...(model.parent ? [model.parent] : []), ...(model.interfaces || [])],
|
|
62
62
|
),
|
|
63
63
|
input(`${model.name}Where`, [
|
|
64
64
|
...model.fields
|
|
@@ -112,13 +112,13 @@ export const generateDefinitions = ({
|
|
|
112
112
|
]),
|
|
113
113
|
input(
|
|
114
114
|
`${model.name}WhereUnique`,
|
|
115
|
-
model.fields.filter(({ unique }) => unique).map((field) => ({ name: field.name, type: field.type }))
|
|
115
|
+
model.fields.filter(({ unique }) => unique).map((field) => ({ name: field.name, type: field.type })),
|
|
116
116
|
),
|
|
117
117
|
...(model.fields.some(({ orderable }) => orderable)
|
|
118
118
|
? [
|
|
119
119
|
input(
|
|
120
120
|
`${model.name}OrderBy`,
|
|
121
|
-
model.fields.filter(({ orderable }) => orderable).map(({ name }) => ({ name, type: 'Order' }))
|
|
121
|
+
model.fields.filter(({ orderable }) => orderable).map(({ name }) => ({ name, type: 'Order' })),
|
|
122
122
|
),
|
|
123
123
|
]
|
|
124
124
|
: []),
|
|
@@ -139,9 +139,9 @@ export const generateDefinitions = ({
|
|
|
139
139
|
type: field.kind === 'json' ? `Create${field.type}` : field.type,
|
|
140
140
|
list: field.list,
|
|
141
141
|
nonNull: field.nonNull && field.defaultValue === undefined,
|
|
142
|
-
}
|
|
143
|
-
)
|
|
144
|
-
)
|
|
142
|
+
},
|
|
143
|
+
),
|
|
144
|
+
),
|
|
145
145
|
);
|
|
146
146
|
}
|
|
147
147
|
|
|
@@ -158,9 +158,9 @@ export const generateDefinitions = ({
|
|
|
158
158
|
name: field.name,
|
|
159
159
|
type: field.kind === 'json' ? `Update${field.type}` : field.type,
|
|
160
160
|
list: field.list,
|
|
161
|
-
}
|
|
162
|
-
)
|
|
163
|
-
)
|
|
161
|
+
},
|
|
162
|
+
),
|
|
163
|
+
),
|
|
164
164
|
);
|
|
165
165
|
}
|
|
166
166
|
}
|
package/src/schema/utils.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { Dayjs } from 'dayjs';
|
|
2
2
|
import {
|
|
3
|
-
|
|
3
|
+
ConstArgumentNode,
|
|
4
|
+
ConstDirectiveNode,
|
|
5
|
+
ConstObjectFieldNode,
|
|
6
|
+
ConstValueNode,
|
|
4
7
|
DefinitionNode,
|
|
5
8
|
DirectiveDefinitionNode,
|
|
6
|
-
DirectiveNode,
|
|
7
9
|
DocumentNode,
|
|
8
10
|
EnumTypeDefinitionNode,
|
|
9
11
|
EnumValueDefinitionNode,
|
|
@@ -11,16 +13,15 @@ import {
|
|
|
11
13
|
InputObjectTypeDefinitionNode,
|
|
12
14
|
InputValueDefinitionNode,
|
|
13
15
|
InterfaceTypeDefinitionNode,
|
|
16
|
+
Kind,
|
|
14
17
|
ListTypeNode,
|
|
15
18
|
NamedTypeNode,
|
|
16
19
|
NameNode,
|
|
17
20
|
NonNullTypeNode,
|
|
18
|
-
ObjectFieldNode,
|
|
19
21
|
ObjectTypeDefinitionNode,
|
|
20
22
|
ScalarTypeDefinitionNode,
|
|
21
23
|
StringValueNode,
|
|
22
24
|
TypeNode,
|
|
23
|
-
ValueNode,
|
|
24
25
|
} from 'graphql';
|
|
25
26
|
import { DateTime } from 'luxon';
|
|
26
27
|
import { Directive, Value, Values } from '../values';
|
|
@@ -46,71 +47,71 @@ export type DirectiveLocation =
|
|
|
46
47
|
| 'INPUT_OBJECT';
|
|
47
48
|
|
|
48
49
|
export const document = (definitions: DefinitionNode[]): DocumentNode => ({
|
|
49
|
-
kind:
|
|
50
|
+
kind: Kind.DOCUMENT,
|
|
50
51
|
definitions,
|
|
51
52
|
});
|
|
52
53
|
|
|
53
54
|
export const directive = (nme: string, locations: DirectiveLocation[], fields?: Field[]): DirectiveDefinitionNode => ({
|
|
54
55
|
name: name(nme),
|
|
55
56
|
repeatable: false,
|
|
56
|
-
kind:
|
|
57
|
+
kind: Kind.DIRECTIVE_DEFINITION,
|
|
57
58
|
arguments: fields && inputValues(fields),
|
|
58
59
|
locations: locations.map(name),
|
|
59
60
|
});
|
|
60
61
|
|
|
61
62
|
export const scalar = (nme: string): ScalarTypeDefinitionNode => ({
|
|
62
63
|
name: name(nme),
|
|
63
|
-
kind:
|
|
64
|
+
kind: Kind.SCALAR_TYPE_DEFINITION,
|
|
64
65
|
});
|
|
65
66
|
|
|
66
67
|
export const input = (nme: string, fields: Field[], dvs?: Directive[]): InputObjectTypeDefinitionNode => ({
|
|
67
68
|
name: name(nme),
|
|
68
69
|
fields: inputValues(fields),
|
|
69
|
-
kind:
|
|
70
|
+
kind: Kind.INPUT_OBJECT_TYPE_DEFINITION,
|
|
70
71
|
directives: directives(dvs),
|
|
71
72
|
});
|
|
72
73
|
|
|
73
74
|
export const object = (nme: string, fds: Field[], interfaces?: string[], dvs?: Directive[]): ObjectTypeDefinitionNode => ({
|
|
74
75
|
name: name(nme),
|
|
75
76
|
fields: fields(fds),
|
|
76
|
-
kind:
|
|
77
|
-
interfaces: interfaces
|
|
77
|
+
kind: Kind.OBJECT_TYPE_DEFINITION,
|
|
78
|
+
interfaces: interfaces?.map((i) => namedType(i)),
|
|
78
79
|
directives: directives(dvs),
|
|
79
80
|
});
|
|
80
81
|
|
|
81
82
|
export const iface = (nme: string, fds: Field[], interfaces?: string[], dvs?: Directive[]): InterfaceTypeDefinitionNode => ({
|
|
82
83
|
name: name(nme),
|
|
83
84
|
fields: fields(fds),
|
|
84
|
-
kind:
|
|
85
|
-
interfaces: interfaces
|
|
85
|
+
kind: Kind.INTERFACE_TYPE_DEFINITION,
|
|
86
|
+
interfaces: interfaces?.map((i) => namedType(i)),
|
|
86
87
|
directives: directives(dvs),
|
|
87
88
|
});
|
|
88
89
|
|
|
89
90
|
export const inputValues = (fields: Field[]): InputValueDefinitionNode[] =>
|
|
90
91
|
fields.map(
|
|
91
92
|
(field): InputValueDefinitionNode => ({
|
|
92
|
-
kind:
|
|
93
|
+
kind: Kind.INPUT_VALUE_DEFINITION,
|
|
93
94
|
name: name(field.name),
|
|
94
95
|
type: fieldType(field),
|
|
95
96
|
defaultValue: field.defaultValue === undefined ? undefined : value(field.defaultValue),
|
|
96
97
|
directives: directives(field.directives),
|
|
97
|
-
})
|
|
98
|
+
}),
|
|
98
99
|
);
|
|
99
100
|
|
|
100
101
|
export const fields = (fields: Field[]): FieldDefinitionNode[] =>
|
|
101
102
|
fields.map(
|
|
102
103
|
(field): FieldDefinitionNode => ({
|
|
103
|
-
kind:
|
|
104
|
+
kind: Kind.FIELD_DEFINITION,
|
|
104
105
|
name: name(field.name),
|
|
105
106
|
type: fieldType(field),
|
|
106
107
|
arguments: field.args?.map((arg) => ({
|
|
107
|
-
kind:
|
|
108
|
+
kind: Kind.INPUT_VALUE_DEFINITION,
|
|
108
109
|
name: name(arg.name),
|
|
109
110
|
type: fieldType(arg),
|
|
110
111
|
defaultValue: arg.defaultValue === undefined ? undefined : value(arg.defaultValue),
|
|
111
112
|
})),
|
|
112
113
|
directives: directives(field.directives),
|
|
113
|
-
})
|
|
114
|
+
}),
|
|
114
115
|
);
|
|
115
116
|
|
|
116
117
|
export const inputValue = (
|
|
@@ -118,62 +119,62 @@ export const inputValue = (
|
|
|
118
119
|
type: TypeNode,
|
|
119
120
|
dvs?: Directive[],
|
|
120
121
|
description?: string,
|
|
121
|
-
defaultValue?: Value
|
|
122
|
+
defaultValue?: Value,
|
|
122
123
|
): InputValueDefinitionNode => ({
|
|
123
124
|
name: name(nme),
|
|
124
125
|
type,
|
|
125
|
-
kind:
|
|
126
|
+
kind: Kind.INPUT_VALUE_DEFINITION,
|
|
126
127
|
directives: directives(dvs),
|
|
127
128
|
defaultValue: defaultValue ? value(defaultValue) : undefined,
|
|
128
129
|
description: description ? (value(description) as StringValueNode) : undefined,
|
|
129
130
|
});
|
|
130
131
|
|
|
131
|
-
export const directives = (directives?: Directive[]):
|
|
132
|
+
export const directives = (directives?: Directive[]): ConstDirectiveNode[] | undefined =>
|
|
132
133
|
directives?.map(
|
|
133
|
-
(directive):
|
|
134
|
-
kind:
|
|
134
|
+
(directive): ConstDirectiveNode => ({
|
|
135
|
+
kind: Kind.DIRECTIVE,
|
|
135
136
|
name: name(directive.name),
|
|
136
137
|
arguments: args(directive.values),
|
|
137
|
-
})
|
|
138
|
+
}),
|
|
138
139
|
);
|
|
139
140
|
|
|
140
|
-
export const args = (ags: Values | undefined):
|
|
141
|
+
export const args = (ags: Values | undefined): readonly ConstArgumentNode[] | undefined =>
|
|
141
142
|
ags?.map(
|
|
142
|
-
(argument):
|
|
143
|
-
kind:
|
|
143
|
+
(argument): ConstArgumentNode => ({
|
|
144
|
+
kind: Kind.ARGUMENT,
|
|
144
145
|
name: name(argument.name),
|
|
145
146
|
value: value(argument.values),
|
|
146
|
-
})
|
|
147
|
+
}),
|
|
147
148
|
);
|
|
148
149
|
|
|
149
150
|
export const enm = (nme: string, values: string[]): EnumTypeDefinitionNode => ({
|
|
150
151
|
name: name(nme),
|
|
151
|
-
kind:
|
|
152
|
+
kind: Kind.ENUM_TYPE_DEFINITION,
|
|
152
153
|
values: values.map(
|
|
153
154
|
(v): EnumValueDefinitionNode => ({
|
|
154
|
-
kind:
|
|
155
|
+
kind: Kind.ENUM_VALUE_DEFINITION,
|
|
155
156
|
name: name(v),
|
|
156
|
-
})
|
|
157
|
+
}),
|
|
157
158
|
),
|
|
158
159
|
});
|
|
159
160
|
|
|
160
161
|
export const nonNull = (type: NamedTypeNode | ListTypeNode): NonNullTypeNode => ({
|
|
161
162
|
type,
|
|
162
|
-
kind:
|
|
163
|
+
kind: Kind.NON_NULL_TYPE,
|
|
163
164
|
});
|
|
164
165
|
|
|
165
166
|
export const namedType = (nme: string): NamedTypeNode => ({
|
|
166
|
-
kind:
|
|
167
|
+
kind: Kind.NAMED_TYPE,
|
|
167
168
|
name: name(nme),
|
|
168
169
|
});
|
|
169
170
|
|
|
170
171
|
export const list = (type: TypeNode): ListTypeNode => ({
|
|
171
172
|
type,
|
|
172
|
-
kind:
|
|
173
|
+
kind: Kind.LIST_TYPE,
|
|
173
174
|
});
|
|
174
175
|
|
|
175
176
|
export const name = (name: string): NameNode => ({
|
|
176
|
-
kind:
|
|
177
|
+
kind: Kind.NAME,
|
|
177
178
|
value: name,
|
|
178
179
|
});
|
|
179
180
|
|
|
@@ -185,61 +186,62 @@ export const fieldType = (field: Field) => {
|
|
|
185
186
|
if (field.nonNull) {
|
|
186
187
|
type = nonNull(type);
|
|
187
188
|
}
|
|
189
|
+
|
|
188
190
|
return type;
|
|
189
191
|
};
|
|
190
192
|
|
|
191
|
-
export const value = (val: Value = null):
|
|
193
|
+
export const value = (val: Value = null): ConstValueNode =>
|
|
192
194
|
val === null
|
|
193
195
|
? {
|
|
194
|
-
kind:
|
|
196
|
+
kind: Kind.NULL,
|
|
195
197
|
}
|
|
196
198
|
: typeof val === 'boolean'
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
199
|
+
? {
|
|
200
|
+
kind: Kind.BOOLEAN,
|
|
201
|
+
value: val,
|
|
202
|
+
}
|
|
203
|
+
: typeof val === 'number'
|
|
204
|
+
? {
|
|
205
|
+
kind: Kind.INT,
|
|
206
|
+
value: `${val}`,
|
|
207
|
+
}
|
|
208
|
+
: typeof val === 'string'
|
|
209
|
+
? {
|
|
210
|
+
kind: Kind.STRING,
|
|
211
|
+
value: val,
|
|
212
|
+
}
|
|
213
|
+
: val instanceof Symbol
|
|
214
|
+
? {
|
|
215
|
+
kind: Kind.ENUM,
|
|
216
|
+
value: val.description!,
|
|
217
|
+
}
|
|
218
|
+
: Array.isArray(val)
|
|
219
|
+
? {
|
|
220
|
+
kind: Kind.LIST,
|
|
221
|
+
values: val.map(value),
|
|
222
|
+
}
|
|
223
|
+
: val instanceof DateTime
|
|
224
|
+
? {
|
|
225
|
+
kind: Kind.STRING,
|
|
226
|
+
value: val.toString(),
|
|
227
|
+
}
|
|
228
|
+
: val instanceof Dayjs
|
|
229
|
+
? {
|
|
230
|
+
kind: Kind.STRING,
|
|
231
|
+
value: val.toISOString(),
|
|
232
|
+
}
|
|
233
|
+
: typeof val === 'object'
|
|
234
|
+
? {
|
|
235
|
+
kind: Kind.OBJECT,
|
|
236
|
+
fields: Object.keys(val).map(
|
|
237
|
+
(nme): ConstObjectFieldNode => ({
|
|
238
|
+
kind: Kind.OBJECT_FIELD,
|
|
239
|
+
name: name(nme),
|
|
240
|
+
value: value(val[nme]),
|
|
241
|
+
}),
|
|
242
|
+
),
|
|
243
|
+
}
|
|
244
|
+
: doThrow(`Unsupported value ${val}`);
|
|
243
245
|
|
|
244
246
|
const doThrow = (message: string) => {
|
|
245
247
|
throw new Error(message);
|
package/src/utils/dates.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { DateTime } from 'luxon';
|
|
|
3
3
|
|
|
4
4
|
export type DateLibrary = 'luxon' | 'dayjs';
|
|
5
5
|
|
|
6
|
-
export const DATE_CLASS:
|
|
6
|
+
export const DATE_CLASS: Record<DateLibrary, string> = {
|
|
7
7
|
luxon: 'DateTime',
|
|
8
8
|
dayjs: 'Dayjs',
|
|
9
9
|
};
|
|
@@ -19,9 +19,9 @@ export const anyDateToLuxon = (date: unknown, zone: string | undefined, fallback
|
|
|
19
19
|
if (!date) {
|
|
20
20
|
if (fallbackToNow) {
|
|
21
21
|
return DateTime.local({ zone });
|
|
22
|
-
} else {
|
|
23
|
-
return undefined;
|
|
24
22
|
}
|
|
23
|
+
|
|
24
|
+
return undefined;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
if (DateTime.isDateTime(date)) {
|
|
@@ -678,7 +678,7 @@ export type User = {
|
|
|
678
678
|
deletedReactions: Array<Reaction>;
|
|
679
679
|
deletedReviews: Array<Review>;
|
|
680
680
|
id: Scalars['ID']['output'];
|
|
681
|
-
role
|
|
681
|
+
role: Role;
|
|
682
682
|
updatedAnswers: Array<Answer>;
|
|
683
683
|
updatedManyObjects: Array<SomeObject>;
|
|
684
684
|
updatedQuestions: Array<Question>;
|
|
@@ -1172,7 +1172,7 @@ export type UserResolvers<ContextType = any, ParentType extends ResolversParentT
|
|
|
1172
1172
|
deletedReactions?: Resolver<Array<ResolversTypes['Reaction']>, ParentType, ContextType, Partial<UserDeletedReactionsArgs>>;
|
|
1173
1173
|
deletedReviews?: Resolver<Array<ResolversTypes['Review']>, ParentType, ContextType, Partial<UserDeletedReviewsArgs>>;
|
|
1174
1174
|
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
|
|
1175
|
-
role?: Resolver<
|
|
1175
|
+
role?: Resolver<ResolversTypes['Role'], ParentType, ContextType>;
|
|
1176
1176
|
updatedAnswers?: Resolver<Array<ResolversTypes['Answer']>, ParentType, ContextType, Partial<UserUpdatedAnswersArgs>>;
|
|
1177
1177
|
updatedManyObjects?: Resolver<Array<ResolversTypes['SomeObject']>, ParentType, ContextType, Partial<UserUpdatedManyObjectsArgs>>;
|
|
1178
1178
|
updatedQuestions?: Resolver<Array<ResolversTypes['Question']>, ParentType, ContextType, Partial<UserUpdatedQuestionsArgs>>;
|