@smartive/graphql-magic 1.0.1

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 +21 -0
  2. package/.github/workflows/release.yml +24 -0
  3. package/.github/workflows/testing.yml +37 -0
  4. package/.nvmrc +1 -0
  5. package/.prettierignore +34 -0
  6. package/.prettierrc.json +1 -0
  7. package/.releaserc +27 -0
  8. package/CHANGELOG.md +6 -0
  9. package/README.md +15 -0
  10. package/dist/cjs/index.cjs +2646 -0
  11. package/dist/esm/client/gql.d.ts +1 -0
  12. package/dist/esm/client/gql.js +5 -0
  13. package/dist/esm/client/gql.js.map +1 -0
  14. package/dist/esm/client/index.d.ts +2 -0
  15. package/dist/esm/client/index.js +4 -0
  16. package/dist/esm/client/index.js.map +1 -0
  17. package/dist/esm/client/queries.d.ts +24 -0
  18. package/dist/esm/client/queries.js +152 -0
  19. package/dist/esm/client/queries.js.map +1 -0
  20. package/dist/esm/context.d.ts +30 -0
  21. package/dist/esm/context.js +2 -0
  22. package/dist/esm/context.js.map +1 -0
  23. package/dist/esm/errors.d.ts +17 -0
  24. package/dist/esm/errors.js +27 -0
  25. package/dist/esm/errors.js.map +1 -0
  26. package/dist/esm/generate/generate.d.ts +7 -0
  27. package/dist/esm/generate/generate.js +211 -0
  28. package/dist/esm/generate/generate.js.map +1 -0
  29. package/dist/esm/generate/index.d.ts +3 -0
  30. package/dist/esm/generate/index.js +5 -0
  31. package/dist/esm/generate/index.js.map +1 -0
  32. package/dist/esm/generate/mutations.d.ts +2 -0
  33. package/dist/esm/generate/mutations.js +18 -0
  34. package/dist/esm/generate/mutations.js.map +1 -0
  35. package/dist/esm/generate/utils.d.ts +22 -0
  36. package/dist/esm/generate/utils.js +150 -0
  37. package/dist/esm/generate/utils.js.map +1 -0
  38. package/dist/esm/index.d.ts +10 -0
  39. package/dist/esm/index.js +12 -0
  40. package/dist/esm/index.js.map +1 -0
  41. package/dist/esm/migrations/generate.d.ts +28 -0
  42. package/dist/esm/migrations/generate.js +516 -0
  43. package/dist/esm/migrations/generate.js.map +1 -0
  44. package/dist/esm/migrations/index.d.ts +1 -0
  45. package/dist/esm/migrations/index.js +3 -0
  46. package/dist/esm/migrations/index.js.map +1 -0
  47. package/dist/esm/models.d.ts +170 -0
  48. package/dist/esm/models.js +27 -0
  49. package/dist/esm/models.js.map +1 -0
  50. package/dist/esm/permissions/check.d.ts +15 -0
  51. package/dist/esm/permissions/check.js +162 -0
  52. package/dist/esm/permissions/check.js.map +1 -0
  53. package/dist/esm/permissions/generate.d.ts +45 -0
  54. package/dist/esm/permissions/generate.js +77 -0
  55. package/dist/esm/permissions/generate.js.map +1 -0
  56. package/dist/esm/permissions/index.d.ts +2 -0
  57. package/dist/esm/permissions/index.js +4 -0
  58. package/dist/esm/permissions/index.js.map +1 -0
  59. package/dist/esm/resolvers/arguments.d.ts +26 -0
  60. package/dist/esm/resolvers/arguments.js +88 -0
  61. package/dist/esm/resolvers/arguments.js.map +1 -0
  62. package/dist/esm/resolvers/filters.d.ts +5 -0
  63. package/dist/esm/resolvers/filters.js +126 -0
  64. package/dist/esm/resolvers/filters.js.map +1 -0
  65. package/dist/esm/resolvers/index.d.ts +7 -0
  66. package/dist/esm/resolvers/index.js +9 -0
  67. package/dist/esm/resolvers/index.js.map +1 -0
  68. package/dist/esm/resolvers/mutations.d.ts +3 -0
  69. package/dist/esm/resolvers/mutations.js +255 -0
  70. package/dist/esm/resolvers/mutations.js.map +1 -0
  71. package/dist/esm/resolvers/node.d.ts +44 -0
  72. package/dist/esm/resolvers/node.js +102 -0
  73. package/dist/esm/resolvers/node.js.map +1 -0
  74. package/dist/esm/resolvers/resolver.d.ts +5 -0
  75. package/dist/esm/resolvers/resolver.js +143 -0
  76. package/dist/esm/resolvers/resolver.js.map +1 -0
  77. package/dist/esm/resolvers/resolvers.d.ts +9 -0
  78. package/dist/esm/resolvers/resolvers.js +39 -0
  79. package/dist/esm/resolvers/resolvers.js.map +1 -0
  80. package/dist/esm/resolvers/utils.d.ts +43 -0
  81. package/dist/esm/resolvers/utils.js +125 -0
  82. package/dist/esm/resolvers/utils.js.map +1 -0
  83. package/dist/esm/utils.d.ts +25 -0
  84. package/dist/esm/utils.js +159 -0
  85. package/dist/esm/utils.js.map +1 -0
  86. package/dist/esm/values.d.ts +15 -0
  87. package/dist/esm/values.js +7 -0
  88. package/dist/esm/values.js.map +1 -0
  89. package/jest.config.ts +12 -0
  90. package/package.json +66 -0
  91. package/renovate.json +32 -0
  92. package/src/client/gql.ts +7 -0
  93. package/src/client/index.ts +4 -0
  94. package/src/client/queries.ts +251 -0
  95. package/src/context.ts +27 -0
  96. package/src/errors.ts +32 -0
  97. package/src/generate/generate.ts +273 -0
  98. package/src/generate/index.ts +5 -0
  99. package/src/generate/mutations.ts +35 -0
  100. package/src/generate/utils.ts +223 -0
  101. package/src/index.ts +12 -0
  102. package/src/migrations/generate.ts +633 -0
  103. package/src/migrations/index.ts +3 -0
  104. package/src/models.ts +228 -0
  105. package/src/permissions/check.ts +239 -0
  106. package/src/permissions/generate.ts +143 -0
  107. package/src/permissions/index.ts +4 -0
  108. package/src/resolvers/arguments.ts +129 -0
  109. package/src/resolvers/filters.ts +163 -0
  110. package/src/resolvers/index.ts +9 -0
  111. package/src/resolvers/mutations.ts +313 -0
  112. package/src/resolvers/node.ts +193 -0
  113. package/src/resolvers/resolver.ts +223 -0
  114. package/src/resolvers/resolvers.ts +40 -0
  115. package/src/resolvers/utils.ts +188 -0
  116. package/src/utils.ts +186 -0
  117. package/src/values.ts +19 -0
  118. package/tests/unit/__snapshots__/generate.spec.ts.snap +105 -0
  119. package/tests/unit/__snapshots__/resolve.spec.ts.snap +60 -0
  120. package/tests/unit/generate.spec.ts +8 -0
  121. package/tests/unit/resolve.spec.ts +128 -0
  122. package/tests/unit/utils.ts +82 -0
  123. package/tsconfig.jest.json +13 -0
  124. package/tsconfig.json +13 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../../src/resolvers/arguments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Knex } from 'knex';
