@smartive/graphql-magic 8.0.0 → 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 (71) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/README.md +8 -15
  3. package/dist/bin/gqm.cjs +1812 -0
  4. package/dist/cjs/index.cjs +544 -6
  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/gqm/codegen.d.ts +2 -0
  12. package/dist/esm/gqm/codegen.js +46 -0
  13. package/dist/esm/gqm/codegen.js.map +1 -0
  14. package/dist/esm/gqm/index.d.ts +9 -0
  15. package/dist/esm/gqm/index.js +11 -0
  16. package/dist/esm/gqm/index.js.map +1 -0
  17. package/dist/esm/gqm/parse-knexfile.d.ts +2 -0
  18. package/dist/esm/gqm/parse-knexfile.js +19 -0
  19. package/dist/esm/gqm/parse-knexfile.js.map +1 -0
  20. package/dist/esm/gqm/parse-models.d.ts +2 -0
  21. package/dist/esm/gqm/parse-models.js +19 -0
  22. package/dist/esm/gqm/parse-models.js.map +1 -0
  23. package/dist/esm/gqm/readline.d.ts +1 -0
  24. package/dist/esm/gqm/readline.js +14 -0
  25. package/dist/esm/gqm/readline.js.map +1 -0
  26. package/dist/esm/gqm/settings.d.ts +9 -0
  27. package/dist/esm/gqm/settings.js +98 -0
  28. package/dist/esm/gqm/settings.js.map +1 -0
  29. package/dist/esm/gqm/static-eval.d.ts +3 -0
  30. package/dist/esm/gqm/static-eval.js +188 -0
  31. package/dist/esm/gqm/static-eval.js.map +1 -0
  32. package/dist/esm/gqm/templates.d.ts +4 -0
  33. package/dist/esm/gqm/templates.js +62 -0
  34. package/dist/esm/gqm/templates.js.map +1 -0
  35. package/dist/esm/gqm/utils.d.ts +2 -0
  36. package/dist/esm/gqm/utils.js +22 -0
  37. package/dist/esm/gqm/utils.js.map +1 -0
  38. package/dist/esm/gqm/visitor.d.ts +8 -0
  39. package/dist/esm/gqm/visitor.js +15 -0
  40. package/dist/esm/gqm/visitor.js.map +1 -0
  41. package/dist/esm/index.d.ts +1 -0
  42. package/dist/esm/index.js +1 -0
  43. package/dist/esm/index.js.map +1 -1
  44. package/dist/esm/migrations/generate.d.ts +1 -0
  45. package/dist/esm/migrations/generate.js +11 -0
  46. package/dist/esm/migrations/generate.js.map +1 -1
  47. package/dist/esm/models/models.d.ts +6 -0
  48. package/dist/esm/models/utils.d.ts +8 -0
  49. package/dist/esm/models/utils.js +1 -0
  50. package/dist/esm/models/utils.js.map +1 -1
  51. package/dist/esm/schema/generate.js +14 -2
  52. package/dist/esm/schema/generate.js.map +1 -1
  53. package/package.json +17 -4
  54. package/src/bin/gqm.ts +146 -0
  55. package/src/client/mutations.ts +4 -3
  56. package/src/gqm/codegen.ts +47 -0
  57. package/src/gqm/index.ts +11 -0
  58. package/src/gqm/parse-knexfile.ts +21 -0
  59. package/src/gqm/parse-models.ts +24 -0
  60. package/src/gqm/readline.ts +15 -0
  61. package/src/gqm/settings.ts +112 -0
  62. package/src/gqm/static-eval.ts +203 -0
  63. package/src/gqm/templates.ts +64 -0
  64. package/src/gqm/utils.ts +23 -0
  65. package/src/gqm/visitor.ts +29 -0
  66. package/src/index.ts +1 -0
  67. package/src/migrations/generate.ts +13 -0
  68. package/src/models/models.ts +5 -0
  69. package/src/models/utils.ts +3 -0
  70. package/src/schema/generate.ts +14 -1
  71. package/tests/utils/generate-migration.ts +2 -13
