@smartive/graphql-magic 3.1.0 → 4.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 (46) hide show
  1. package/CHANGELOG.md +1 -6
  2. package/dist/cjs/index.cjs +196 -170
  3. package/dist/esm/client/queries.d.ts +4 -1
  4. package/dist/esm/client/queries.js +7 -4
  5. package/dist/esm/client/queries.js.map +1 -1
  6. package/dist/esm/db/generate.js +21 -13
  7. package/dist/esm/db/generate.js.map +1 -1
  8. package/dist/esm/generate/generate.js +17 -22
  9. package/dist/esm/generate/generate.js.map +1 -1
  10. package/dist/esm/generate/utils.d.ts +10 -1
  11. package/dist/esm/generate/utils.js.map +1 -1
  12. package/dist/esm/migrations/generate.js +82 -89
  13. package/dist/esm/migrations/generate.js.map +1 -1
  14. package/dist/esm/models.d.ts +115 -93
  15. package/dist/esm/models.js +1 -26
  16. package/dist/esm/models.js.map +1 -1
  17. package/dist/esm/permissions/check.js +2 -2
  18. package/dist/esm/permissions/check.js.map +1 -1
  19. package/dist/esm/permissions/generate.js +2 -2
  20. package/dist/esm/permissions/generate.js.map +1 -1
  21. package/dist/esm/resolvers/filters.js +1 -1
  22. package/dist/esm/resolvers/filters.js.map +1 -1
  23. package/dist/esm/resolvers/mutations.js +5 -6
  24. package/dist/esm/resolvers/mutations.js.map +1 -1
  25. package/dist/esm/resolvers/node.js +4 -5
  26. package/dist/esm/resolvers/node.js.map +1 -1
  27. package/dist/esm/resolvers/resolver.js +2 -2
  28. package/dist/esm/resolvers/resolver.js.map +1 -1
  29. package/dist/esm/utils.d.ts +181 -1
  30. package/dist/esm/utils.js +69 -21
  31. package/dist/esm/utils.js.map +1 -1
  32. package/package.json +2 -2
  33. package/src/client/queries.ts +16 -10
  34. package/src/db/generate.ts +22 -15
  35. package/src/generate/generate.ts +26 -34
  36. package/src/generate/utils.ts +11 -1
  37. package/src/migrations/generate.ts +84 -82
  38. package/src/models.ts +113 -157
  39. package/src/permissions/check.ts +2 -2
  40. package/src/permissions/generate.ts +2 -2
  41. package/src/resolvers/filters.ts +1 -1
  42. package/src/resolvers/mutations.ts +10 -9
  43. package/src/resolvers/node.ts +6 -6
  44. package/src/resolvers/resolver.ts +2 -2
  45. package/src/utils.ts +158 -57
  46. package/tests/utils/models.ts +7 -6
package/dist/esm/utils.js CHANGED
@@ -4,7 +4,6 @@ import camelCase from 'lodash/camelCase';
4
4
  import lodashGet from 'lodash/get';
5
5
  import kebabCase from 'lodash/kebabCase';
6
6
  import startCase from 'lodash/startCase';
7
- import { isObjectModel } from './models';
8
7
  const isNotFalsy = (v) => typeof v !== 'undefined' && v !== null && v !== false;
9
8
  export const merge = (objects) => (objects || []).filter(isNotFalsy).reduce((i, acc) => ({ ...acc, ...i }), {});
10
9
  // Target -> target
@@ -15,6 +14,28 @@ export const getModelSlug = (model) => kebabCase(getModelPlural(model));
15
14
  export const getModelLabelPlural = (model) => getLabel(getModelPlural(model));
16
15
  export const getModelLabel = (model) => getLabel(model.name);
17
16
  export const getLabel = (s) => startCase(camelCase(s));