2
+ import { FieldResolverNode } from './node';
3
+ import { Joins } from './utils';
4
+ export declare const SPECIAL_FILTERS: Record<string, string>;
5
+ export declare const applyFilters: (node: FieldResolverNode, query: Knex.QueryBuilder, joins: Joins) => void;
@@ -0,0 +1,126 @@
1
+ import { ForbiddenError, UserInputError } from '../errors';
2
+ import { get, summonByName } from '../utils';
3
+ import { normalizeArguments } from './arguments';
4
+ import { addJoin, apply, ors } from './utils';
5
+ export const SPECIAL_FILTERS = {
6
+ GT: '?? > ?',
7
+ GTE: '?? >= ?',
8
+ LT: '?? < ?',
9
+ LTE: '?? <= ?',
10
+ };
11
+ export const applyFilters = (node, query, joins) => {
12
+ const normalizedArguments = normalizeArguments(node);
13
+ if (!normalizedArguments.orderBy) {
14
+ if (node.model.defaultOrderBy) {
15
+ normalizedArguments.orderBy = node.model.defaultOrderBy;
16
+ }
17
+ else if (node.model.creatable) {
18
+ normalizedArguments.orderBy = [{ createdAt: 'DESC' }];
19
+ }
20
+ }
21
+ if (node.model.deletable) {
22
+ if (!normalizedArguments.where) {
23
+ normalizedArguments.where = {};
24
+ }
25
+ if (normalizedArguments.where.deleted &&
26
+ (!Array.isArray(normalizedArguments.where.deleted) || normalizedArguments.where.deleted.some((v) => v))) {
27
+ if (node.ctx.user.role !== 'ADMIN') {
28
+ throw new ForbiddenError('You cannot access deleted entries.');
29
+ }
30
+ }
31
+ else {
32
+ normalizedArguments.where.deleted = false;
33
+ }
34
+ }
35
+ const { limit, offset, orderBy, where, search } = normalizedArguments;
36
+ if (limit) {
37
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
38
+ query.limit(limit);
39
+ }
40
+ if (offset) {
41
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
42
+ query.offset(offset);
43
+ }
44
+ if (orderBy) {
45
+ applyOrderBy(node, orderBy, query);
46
+ }
47
+ if (where) {
48
+ const ops = [];
49
+ applyWhere(node, where, ops, joins);
50
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
51
+ apply(query, ops);
52
+ }
53
+ if (search) {
54
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
55
+ applySearch(node, search, query);
56
+ }
57
+ };
58
+ const applyWhere = (node, where, ops, joins) => {
59
+ for (const key of Object.keys(where)) {
60
+ const value = where[key];
61
+ const specialFilter = key.match(/^(\w+)_(\w+)$/);
62
+ if (specialFilter) {
63
+ const [, actualKey, filter] = specialFilter;
64
+ if (!SPECIAL_FILTERS[filter]) {
65
+ // Should not happen
66
+ throw new Error(`Invalid filter ${key}.`);
67
+ }
68
+ ops.push((query) => query.whereRaw(SPECIAL_FILTERS[filter], [`${node.shortTableAlias}.${actualKey}`, value]));
69
+ continue;
70
+ }
71
+ const field = summonByName(node.model.fields, key);
72
+ const fullKey = `${node.shortTableAlias}.${key}`;
73
+ if (field.relation) {
74
+ const relation = get(node.model.relationsByName, field.name);
75
+ const tableAlias = `${node.model.name}__W__${key}`;
76
+ const subNode = {
77
+ ctx: node.ctx,
78
+ model: relation.model,
79
+ tableName: relation.model.name,
80
+ tableAlias,
81
+ shortTableAlias: node.ctx.aliases.getShort(tableAlias),
82
+ foreignKey: relation.field.foreignKey,
83
+ };
84
+ addJoin(joins, node.tableAlias, subNode.tableName, subNode.tableAlias, get(subNode, 'foreignKey'), 'id');
85
+ applyWhere(subNode, value, ops, joins);
86
+ continue;
87
+ }
88
+ if (Array.isArray(value)) {
89
+ if (field && field.list) {
90
+ ops.push((query) => ors(query, value.map((v) => (subQuery) => subQuery.whereRaw('? = ANY(??)', [v, fullKey]))));
91
+ continue;
92
+ }
93
+ if (value.some((v) => v === null)) {
94
+ if (value.some((v) => v !== null)) {
95
+ ops.push((query) => ors(query, [
96
+ (subQuery) => subQuery.whereIn(fullKey, value.filter((v) => v !== null)),
97
+ (subQuery) => subQuery.whereNull(fullKey),
98
+ ]));
99
+ continue;
100
+ }
101
+ ops.push((query) => query.whereNull(fullKey));
102
+ continue;
103
+ }
104
+ ops.push((query) => query.whereIn(fullKey, value));
105
+ continue;
106
+ }
107
+ ops.push((query) => query.where({ [fullKey]: value }));
108
+ }
109
+ };
110
+ const applySearch = (node, search, query) => ors(query, node.model.fields
111
+ .filter(({ searchable }) => searchable)
112
+ .map(({ name }) => (query) => query.whereILike(`${node.shortTableAlias}.${name}`, `%${search}%`)));
113
+ const applyOrderBy = (node, orderBy, query) => {
114
+ for (const vals of orderBy) {
115
+ const keys = Object.keys(vals);
116
+ if (keys.length !== 1) {
117
+ throw new UserInputError(`You need to specify exactly 1 value to order by for each orderBy entry.`);
118
+ }
119
+ const key = keys[0];
120
+ const value = vals[key];
121
+ // Simple field
122
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises -- we do not need to await knex here
123
+ query.orderBy(`${node.shortTableAlias}.${key}`, value);
124
+ }
125
+ };
126
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../src/resolvers/filters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAkB,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAc,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,CAAC,MAAM,eAAe,GAA2B;IACrD,EAAE,EAAE,QAAQ;IACZ,GAAG,EAAE,SAAS;IACd,EAAE,EAAE,QAAQ;IACZ,GAAG,EAAE,SAAS;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAuB,EAAE,KAAwB,EAAE,KAAY,EAAE,EAAE;IAC9F,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACrD,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE;QAChC,IAAI,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;YAC7B,mBAAmB,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;SACzD;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YAC/B,mBAAmB,CAAC,OAAO,GAAG,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;SACvD;KACF;IACD,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QACxB,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE;YAC9B,mBAAmB,CAAC,KAAK,GAAG,EAAE,CAAC;SAChC;QACD,IACE,mBAAmB,CAAC,KAAK,CAAC,OAAO;YACjC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EACvG;YACA,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;gBAClC,MAAM,IAAI,cAAc,CAAC,oCAAoC,CAAC,CAAC;aAChE;SACF;aAAM;YACL,mBAAmB,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;SAC3C;KACF;IACD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC;IAEtE,IAAI,KAAK,EAAE;QACT,wGAAwG;QACxG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;KACpB;IAED,IAAI,MAAM,EAAE;QACV,wGAAwG;QACxG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;KACtB;IAED,IAAI,OAAO,EAAE;QACX,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;KACpC;IAED,IAAI,KAAK,EAAE;QACT,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,wGAAwG;QACxG,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;KACnB;IAED,IAAI,MAAM,EAAE;QACV,wGAAwG;QACxG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;KAClC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,IAAe,EAAE,KAAY,EAAE,GAA2B,EAAE,KAAY,EAAE,EAAE;IAC9F,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAEzB,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACjD,IAAI,aAAa,EAAE;YACjB,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,aAAa,CAAC;YAC5C,IAAI,CAAC,eAAe,CAAC,MAAO,CAAC,EAAE;gBAC7B,oBAAoB;gBACpB,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,GAAG,CAAC,CAAC;aAC3C;YACD,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACjB,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAO,CAAE,EAAE,CAAC,GAAG,IAAI,CAAC,eAAe,IAAI,SAAS,EAAE,EAAE,KAAe,CAAC,CAAC,CACrG,CAAC;YACF,SAAS;SACV;QAED,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,eAAe,IAAI,GAAG,EAAE,CAAC;QAEjD,IAAI,KAAK,CAAC,QAAQ,EAAE;YAClB,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,GAAG,EAAE,CAAC;YACnD,MAAM,OAAO,GAAc;gBACzB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI;gBAC9B,UAAU;gBACV,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;gBACtD,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,UAAU;aACtC,CAAC;YACF,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;YACzG,UAAU,CAAC,OAAO,EAAE,KAAc,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAChD,SAAS;SACV;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE;gBACvB,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACjB,GAAG,CACD,KAAK,EACL,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,OAAO,CAAa,CAAC,CAAC,CAC3F,CACF,CAAC;gBACF,SAAS;aACV;YAED,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE;gBACjC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE;oBACjC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACjB,GAAG,CAAC,KAAK,EAAE;wBACT,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAa,CAAC;wBACpF,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC;qBAC1C,CAAC,CACH,CAAC;oBACF,SAAS;iBACV;gBAED,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC9C,SAAS;aACV;YAED,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,KAAiB,CAAC,CAAC,CAAC;YAC/D,SAAS;SACV;QAED,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;KACxD;AACH,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,IAAuB,EAAE,MAAc,EAAE,KAAwB,EAAE,EAAE,CACxF,GAAG,CACD,KAAK,EACL,IAAI,CAAC,KAAK,CAAC,MAAM;KACd,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC;KACtC,GAAG,CACF,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CACX,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,EAAE,EAAE,IAAI,MAAM,GAAG,CAAC,CACvE,CACJ,CAAC;AAEJ,MAAM,YAAY,GAAG,CAAC,IAAuB,EAAE,OAAgB,EAAE,KAAwB,EAAE,EAAE;IAC3F,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,MAAM,IAAI,cAAc,CAAC,yEAAyE,CAAC,CAAC;SACrG;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAI,CAAC,CAAC;QAEzB,eAAe;QACf,wGAAwG;QACxG,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,eAAe,IAAI,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;KACxD;AACH,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from './arguments';
2
+ export * from './filters';
3
+ export * from './mutations';
4
+ export * from './node';
5
+ export * from './resolver';
6
+ export * from './resolvers';
7
+ export * from './utils';
@@ -0,0 +1,9 @@
1
+ // created from 'create-ts-index'
2
+ export * from './arguments';
3
+ export * from './filters';
4
+ export * from './mutations';
5
+ export * from './node';
6
+ export * from './resolver';
7
+ export * from './resolvers';
8
+ export * from './utils';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { GraphQLResolveInfo } from 'graphql';
2
+ import { Context } from '../context';
3
+ export declare const mutationResolver: (_parent: any, args: any, partialCtx: Context, info: GraphQLResolveInfo) => Promise<any>;
@@ -0,0 +1,255 @@
1
+ import { v4 as uuid } from 'uuid';
2
+ import { ForbiddenError, GraphQLError } from '../errors';
3
+ import { isEnumList } from '../models';
4
+ import { applyPermissions, checkCanWrite, getEntityToMutate } from '../permissions/check';
5
+ import { get, it, summonByName, typeToField } from '../utils';
6
+ import { resolve } from './resolver';
7
+ import { AliasGenerator } from './utils';
8
+ export const mutationResolver = async (_parent, args, partialCtx, info) => {
9
+ return await partialCtx.knex.transaction(async (knex) => {
10
+ const [, mutation, modelName] = it(info.fieldName.match(/^(create|update|delete|restore)(.+)$/));
11
+ const ctx = { ...partialCtx, knex, info, aliases: new AliasGenerator() };
12
+ const model = summonByName(ctx.models, modelName);
13
+ switch (mutation) {
14
+ case 'create':
15
+ return await create(model, args, ctx);
16
+ case 'update':
17
+ return await update(model, args, ctx);
18
+ case 'delete':
19
+ return await del(model, args, ctx);
20
+ case 'restore':
21
+ return await restore(model, args, ctx);
22
+ }
23
+ });
24
+ };
25
+ const create = async (model, { data: input }, ctx) => {
26
+ const normalizedInput = { ...input };
27
+ normalizedInput.id = uuid();
28
+ normalizedInput.createdAt = ctx.now;
29
+ normalizedInput.createdById = ctx.user.id;
30
+ sanitize(ctx, model, normalizedInput);
31
+ await checkCanWrite(ctx, model, normalizedInput, 'CREATE');
32
+ await ctx.handleUploads?.(normalizedInput);
33
+ const data = { prev: {}, input, normalizedInput, next: normalizedInput };
34
+ await ctx.mutationHook?.(model, 'create', 'before', data, ctx);
35
+ await ctx.knex(model.name).insert(normalizedInput);
36
+ await createRevision(model, normalizedInput, ctx);
37
+ await ctx.mutationHook?.(model, 'create', 'after', data, ctx);
38
+ return await resolve(ctx, normalizedInput.id);
39
+ };
40
+ const update = async (model, { where, data: input }, ctx) => {
41
+ if (Object.keys(where).length === 0) {
42
+ throw new Error(`No ${model.name} specified.`);
43
+ }
44
+ const normalizedInput = { ...input };
45
+ sanitize(ctx, model, normalizedInput);
46
+ const prev = await getEntityToMutate(ctx, model, where, 'UPDATE');
47
+ // Remove data that wouldn't mutate given that it's irrelevant for permissions
48
+ for (const key of Object.keys(normalizedInput)) {
49
+ if (normalizedInput[key] === prev[key]) {
50
+ delete normalizedInput[key];
51
+ }
52
+ }
53
+ if (Object.keys(normalizedInput).length > 0) {
54
+ await checkCanWrite(ctx, model, normalizedInput, 'UPDATE');
55
+ await ctx.handleUploads?.(normalizedInput);
56
+ const next = { ...prev, ...normalizedInput };
57
+ const data = { prev, input, normalizedInput, next };
58
+ await ctx.mutationHook?.(model, 'update', 'before', data, ctx);
59
+ await ctx.knex(model.name).where(where).update(normalizedInput);
60
+ await createRevision(model, next, ctx);
61
+ await ctx.mutationHook?.(model, 'update', 'after', data, ctx);
62
+ }
63
+ return await resolve(ctx);
64
+ };
65
+ const del = async (model, { where, dryRun }, ctx) => {
66
+ if (Object.keys(where).length === 0) {
67
+ throw new Error(`No ${model.name} specified.`);
68
+ }
69
+ const entity = await getEntityToMutate(ctx, model, where, 'DELETE');
70
+ if (entity.deleted) {
71
+ throw new ForbiddenError('Entity is already deleted.');
72
+ }
73
+ const toDelete = {};
74
+ const toUnlink = {};
75
+ const beforeHooks = [];
76
+ const mutations = [];
77
+ const afterHooks = [];
78
+ const deleteCascade = async (currentModel, entity) => {
79
+ if (entity.deleted) {
80
+ return;
81
+ }
82
+ if (dryRun) {
83
+ if (!(currentModel.name in toDelete)) {
84
+ toDelete[currentModel.name] = {};
85
+ }
86
+ toDelete[currentModel.name][entity.id] = entity[currentModel.displayField || 'id'] || entity.id;
87
+ }
88
+ else {
89
+ const normalizedInput = { deleted: true, deletedAt: ctx.now, deletedById: ctx.user.id };
90
+ const data = { prev: entity, input: {}, normalizedInput, next: { ...entity, ...normalizedInput } };
91
+ if (ctx.mutationHook) {
92
+ beforeHooks.push(async () => {
93
+ await ctx.mutationHook(currentModel, 'delete', 'before', data, ctx);
94
+ });
95
+ }
96
+ mutations.push(async () => {
97
+ await ctx.knex(currentModel.name).where({ id: entity.id }).update(normalizedInput);
98
+ await createRevision(currentModel, { ...entity, deleted: true }, ctx);
99
+ });
100
+ if (ctx.mutationHook) {
101
+ afterHooks.push(async () => {
102
+ await ctx.mutationHook(currentModel, 'delete', 'after', data, ctx);
103
+ });
104
+ }
105
+ }
106
+ for (const { model: descendantModel, foreignKey, field: { name, onDelete }, } of currentModel.reverseRelations) {
107
+ const query = ctx.knex(descendantModel.name).where({ [foreignKey]: entity.id });
108
+ switch (onDelete) {
109
+ case 'set-null': {
110
+ const descendants = await query;
111
+ for (const descendant of descendants) {
112
+ if (dryRun) {
113
+ if (!toUnlink[descendantModel.name]) {
114
+ toUnlink[descendantModel.name] = {};
115
+ }
116
+ if (!toUnlink[descendantModel.name][descendant.id]) {
117
+ toUnlink[descendantModel.name][descendant.id] = {
118
+ display: descendant[descendantModel.displayField || 'id'] || entity.id,
119
+ fields: [],
120
+ };
121
+ }
122
+ toUnlink[descendantModel.name][descendant.id].fields.push(name);
123
+ }
124
+ else {
125
+ mutations.push(async () => {
126
+ await ctx
127
+ .knex(descendantModel.name)
128
+ .where({ id: descendant.id })
129
+ .update({
130
+ [`${name}Id`]: null,
131
+ });
132
+ });
133
+ }
134
+ }
135
+ break;
136
+ }
137
+ case 'cascade':
138
+ default: {
139
+ applyPermissions(ctx, descendantModel.name, descendantModel.name, query, 'DELETE');
140
+ const descendants = await query;
141
+ if (descendants.length && !descendantModel.deletable) {
142
+ throw new ForbiddenError(`This ${model.name} depends on a ${descendantModel.name} which cannot be deleted.`);
143
+ }
144
+ for (const descendant of descendants) {
145
+ await deleteCascade(descendantModel, descendant);
146
+ }
147
+ break;
148
+ }
149
+ }
150
+ }
151
+ };
152
+ await deleteCascade(model, entity);
153
+ for (const callback of [...beforeHooks, ...mutations, ...afterHooks]) {
154
+ await callback();
155
+ }
156
+ if (dryRun) {
157
+ throw new GraphQLError(`Delete dry run:`, {
158
+ code: 'DELETE_DRY_RUN',
159
+ toDelete,
160
+ toUnlink,
161
+ });
162
+ }
163
+ return entity.id;
164
+ };
165
+ const restore = async (model, { where }, ctx) => {
166
+ if (Object.keys(where).length === 0) {
167
+ throw new Error(`No ${model.name} specified.`);
168
+ }
169
+ const entity = await getEntityToMutate(ctx, model, where, 'RESTORE');
170
+ if (!entity.deleted) {
171
+ throw new ForbiddenError('Entity is not deleted.');
172
+ }
173
+ const beforeHooks = [];
174
+ const mutations = [];
175
+ const afterHooks = [];
176
+ const restoreCascade = async (currentModel, relatedEntity) => {
177
+ if (!relatedEntity.deleted || !relatedEntity.deletedAt || !relatedEntity.deletedAt.equals(entity.deletedAt)) {
178
+ return;
179
+ }
180
+ const normalizedInput = { deleted: false, deletedAt: null, deletedById: null };
181
+ const data = { prev: relatedEntity, input: {}, normalizedInput, next: { ...relatedEntity, ...normalizedInput } };
182
+ if (ctx.mutationHook) {
183
+ beforeHooks.push(async () => {
184
+ await ctx.mutationHook(model, 'restore', 'before', data, ctx);
185
+ });
186
+ }
187
+ mutations.push(async () => {
188
+ await ctx.knex(currentModel.name).where({ id: relatedEntity.id }).update(normalizedInput);
189
+ await createRevision(currentModel, { ...relatedEntity, deleted: false }, ctx);
190
+ });
191
+ if (ctx.mutationHook) {
192
+ afterHooks.push(async () => {
193
+ await ctx.mutationHook(model, 'restore', 'after', data, ctx);
194
+ });
195
+ }
196
+ for (const { model: descendantModel, foreignKey } of currentModel.reverseRelations.filter(({ model: { deletable } }) => deletable)) {
197
+ const query = ctx.knex(descendantModel.name).where({ [foreignKey]: relatedEntity.id });
198
+ applyPermissions(ctx, descendantModel.name, descendantModel.name, query, 'RESTORE');
199
+ const descendants = await query;
200
+ for (const descendant of descendants) {
201
+ await restoreCascade(descendantModel, descendant);
202
+ }
203
+ }
204
+ };
205
+ await restoreCascade(model, entity);
206
+ for (const callback of [...beforeHooks, ...mutations, ...afterHooks]) {
207
+ await callback();
208
+ }
209
+ return entity.id;
210
+ };
211
+ const createRevision = async (model, data, ctx) => {
212
+ if (model.updatable) {
213
+ const revisionData = {
214
+ id: uuid(),
215
+ [`${typeToField(model.name)}Id`]: data.id,
216
+ createdAt: ctx.now,
217
+ createdById: ctx.user.id,
218
+ };
219
+ if (model.deletable) {
220
+ revisionData.deleted = data.deleted || false;
221
+ }
222
+ for (const { name, relation, nonNull, ...field } of model.fields.filter(({ updatable }) => updatable)) {
223
+ const col = relation ? `${name}Id` : name;
224
+ if (nonNull && (!(col in data) || col === undefined || col === null)) {
225
+ revisionData[col] = get(field, 'default');
226
+ }
227
+ else {
228
+ revisionData[col] = data[col];
229
+ }
230
+ }
231
+ await ctx.knex(`${model.name}Revision`).insert(revisionData);
232
+ }
233
+ };
234
+ const sanitize = (ctx, model, data) => {
235
+ if (model.updatable) {
236
+ data.updatedAt = ctx.now;
237
+ data.updatedById = ctx.user.id;
238
+ }
239
+ for (const key of Object.keys(data)) {
240
+ const field = model.fields.find(({ name }) => name === key);
241
+ if (!field) {
242
+ continue;
243
+ }
244
+ if (isEndOfDay(field) && data[key]) {
245
+ data[key] = data[key].endOf('day');
246
+ continue;
247
+ }
248
+ if (isEnumList(ctx.rawModels, field) && Array.isArray(data[key])) {
249
+ data[key] = `{${data[key].join(',')}}`;
250
+ continue;
251
+ }
252
+ }
253
+ };
254
+ const isEndOfDay = (field) => field?.endOfDay === true && field?.dateTimeType === 'date' && field?.type === 'DateTime';
255
+ //# sourceMappingURL=mutations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutations.js","sourceRoot":"","sources":["../../../src/resolvers/mutations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { FieldDefinitionNode, FieldNode, FragmentDefinitionNode, InlineFragmentNode, ObjectTypeDefinitionNode, SelectionNode } from 'graphql';
2
+ import { FullContext } from '../context';
3
+ import { Model } from '../models';
4
+ export type ResolverNode = {
5
+ ctx: FullContext;
6
+ tableName: string;
7
+ tableAlias: string;
8
+ shortTableAlias: string;
9
+ baseTypeDefinition: ObjectTypeDefinitionNode;
10
+ baseModel?: Model;
11
+ typeDefinition: ObjectTypeDefinitionNode;
12
+ model: Model;
13
+ selectionSet: readonly SelectionNode[];
14
+ };
15
+ export type FieldResolverNode = ResolverNode & {
16
+ field: FieldNode;
17
+ fieldDefinition: FieldDefinitionNode;
18
+ foreignKey?: string;
19
+ isList: boolean;
20
+ };
21
+ export type WhereNode = {
22
+ ctx: FullContext;
23
+ tableName: string;
24
+ tableAlias: string;
25
+ shortTableAlias: string;
26
+ model: Model;
27
+ foreignKey?: string;
28
+ };
29
+ export declare const getResolverNode: ({ ctx, node, tableAlias, baseTypeDefinition, typeName, }: {
30
+ ctx: FullContext;
31
+ node: FieldNode | InlineFragmentNode | FragmentDefinitionNode;
32
+ baseTypeDefinition: ObjectTypeDefinitionNode;
33
+ tableAlias: string;
34
+ typeName: string;
35
+ }) => ResolverNode;
36
+ export declare const getRootFieldNode: ({ ctx, node, baseTypeDefinition, }: {
37
+ ctx: FullContext;
38
+ node: FieldNode;
39
+ baseTypeDefinition: ObjectTypeDefinitionNode;
40
+ }) => FieldResolverNode;
41
+ export declare const getSimpleFields: (node: ResolverNode) => FieldNode[];
42
+ export declare const getInlineFragments: (node: ResolverNode) => ResolverNode[];
43
+ export declare const getFragmentSpreads: (node: ResolverNode) => ResolverNode[];
44
+ export declare const getJoins: (node: ResolverNode, toMany: boolean) => FieldResolverNode[];
@@ -0,0 +1,102 @@
1
+ import { isJsonObjectModel } from '../models';
2
+ import { get, summonByKey, summonByName } from '../utils';
3
+ import { getFragmentTypeName, getNameOrAlias, getType, getTypeName, isFieldNode, isFragmentSpreadNode, isInlineFragmentNode, isListType, } from './utils';
4
+ export const getResolverNode = ({ ctx, node, tableAlias, baseTypeDefinition, typeName, }) => ({
5
+ ctx,
6
+ tableName: typeName,
7
+ tableAlias,
8
+ shortTableAlias: ctx.aliases.getShort(tableAlias),
9
+ baseTypeDefinition,
10
+ baseModel: ctx.models.find((model) => model.name === baseTypeDefinition.name.value),
11
+ typeDefinition: getType(ctx.info.schema, typeName),
12
+ model: summonByName(ctx.models, typeName),
13
+ selectionSet: get(node.selectionSet, 'selections'),
14
+ });
15
+ export const getRootFieldNode = ({ ctx, node, baseTypeDefinition, }) => {
16
+ const fieldName = node.name.value;
17
+ const fieldDefinition = summonByKey(baseTypeDefinition.fields || [], 'name.value', fieldName);
18
+ const typeName = getTypeName(fieldDefinition.type);
19
+ return {
20
+ ctx,
21
+ tableName: typeName,
22
+ tableAlias: typeName,
23
+ shortTableAlias: ctx.aliases.getShort(typeName),
24
+ baseTypeDefinition,
25
+ typeDefinition: getType(ctx.info.schema, typeName),
26
+ model: summonByName(ctx.models, typeName),
27
+ selectionSet: get(node.selectionSet, 'selections'),
28
+ field: node,
29
+ fieldDefinition,
30
+ isList: isListType(fieldDefinition.type),
31
+ };
32
+ };
33
+ export const getSimpleFields = (node) => {
34
+ return node.selectionSet.filter(isFieldNode).filter((selection) => {
35
+ if (!selection.selectionSet) {
36
+ return true;
37
+ }
38
+ return node.model.fields.some(({ json, name }) => json && name === selection.name.value);
39
+ });
40
+ };
41
+ export const getInlineFragments = (node) => node.selectionSet.filter(isInlineFragmentNode).map((subNode) => getResolverNode({
42
+ ctx: node.ctx,
43
+ node: subNode,
44
+ tableAlias: node.tableAlias + '__' + getFragmentTypeName(subNode),
45
+ baseTypeDefinition: node.baseTypeDefinition,
46
+ typeName: getFragmentTypeName(subNode),
47
+ }));
48
+ export const getFragmentSpreads = (node) => node.selectionSet.filter(isFragmentSpreadNode).map((subNode) => getResolverNode({
49
+ ctx: node.ctx,
50
+ node: node.ctx.info.fragments[subNode.name.value],
51
+ tableAlias: node.tableAlias,
52
+ baseTypeDefinition: node.baseTypeDefinition,
53
+ typeName: node.model.name,
54
+ }));
55
+ export const getJoins = (node, toMany) => {
56
+ const nodes = [];
57
+ for (const subNode of node.selectionSet.filter(isFieldNode).filter(({ selectionSet }) => selectionSet)) {
58
+ const ctx = node.ctx;
59
+ const baseTypeDefinition = node.typeDefinition;
60
+ const fieldName = subNode.name.value;
61
+ const fieldNameOrAlias = getNameOrAlias(subNode);
62
+ const fieldDefinition = summonByKey(baseTypeDefinition.fields || [], 'name.value', fieldName);
63
+ const typeName = getTypeName(fieldDefinition.type);
64
+ if (isJsonObjectModel(summonByName(ctx.rawModels, typeName))) {
65
+ continue;
66
+ }
67
+ const baseModel = summonByName(ctx.models, baseTypeDefinition.name.value);
68
+ let foreignKey;
69
+ if (toMany) {
70
+ const reverseRelation = baseModel.reverseRelationsByName[fieldName];
71
+ if (!reverseRelation) {
72
+ continue;
73
+ }
74
+ foreignKey = reverseRelation.foreignKey;
75
+ }
76
+ else {
77
+ const modelField = baseModel.fieldsByName[fieldName];
78
+ if (!modelField || modelField.raw) {
79
+ continue;
80
+ }
81
+ foreignKey = modelField.foreignKey;
82
+ }
83
+ const tableAlias = node.tableAlias + '__' + fieldNameOrAlias;
84
+ nodes.push({
85
+ ctx,
86
+ tableName: typeName,
87
+ tableAlias,
88
+ shortTableAlias: ctx.aliases.getShort(tableAlias),
89
+ baseTypeDefinition,
90
+ baseModel,
91
+ typeDefinition: getType(ctx.info.schema, typeName),
92
+ model: summonByName(ctx.models, typeName),
93
+ selectionSet: get(subNode.selectionSet, 'selections'),
94
+ field: subNode,
95
+ fieldDefinition,
96
+ foreignKey,
97
+ isList: isListType(fieldDefinition.type),
98
+ });
99
+ }
100
+ return nodes;
101
+ };
102
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/resolvers/node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { GraphQLResolveInfo } from 'graphql';
2
+ import { Context, FullContext } from '../context';
3
+ import { Entry } from './utils';
4
+ export declare const queryResolver: (_parent: any, _args: any, ctx: Context, info: GraphQLResolveInfo) => Promise<Entry | Entry[]>;
5
+ export declare const resolve: (ctx: FullContext, id?: string) => Promise<Entry | Entry[]>;