@smartive/graphql-magic 9.1.3 → 11.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 (124) 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 +1 -6
  5. package/README.md +1 -1
  6. package/dist/bin/gqm.cjs +676 -324
  7. package/dist/cjs/index.cjs +1016 -561
  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/errors.d.ts +1 -1
  21. package/dist/esm/errors.js +2 -2
  22. package/dist/esm/errors.js.map +1 -1
  23. package/dist/esm/migrations/generate.d.ts +3 -4
  24. package/dist/esm/migrations/generate.js +114 -107
  25. package/dist/esm/migrations/generate.js.map +1 -1
  26. package/dist/esm/models/index.d.ts +1 -0
  27. package/dist/esm/models/index.js +1 -0
  28. package/dist/esm/models/index.js.map +1 -1
  29. package/dist/esm/models/model-definitions.d.ts +189 -0
  30. package/dist/esm/models/model-definitions.js +2 -0
  31. package/dist/esm/models/model-definitions.js.map +1 -0
  32. package/dist/esm/models/models.d.ts +128 -174
  33. package/dist/esm/models/models.js +411 -1
  34. package/dist/esm/models/models.js.map +1 -1
  35. package/dist/esm/models/mutation-hook.d.ts +2 -2
  36. package/dist/esm/models/utils.d.ts +35 -497
  37. package/dist/esm/models/utils.js +21 -144
  38. package/dist/esm/models/utils.js.map +1 -1
  39. package/dist/esm/permissions/check.d.ts +3 -3
  40. package/dist/esm/permissions/check.js +19 -12
  41. package/dist/esm/permissions/check.js.map +1 -1
  42. package/dist/esm/permissions/generate.js +6 -6
  43. package/dist/esm/permissions/generate.js.map +1 -1
  44. package/dist/esm/resolvers/filters.d.ts +8 -0
  45. package/dist/esm/resolvers/filters.js +28 -25
  46. package/dist/esm/resolvers/filters.js.map +1 -1
  47. package/dist/esm/resolvers/index.d.ts +1 -0
  48. package/dist/esm/resolvers/index.js +1 -0
  49. package/dist/esm/resolvers/index.js.map +1 -1
  50. package/dist/esm/resolvers/mutations.js +85 -21
  51. package/dist/esm/resolvers/mutations.js.map +1 -1
  52. package/dist/esm/resolvers/node.d.ts +13 -15
  53. package/dist/esm/resolvers/node.js +41 -36
  54. package/dist/esm/resolvers/node.js.map +1 -1
  55. package/dist/esm/resolvers/resolver.js +19 -49
  56. package/dist/esm/resolvers/resolver.js.map +1 -1
  57. package/dist/esm/resolvers/resolvers.d.ts +1 -8
  58. package/dist/esm/resolvers/resolvers.js +15 -7
  59. package/dist/esm/resolvers/resolvers.js.map +1 -1
  60. package/dist/esm/resolvers/selects.d.ts +3 -0
  61. package/dist/esm/resolvers/selects.js +50 -0
  62. package/dist/esm/resolvers/selects.js.map +1 -0
  63. package/dist/esm/resolvers/utils.d.ts +12 -4
  64. package/dist/esm/resolvers/utils.js +30 -22
  65. package/dist/esm/resolvers/utils.js.map +1 -1
  66. package/dist/esm/schema/generate.d.ts +4 -4
  67. package/dist/esm/schema/generate.js +122 -131
  68. package/dist/esm/schema/generate.js.map +1 -1
  69. package/dist/esm/schema/utils.d.ts +1 -1
  70. package/dist/esm/schema/utils.js +2 -1
  71. package/dist/esm/schema/utils.js.map +1 -1
  72. package/knexfile.ts +31 -0
  73. package/migrations/20230912185644_setup.ts +127 -0
  74. package/package.json +16 -14
  75. package/src/api/execute.ts +1 -1
  76. package/src/bin/gqm/gqm.ts +16 -16
  77. package/src/bin/gqm/parse-models.ts +5 -5
  78. package/src/bin/gqm/settings.ts +13 -4
  79. package/src/bin/gqm/static-eval.ts +5 -0
  80. package/src/bin/gqm/templates.ts +23 -3
  81. package/src/client/mutations.ts +11 -5
  82. package/src/client/queries.ts +44 -81
  83. package/src/context.ts +1 -2
  84. package/src/db/generate.ts +41 -41
  85. package/src/errors.ts +2 -2
  86. package/src/migrations/generate.ts +165 -146
  87. package/src/models/index.ts +1 -0
  88. package/src/models/model-definitions.ts +168 -0
  89. package/src/models/models.ts +510 -166
  90. package/src/models/mutation-hook.ts +2 -2
  91. package/src/models/utils.ts +53 -187
  92. package/src/permissions/check.ts +34 -16
  93. package/src/permissions/generate.ts +6 -6
  94. package/src/resolvers/filters.ts +44 -28
  95. package/src/resolvers/index.ts +1 -0
  96. package/src/resolvers/mutations.ts +98 -36
  97. package/src/resolvers/node.ts +79 -51
  98. package/src/resolvers/resolver.ts +20 -74
  99. package/src/resolvers/resolvers.ts +18 -7
  100. package/src/resolvers/selects.ts +78 -0
  101. package/src/resolvers/utils.ts +41 -25
  102. package/src/schema/generate.ts +106 -127
  103. package/src/schema/utils.ts +2 -1
  104. package/tests/api/__snapshots__/inheritance.spec.ts.snap +83 -0
  105. package/tests/api/inheritance.spec.ts +130 -0
  106. package/tests/generated/api/index.ts +1174 -0
  107. package/tests/generated/client/index.ts +1163 -0
  108. package/tests/generated/client/mutations.ts +109 -0
  109. package/tests/generated/db/index.ts +291 -0
  110. package/tests/generated/db/knex.ts +14 -0
  111. package/tests/generated/models.json +675 -0
  112. package/tests/generated/schema.graphql +325 -0
  113. package/tests/unit/__snapshots__/resolve.spec.ts.snap +23 -0
  114. package/tests/unit/queries.spec.ts +5 -5
  115. package/tests/unit/resolve.spec.ts +8 -8
  116. package/tests/utils/database/knex.ts +5 -13
  117. package/tests/utils/database/seed.ts +57 -18
  118. package/tests/utils/models.ts +62 -7
  119. package/tests/utils/server.ts +5 -5
  120. package/tsconfig.eslint.json +1 -0
  121. package/tests/unit/__snapshots__/generate.spec.ts.snap +0 -128
  122. package/tests/unit/generate.spec.ts +0 -8
  123. package/tests/utils/database/schema.ts +0 -64
  124. 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();