@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-definitions.js","sourceRoot":"","sources":["../../../src/models/model-definitions.ts"],"names":[],"mappings":""}
@@ -1,204 +1,158 @@
1
- import { Field } from '..';
2
- import type { OrderBy } from '../resolvers/arguments';
3
- import type { Value } from '../values';
4
- export type RawModels = RawModel[];
5
- export type RawModel = {
1
+ import { CustomFieldDefinition, EnumFieldDefinition, FloatFieldDefinition, IDFieldDefinition, InputModelDefinition, IntFieldDefinition, InterfaceModelDefinition, JsonFieldDefinition, ObjectModelDefinition, OrderBy, PrimitiveFieldDefinition, RawEnumModelDefinition, StringFieldDefinition, UploadFieldDefinition } from '..';
2
+ import { BooleanFieldDefinition, DateTimeFieldDefinition, EntityFieldDefinition, EntityModelDefinition, EnumModelDefinition, ModelDefinition, ModelDefinitions, ObjectFieldDefinition, RelationFieldDefinition } from './model-definitions';
3
+ export type ObjectField = ObjectFieldDefinition;
4
+ export type EntityField = EntityFieldDefinition;
5
+ export type PrimitiveField = PrimitiveFieldDefinition;
6
+ export type IDField = IDFieldDefinition;
7
+ export type BooleanField = BooleanFieldDefinition;
8
+ export type StringField = StringFieldDefinition;
9
+ export type DateTimeField = DateTimeFieldDefinition;
10
+ export type IntField = IntFieldDefinition;
11
+ export type FloatField = FloatFieldDefinition;
12
+ export type UploadField = UploadFieldDefinition;
13
+ export type JsonField = JsonFieldDefinition;
14
+ export type EnumField = EnumFieldDefinition;
15
+ export type CustomField = CustomFieldDefinition;
16
+ export type RelationField = Omit<RelationFieldDefinition, 'foreignKey'> & {
17
+ foreignKey: string;
18
+ };
19
+ export declare class Models {
20
+ models: Model[];
21
+ private modelsByName;
22
+ scalars: ScalarModel[];
23
+ rawEnums: RawEnumModel[];
24
+ enums: EnumModel[];
25
+ inputs: InputModel[];
26
+ interfaces: InterfaceModel[];
27
+ objects: ObjectModel[];
28
+ entities: EntityModel[];
29
+ definitions: ModelDefinitions;
30
+ constructor(definitions: ModelDefinitions);
31
+ getModel<K extends keyof ModelKindToClassMapping>(name: string, kind?: K): ModelKindToClassMapping[K];
32
+ }
33
+ export declare abstract class Model {
34
+ models: Models;
6
35
  name: string;
7
- plural?: string;
8
- description?: string;
9
- } & ({
36
+ plural: string;
37
+ description: string;
38
+ constructor(models: Models, definition: ModelDefinition);
39
+ }
40
+ export declare class ScalarModel extends Model {
10
41
  kind: 'scalar';
11
- } | {
42
+ }
43
+ export declare class EnumModel extends Model {
12
44
  kind: 'enum';
13
45
  values: string[];
14
46
  deleted?: true;
15
- } | {
47
+ constructor(models: Models, definition: EnumModelDefinition);
48
+ }
49
+ export declare class RawEnumModel extends Model {
16
50
  kind: 'raw-enum';
17
51
  values: string[];
18
- } | {
52
+ constructor(models: Models, definition: RawEnumModelDefinition);
53
+ }
54
+ export declare class InterfaceModel extends Model {
19
55
  kind: 'interface';
20
- fields: ModelField[];
21
- } | {
22
- kind: 'input';
56
+ fields: EntityField[];
57
+ constructor(models: Models, definition: InterfaceModelDefinition);
58
+ }
59
+ export declare class InputModel extends Model {
60
+ kind: 'model';
23
61
  fields: ObjectField[];
24
- } | {
62
+ constructor(models: Models, definition: InputModelDefinition);
63
+ }
64
+ export declare class ObjectModel extends Model {
25
65
  kind: 'object';
26
66
  fields: ObjectField[];
27
- } | {
67
+ constructor(models: Models, definition: ObjectModelDefinition);
68
+ }
69
+ export declare class EntityModel extends Model {
28
70
  kind: 'entity';
71
+ root?: boolean;
72
+ parent?: string;
29
73
  interfaces?: string[];
30
74
  queriable?: boolean;
31
75
  listQueriable?: boolean;
32
76
  creatable?: boolean | {
33
- createdBy?: Partial<RelationField>;
34
- createdAt?: Partial<DateTimeField>;
77
+ createdBy?: Partial<RelationFieldDefinition>;
78
+ createdAt?: Partial<DateTimeFieldDefinition>;
35
79
  };
36
80
  updatable?: boolean | {
37
- updatedBy?: Partial<RelationField>;
38
- updatedAt?: Partial<DateTimeField>;
81
+ updatedBy?: Partial<RelationFieldDefinition>;
82
+ updatedAt?: Partial<DateTimeFieldDefinition>;
39
83
  };
40
84
  deletable?: boolean | {
41
- deleted?: Partial<BooleanField>;
42
- deletedBy?: Partial<RelationField>;
43
- deletedAt?: Partial<DateTimeField>;
85
+ deleted?: Partial<BooleanFieldDefinition>;
86
+ deletedBy?: Partial<RelationFieldDefinition>;
87
+ deletedAt?: Partial<DateTimeFieldDefinition>;
44
88
  };
45
89
  displayField?: string;
46
90
  defaultOrderBy?: OrderBy;
47
- fields: ModelField[];
91
+ fields: EntityField[];
48
92
  deleted?: true;
49
93
  oldName?: string;
50
- });
51
- export type ScalarModel = Extract<RawModel, {
52
- kind: 'scalar';
53
- }>;
54
- export type EnumModel = Extract<RawModel, {
55
- kind: 'enum';
56
- }>;
57
- export type RawEnumModel = Extract<RawModel, {
58
- kind: 'raw-enum';
59
- }>;
60
- export type InterfaceModel = Extract<RawModel, {
61
- kind: 'interface';
62
- }>;
63
- export type ObjectModel = Extract<RawModel, {
64
- kind: 'object';
65
- }>;
66
- export type InputModel = Extract<RawModel, {
67
- kind: 'input';
68
- }>;
69
- export type EntityModel = Extract<RawModel, {
70
- kind: 'entity';
71
- }>;
72
- type BaseNumberType = {
73
- unit?: 'million';
74
- min?: number;
75
- max?: number;
94
+ fieldsByName: Record<string, EntityField>;
95
+ fieldsByColumnName: Record<string, EntityField>;
96
+ private _relations;
97
+ private _relationsByName;
98
+ private _reverseRelations;
99
+ private _reverseRelationsByName;
100
+ private _manyToManyRelations;
101
+ private _manyToManyRelationsByName;
102
+ pluralField: string;
103
+ slug: string;
104
+ labelPlural: string;
105
+ label: string;
106
+ private _parentModel;
107
+ constructor(models: Models, definition: EntityModelDefinition);
108
+ getField(name: string): EntityFieldDefinition;
109
+ get relations(): NormalRelation[];
110
+ get relationsByName(): Record<string, NormalRelation>;
111
+ getRelation(name: string): NormalRelation;
112
+ get reverseRelations(): ReverseRelation[];
113
+ get reverseRelationsByName(): Record<string, ReverseRelation>;
114
+ getReverseRelation(name: string): ReverseRelation;
115
+ get manyToManyRelations(): ManyToManyRelation[];
116
+ get manyToManyRelationsByName(): Record<string, ManyToManyRelation>;
117
+ getManyToManyRelation(name: string): ManyToManyRelation;
118
+ get parentModel(): EntityModel;
119
+ get rootModel(): EntityModel;
120
+ }
121
+ declare const MODEL_KIND_TO_CLASS_MAPPING: {
122
+ entity: typeof EntityModel;
123
+ enum: typeof EnumModel;
124
+ input: typeof InputModel;
125
+ interface: typeof InterfaceModel;
126
+ object: typeof ObjectModel;
127
+ 'raw-enum': typeof RawEnumModel;
128
+ scalar: typeof ScalarModel;
76
129
  };
77
- type FieldBase = Omit<Field, 'type'>;
78
- type FieldBase2 = ({
79
- kind?: 'primitive' | undefined;
80
- } & ({
81
- type: 'ID';
82
- } | {
83
- type: 'Boolean';
84
- } | {
85
- type: 'String';
86
- stringType?: 'email' | 'url' | 'phone';
87
- large?: true;
88
- maxLength?: number;
89
- } | {
90
- type: 'DateTime';
91
- dateTimeType?: 'year' | 'date' | 'datetime' | 'year_and_month';
92
- endOfDay?: boolean;
93
- } | ({
94
- type: 'Int';
95
- intType?: 'currency';
96
- } & BaseNumberType) | ({
97
- type: 'Float';
98
- floatType?: 'currency' | 'percentage';
99
- double?: boolean;
100
- precision?: number;
101
- scale?: number;
102
- } & BaseNumberType) | {
103
- type: 'Upload';
104
- })) | {
105
- kind: 'enum';
106
- type: string;
107
- possibleValues?: Value[];
108
- } | {
109
- kind: 'custom';
110
- type: string;
130
+ type ModelKindToClassMapping = {
131
+ [K in keyof typeof MODEL_KIND_TO_CLASS_MAPPING]: InstanceType<(typeof MODEL_KIND_TO_CLASS_MAPPING)[K]>;
111
132
  };
112
- export type ObjectField = FieldBase & FieldBase2;
113
- export type ModelField = FieldBase & (FieldBase2 | {
114
- kind: 'json';
115
- type: string;
116
- } | {
117
- kind: 'relation';
118
- type: string;
119
- toOne?: boolean;
120
- reverse?: string;
121
- foreignKey?: string;
122
- onDelete?: 'cascade' | 'set-null';
123
- }) & {
124
- primary?: boolean;
125
- unique?: boolean;
126
- filterable?: boolean | {
127
- default?: Value;
128
- };
129
- searchable?: boolean;
130
- orderable?: boolean;
131
- comparable?: boolean;
132
- queriable?: boolean | {
133
- roles?: string[];
134
- };
135
- creatable?: boolean | {
136
- roles?: string[];
137
- };
138
- updatable?: boolean | {
139
- roles?: string[];
140
- };
141
- generated?: boolean;
142
- tooltip?: string;
143
- required?: boolean;
144
- indent?: boolean;
145
- hidden?: boolean;
146
- deleted?: true;
147
- oldName?: string;
148
- meta?: Record<string, unknown>;
149
- };
150
- export type PrimitiveField = Extract<ModelField, {
151
- kind?: 'primitive' | undefined;
152
- }>;
153
- export type IDField = Extract<PrimitiveField, {
154
- type: 'ID';
155
- }>;
156
- export type BooleanField = Extract<PrimitiveField, {
157
- type: 'Boolean';
158
- }>;
159
- export type StringField = Extract<PrimitiveField, {
160
- type: 'String';
161
- }>;
162
- export type DateTimeField = Extract<PrimitiveField, {
163
- type: 'DateTime';
164
- }>;
165
- export type IntField = Extract<PrimitiveField, {
166
- type: 'Int';
167
- }>;
168
- export type FloatField = Extract<PrimitiveField, {
169
- type: 'Float';
170
- }>;
171
- export type UploadField = Extract<PrimitiveField, {
172
- type: 'Upload';
173
- }>;
174
- export type JsonField = Extract<ModelField, {
175
- kind: 'json';
176
- }>;
177
- export type EnumField = Extract<ModelField, {
178
- kind: 'enum';
179
- }>;
180
- export type CustomField = Extract<ModelField, {
181
- kind: 'custom';
182
- }>;
183
- export type RelationField = Extract<ModelField, {
184
- kind: 'relation';
185
- }>;
186
- export type Models = Model[];
187
- export type Model = EntityModel & {
188
- fieldsByName: Record<string, ModelField>;
189
- relations: Relation[];
190
- relationsByName: Record<string, Relation>;
191
- reverseRelations: ReverseRelation[];
192
- reverseRelationsByName: Record<string, ReverseRelation>;
193
- };
194
- export type Relation = {
133
+ export declare abstract class Relation {
134
+ name: string;
135
+ sourceModel: EntityModel;
195
136
  field: RelationField;
196
- model: Model;
197
- reverseRelation: ReverseRelation;
198
- };
199
- export type ReverseRelation = RelationField & {
200
- model: Model;
137
+ targetModel: EntityModel;
138
+ constructor(name: string, sourceModel: EntityModel, field: RelationField, targetModel: EntityModel);
139
+ }
140
+ export declare class NormalRelation extends Relation {
201
141
  field: RelationField;
202
- fieldModel: Model;
203
- };
142
+ reverse: ReverseRelation;
143
+ constructor(sourceModel: EntityModel, field: RelationField, targetModel: EntityModel);
144
+ }
145
+ export declare class ReverseRelation extends Relation {
146
+ reverse: NormalRelation;
147
+ constructor(reverse: NormalRelation);
148
+ }
149
+ export declare class ManyToManyRelation {
150
+ name: string;
151
+ sourceModel: EntityModel;
152
+ relationFromSource: ReverseRelation;
153
+ relationModel: EntityModel;
154
+ relationToTarget: NormalRelation;
155
+ targetModel: EntityModel;
156
+ constructor(relationFromSource: ReverseRelation, relationToTarget: NormalRelation);
157
+ }
204
158
  export {};