@smartive/graphql-magic 7.0.1 → 8.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.
- package/CHANGELOG.md +3 -3
- package/README.md +8 -15
- package/dist/bin/gqm.cjs +1812 -0
- package/dist/cjs/index.cjs +568 -30
- package/dist/esm/bin/gqm.d.ts +2 -0
- package/dist/esm/bin/gqm.js +121 -0
- package/dist/esm/bin/gqm.js.map +1 -0
- package/dist/esm/client/mutations.d.ts +2 -2
- package/dist/esm/client/mutations.js +2 -1
- package/dist/esm/client/mutations.js.map +1 -1
- package/dist/esm/db/generate.js +7 -7
- package/dist/esm/db/generate.js.map +1 -1
- package/dist/esm/gqm/codegen.d.ts +2 -0
- package/dist/esm/gqm/codegen.js +46 -0
- package/dist/esm/gqm/codegen.js.map +1 -0
- package/dist/esm/gqm/index.d.ts +9 -0
- package/dist/esm/gqm/index.js +11 -0
- package/dist/esm/gqm/index.js.map +1 -0
- package/dist/esm/gqm/parse-knexfile.d.ts +2 -0
- package/dist/esm/gqm/parse-knexfile.js +19 -0
- package/dist/esm/gqm/parse-knexfile.js.map +1 -0
- package/dist/esm/gqm/parse-models.d.ts +2 -0
- package/dist/esm/gqm/parse-models.js +19 -0
- package/dist/esm/gqm/parse-models.js.map +1 -0
- package/dist/esm/gqm/readline.d.ts +1 -0
- package/dist/esm/gqm/readline.js +14 -0
- package/dist/esm/gqm/readline.js.map +1 -0
- package/dist/esm/gqm/settings.d.ts +9 -0
- package/dist/esm/gqm/settings.js +98 -0
- package/dist/esm/gqm/settings.js.map +1 -0
- package/dist/esm/gqm/static-eval.d.ts +3 -0
- package/dist/esm/gqm/static-eval.js +188 -0
- package/dist/esm/gqm/static-eval.js.map +1 -0
- package/dist/esm/gqm/templates.d.ts +4 -0
- package/dist/esm/gqm/templates.js +62 -0
- package/dist/esm/gqm/templates.js.map +1 -0
- package/dist/esm/gqm/utils.d.ts +2 -0
- package/dist/esm/gqm/utils.js +22 -0
- package/dist/esm/gqm/utils.js.map +1 -0
- package/dist/esm/gqm/visitor.d.ts +8 -0
- package/dist/esm/gqm/visitor.js +15 -0
- package/dist/esm/gqm/visitor.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/migrations/generate.d.ts +1 -0
- package/dist/esm/migrations/generate.js +16 -5
- package/dist/esm/migrations/generate.js.map +1 -1
- package/dist/esm/models/models.d.ts +16 -10
- package/dist/esm/models/utils.d.ts +17 -9
- package/dist/esm/models/utils.js +6 -5
- package/dist/esm/models/utils.js.map +1 -1
- package/dist/esm/resolvers/node.js +2 -2
- package/dist/esm/resolvers/node.js.map +1 -1
- package/dist/esm/resolvers/resolver.js +1 -1
- package/dist/esm/resolvers/resolver.js.map +1 -1
- package/dist/esm/schema/generate.js +16 -4
- package/dist/esm/schema/generate.js.map +1 -1
- package/package.json +18 -5
- package/src/bin/gqm.ts +146 -0
- package/src/client/mutations.ts +4 -3
- package/src/db/generate.ts +7 -7
- package/src/gqm/codegen.ts +47 -0
- package/src/gqm/index.ts +11 -0
- package/src/gqm/parse-knexfile.ts +21 -0
- package/src/gqm/parse-models.ts +24 -0
- package/src/gqm/readline.ts +15 -0
- package/src/gqm/settings.ts +112 -0
- package/src/gqm/static-eval.ts +203 -0
- package/src/gqm/templates.ts +64 -0
- package/src/gqm/utils.ts +23 -0
- package/src/gqm/visitor.ts +29 -0
- package/src/index.ts +1 -0
- package/src/migrations/generate.ts +18 -5
- package/src/models/models.ts +12 -7
- package/src/models/utils.ts +11 -8
- package/src/resolvers/node.ts +2 -2
- package/src/resolvers/resolver.ts +1 -1
- package/src/schema/generate.ts +17 -4
- package/tests/utils/generate-migration.ts +2 -13
- package/tests/utils/models.ts +4 -4
package/src/models/utils.ts
CHANGED
|
@@ -6,19 +6,20 @@ import kebabCase from 'lodash/kebabCase';
|
|
|
6
6
|
import startCase from 'lodash/startCase';
|
|
7
7
|
import {
|
|
8
8
|
BooleanField,
|
|
9
|
+
CustomField,
|
|
9
10
|
DateTimeField,
|
|
11
|
+
EntityModel,
|
|
10
12
|
EnumField,
|
|
11
13
|
EnumModel,
|
|
14
|
+
InputModel,
|
|
12
15
|
Model,
|
|
13
16
|
ModelField,
|
|
14
17
|
Models,
|
|
15
18
|
ObjectModel,
|
|
16
19
|
PrimitiveField,
|
|
17
20
|
RawEnumModel,
|
|
18
|
-
RawField,
|
|
19
21
|
RawModel,
|
|
20
22
|
RawModels,
|
|
21
|
-
RawObjectModel,
|
|
22
23
|
Relation,
|
|
23
24
|
RelationField,
|
|
24
25
|
ReverseRelation,
|
|
@@ -33,7 +34,7 @@ export const merge = <T>(objects: ({ [name: string]: T } | undefined | false)[]
|
|
|
33
34
|
// Target -> target
|
|
34
35
|
export const typeToField = (type: string) => type.substr(0, 1).toLowerCase() + type.substr(1);
|
|
35
36
|
|
|
36
|
-
export const getModelPlural = (model:
|
|
37
|
+
export const getModelPlural = (model: EntityModel | Model) => model.plural || pluralize(model.name);
|
|
37
38
|
|
|
38
39
|
export const getModelPluralField = (model: Model) => typeToField(getModelPlural(model));
|
|
39
40
|
|
|
@@ -45,7 +46,7 @@ export const getModelLabel = (model: Model) => getLabel(model.name);
|
|
|
45
46
|
|
|
46
47
|
export const getLabel = (s: string) => startCase(camelCase(s));
|
|
47
48
|
|
|
48
|
-
export const
|
|
49
|
+
export const isEntityModel = (model: RawModel): model is EntityModel => model.kind === 'entity';
|
|
49
50
|
|
|
50
51
|
export const isEnumModel = (model: RawModel): model is EnumModel => model.kind === 'enum';
|
|
51
52
|
|
|
@@ -53,7 +54,9 @@ export const isRawEnumModel = (model: RawModel): model is RawEnumModel => model.
|
|
|
53
54
|
|
|
54
55
|
export const isScalarModel = (model: RawModel): model is ScalarModel => model.kind === 'scalar';
|
|
55
56
|
|
|
56
|
-
export const
|
|
57
|
+
export const isObjectModel = (model: RawModel): model is ObjectModel => model.kind === 'object';
|
|
58
|
+
|
|
59
|
+
export const isInputModel = (model: RawModel): model is InputModel => model.kind === 'input';
|
|
57
60
|
|
|
58
61
|
export const isEnumList = (models: RawModels, field: ModelField) =>
|
|
59
62
|
field?.list === true && models.find(({ name }) => name === field.kind)?.kind === 'enum';
|
|
@@ -76,11 +79,11 @@ export const isToOneRelation = (field: ModelField): field is RelationField => is
|
|
|
76
79
|
|
|
77
80
|
export const isQueriableField = ({ queriable }: ModelField) => queriable !== false;
|
|
78
81
|
|
|
79
|
-
export const
|
|
82
|
+
export const isCustomField = (field: ModelField): field is CustomField => field.kind === 'custom';
|
|
80
83
|
|
|
81
84
|
export const isVisible = ({ hidden }: ModelField) => hidden !== true;
|
|
82
85
|
|
|
83
|
-
export const isSimpleField = and(not(isRelation), not(
|
|
86
|
+
export const isSimpleField = and(not(isRelation), not(isCustomField));
|
|
84
87
|
|
|
85
88
|
export const isUpdatable = ({ updatable }: ModelField) => !!updatable;
|
|
86
89
|
|
|
@@ -108,7 +111,7 @@ export const actionableRelations = (model: Model, action: 'create' | 'update' |
|
|
|
108
111
|
);
|
|
109
112
|
|
|
110
113
|
export const getModels = (rawModels: RawModels): Models => {
|
|
111
|
-
const models: Models = rawModels.filter(
|
|
114
|
+
const models: Models = rawModels.filter(isEntityModel).map((model) => {
|
|
112
115
|
const objectModel: Model = {
|
|
113
116
|
...model,
|
|
114
117
|
fieldsByName: {},
|
package/src/resolvers/node.ts
CHANGED
|
@@ -9,7 +9,7 @@ import type {
|
|
|
9
9
|
|
|
10
10
|
import { FullContext } from '../context';
|
|
11
11
|
import { Model } from '../models/models';
|
|
12
|
-
import { get,
|
|
12
|
+
import { get, isObjectModel, summonByKey, summonByName } from '../models/utils';
|
|
13
13
|
import {
|
|
14
14
|
getFragmentTypeName,
|
|
15
15
|
getNameOrAlias,
|
|
@@ -150,7 +150,7 @@ export const getJoins = (node: ResolverNode, toMany: boolean) => {
|
|
|
150
150
|
|
|
151
151
|
const typeName = getTypeName(fieldDefinition.type);
|
|
152
152
|
|
|
153
|
-
if (
|
|
153
|
+
if (isObjectModel(summonByName(ctx.rawModels, typeName))) {
|
|
154
154
|
continue;
|
|
155
155
|
}
|
|
156
156
|
|
|
@@ -115,7 +115,7 @@ const applySelects = (node: ResolverNode, query: Knex.QueryBuilder, joins: Joins
|
|
|
115
115
|
.filter((n) => {
|
|
116
116
|
const field = node.model.fields.find(({ name }) => name === n.name.value);
|
|
117
117
|
|
|
118
|
-
if (!field || field.kind === 'relation' || field.kind === '
|
|
118
|
+
if (!field || field.kind === 'relation' || field.kind === 'custom') {
|
|
119
119
|
return false;
|
|
120
120
|
}
|
|
121
121
|
|
package/src/schema/generate.ts
CHANGED
|
@@ -5,9 +5,10 @@ import {
|
|
|
5
5
|
getModelPluralField,
|
|
6
6
|
getModels,
|
|
7
7
|
isEnumModel,
|
|
8
|
+
isInputModel,
|
|
9
|
+
isObjectModel,
|
|
8
10
|
isQueriableField,
|
|
9
11
|
isRawEnumModel,
|
|
10
|
-
isRawObjectModel,
|
|
11
12
|
isRelation,
|
|
12
13
|
isScalarModel,
|
|
13
14
|
typeToField,
|
|
@@ -26,15 +27,19 @@ export const generateDefinitions = (rawModels: RawModels): DefinitionNode[] => {
|
|
|
26
27
|
...rawModels.filter(isEnumModel).map((model) => enm(model.name, model.values)),
|
|
27
28
|
...rawModels.filter(isRawEnumModel).map((model) => enm(model.name, model.values)),
|
|
28
29
|
...rawModels.filter(isScalarModel).map((model) => scalar(model.name)),
|
|
29
|
-
...rawModels.filter(isRawObjectModel).map((model) => object(model.name, model.fields)),
|
|
30
30
|
...rawModels
|
|
31
|
-
.filter(
|
|
31
|
+
.filter(isObjectModel)
|
|
32
|
+
.filter(({ name }) => !['Query', 'Mutation'].includes(name))
|
|
33
|
+
.map((model) => object(model.name, model.fields)),
|
|
34
|
+
...rawModels.filter(isInputModel).map((model) => input(model.name, model.fields)),
|
|
35
|
+
...rawModels
|
|
36
|
+
.filter(isObjectModel)
|
|
32
37
|
.filter((model) =>
|
|
33
38
|
models.some((m) => m.creatable && m.fields.some((f) => f.creatable && f.kind === 'json' && f.type === model.name))
|
|
34
39
|
)
|
|
35
40
|
.map((model) => input(`Create${model.name}`, model.fields)),
|
|
36
41
|
...rawModels
|
|
37
|
-
.filter(
|
|
42
|
+
.filter(isObjectModel)
|
|
38
43
|
.filter((model) =>
|
|
39
44
|
models.some((m) => m.creatable && m.fields.some((f) => f.creatable && f.kind === 'json' && f.type === model.name))
|
|
40
45
|
)
|
|
@@ -188,6 +193,10 @@ export const generateDefinitions = (rawModels: RawModels): DefinitionNode[] => {
|
|
|
188
193
|
{ name: 'offset', type: 'Int' },
|
|
189
194
|
],
|
|
190
195
|
})),
|
|
196
|
+
...rawModels
|
|
197
|
+
.filter(isObjectModel)
|
|
198
|
+
.filter((model) => model.name === 'Query')
|
|
199
|
+
.flatMap((model) => model.fields),
|
|
191
200
|
]),
|
|
192
201
|
|
|
193
202
|
object('Mutation', [
|
|
@@ -264,6 +273,10 @@ export const generateDefinitions = (rawModels: RawModels): DefinitionNode[] => {
|
|
|
264
273
|
return mutations;
|
|
265
274
|
})
|
|
266
275
|
),
|
|
276
|
+
...rawModels
|
|
277
|
+
.filter(isObjectModel)
|
|
278
|
+
.filter((model) => model.name === 'Mutation')
|
|
279
|
+
.flatMap((model) => model.fields),
|
|
267
280
|
]),
|
|
268
281
|
];
|
|
269
282
|
};
|
|
@@ -1,22 +1,11 @@
|
|
|
1
1
|
import { writeFileSync } from 'fs';
|
|
2
2
|
import { simpleGit } from 'simple-git';
|
|
3
|
-
import { MigrationGenerator } from '../../src/migrations/generate';
|
|
3
|
+
import { MigrationGenerator, getMigrationDate } from '../../src/migrations/generate';
|
|
4
4
|
import { getKnex } from './database/knex';
|
|
5
5
|
import { rawModels } from './models';
|
|
6
6
|
|
|
7
7
|
const git = simpleGit();
|
|
8
8
|
|
|
9
|
-
const getDate = () => {
|
|
10
|
-
const date = new Date();
|
|
11
|
-
const year = date.getFullYear();
|
|
12
|
-
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
13
|
-
const day = String(date.getDate()).padStart(2, '0');
|
|
14
|
-
const hours = String(date.getHours()).padStart(2, '0');
|
|
15
|
-
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
16
|
-
const seconds = String(date.getSeconds()).padStart(2, '0');
|
|
17
|
-
|
|
18
|
-
return `${year}${month}${day}${hours}${minutes}${seconds}`;
|
|
19
|
-
};
|
|
20
9
|
|
|
21
10
|
const writeMigration = async () => {
|
|
22
11
|
const name = process.argv[2] || (await git.branch()).current.split('/').pop();
|
|
@@ -26,7 +15,7 @@ const writeMigration = async () => {
|
|
|
26
15
|
try {
|
|
27
16
|
const migrations = await new MigrationGenerator(knex, rawModels).generate();
|
|
28
17
|
|
|
29
|
-
writeFileSync(`tmp/${
|
|
18
|
+
writeFileSync(`tmp/${getMigrationDate()}_${name}.ts`, migrations);
|
|
30
19
|
} finally {
|
|
31
20
|
await knex.destroy();
|
|
32
21
|
}
|
package/tests/utils/models.ts
CHANGED
|
@@ -16,12 +16,12 @@ export const rawModels: RawModels = [
|
|
|
16
16
|
|
|
17
17
|
{
|
|
18
18
|
name: 'SomeRawObject',
|
|
19
|
-
kind: '
|
|
19
|
+
kind: 'object',
|
|
20
20
|
fields: [{ name: 'field', type: 'String' }],
|
|
21
21
|
},
|
|
22
22
|
|
|
23
23
|
{
|
|
24
|
-
kind: '
|
|
24
|
+
kind: 'entity',
|
|
25
25
|
name: 'User',
|
|
26
26
|
fields: [
|
|
27
27
|
{
|
|
@@ -36,7 +36,7 @@ export const rawModels: RawModels = [
|
|
|
36
36
|
],
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
|
-
kind: '
|
|
39
|
+
kind: 'entity',
|
|
40
40
|
name: 'AnotherObject',
|
|
41
41
|
listQueriable: true,
|
|
42
42
|
deletable: true,
|
|
@@ -57,7 +57,7 @@ export const rawModels: RawModels = [
|
|
|
57
57
|
],
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
|
-
kind: '
|
|
60
|
+
kind: 'entity',
|
|
61
61
|
name: 'SomeObject',
|
|
62
62
|
plural: 'ManyObjects',
|
|
63
63
|
description: 'An object',
|