@smartive/graphql-magic 9.1.2 → 10.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.
Files changed (120) hide show
  1. package/.eslintrc +2 -10
  2. package/.github/workflows/release.yml +1 -1
  3. package/.gqmrc.json +6 -0
  4. package/CHANGELOG.md +2 -2
  5. package/README.md +1 -1
  6. package/dist/bin/gqm.cjs +684 -330
  7. package/dist/cjs/index.cjs +998 -554
  8. package/dist/esm/api/execute.js +1 -1
  9. package/dist/esm/api/execute.js.map +1 -1
  10. package/dist/esm/client/mutations.d.ts +2 -2
  11. package/dist/esm/client/mutations.js +5 -4
  12. package/dist/esm/client/mutations.js.map +1 -1
  13. package/dist/esm/client/queries.d.ts +12 -17
  14. package/dist/esm/client/queries.js +30 -50
  15. package/dist/esm/client/queries.js.map +1 -1
  16. package/dist/esm/context.d.ts +1 -2
  17. package/dist/esm/db/generate.d.ts +3 -3
  18. package/dist/esm/db/generate.js +31 -29
  19. package/dist/esm/db/generate.js.map +1 -1
  20. package/dist/esm/migrations/generate.d.ts +3 -4
  21. package/dist/esm/migrations/generate.js +114 -107
  22. package/dist/esm/migrations/generate.js.map +1 -1
  23. package/dist/esm/models/index.d.ts +1 -0
  24. package/dist/esm/models/index.js +1 -0
  25. package/dist/esm/models/index.js.map +1 -1
  26. package/dist/esm/models/model-definitions.d.ts +189 -0
  27. package/dist/esm/models/model-definitions.js +2 -0
  28. package/dist/esm/models/model-definitions.js.map +1 -0
  29. package/dist/esm/models/models.d.ts +128 -174
  30. package/dist/esm/models/models.js +411 -1
  31. package/dist/esm/models/models.js.map +1 -1
  32. package/dist/esm/models/mutation-hook.d.ts +2 -2
  33. package/dist/esm/models/utils.d.ts +35 -497
  34. package/dist/esm/models/utils.js +21 -144
  35. package/dist/esm/models/utils.js.map +1 -1
  36. package/dist/esm/permissions/check.d.ts +3 -3
  37. package/dist/esm/permissions/check.js +14 -7
  38. package/dist/esm/permissions/check.js.map +1 -1
  39. package/dist/esm/permissions/generate.js +6 -6
  40. package/dist/esm/permissions/generate.js.map +1 -1
  41. package/dist/esm/resolvers/filters.d.ts +8 -0
  42. package/dist/esm/resolvers/filters.js +28 -25
  43. package/dist/esm/resolvers/filters.js.map +1 -1
  44. package/dist/esm/resolvers/index.d.ts +1 -0
  45. package/dist/esm/resolvers/index.js +1 -0
  46. package/dist/esm/resolvers/index.js.map +1 -1
  47. package/dist/esm/resolvers/mutations.js +85 -21
  48. package/dist/esm/resolvers/mutations.js.map +1 -1
  49. package/dist/esm/resolvers/node.d.ts +13 -15
  50. package/dist/esm/resolvers/node.js +41 -36
  51. package/dist/esm/resolvers/node.js.map +1 -1
  52. package/dist/esm/resolvers/resolver.js +19 -49
  53. package/dist/esm/resolvers/resolver.js.map +1 -1
  54. package/dist/esm/resolvers/resolvers.d.ts +1 -8
  55. package/dist/esm/resolvers/resolvers.js +15 -7
  56. package/dist/esm/resolvers/resolvers.js.map +1 -1
  57. package/dist/esm/resolvers/selects.d.ts +3 -0
  58. package/dist/esm/resolvers/selects.js +50 -0
  59. package/dist/esm/resolvers/selects.js.map +1 -0
  60. package/dist/esm/resolvers/utils.d.ts +12 -4
  61. package/dist/esm/resolvers/utils.js +30 -22
  62. package/dist/esm/resolvers/utils.js.map +1 -1
  63. package/dist/esm/schema/generate.d.ts +4 -4
  64. package/dist/esm/schema/generate.js +122 -131
  65. package/dist/esm/schema/generate.js.map +1 -1
  66. package/dist/esm/schema/utils.d.ts +1 -1
  67. package/dist/esm/schema/utils.js +2 -1
  68. package/dist/esm/schema/utils.js.map +1 -1
  69. package/knexfile.ts +31 -0
  70. package/migrations/20230912185644_setup.ts +127 -0
  71. package/package.json +16 -14
  72. package/src/api/execute.ts +1 -1
  73. package/src/bin/gqm/gqm.ts +25 -23
  74. package/src/bin/gqm/parse-models.ts +5 -5
  75. package/src/bin/gqm/settings.ts +13 -4
  76. package/src/bin/gqm/static-eval.ts +5 -0
  77. package/src/bin/gqm/templates.ts +23 -3
  78. package/src/client/mutations.ts +11 -5
  79. package/src/client/queries.ts +43 -80
  80. package/src/context.ts +1 -2
  81. package/src/db/generate.ts +41 -41
  82. package/src/migrations/generate.ts +165 -146
  83. package/src/models/index.ts +1 -0
  84. package/src/models/model-definitions.ts +168 -0
  85. package/src/models/models.ts +510 -166
  86. package/src/models/mutation-hook.ts +2 -2
  87. package/src/models/utils.ts +53 -187
  88. package/src/permissions/check.ts +19 -11
  89. package/src/permissions/generate.ts +6 -6
  90. package/src/resolvers/filters.ts +44 -28
  91. package/src/resolvers/index.ts +1 -0
  92. package/src/resolvers/mutations.ts +98 -36
  93. package/src/resolvers/node.ts +79 -51
  94. package/src/resolvers/resolver.ts +20 -74
  95. package/src/resolvers/resolvers.ts +18 -7
  96. package/src/resolvers/selects.ts +77 -0
  97. package/src/resolvers/utils.ts +41 -25
  98. package/src/schema/generate.ts +106 -127
  99. package/src/schema/utils.ts +2 -1
  100. package/tests/api/__snapshots__/inheritance.spec.ts.snap +83 -0
  101. package/tests/api/inheritance.spec.ts +130 -0
  102. package/tests/generated/api/index.ts +1174 -0
  103. package/tests/generated/client/index.ts +1163 -0
  104. package/tests/generated/client/mutations.ts +109 -0
  105. package/tests/generated/db/index.ts +291 -0
  106. package/tests/generated/db/knex.ts +14 -0
  107. package/tests/generated/models.json +675 -0
  108. package/tests/generated/schema.graphql +325 -0
  109. package/tests/unit/__snapshots__/resolve.spec.ts.snap +23 -0
  110. package/tests/unit/queries.spec.ts +5 -5
  111. package/tests/unit/resolve.spec.ts +8 -8
  112. package/tests/utils/database/knex.ts +5 -13
  113. package/tests/utils/database/seed.ts +57 -18
  114. package/tests/utils/models.ts +62 -7
  115. package/tests/utils/server.ts +5 -5
  116. package/tsconfig.eslint.json +1 -0
  117. package/tests/unit/__snapshots__/generate.spec.ts.snap +0 -128
  118. package/tests/unit/generate.spec.ts +0 -8
  119. package/tests/utils/database/schema.ts +0 -64
  120. package/tests/utils/generate-migration.ts +0 -24