@@ -0,0 +1,29 @@
1
+ import { KindToNodeMappings, Node, SyntaxKind } from 'ts-morph';
2
+ import { get } from '..';
3
+
4
+ export type Visitor<T, C> = {
5
+ undefined?: () => T;
6
+ unknown?: (node: Node) => T;
7
+ } & {
8
+ [kind in keyof KindToNodeMappings]?: (node: KindToNodeMappings[kind], context: C) => T;
9
+ };
10
+
11
+ export const visit = <T, C>(node: Node | undefined, context: C, visitor: Visitor<T, C>) => {
12
+ const kind: undefined | keyof KindToNodeMappings = node?.getKind();
13
+ if (kind in visitor) {
14
+ return visitor[kind](node.asKindOrThrow(kind), context);
15
+ }
16
+
17
+ if ('unknown' in visitor) {
18
+ return visitor.unknown(node);
19
+ }
20
+
21
+ console.error(node.getText());
22
+ console.error(node.getParent().getText());
23
+ throw new Error(
24
+ `Cannot handle kind ${get(
25
+ Object.entries(SyntaxKind).find(([, val]) => val === kind),
26
+ 0
27
+ )}`
28
+ );
29
+ };
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@
3
3
  export * from './api';
4
4
  export * from './client';
5
5
  export * from './db';
6
+ export * from './gqm';
6
7
  export * from './migrations';
7
8
  export * from './models';
8
9
  export * from './permissions';
@@ -580,6 +580,7 @@ export class MigrationGenerator {
580
580
  };
581
581
  const kind = field.kind;
582
582
  switch (kind) {
583
+ case undefined:
583
584
  case 'primitive':
584
585
  switch (field.type) {
585
586
  case 'Boolean':
@@ -645,3 +646,15 @@ export class MigrationGenerator {
645
646
  }
646
647
  }
647
648
  }
649
+
650
+ export const getMigrationDate = () => {
651
+ const date = new Date();
652
+ const year = date.getFullYear();
653
+ const month = String(date.getMonth() + 1).padStart(2, '0');
654
+ const day = String(date.getDate()).padStart(2, '0');
655
+ const hours = String(date.getHours()).padStart(2, '0');
656
+ const minutes = String(date.getMinutes()).padStart(2, '0');
657
+ const seconds = String(date.getSeconds()).padStart(2, '0');
658
+
659
+ return `${year}${month}${day}${hours}${minutes}${seconds}`;
660
+ };
@@ -13,6 +13,10 @@ export type RawModel = {
13
13
  | { kind: 'enum'; values: string[]; deleted?: true }
14
14
  | { kind: 'raw-enum'; values: string[] }
15
15
  | { kind: 'interface'; fields: ModelField[] }
16
+ | {
17
+ kind: 'input';
18
+ fields: ObjectField[];
19
+ }
16
20
  | {
17
21
  kind: 'object';
18
22
  fields: ObjectField[];
@@ -42,6 +46,7 @@ export type EnumModel = Extract<RawModel, { kind: 'enum' }>;
42
46
  export type RawEnumModel = Extract<RawModel, { kind: 'raw-enum' }>;
43
47
  export type InterfaceModel = Extract<RawModel, { kind: 'interface' }>;
44
48
  export type ObjectModel = Extract<RawModel, { kind: 'object' }>;
49
+ export type InputModel = Extract<RawModel, { kind: 'input' }>;
45
50
  export type EntityModel = Extract<RawModel, { kind: 'entity' }>;
46
51
 
47
52
  type BaseNumberType = {
@@ -11,6 +11,7 @@ import {
11
11
  EntityModel,
12
12
  EnumField,
13
13
  EnumModel,
14
+ InputModel,
14
15
  Model,
15
16
  ModelField,
16
17
  Models,
@@ -55,6 +56,8 @@ export const isScalarModel = (model: RawModel): model is ScalarModel => model.ki
55
56
 
56
57
  export const isObjectModel = (model: RawModel): model is ObjectModel => model.kind === 'object';
57
58
 
59
+ export const isInputModel = (model: RawModel): model is InputModel => model.kind === 'input';
60
+
58
61
  export const isEnumList = (models: RawModels, field: ModelField) =>
59
62
  field?.list === true && models.find(({ name }) => name === field.kind)?.kind === 'enum';
60
63
 
@@ -5,6 +5,7 @@ import {
5
5
  getModelPluralField,
6
6
  getModels,
7
7
  isEnumModel,
8
+ isInputModel,
8
9
  isObjectModel,
9
10
  isQueriableField,
10
11
  isRawEnumModel,
@@ -26,7 +27,11 @@ 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(isObjectModel).map((model) => object(model.name, model.fields)),
30
+ ...rawModels
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)),
30
35
  ...rawModels
31
36
  .filter(isObjectModel)
32
37
  .filter((model) =>
@@ -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
  }