17
+ export const isObjectModel = (model) => model.type === 'object';
18
+ export const isEnumModel = (model) => model.type === 'enum';
19
+ export const isRawEnumModel = (model) => model.type === 'raw-enum';
20
+ export const isScalarModel = (model) => model.type === 'scalar';
21
+ export const isRawObjectModel = (model) => model.type === 'raw';
22
+ export const isEnumList = (models, field) => field?.list === true && models.find(({ name }) => name === field.type)?.type === 'enum';
23
+ export const and = (...predicates) => (field) => predicates.every((predicate) => predicate(field));
24
+ export const not = (predicate) => (field) => !predicate(field);
25
+ export const isRelation = (field) => field.type === 'relation';
26
+ export const isToOneRelation = (field) => isRelation(field) && !!field.toOne;
27
+ export const isQueriableField = ({ queriable }) => queriable !== false;
28
+ export const isRaw = (field) => field.type === 'raw';
29
+ export const isVisible = ({ hidden }) => hidden !== true;
30
+ export const isSimpleField = and(not(isRelation), not(isRaw));
31
+ export const isUpdatable = ({ updatable }) => !!updatable;
32
+ export const isCreatable = ({ creatable }) => !!creatable;
33
+ export const isQueriableBy = (role) => (field) => field.queriable !== false && (field.queriable == true || !field.queriable.roles || field.queriable.roles.includes(role));
34
+ export const isUpdatableBy = (role) => (field) => field.updatable && (field.updatable === true || !field.updatable.roles || field.updatable.roles.includes(role));
35
+ export const isCreatableBy = (role) => (field) => field.creatable && (field.creatable === true || !field.creatable.roles || field.creatable.roles.includes(role));
36
+ export const actionableRelations = (model, action) => model.fields
37
+ .filter(isRelation)
38
+ .filter((field) => field[`${action === 'filter' ? action : action.slice(0, -1)}able`]);
18
39
  export const getModels = (rawModels) => {
19
40
  const models = rawModels.filter(isObjectModel).map((model) => {
20
41
  const objectModel = {
@@ -24,32 +45,48 @@ export const getModels = (rawModels) => {
24
45
  relationsByName: {},
25
46
  reverseRelations: [],
26
47
  reverseRelationsByName: {},
27
- fields: [
48
+ fields: ([
28
49
  { name: 'id', type: 'ID', nonNull: true, unique: true, primary: true, generated: true },
29
50
  ...model.fields,
30
51
  ...(model.creatable
31
52
  ? [
32
- { name: 'createdAt', type: 'DateTime', nonNull: !model.nonStrict, orderable: true, generated: true },
53
+ {
54
+ name: 'createdAt',
55
+ type: 'DateTime',
56
+ nonNull: true,
57
+ orderable: true,
58
+ generated: true,
59
+ ...(typeof model.creatable === 'object' && model.creatable.createdAt),
60
+ },
33
61
  {
34
62
  name: 'createdBy',
35
- type: 'User',
36
- relation: true,
37
- nonNull: !model.nonStrict,
63
+ type: 'relation',
64
+ typeName: 'User',
65
+ nonNull: true,
38
66
  reverse: `created${getModelPlural(model)}`,
39
67
  generated: true,
68
+ ...(typeof model.creatable === 'object' && model.creatable.createdBy),
40
69
  },
41
70
  ]
42
71
  : []),
43
72
  ...(model.updatable
44
73
  ? [
45
- { name: 'updatedAt', type: 'DateTime', nonNull: !model.nonStrict, orderable: true, generated: true },
74
+ {
75
+ name: 'updatedAt',
76
+ type: 'DateTime',
77
+ nonNull: true,
78
+ orderable: true,
79
+ generated: true,
80
+ ...(typeof model.updatable === 'object' && model.updatable.updatedAt),
81
+ },
46
82
  {
47
83
  name: 'updatedBy',
48
- type: 'User',
49
- relation: true,
50
- nonNull: !model.nonStrict,
84
+ type: 'relation',
85
+ typeName: 'User',
86
+ nonNull: true,
51
87
  reverse: `updated${getModelPlural(model)}`,
52
88
  generated: true,
89
+ ...(typeof model.updatable === 'object' && model.updatable.updatedBy),
53
90
  },
54
91
  ]
55
92
  : []),
@@ -60,24 +97,31 @@ export const getModels = (rawModels) => {
60
97
  type: 'Boolean',
61
98
  nonNull: true,
62
99
  default: false,
63
- filterable: true,
64
- defaultFilter: false,
100
+ filterable: { default: false },
101
+ generated: true,
102
+ ...(typeof model.deletable === 'object' && model.deletable.deleted),
103
+ },
104
+ {
105
+ name: 'deletedAt',
106
+ type: 'DateTime',
107
+ orderable: true,
65
108
  generated: true,
109
+ ...(typeof model.deletable === 'object' && model.deletable.deletedAt),
66
110
  },
67
- { name: 'deletedAt', type: 'DateTime', orderable: true, generated: true },
68
111
  {
69
112
  name: 'deletedBy',
70
- type: 'User',
71
- relation: true,
113
+ type: 'relation',
114
+ typeName: 'User',
72
115
  reverse: `deleted${getModelPlural(model)}`,
73
116
  generated: true,
117
+ ...(typeof model.deletable === 'object' && model.deletable.deletedBy),
74
118
  },
75
119
  ]
76
120
  : []),
77
- ].map(({ foreignKey, ...field }) => ({
121
+ ]).map((field) => ({
78
122
  ...field,
79
- ...(field.relation && {
80
- foreignKey: foreignKey || `${field.name}Id`,
123
+ ...(field.type === 'relation' && {
124
+ foreignKey: field.foreignKey || `${field.name}Id`,
81
125
  }),
82
126
  })),
83
127
  };
@@ -87,12 +131,16 @@ export const getModels = (rawModels) => {
87
131
  return objectModel;
88
132
  });
89
133
  for (const model of models) {
90
- for (const field of model.fields.filter(({ relation }) => relation)) {
91
- const fieldModel = summonByName(models, field.type);
134
+ for (const field of model.fields) {
135
+ if (field.type !== 'relation') {
136
+ continue;
137
+ }
138
+ const fieldModel = summonByName(models, field.typeName);
92
139
  const reverseRelation = {
140
+ type: 'relation',
93
141
  name: field.reverse || (field.toOne ? typeToField(model.name) : getModelPluralField(model)),
94
142
  foreignKey: get(field, 'foreignKey'),
95
- type: model.name,
143
+ typeName: model.name,
96
144
  toOne: !!field.toOne,
97
145
  fieldModel,
98
146
  field,
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smartive/graphql-magic",
3
- "version": "3.1.0",
3
+ "version": "4.0.0",
4
4
  "description": "",
5
5
  "source": "src/index.ts",
6
6
  "type": "module",
@@ -62,7 +62,7 @@
62
62
  "graphql-request": "6.1.0",
63
63
  "jest": "29.6.2",
64
64
  "mock-knex": "0.4.12",
65
- "pg": "8.11.2",
65
+ "pg": "8.11.3",
66
66
  "prettier": "2.8.8",
67
67
  "simple-git": "3.19.1",
68
68
  "ts-jest": "29.1.1",
@@ -1,21 +1,20 @@
1
1
  import upperFirst from 'lodash/upperFirst';
2
+ import { Field } from '..';
3
+ import { Model, Models, Relation, ReverseRelation } from '../models';
2
4
  import {
3
5
  actionableRelations,
4
6
  and,
7
+ getModelPlural,
8
+ getModelPluralField,
5
9
  isQueriableBy,
6
10
  isRelation,
7
11
  isSimpleField,
8
12
  isToOneRelation,
9
13
  isUpdatableBy,
10
- isVisibleRelation,
11
- Model,
12
- Models,
13
14
  not,
14
- Relation,
15
- ReverseRelation,
16
- VisibleRelationsByRole,
17
- } from '../models';
18
- import { getModelPlural, getModelPluralField, summonByName, typeToField } from '../utils';
15
+ summonByName,
16
+ typeToField,
17
+ } from '../utils';
19
18
 
20
19
  export const getUpdateEntityQuery = (
21
20
  model: Model,
@@ -54,8 +53,8 @@ export const getEditEntityRelationsQuery = (
54
53
  !!relations.length &&
55
54
  `query ${upperFirst(action)}${model.name}Relations {
56
55
  ${relations
57
- .map(({ name, type }) => {
58
- const model = summonByName(models, type);
56
+ .map(({ name, typeName }) => {
57
+ const model = summonByName(models, typeName);
59
58
 
60
59
  let filters = '';
61
60
  if (model.displayField) {
@@ -206,6 +205,13 @@ export const getEntityListQuery = (
206
205
  ${root ? '}' : ''}
207
206
  }`;
208
207
 
208
+ export type VisibleRelationsByRole = Record<string, Record<string, string[]>>;
209
+
210
+ export const isVisibleRelation = (visibleRelationsByRole: VisibleRelationsByRole, modelName: string, role: string) => {
211
+ const whitelist = visibleRelationsByRole[role]?.[modelName];
212
+ return ({ name }: Field) => (whitelist ? whitelist.includes(name) : true);
213
+ };
214
+
209
215
  export const getEntityQuery = (
210
216
  models: Models,
211
217
  model: Model,
@@ -1,5 +1,5 @@
1
1
  import CodeBlockWriter from 'code-block-writer';
2
- import { ModelField, RawModels, getModels, isEnumModel } from '..';
2
+ import { ModelField, RawModels, get, getModels, isEnumModel, isRaw, not } from '..';
3
3
 
4
4
  const PRIMITIVE_TYPES = {
5
5
  ID: 'string',
@@ -29,14 +29,14 @@ export const generateDBModels = (rawModels: RawModels) => {
29
29
 
30
30
  for (const model of models) {
31
31
  // TODO: deprecate allowing to define foreignKey
32
- const fields = model.fields.some((field) => field.foreignKey === 'id')
32
+ const fields = model.fields.some((field) => field.type === 'relation' && field.foreignKey === 'id')
33
33
  ? model.fields.filter((field) => field.name !== 'id')
34
34
  : model.fields;
35
35
 
36
36
  writer
37
37
  .write(`export type ${model.name} = `)
38
38
  .inlineBlock(() => {
39
- for (const field of fields.filter(({ raw }) => !raw)) {
39
+ for (const field of fields.filter(not(isRaw))) {
40
40
  writer.write(`'${getFieldName(field)}': ${getFieldOutputType(field)}${field.nonNull ? '' : ' | null'},`).newLine();
41
41
  }
42
42
  })
@@ -45,7 +45,7 @@ export const generateDBModels = (rawModels: RawModels) => {
45
45
  writer
46
46
  .write(`export type ${model.name}Initializer = `)
47
47
  .inlineBlock(() => {
48
- for (const field of fields.filter(({ raw }) => !raw)) {
48
+ for (const field of fields.filter(not(isRaw))) {
49
49
  writer
50
50
  .write(
51
51
  `'${getFieldName(field)}'${field.nonNull && field.default === undefined ? '' : '?'}: ${getFieldInputType(
@@ -60,7 +60,7 @@ export const generateDBModels = (rawModels: RawModels) => {
60
60
  writer
61
61
  .write(`export type ${model.name}Mutator = `)
62
62
  .inlineBlock(() => {
63
- for (const field of fields.filter(({ raw }) => !raw)) {
63
+ for (const field of fields.filter(not(isRaw))) {
64
64
  writer.write(`'${getFieldName(field)}'?: ${getFieldInputType(field)}${field.nonNull ? '' : ' | null'},`).newLine();
65
65
  }
66
66
  })
@@ -69,7 +69,7 @@ export const generateDBModels = (rawModels: RawModels) => {
69
69
  writer
70
70
  .write(`export type ${model.name}Seed = `)
71
71
  .inlineBlock(() => {
72
- for (const field of fields.filter(({ raw }) => !raw)) {
72
+ for (const field of fields.filter(not(isRaw))) {
73
73
  const fieldName = getFieldName(field);
74
74
  writer
75
75
  .write(
@@ -95,16 +95,23 @@ export const generateDBModels = (rawModels: RawModels) => {
95
95
  return writer.toString();
96
96
  };
97
97
 
98
- const getFieldName = ({ relation, name, foreignKey }: ModelField) => {
99
- return foreignKey || `${name}${relation ? 'Id' : ''}`;
100
- };
101
-
102
- const getFieldOutputType = ({ relation, type, list, json }: ModelField) => {
103
- if (json || relation) {
104
- return 'string';
98
+ const getFieldName = (field: ModelField) => (field.type === 'relation' ? field.foreignKey || `${field.name}Id` : field.name);
99
+
100
+ const getFieldOutputType = (field: ModelField) => {
101
+ switch (field.type) {
102
+ case 'json':
103
+ // JSON data is stored as string
104
+ return 'string';
105
+ case 'relation':
106
+ // Relations are stored as ids
107
+ return 'string';
108
+ case 'enum':
109
+ return field.typeName + field.list ? '[]' : '';
110
+ case 'raw':
111
+ throw new Error(`Raw fields are not in the db.`);
112
+ default:
113
+ return get(PRIMITIVE_TYPES, field.type) + (field.list ? '[]' : '');
105
114
  }
106
-
107
- return (PRIMITIVE_TYPES[type] || type) + (list ? '[]' : '');
108
115
  };
109
116
 
110
117
  const getFieldInputType = (field: ModelField, stringTypes: string[] = []) => {
@@ -1,17 +1,18 @@
1
1
  import { buildASTSchema, DefinitionNode, DocumentNode, GraphQLSchema, print } from 'graphql';
2
2
  import flatMap from 'lodash/flatMap';
3
+ import { RawModels } from '../models';
3
4
  import {
4
- Field,
5
+ getModelPluralField,
6
+ getModels,
5
7
  isEnumModel,
6
- isJsonObjectModel,
7
8
  isQueriableField,
8
9
  isRawEnumModel,
9
10
  isRawObjectModel,
11
+ isRelation,
10
12
  isScalarModel,
11
- RawModels,
12
- } from '../models';
13
- import { getModelPluralField, getModels, typeToField } from '../utils';
14
- import { document, enm, input, object, scalar } from './utils';
13
+ typeToField,
14
+ } from '../utils';
15
+ import { document, enm, Field, input, object, scalar } from './utils';
15
16
 
16
17
  export const generateDefinitions = (rawModels: RawModels): DefinitionNode[] => {
17
18
  const models = getModels(rawModels);
@@ -26,17 +27,6 @@ export const generateDefinitions = (rawModels: RawModels): DefinitionNode[] => {
26
27
  ...rawModels.filter(isRawEnumModel).map((model) => enm(model.name, model.values)),
27
28
  ...rawModels.filter(isScalarModel).map((model) => scalar(model.name)),
28
29
  ...rawModels.filter(isRawObjectModel).map((model) => object(model.name, model.fields)),
29
- ...rawModels.filter(isJsonObjectModel).map((model) => object(model.name, model.fields)),
30
- ...rawModels
31
- .filter(isRawObjectModel)
32
- .filter(({ rawFilters }) => rawFilters)
33
- .map((model) =>
34
- input(
35
- `${model.name}Where`,
36
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- array gets filtered above to only include models with rawFilters
37
- model.rawFilters!.map(({ name, type, list = false, nonNull = false }) => ({ name, type, list, nonNull }))
38
- )
39
- ),
40
30
 
41
31
  ...flatMap(
42
32
  models.map((model) => {
@@ -46,10 +36,9 @@ export const generateDefinitions = (rawModels: RawModels): DefinitionNode[] => {
46
36
  [
47
37
  ...model.fields.filter(isQueriableField).map((field) => ({
48
38
  ...field,
49
- args: [
50
- ...(field.args || []),
51
- ...(hasRawFilters(rawModels, field.type) ? [{ name: 'where', type: `${field.type}Where` }] : []),
52
- ],
39
+ type:
40
+ field.type === 'relation' || field.type === 'enum' || field.type === 'raw' ? field.typeName : field.type,
41
+ args: [...(field.args || [])],
53
42
  directives: field.directives,
54
43
  })),
55
44
  ...model.reverseRelations.map(({ name, field, model }) => ({
@@ -72,8 +61,13 @@ export const generateDefinitions = (rawModels: RawModels): DefinitionNode[] => {
72
61
  ),
73
62
  input(`${model.name}Where`, [
74
63
  ...model.fields
75
- .filter(({ unique, filterable, relation }) => (unique || filterable) && !relation)
76
- .map(({ name, type, defaultFilter }) => ({ name, type, list: true, default: defaultFilter })),
64
+ .filter(({ type, unique, filterable }) => (unique || filterable) && type !== 'relation')
65
+ .map(({ type, name, filterable }) => ({
66
+ name,
67
+ type,
68
+ list: true,
69
+ default: typeof filterable === 'object' ? filterable.default : undefined,
70
+ })),
77
71
  ...flatMap(
78
72
  model.fields.filter(({ comparable }) => comparable),
79
73
  ({ name, type }) => [
@@ -84,10 +78,11 @@ export const generateDefinitions = (rawModels: RawModels): DefinitionNode[] => {
84
78
  ]
85
79
  ),
86
80
  ...model.fields
87
- .filter(({ filterable, relation }) => filterable && relation)
88
- .map(({ name, type }) => ({
81
+ .filter(isRelation)
82
+ .filter(({ filterable }) => filterable)
83
+ .map(({ name, typeName }) => ({
89
84
  name,
90
- type: `${type}Where`,
85
+ type: `${typeName}Where`,
91
86
  })),
92
87
  ]),
93
88
  input(
@@ -110,10 +105,10 @@ export const generateDefinitions = (rawModels: RawModels): DefinitionNode[] => {
110
105
  `Create${model.name}`,
111
106
  model.fields
112
107
  .filter(({ creatable }) => creatable)
113
- .map(({ name, relation, type, nonNull, list, default: defaultValue }) =>
114
- relation
108
+ .map(({ name, nonNull, list, default: defaultValue, ...field }) =>
109
+ field.type === 'relation'
115
110
  ? { name: `${name}Id`, type: 'ID', nonNull }
116
- : { name, type, list, nonNull: nonNull && defaultValue === undefined }
111
+ : { name, type: field.type, list, nonNull: nonNull && defaultValue === undefined }
117
112
  )
118
113
  )
119
114
  );
@@ -125,8 +120,8 @@ export const generateDefinitions = (rawModels: RawModels): DefinitionNode[] => {
125
120
  `Update${model.name}`,
126
121
  model.fields
127
122
  .filter(({ updatable }) => updatable)
128
- .map(({ name, relation, type, list }) =>
129
- relation ? { name: `${name}Id`, type: 'ID' } : { name, type, list }
123
+ .map(({ name, type, list }) =>
124
+ type === 'relation' ? { name: `${name}Id`, type: 'ID' } : { name, type, list }
130
125
  )
131
126
  )
132
127
  );
@@ -265,9 +260,6 @@ export const printSchema = (schema: GraphQLSchema): string =>
265
260
  .map((s) => `${s}\n`)
266
261
  .join('\n');
267
262
 
268
- const hasRawFilters = (models: RawModels, type: string) =>
269
- models.filter(isRawObjectModel).some(({ name, rawFilters }) => name === type && !!rawFilters);
270
-
271
263
  export const printSchemaFromDocument = (document: DocumentNode) => printSchema(buildASTSchema(document));
272
264
 
273
265
  export const printSchemaFromModels = (models: RawModels) => printSchema(buildASTSchema(generate(models)));
@@ -22,9 +22,19 @@ import {
22
22
  ValueNode,
23
23
  } from 'graphql';
24
24
  import { DateTime } from 'luxon';
25
- import { Field } from '../models';
26
25
  import { Directive, Enum, Value, Values } from '../values';
27
26
 
27
+ export type Field = {
28
+ name: string;
29
+ type: string;
30
+ description?: string;
31
+ list?: boolean;
32
+ nonNull?: boolean;
33
+ default?: Value;
34
+ args?: Field[];
35
+ directives?: Directive[];
36
+ };
37
+
28
38
  export type DirectiveLocation =
29
39
  | 'ARGUMENT_DEFINITION'
30
40
  | 'INPUT_FIELD_DEFINITION'