@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.
Files changed (81) hide show
  1. package/CHANGELOG.md +3 -3
  2. package/README.md +8 -15
  3. package/dist/bin/gqm.cjs +1812 -0
  4. package/dist/cjs/index.cjs +568 -30
  5. package/dist/esm/bin/gqm.d.ts +2 -0
  6. package/dist/esm/bin/gqm.js +121 -0
  7. package/dist/esm/bin/gqm.js.map +1 -0
  8. package/dist/esm/client/mutations.d.ts +2 -2
  9. package/dist/esm/client/mutations.js +2 -1
  10. package/dist/esm/client/mutations.js.map +1 -1
  11. package/dist/esm/db/generate.js +7 -7
  12. package/dist/esm/db/generate.js.map +1 -1
  13. package/dist/esm/gqm/codegen.d.ts +2 -0
  14. package/dist/esm/gqm/codegen.js +46 -0
  15. package/dist/esm/gqm/codegen.js.map +1 -0
  16. package/dist/esm/gqm/index.d.ts +9 -0
  17. package/dist/esm/gqm/index.js +11 -0
  18. package/dist/esm/gqm/index.js.map +1 -0
  19. package/dist/esm/gqm/parse-knexfile.d.ts +2 -0
  20. package/dist/esm/gqm/parse-knexfile.js +19 -0
  21. package/dist/esm/gqm/parse-knexfile.js.map +1 -0
  22. package/dist/esm/gqm/parse-models.d.ts +2 -0
  23. package/dist/esm/gqm/parse-models.js +19 -0
  24. package/dist/esm/gqm/parse-models.js.map +1 -0
  25. package/dist/esm/gqm/readline.d.ts +1 -0
  26. package/dist/esm/gqm/readline.js +14 -0
  27. package/dist/esm/gqm/readline.js.map +1 -0
  28. package/dist/esm/gqm/settings.d.ts +9 -0
  29. package/dist/esm/gqm/settings.js +98 -0
  30. package/dist/esm/gqm/settings.js.map +1 -0
  31. package/dist/esm/gqm/static-eval.d.ts +3 -0
  32. package/dist/esm/gqm/static-eval.js +188 -0
  33. package/dist/esm/gqm/static-eval.js.map +1 -0
  34. package/dist/esm/gqm/templates.d.ts +4 -0
  35. package/dist/esm/gqm/templates.js +62 -0
  36. package/dist/esm/gqm/templates.js.map +1 -0
  37. package/dist/esm/gqm/utils.d.ts +2 -0
  38. package/dist/esm/gqm/utils.js +22 -0
  39. package/dist/esm/gqm/utils.js.map +1 -0
  40. package/dist/esm/gqm/visitor.d.ts +8 -0
  41. package/dist/esm/gqm/visitor.js +15 -0
  42. package/dist/esm/gqm/visitor.js.map +1 -0
  43. package/dist/esm/index.d.ts +1 -0
  44. package/dist/esm/index.js +1 -0
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/migrations/generate.d.ts +1 -0
  47. package/dist/esm/migrations/generate.js +16 -5
  48. package/dist/esm/migrations/generate.js.map +1 -1
  49. package/dist/esm/models/models.d.ts +16 -10
  50. package/dist/esm/models/utils.d.ts +17 -9
  51. package/dist/esm/models/utils.js +6 -5
  52. package/dist/esm/models/utils.js.map +1 -1
  53. package/dist/esm/resolvers/node.js +2 -2
  54. package/dist/esm/resolvers/node.js.map +1 -1
  55. package/dist/esm/resolvers/resolver.js +1 -1
  56. package/dist/esm/resolvers/resolver.js.map +1 -1
  57. package/dist/esm/schema/generate.js +16 -4
  58. package/dist/esm/schema/generate.js.map +1 -1
  59. package/package.json +18 -5
  60. package/src/bin/gqm.ts +146 -0
  61. package/src/client/mutations.ts +4 -3
  62. package/src/db/generate.ts +7 -7
  63. package/src/gqm/codegen.ts +47 -0
  64. package/src/gqm/index.ts +11 -0
  65. package/src/gqm/parse-knexfile.ts +21 -0
  66. package/src/gqm/parse-models.ts +24 -0
  67. package/src/gqm/readline.ts +15 -0
  68. package/src/gqm/settings.ts +112 -0
  69. package/src/gqm/static-eval.ts +203 -0
  70. package/src/gqm/templates.ts +64 -0
  71. package/src/gqm/utils.ts +23 -0
  72. package/src/gqm/visitor.ts +29 -0
  73. package/src/index.ts +1 -0
  74. package/src/migrations/generate.ts +18 -5
  75. package/src/models/models.ts +12 -7
  76. package/src/models/utils.ts +11 -8
  77. package/src/resolvers/node.ts +2 -2
  78. package/src/resolvers/resolver.ts +1 -1
  79. package/src/schema/generate.ts +17 -4
  80. package/tests/utils/generate-migration.ts +2 -13
  81. package/tests/utils/models.ts +4 -4
@@ -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: ObjectModel | Model) => model.plural || pluralize(model.name);
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 isObjectModel = (model: RawModel): model is ObjectModel => model.kind === 'object';
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 isRawObjectModel = (model: RawModel): model is RawObjectModel => model.kind === 'raw';
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 isRaw = (field: ModelField): field is RawField => field.kind === 'raw';
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(isRaw));
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(isObjectModel).map((model) => {
114
+ const models: Models = rawModels.filter(isEntityModel).map((model) => {
112
115
  const objectModel: Model = {
113
116
  ...model,
114
117
  fieldsByName: {},
@@ -9,7 +9,7 @@ import type {
9
9
 
10
10
  import { FullContext } from '../context';
11
11
  import { Model } from '../models/models';
12
- import { get, isRawObjectModel, summonByKey, summonByName } from '../models/utils';
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 (isRawObjectModel(summonByName(ctx.rawModels, typeName))) {
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 === 'raw') {
118
+ if (!field || field.kind === 'relation' || field.kind === 'custom') {
119
119
  return false;
120
120
  }
121
121
 
@@ -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(isRawObjectModel)
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(isRawObjectModel)
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/${getDate()}_${name}.ts`, migrations);
18
+ writeFileSync(`tmp/${getMigrationDate()}_${name}.ts`, migrations);
30
19
  } finally {
31
20
  await knex.destroy();
32
21
  }
@@ -16,12 +16,12 @@ export const rawModels: RawModels = [
16
16
 
17
17
  {
18
18
  name: 'SomeRawObject',
19
- kind: 'raw',
19
+ kind: 'object',
20
20
  fields: [{ name: 'field', type: 'String' }],
21
21
  },
22
22
 
23
23
  {
24
- kind: 'object',
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: 'object',
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: 'object',
60
+ kind: 'entity',
61
61
  name: 'SomeObject',
62
62
  plural: 'ManyObjects',
63
63
  description: 'An object',