@@ -3,11 +3,11 @@ import graphqlRequest, { RequestDocument, Variables } from 'graphql-request';
3
3
  import { RequestListener, createServer } from 'http';
4
4
  import { Knex } from 'knex';
5
5
  import { DateTime } from 'luxon';
6
+ import { up } from '../../migrations/20230912185644_setup';
6
7
  import { execute } from '../../src';
7
8
  import { getKnex } from './database/knex';
8
- import { setupSchema } from './database/schema';
9
9
  import { ADMIN_ID, setupSeed } from './database/seed';
10
- import { models, permissions, rawModels } from './models';
10
+ import { models, permissions } from './models';
11
11
 
12
12
  const MIN_PORT = 49152;
13
13
  const MAX_PORT = 65535;
@@ -30,7 +30,8 @@ export const withServer = async (
30
30
  await new Promise<void>((res, rej) => server.listen(port, res).once('error', rej));
31
31
  break;
32
32
  } catch (e) {
33
- console.error(e);
33
+ console.warn(`Wait did we really get a port collision? Craaaaazy.`);
34
+ console.warn(e);
34
35
  }
35
36
  }
36
37
 
@@ -42,7 +43,7 @@ export const withServer = async (
42
43
  const knex = getKnex(dbName);
43
44
 
44
45
  try {
45
- await setupSchema(knex);
46
+ await up(knex);
46
47
  await setupSeed(knex);
47
48
 
48
49
  handler = async (req, res) => {
@@ -63,7 +64,6 @@ export const withServer = async (
63
64
  locale: 'en',
64
65
  locales: ['en'],
65
66
  user,
66
- rawModels,
67
67
  models,
68
68
  permissions,
69
69
  now: DateTime.fromISO('2020-01-01T00:00:00.000Z'),
@@ -1,4 +1,5 @@
1
1
  {
2
2
  "extends": "./tsconfig.json",
3
+ "include": ["**/*.ts", "**/*.tsx"],
3
4
  "exclude": ["node_modules", "dist"],
4
5
  }
@@ -1,128 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`generate generates a schema 1`] = `
4
- "type AnotherObject {
5
- id: ID!
6
- name: String
7
- myself: AnotherObject
8
- deleted: Boolean!
9
- deletedAt: DateTime
10
- deletedBy: User
11
- self(where: AnotherObjectWhere, orderBy: [AnotherObjectOrderBy!], limit: Int, offset: Int): AnotherObject
12
- manyObjects(where: SomeObjectWhere, search: String, orderBy: [SomeObjectOrderBy!], limit: Int, offset: Int): [SomeObject!]!
13
- }
14
-
15
- input AnotherObjectOrderBy {
16
- name: Order
17
- deletedAt: Order
18
- }
19
-
20
- input AnotherObjectWhere {
21
- id: [ID!]
22
- deleted: [Boolean!]
23
- }
24
-
25
- input AnotherObjectWhereUnique {
26
- id: ID
27
- }
28
-
29
- input CreateSomeObject {
30
- xyz: Int!
31
- }
32
-
33
- scalar DateTime
34
-
35
- type Mutation {
36
- deleteAnotherObject(where: AnotherObjectWhereUnique!, dryRun: Boolean): ID!
37
- restoreAnotherObject(where: AnotherObjectWhereUnique!): ID!
38
- createSomeObject(data: CreateSomeObject!): SomeObject!
39
- updateSomeObject(where: SomeObjectWhereUnique!, data: UpdateSomeObject!): SomeObject!
40
- deleteSomeObject(where: SomeObjectWhereUnique!, dryRun: Boolean): ID!
41
- restoreSomeObject(where: SomeObjectWhereUnique!): ID!
42
- }
43
-
44
- enum Order {
45
- ASC
46
- DESC
47
- }
48
-
49
- type Query {
50
- me: User
51
- someObject(where: SomeObjectWhereUnique!): SomeObject!
52
- anotherObjects(where: AnotherObjectWhere, orderBy: [AnotherObjectOrderBy!], limit: Int, offset: Int): [AnotherObject!]!
53
- manyObjects(where: SomeObjectWhere, search: String, orderBy: [SomeObjectOrderBy!], limit: Int, offset: Int): [SomeObject!]!
54
- }
55
-
56
- enum Role {
57
- ADMIN
58
- USER
59
- }
60
-
61
- enum SomeEnum {
62
- A
63
- B
64
- C
65
- }
66
-
67
- type SomeObject {
68
- id: ID!
69
- field: String
70
- another: AnotherObject!
71
- list(magic: Boolean): [Float!]!
72
- xyz: Int!
73
- createdAt: DateTime!
74
- createdBy: User!
75
- updatedAt: DateTime!
76
- updatedBy: User!
77
- deleted: Boolean!
78
- deletedAt: DateTime
79
- deletedBy: User
80
- }
81
-
82
- input SomeObjectOrderBy {
83
- xyz: Order
84
- createdAt: Order
85
- updatedAt: Order
86
- deletedAt: Order
87
- }
88
-
89
- input SomeObjectWhere {
90
- id: [ID!]
91
- deleted: [Boolean!]
92
- another: AnotherObjectWhere
93
- }
94
-
95
- input SomeObjectWhereUnique {
96
- id: ID
97
- }
98
-
99
- type SomeRawObject {
100
- field: String
101
- }
102
-
103
- input UpdateSomeObject {
104
- anotherId: ID
105
- xyz: Int
106
- }
107
-
108
- scalar Upload
109
-
110
- type User {
111
- id: ID!
112
- username: String
113
- role: Role
114
- deletedAnotherObjects(where: AnotherObjectWhere, orderBy: [AnotherObjectOrderBy!], limit: Int, offset: Int): [AnotherObject!]!
115
- createdManyObjects(where: SomeObjectWhere, search: String, orderBy: [SomeObjectOrderBy!], limit: Int, offset: Int): [SomeObject!]!
116
- updatedManyObjects(where: SomeObjectWhere, search: String, orderBy: [SomeObjectOrderBy!], limit: Int, offset: Int): [SomeObject!]!
117
- deletedManyObjects(where: SomeObjectWhere, search: String, orderBy: [SomeObjectOrderBy!], limit: Int, offset: Int): [SomeObject!]!
118
- }
119
-
120
- input UserWhere {
121
- id: [ID!]
122
- }
123
-
124
- input UserWhereUnique {
125
- id: ID
126
- }
127
- "
128
- `;
@@ -1,8 +0,0 @@
1
- import { printSchemaFromModels } from '../../src';
2
- import { rawModels } from '../utils/models';
3
-
4
- describe('generate', () => {
5
- it('generates a schema', () => {
6
- expect(printSchemaFromModels(rawModels)).toMatchSnapshot();
7
- });
8
- });
@@ -1,64 +0,0 @@
1
- import { Knex } from 'knex';
2
-
3
- export const setupSchema = async (knex: Knex) => {
4
- await knex.raw(`CREATE TYPE "someEnum" AS ENUM ('A','B','C')`);
5
-
6
- await knex.raw(`CREATE TYPE "role" AS ENUM ('ADMIN','USER')`);
7
-
8
- await knex.schema.createTable('User', (table) => {
9
- table.uuid('id').notNullable().primary();
10
- table.string('username', undefined).nullable();
11
- table
12
- .enum('role', null as any, {
13
- useNative: true,
14
- existingType: true,
15
- enumName: 'role',
16
- })
17
- .nullable();
18
- });
19
-
20
- await knex.schema.createTable('AnotherObject', (table) => {
21
- table.uuid('id').notNullable().primary();
22
- table.uuid('myselfId').notNullable();
23
- table.foreign('myselfId').references('id').inTable('AnotherObject');
24
- table.boolean('deleted').notNullable().defaultTo(false);
25
- table.timestamp('deletedAt').nullable();
26
- table.uuid('deletedById').nullable();
27
- table.foreign('deletedById').references('id').inTable('User');
28
- });
29
-
30
- await knex.schema.createTable('AnotherObjectRevision', (table) => {
31
- table.uuid('id').notNullable().primary();
32
- table.boolean('deleted').notNullable();
33
- });
34
-
35
- await knex.schema.createTable('SomeObject', (table) => {
36
- table.uuid('id').notNullable().primary();
37
- table.string('field', undefined).nullable();
38
- table.uuid('anotherId').notNullable();
39
- table.foreign('anotherId').references('id').inTable('AnotherObject');
40
- table.decimal('list', 1, 1).notNullable();
41
- table.integer('xyz').notNullable();
42
- table.timestamp('createdAt').notNullable();
43
- table.uuid('createdById').notNullable();
44
- table.foreign('createdById').references('id').inTable('User');
45
- table.timestamp('updatedAt').notNullable();
46
- table.uuid('updatedById').notNullable();
47
- table.foreign('updatedById').references('id').inTable('User');
48
- table.boolean('deleted').notNullable().defaultTo(false);
49
- table.timestamp('deletedAt').nullable();
50
- table.uuid('deletedById').nullable();
51
- table.foreign('deletedById').references('id').inTable('User');
52
- });
53
-
54
- await knex.schema.createTable('SomeObjectRevision', (table) => {
55
- table.uuid('id').notNullable().primary();
56
- table.uuid('someObjectId').notNullable();
57
- table.uuid('anotherId').notNullable();
58
- table.foreign('anotherId').references('id').inTable('AnotherObject');
59
- table.uuid('createdById').notNullable();
60
- table.timestamp('createdAt').notNullable().defaultTo(knex.fn.now(0));
61
- table.boolean('deleted').notNullable();
62
- table.integer('xyz').notNullable();
63
- });
64
- };
@@ -1,24 +0,0 @@
1
- import { writeFileSync } from 'fs';
2
- import { simpleGit } from 'simple-git';
3
- import { MigrationGenerator, getMigrationDate } from '../../src/migrations/generate';
4
- import { getKnex } from './database/knex';
5
- import { rawModels } from './models';
6
-
7
- const git = simpleGit();
8
-
9
-
10
- const writeMigration = async () => {
11
- const name = process.argv[2] || (await git.branch()).current.split('/').pop();
12
-
13
- const knex = getKnex();
14
-
15
- try {
16
- const migrations = await new MigrationGenerator(knex, rawModels).generate();
17
-
18
- writeFileSync(`tmp/${getMigrationDate()}_${name}.ts`, migrations);
19
- } finally {
20
- await knex.destroy();
21
- }
22
- };
23
-
24
- void writeMigration();