@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.
- package/.eslintrc +2 -10
- package/.github/workflows/release.yml +1 -1
- package/.gqmrc.json +6 -0
- package/CHANGELOG.md +2 -2
- package/README.md +1 -1
- package/dist/bin/gqm.cjs +684 -330
- package/dist/cjs/index.cjs +998 -554
- package/dist/esm/api/execute.js +1 -1
- package/dist/esm/api/execute.js.map +1 -1
- package/dist/esm/client/mutations.d.ts +2 -2
- package/dist/esm/client/mutations.js +5 -4
- package/dist/esm/client/mutations.js.map +1 -1
- package/dist/esm/client/queries.d.ts +12 -17
- package/dist/esm/client/queries.js +30 -50
- package/dist/esm/client/queries.js.map +1 -1
- package/dist/esm/context.d.ts +1 -2
- package/dist/esm/db/generate.d.ts +3 -3
- package/dist/esm/db/generate.js +31 -29
- package/dist/esm/db/generate.js.map +1 -1
- package/dist/esm/migrations/generate.d.ts +3 -4
- package/dist/esm/migrations/generate.js +114 -107
- package/dist/esm/migrations/generate.js.map +1 -1
- package/dist/esm/models/index.d.ts +1 -0
- package/dist/esm/models/index.js +1 -0
- package/dist/esm/models/index.js.map +1 -1
- package/dist/esm/models/model-definitions.d.ts +189 -0
- package/dist/esm/models/model-definitions.js +2 -0
- package/dist/esm/models/model-definitions.js.map +1 -0
- package/dist/esm/models/models.d.ts +128 -174
- package/dist/esm/models/models.js +411 -1
- package/dist/esm/models/models.js.map +1 -1
- package/dist/esm/models/mutation-hook.d.ts +2 -2
- package/dist/esm/models/utils.d.ts +35 -497
- package/dist/esm/models/utils.js +21 -144
- package/dist/esm/models/utils.js.map +1 -1
- package/dist/esm/permissions/check.d.ts +3 -3
- package/dist/esm/permissions/check.js +14 -7
- package/dist/esm/permissions/check.js.map +1 -1
- package/dist/esm/permissions/generate.js +6 -6
- package/dist/esm/permissions/generate.js.map +1 -1
- package/dist/esm/resolvers/filters.d.ts +8 -0
- package/dist/esm/resolvers/filters.js +28 -25
- package/dist/esm/resolvers/filters.js.map +1 -1
- package/dist/esm/resolvers/index.d.ts +1 -0
- package/dist/esm/resolvers/index.js +1 -0
- package/dist/esm/resolvers/index.js.map +1 -1
- package/dist/esm/resolvers/mutations.js +85 -21
- package/dist/esm/resolvers/mutations.js.map +1 -1
- package/dist/esm/resolvers/node.d.ts +13 -15
- package/dist/esm/resolvers/node.js +41 -36
- package/dist/esm/resolvers/node.js.map +1 -1
- package/dist/esm/resolvers/resolver.js +19 -49
- package/dist/esm/resolvers/resolver.js.map +1 -1
- package/dist/esm/resolvers/resolvers.d.ts +1 -8
- package/dist/esm/resolvers/resolvers.js +15 -7
- package/dist/esm/resolvers/resolvers.js.map +1 -1
- package/dist/esm/resolvers/selects.d.ts +3 -0
- package/dist/esm/resolvers/selects.js +50 -0
- package/dist/esm/resolvers/selects.js.map +1 -0
- package/dist/esm/resolvers/utils.d.ts +12 -4
- package/dist/esm/resolvers/utils.js +30 -22
- package/dist/esm/resolvers/utils.js.map +1 -1
- package/dist/esm/schema/generate.d.ts +4 -4
- package/dist/esm/schema/generate.js +122 -131
- package/dist/esm/schema/generate.js.map +1 -1
- package/dist/esm/schema/utils.d.ts +1 -1
- package/dist/esm/schema/utils.js +2 -1
- package/dist/esm/schema/utils.js.map +1 -1
- package/knexfile.ts +31 -0
- package/migrations/20230912185644_setup.ts +127 -0
- package/package.json +16 -14
- package/src/api/execute.ts +1 -1
- package/src/bin/gqm/gqm.ts +25 -23
- package/src/bin/gqm/parse-models.ts +5 -5
- package/src/bin/gqm/settings.ts +13 -4
- package/src/bin/gqm/static-eval.ts +5 -0
- package/src/bin/gqm/templates.ts +23 -3
- package/src/client/mutations.ts +11 -5
- package/src/client/queries.ts +43 -80
- package/src/context.ts +1 -2
- package/src/db/generate.ts +41 -41
- package/src/migrations/generate.ts +165 -146
- package/src/models/index.ts +1 -0
- package/src/models/model-definitions.ts +168 -0
- package/src/models/models.ts +510 -166
- package/src/models/mutation-hook.ts +2 -2
- package/src/models/utils.ts +53 -187
- package/src/permissions/check.ts +19 -11
- package/src/permissions/generate.ts +6 -6
- package/src/resolvers/filters.ts +44 -28
- package/src/resolvers/index.ts +1 -0
- package/src/resolvers/mutations.ts +98 -36
- package/src/resolvers/node.ts +79 -51
- package/src/resolvers/resolver.ts +20 -74
- package/src/resolvers/resolvers.ts +18 -7
- package/src/resolvers/selects.ts +77 -0
- package/src/resolvers/utils.ts +41 -25
- package/src/schema/generate.ts +106 -127
- package/src/schema/utils.ts +2 -1
- package/tests/api/__snapshots__/inheritance.spec.ts.snap +83 -0
- package/tests/api/inheritance.spec.ts +130 -0
- package/tests/generated/api/index.ts +1174 -0
- package/tests/generated/client/index.ts +1163 -0
- package/tests/generated/client/mutations.ts +109 -0
- package/tests/generated/db/index.ts +291 -0
- package/tests/generated/db/knex.ts +14 -0
- package/tests/generated/models.json +675 -0
- package/tests/generated/schema.graphql +325 -0
- package/tests/unit/__snapshots__/resolve.spec.ts.snap +23 -0
- package/tests/unit/queries.spec.ts +5 -5
- package/tests/unit/resolve.spec.ts +8 -8
- package/tests/utils/database/knex.ts +5 -13
- package/tests/utils/database/seed.ts +57 -18
- package/tests/utils/models.ts +62 -7
- package/tests/utils/server.ts +5 -5
- package/tsconfig.eslint.json +1 -0
- package/tests/unit/__snapshots__/generate.spec.ts.snap +0 -128
- package/tests/unit/generate.spec.ts +0 -8
- package/tests/utils/database/schema.ts +0 -64
- package/tests/utils/generate-migration.ts +0 -24
package/dist/esm/api/execute.js
CHANGED
|
@@ -3,7 +3,7 @@ import { Source, execute as graphqlExecute, parse } from 'graphql';
|
|
|
3
3
|
import { merge } from 'lodash';
|
|
4
4
|
import { generate, get, getResolvers } from '..';
|
|
5
5
|
export const execute = async ({ additionalResolvers, body, ...ctx }) => {
|
|
6
|
-
const document = generate(ctx.
|
|
6
|
+
const document = generate(ctx.models);
|
|
7
7
|
const generatedResolvers = getResolvers(ctx.models);
|
|
8
8
|
const schema = makeExecutableSchema({
|
|
9
9
|
typeDefs: document,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/api/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAsB,MAAM,EAAE,OAAO,IAAI,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAW,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAE1D,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,EAC5B,mBAAmB,EACnB,IAAI,EACJ,GAAG,GAAG,EAIqB,EAAE,EAAE;IAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/api/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAsB,MAAM,EAAE,OAAO,IAAI,cAAc,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAW,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAE1D,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,EAC5B,mBAAmB,EACnB,IAAI,EACJ,GAAG,GAAG,EAIqB,EAAE,EAAE;IAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEtC,MAAM,kBAAkB,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,oBAAoB,CAAC;QAClC,QAAQ,EAAE,QAAQ;QAClB,SAAS,EAAE,KAAK,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;KAC1D,CAAC,CAAC;IAEH,MAAM,YAAY,GAAY;QAC5B,QAAQ;QACR,GAAG,GAAG;KACP,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;QAClC,MAAM;QACN,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;QAC1D,YAAY;QACZ,cAAc,EAAE,IAAI,CAAC,SAAS;QAC9B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,aAAa,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAwB,EAAE,EAAE;YAC/D,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare const generateMutations: (models:
|
|
1
|
+
import { Models } from '../models/models';
|
|
2
|
+
export declare const generateMutations: (models: Models, gqmModule?: string) => string;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import upperCase from 'lodash/upperCase';
|
|
2
|
-
import {
|
|
2
|
+
import { isRootModel, not } from '..';
|
|
3
3
|
const constantCase = (str) => upperCase(str).replace(/ /g, '_');
|
|
4
|
-
export const generateMutations = (models) => {
|
|
4
|
+
export const generateMutations = (models, gqmModule = '@smartive/graphql-magic') => {
|
|
5
5
|
const parts = [];
|
|
6
|
-
for (const { name, creatable, updatable, deletable } of models.filter(
|
|
6
|
+
for (const { name, creatable, updatable, deletable } of models.entities.filter(not(isRootModel))) {
|
|
7
7
|
if (creatable) {
|
|
8
8
|
parts.push(`export const CREATE_${constantCase(name)} = gql\`\n mutation Create${name}Mutation($data: Create${name}!) {\n create${name}(data: $data) { id }\n }\n\`;`);
|
|
9
9
|
}
|
|
@@ -12,8 +12,9 @@ export const generateMutations = (models) => {
|
|
|
12
12
|
}
|
|
13
13
|
if (deletable) {
|
|
14
14
|
parts.push(`export const DELETE_${constantCase(name)} = gql\`\n mutation Delete${name}Mutation($id: ID!) {\n delete${name}(where: { id: $id })\n }\n\`;`);
|
|
15
|
+
parts.push(`export const RESTORE_${constantCase(name)} = gql\`\n mutation Restore${name}Mutation($id: ID!) {\n restore${name}(where: { id: $id })\n }\n\`;`);
|
|
15
16
|
}
|
|
16
17
|
}
|
|
17
|
-
return `import { gql } from "
|
|
18
|
+
return `import { gql } from "${gqmModule}";\n\n${parts.join('\n\n')}`;
|
|
18
19
|
};
|
|
19
20
|
//# sourceMappingURL=mutations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutations.js","sourceRoot":"","sources":["../../../src/client/mutations.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mutations.js","sourceRoot":"","sources":["../../../src/client/mutations.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC;AAGtC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAE,SAAS,GAAG,yBAAyB,EAAE,EAAE;IACzF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE;QAChG,IAAI,SAAS,EAAE;YACb,KAAK,CAAC,IAAI,CACR,uBAAuB,YAAY,CACjC,IAAI,CACL,8BAA8B,IAAI,yBAAyB,IAAI,mBAAmB,IAAI,gCAAgC,CACxH,CAAC;SACH;QAED,IAAI,SAAS,EAAE;YACb,KAAK,CAAC,IAAI,CACR,uBAAuB,YAAY,CACjC,IAAI,CACL,8BAA8B,IAAI,mCAAmC,IAAI,mBAAmB,IAAI,oDAAoD,CACtJ,CAAC;SACH;QAED,IAAI,SAAS,EAAE;YACb,KAAK,CAAC,IAAI,CACR,uBAAuB,YAAY,CACjC,IAAI,CACL,8BAA8B,IAAI,mCAAmC,IAAI,gCAAgC,CAC3G,CAAC;YAEF,KAAK,CAAC,IAAI,CACR,wBAAwB,YAAY,CAClC,IAAI,CACL,+BAA+B,IAAI,oCAAoC,IAAI,gCAAgC,CAC7G,CAAC;SACH;KACF;IAED,OAAO,wBAAwB,SAAS,SAAS,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACxE,CAAC,CAAC"}
|
|
@@ -1,27 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Model, Models, Relation
|
|
3
|
-
export declare const getUpdateEntityQuery: (model:
|
|
4
|
-
export declare const getEditEntityRelationsQuery: (
|
|
5
|
-
export declare const
|
|
6
|
-
export declare const getManyToManyRelation: (model: Model, name: string) => [ReverseRelation, Relation];
|
|
7
|
-
export declare const getManyToManyRelationsQuery: (model: Model, action: 'create' | 'update', manyToManyRelations: [ReverseRelation, Relation][]) => string;
|
|
1
|
+
import { ManyToManyRelation } from '..';
|
|
2
|
+
import { EntityModel, Model, Models, Relation } from '../models/models';
|
|
3
|
+
export declare const getUpdateEntityQuery: (model: EntityModel, role: any, fields?: string[] | undefined, additionalFields?: string) => string;
|
|
4
|
+
export declare const getEditEntityRelationsQuery: (model: EntityModel, action: 'create' | 'update' | 'filter', fields?: string[], ignoreFields?: string[], additionalFields?: Record<string, string>) => string;
|
|
5
|
+
export declare const getManyToManyRelationsQuery: (model: Model, action: 'create' | 'update', manyToManyRelations: ManyToManyRelation[]) => string;
|
|
8
6
|
export type MutationQuery = {
|
|
9
7
|
mutated: {
|
|
10
8
|
id: string;
|
|
11
9
|
};
|
|
12
10
|
};
|
|
13
11
|
export declare const getMutationQuery: (model: Model, action: 'create' | 'update' | 'delete') => string;
|
|
14
|
-
export declare const displayField: (model:
|
|
15
|
-
export declare const getEntityListQuery: (model:
|
|
16
|
-
model:
|
|
12
|
+
export declare const displayField: (model: EntityModel) => string;
|
|
13
|
+
export declare const getEntityListQuery: (model: EntityModel, role: string, additionalFields?: string, root?: {
|
|
14
|
+
model: EntityModel;
|
|
17
15
|
entity: any;
|
|
18
16
|
reverseRelationName: string;
|
|
19
17
|
}) => string;
|
|
20
18
|
export type VisibleRelationsByRole = Record<string, Record<string, string[]>>;
|
|
21
|
-
export declare const isVisibleRelation: (visibleRelationsByRole: VisibleRelationsByRole, modelName: string, role: string) => (
|
|
22
|
-
export declare const getEntityQuery: (
|
|
23
|
-
export declare const getFindEntityQuery: (model:
|
|
24
|
-
export declare const queryRelations: (models: Models, relations:
|
|
25
|
-
name: string;
|
|
26
|
-
type: string;
|
|
27
|
-
}[], role: string, typesWithSubRelations: string[]) => string;
|
|
19
|
+
export declare const isVisibleRelation: (visibleRelationsByRole: VisibleRelationsByRole, modelName: string, role: string) => (relation: Relation) => boolean;
|
|
20
|
+
export declare const getEntityQuery: (model: EntityModel, role: string, visibleRelationsByRole: VisibleRelationsByRole, typesWithSubRelations: string[]) => string;
|
|
21
|
+
export declare const getFindEntityQuery: (model: EntityModel, role: string) => string;
|
|
22
|
+
export declare const queryRelations: (models: Models, relations: Relation[], role: string, typesWithSubRelations: string[]) => string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import upperFirst from 'lodash/upperFirst';
|
|
2
|
-
import { actionableRelations, and,
|
|
2
|
+
import { actionableRelations, and, isQueriableBy, isRelation, isSimpleField, isToOneRelation, isUpdatableBy, not, typeToField, } from '../models/utils';
|
|
3
3
|
export const getUpdateEntityQuery = (model, role, fields, additionalFields = '') => `query Update${model.name}Fields ($id: ID!) {
|
|
4
4
|
data: ${typeToField(model.name)}(where: { id: $id }) {
|
|
5
5
|
id
|
|
@@ -15,57 +15,37 @@ export const getUpdateEntityQuery = (model, role, fields, additionalFields = '')
|
|
|
15
15
|
${additionalFields}
|
|
16
16
|
}
|
|
17
17
|
}`;
|
|
18
|
-
export const getEditEntityRelationsQuery = (
|
|
18
|
+
export const getEditEntityRelationsQuery = (model, action, fields, ignoreFields, additionalFields = {}) => {
|
|
19
19
|
const relations = actionableRelations(model, action).filter(({ name }) => (!fields || fields.includes(name)) && (!ignoreFields || !ignoreFields.includes(name)));
|
|
20
20
|
return (!!relations.length &&
|
|
21
21
|
`query ${upperFirst(action)}${model.name}Relations {
|
|
22
22
|
${relations
|
|
23
|
-
.map((
|
|
24
|
-
const model = summonByName(models, type);
|
|
23
|
+
.map((relation) => {
|
|
25
24
|
let filters = '';
|
|
26
|
-
if (
|
|
27
|
-
const displayField =
|
|
25
|
+
if (relation.targetModel.displayField) {
|
|
26
|
+
const displayField = relation.targetModel.fieldsByName[relation.targetModel.displayField];
|
|
28
27
|
if (displayField.orderable) {
|
|
29
|
-
filters = `(orderBy: [{ ${
|
|
28
|
+
filters = `(orderBy: [{ ${relation.targetModel.displayField}: ASC }])`;
|
|
30
29
|
}
|
|
31
30
|
}
|
|
32
|
-
return `${name}: ${
|
|
31
|
+
return `${relation.name}: ${relation.targetModel.pluralField}${filters} {
|
|
33
32
|
id
|
|
34
|
-
display: ${
|
|
35
|
-
${additionalFields[name] || ''}
|
|
33
|
+
display: ${relation.targetModel.displayField || 'id'}
|
|
34
|
+
${additionalFields[relation.name] || ''}
|
|
36
35
|
}`;
|
|
37
36
|
})
|
|
38
37
|
.join(' ')}
|
|
39
38
|
}`);
|
|
40
39
|
};
|
|
41
|
-
export const getManyToManyRelations = (model, fields, ignoreFields) => {
|
|
42
|
-
const manyToManyRelations = [];
|
|
43
|
-
for (const field of model.reverseRelations) {
|
|
44
|
-
if ((fields && !fields.includes(field.name)) || (ignoreFields && ignoreFields.includes(field.name))) {
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
const relation = field.model.relations.find((relation) => !relation.field.generated && relation.field.name !== field.field.name);
|
|
48
|
-
if (!relation) {
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
const inapplicableFields = field.model.fields.filter((otherField) => !otherField.generated && ![field.field.name, relation.field.name].includes(otherField.name));
|
|
52
|
-
if (inapplicableFields.length) {
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
manyToManyRelations.push([field, relation]);
|
|
56
|
-
}
|
|
57
|
-
return manyToManyRelations;
|
|
58
|
-
};
|
|
59
|
-
export const getManyToManyRelation = (model, name) => getManyToManyRelations(model, [name])[0];
|
|
60
40
|
export const getManyToManyRelationsQuery = (model, action, manyToManyRelations) => !!manyToManyRelations.length &&
|
|
61
41
|
(action === 'update'
|
|
62
42
|
? `query Update${model.name}ManyToManyRelations($id: ID!) {
|
|
63
43
|
${typeToField(model.name)}(where: { id: $id }) {
|
|
64
44
|
${manyToManyRelations
|
|
65
|
-
.map((
|
|
66
|
-
return `${
|
|
45
|
+
.map((relation) => {
|
|
46
|
+
return `${relation.name} {
|
|
67
47
|
id
|
|
68
|
-
${
|
|
48
|
+
${relation.relationToTarget.name} {
|
|
69
49
|
id
|
|
70
50
|
}
|
|
71
51
|
}`;
|
|
@@ -73,20 +53,20 @@ export const getManyToManyRelationsQuery = (model, action, manyToManyRelations)
|
|
|
73
53
|
.join(' ')}
|
|
74
54
|
}
|
|
75
55
|
${manyToManyRelations
|
|
76
|
-
.map((
|
|
77
|
-
return `${
|
|
56
|
+
.map((relation) => {
|
|
57
|
+
return `${relation.name}: ${relation.targetModel.pluralField} {
|
|
78
58
|
id
|
|
79
|
-
${
|
|
59
|
+
${relation.targetModel.displayField || ''}
|
|
80
60
|
}`;
|
|
81
61
|
})
|
|
82
62
|
.join(' ')}
|
|
83
63
|
}`
|
|
84
64
|
: `query Create${model.name}ManyToManyRelations {
|
|
85
65
|
${manyToManyRelations
|
|
86
|
-
.map((
|
|
87
|
-
return `${
|
|
66
|
+
.map((relation) => {
|
|
67
|
+
return `${relation.name}: ${relation.targetModel.pluralField} {
|
|
88
68
|
id
|
|
89
|
-
${
|
|
69
|
+
${relation.targetModel.displayField || ''}
|
|
90
70
|
}`;
|
|
91
71
|
})
|
|
92
72
|
.join(' ')}
|
|
@@ -117,14 +97,14 @@ export const getMutationQuery = (model, action) => action === 'create'
|
|
|
117
97
|
export const displayField = (model) => `
|
|
118
98
|
${model.displayField ? `display: ${model.displayField}` : ''}
|
|
119
99
|
`;
|
|
120
|
-
export const getEntityListQuery = (model, role, additionalFields = '', root) => `query ${
|
|
100
|
+
export const getEntityListQuery = (model, role, additionalFields = '', root) => `query ${model.plural}List(
|
|
121
101
|
${root ? '$id: ID!,' : ''}
|
|
122
102
|
$limit: Int!,
|
|
123
103
|
$where: ${model.name}Where!,
|
|
124
104
|
${model.fields.some(({ searchable }) => searchable) ? '$search: String,' : ''}
|
|
125
105
|
) {
|
|
126
106
|
${root ? `root: ${typeToField(root.model.name)}(where: { id: $id }) {` : ''}
|
|
127
|
-
data: ${root ? root.reverseRelationName :
|
|
107
|
+
data: ${root ? root.reverseRelationName : model.pluralField}(limit: $limit, where: $where, ${model.fields.some(({ searchable }) => searchable) ? ', search: $search' : ''}) {
|
|
128
108
|
${displayField(model)}
|
|
129
109
|
${model.fields.filter(and(isSimpleField, isQueriableBy(role))).map(({ name }) => name)}
|
|
130
110
|
${additionalFields}
|
|
@@ -133,28 +113,28 @@ export const getEntityListQuery = (model, role, additionalFields = '', root) =>
|
|
|
133
113
|
}`;
|
|
134
114
|
export const isVisibleRelation = (visibleRelationsByRole, modelName, role) => {
|
|
135
115
|
const whitelist = visibleRelationsByRole[role]?.[modelName];
|
|
136
|
-
return (
|
|
116
|
+
return (relation) => (whitelist ? whitelist.includes(relation.name) : true);
|
|
137
117
|
};
|
|
138
|
-
export const getEntityQuery = (
|
|
118
|
+
export const getEntityQuery = (model, role, visibleRelationsByRole, typesWithSubRelations) => `query Admin${model.name} ($id: ID!) {
|
|
139
119
|
data: ${typeToField(model.name)}(where: { id: $id }) {
|
|
140
120
|
${displayField(model)}
|
|
141
121
|
${model.fields.filter(and(isSimpleField, isQueriableBy(role))).map(({ name }) => name)}
|
|
142
|
-
${queryRelations(models, model.
|
|
143
|
-
${queryRelations(models, model.reverseRelations.filter(
|
|
122
|
+
${queryRelations(model.models, model.relations.filter(isVisibleRelation(visibleRelationsByRole, model.name, role)), role, typesWithSubRelations)}
|
|
123
|
+
${queryRelations(model.models, model.reverseRelations.filter((reverseRelation) => isToOneRelation(reverseRelation.field) &&
|
|
124
|
+
isVisibleRelation(visibleRelationsByRole, model.name, role)(reverseRelation)), role, typesWithSubRelations)}
|
|
144
125
|
}
|
|
145
126
|
}`;
|
|
146
127
|
export const getFindEntityQuery = (model, role) => `query Find${model.name}($where: ${model.name}Where!, $orderBy: [${model.name}OrderBy!]) {
|
|
147
|
-
data: ${
|
|
128
|
+
data: ${model.pluralField}(limit: 1, where: $where, orderBy: $orderBy) {
|
|
148
129
|
${model.fields.filter(and(isSimpleField, isQueriableBy(role))).map(({ name }) => name)}
|
|
149
130
|
}
|
|
150
131
|
}`;
|
|
151
132
|
export const queryRelations = (models, relations, role, typesWithSubRelations) => relations
|
|
152
|
-
.map((
|
|
153
|
-
const
|
|
154
|
-
|
|
155
|
-
return `${name} {
|
|
133
|
+
.map((relation) => {
|
|
134
|
+
const subRelations = typesWithSubRelations.includes(relation.targetModel.name) ? relation.targetModel.relations : [];
|
|
135
|
+
return `${relation.name} {
|
|
156
136
|
id
|
|
157
|
-
${displayField(
|
|
137
|
+
${displayField(relation.targetModel)}
|
|
158
138
|
${subRelations.length > 0 ? queryRelations(models, subRelations, role, typesWithSubRelations) : ''}
|
|
159
139
|
}`;
|
|
160
140
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/client/queries.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,mBAAmB,CAAC;AAG3C,OAAO,EACL,mBAAmB,EACnB,GAAG,EACH,
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/client/queries.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/context.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { DocumentNode, GraphQLResolveInfo } from 'graphql';
|
|
|
3
3
|
import { IncomingMessage } from 'http';
|
|
4
4
|
import { Knex } from 'knex';
|
|
5
5
|
import { DateTime } from 'luxon';
|
|
6
|
-
import { Models
|
|
6
|
+
import { Models } from './models/models';
|
|
7
7
|
import { Entity, MutationHook } from './models/mutation-hook';
|
|
8
8
|
import { Permissions } from './permissions/generate';
|
|
9
9
|
import { AliasGenerator } from './resolvers/utils';
|
|
@@ -19,7 +19,6 @@ export type Context = {
|
|
|
19
19
|
locale: string;
|
|
20
20
|
locales: string[];
|
|
21
21
|
user: User;
|
|
22
|
-
rawModels: RawModels;
|
|
23
22
|
models: Models;
|
|
24
23
|
permissions: Permissions;
|
|
25
24
|
mutationHook?: MutationHook;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare const generateDBModels: (
|
|
3
|
-
export declare const generateKnexTables: (
|
|
1
|
+
import { Models } from '../models/models';
|
|
2
|
+
export declare const generateDBModels: (models: Models) => string;
|
|
3
|
+
export declare const generateKnexTables: (models: Models) => string;
|
package/dist/esm/db/generate.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import CodeBlockWriter from 'code-block-writer';
|
|
2
|
-
import { get,
|
|
2
|
+
import { get, getColumnName, isCustomField, isInTable, isRootModel, not } from '..';
|
|
3
3
|
const PRIMITIVE_TYPES = {
|
|
4
4
|
ID: 'string',
|
|
5
5
|
Boolean: 'boolean',
|
|
@@ -10,35 +10,34 @@ const PRIMITIVE_TYPES = {
|
|
|
10
10
|
DateTime: 'DateTime | string',
|
|
11
11
|
};
|
|
12
12
|
const OPTIONAL_SEED_FIELDS = ['createdAt', 'createdById', 'updatedAt', 'updatedById', 'deletedAt', 'deletedById'];
|
|
13
|
-
export const generateDBModels = (
|
|
13
|
+
export const generateDBModels = (models) => {
|
|
14
14
|
const writer = new CodeBlockWriter['default']({
|
|
15
15
|
useSingleQuote: true,
|
|
16
16
|
indentNumberOfSpaces: 2,
|
|
17
17
|
});
|
|
18
18
|
writer.write(`import { DateTime } from 'luxon';`).blankLine();
|
|
19
|
-
for (const enm of
|
|
19
|
+
for (const enm of models.enums) {
|
|
20
20
|
writer.write(`export type ${enm.name} = ${enm.values.map((v) => `'${v}'`).join(' | ')};`).blankLine();
|
|
21
21
|
}
|
|
22
|
-
const
|
|
23
|
-
for (const model of models) {
|
|
22
|
+
for (const model of models.entities) {
|
|
24
23
|
// TODO: deprecate allowing to define foreignKey
|
|
25
|
-
const fields = model.
|
|
24
|
+
const fields = model.relations.some((relation) => relation.field.foreignKey === 'id')
|
|
26
25
|
? model.fields.filter((field) => field.name !== 'id')
|
|
27
26
|
: model.fields;
|
|
28
27
|
writer
|
|
29
28
|
.write(`export type ${model.name} = `)
|
|
30
29
|
.inlineBlock(() => {
|
|
31
30
|
for (const field of fields.filter(not(isCustomField))) {
|
|
32
|
-
writer.write(`'${
|
|
31
|
+
writer.write(`'${getColumnName(field)}': ${getFieldType(field)}${field.nonNull ? '' : ' | null'};`).newLine();
|
|
33
32
|
}
|
|
34
33
|
})
|
|
35
34
|
.blankLine();
|
|
36
35
|
writer
|
|
37
36
|
.write(`export type ${model.name}Initializer = `)
|
|
38
37
|
.inlineBlock(() => {
|
|
39
|
-
for (const field of fields.filter(not(isCustomField))) {
|
|
38
|
+
for (const field of fields.filter(not(isCustomField)).filter(isInTable)) {
|
|
40
39
|
writer
|
|
41
|
-
.write(`'${
|
|
40
|
+
.write(`'${getColumnName(field)}'${field.nonNull && field.defaultValue === undefined ? '' : '?'}: ${getFieldType(field)}${field.list ? ' | string' : ''}${field.nonNull ? '' : ' | null'};`)
|
|
42
41
|
.newLine();
|
|
43
42
|
}
|
|
44
43
|
})
|
|
@@ -46,33 +45,37 @@ export const generateDBModels = (rawModels) => {
|
|
|
46
45
|
writer
|
|
47
46
|
.write(`export type ${model.name}Mutator = `)
|
|
48
47
|
.inlineBlock(() => {
|
|
49
|
-
for (const field of fields.filter(not(isCustomField))) {
|
|
48
|
+
for (const field of fields.filter(not(isCustomField)).filter(isInTable)) {
|
|
50
49
|
writer
|
|
51
|
-
.write(`'${
|
|
52
|
-
.newLine();
|
|
53
|
-
}
|
|
54
|
-
})
|
|
55
|
-
.blankLine();
|
|
56
|
-
writer
|
|
57
|
-
.write(`export type ${model.name}Seed = `)
|
|
58
|
-
.inlineBlock(() => {
|
|
59
|
-
for (const field of fields.filter(not(isCustomField))) {
|
|
60
|
-
const fieldName = getFieldName(field);
|
|
61
|
-
writer
|
|
62
|
-
.write(`'${getFieldName(field)}'${field.nonNull && field.defaultValue === undefined && !OPTIONAL_SEED_FIELDS.includes(fieldName) ? '' : '?'}: ${field.kind === 'enum' ? (field.list ? 'string[]' : 'string') : getFieldType(field)}${field.list ? ' | string' : ''}${field.nonNull ? '' : ' | null'},`)
|
|
50
|
+
.write(`'${getColumnName(field)}'?: ${getFieldType(field)}${field.list ? ' | string' : ''}${field.nonNull ? '' : ' | null'};`)
|
|
63
51
|
.newLine();
|
|
64
52
|
}
|
|
65
53
|
})
|
|
66
54
|
.blankLine();
|
|
55
|
+
if (!isRootModel(model)) {
|
|
56
|
+
writer
|
|
57
|
+
.write(`export type ${model.name}Seed = `)
|
|
58
|
+
.inlineBlock(() => {
|
|
59
|
+
for (const field of fields.filter(not(isCustomField))) {
|
|
60
|
+
if (model.parent && field.name === 'type') {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const fieldName = getColumnName(field);
|
|
64
|
+
writer
|
|
65
|
+
.write(`'${getColumnName(field)}'${field.nonNull && field.defaultValue === undefined && !OPTIONAL_SEED_FIELDS.includes(fieldName) ? '' : '?'}: ${field.kind === 'enum' ? (field.list ? 'string[]' : 'string') : getFieldType(field)}${field.list ? ' | string' : ''}${field.nonNull ? '' : ' | null'};`)
|
|
66
|
+
.newLine();
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
.blankLine();
|
|
70
|
+
}
|
|
67
71
|
}
|
|
68
72
|
writer.write(`export type SeedData = `).inlineBlock(() => {
|
|
69
|
-
for (const model of models) {
|
|
70
|
-
writer.write(`${model.name}: ${model.name}Seed[]
|
|
73
|
+
for (const model of models.entities.filter(not(isRootModel))) {
|
|
74
|
+
writer.write(`${model.name}: ${model.name}Seed[];`).newLine();
|
|
71
75
|
}
|
|
72
76
|
});
|
|
73
77
|
return writer.toString();
|
|
74
78
|
};
|
|
75
|
-
const getFieldName = (field) => (field.kind === 'relation' ? field.foreignKey || `${field.name}Id` : field.name);
|
|
76
79
|
const getFieldType = (field) => {
|
|
77
80
|
const kind = field.kind;
|
|
78
81
|
switch (kind) {
|
|
@@ -95,21 +98,20 @@ const getFieldType = (field) => {
|
|
|
95
98
|
}
|
|
96
99
|
}
|
|
97
100
|
};
|
|
98
|
-
export const generateKnexTables = (
|
|
101
|
+
export const generateKnexTables = (models) => {
|
|
99
102
|
const writer = new CodeBlockWriter['default']({
|
|
100
103
|
useSingleQuote: true,
|
|
101
104
|
indentNumberOfSpaces: 2,
|
|
102
105
|
});
|
|
103
|
-
const models = getModels(rawModels);
|
|
104
106
|
writer.write(`import { Knex } from 'knex';`).newLine();
|
|
105
107
|
writer
|
|
106
|
-
.write(`import { ${models
|
|
108
|
+
.write(`import { ${models.entities
|
|
107
109
|
.map((model) => `${model.name}, ${model.name}Initializer, ${model.name}Mutator`)
|
|
108
110
|
.join(', ')} } from '.';`)
|
|
109
111
|
.blankLine();
|
|
110
112
|
writer.write(`declare module 'knex/types/tables' `).inlineBlock(() => {
|
|
111
113
|
writer.write(`interface Tables `).inlineBlock(() => {
|
|
112
|
-
for (const model of models) {
|
|
114
|
+
for (const model of models.entities) {
|
|
113
115
|
writer
|
|
114
116
|
.write(`'${model.name}': Knex.CompositeTableType<${model.name}, ${model.name}Initializer, ${model.name}Mutator>,`)
|
|
115
117
|
.newLine();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/db/generate.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/db/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { Knex } from 'knex';
|
|
2
|
-
import {
|
|
2
|
+
import { Models } from '../models/models';
|
|
3
3
|
export declare class MigrationGenerator {
|
|
4
|
-
private
|
|
4
|
+
private models;
|
|
5
5
|
private writer;
|
|
6
6
|
private schema;
|
|
7
7
|
private columns;
|
|
8
8
|
private uuidUsed?;
|
|
9
9
|
private nowUsed?;
|
|
10
|
-
|
|
11
|
-
constructor(knex: Knex, rawModels: RawModels);
|
|
10
|
+
constructor(knex: Knex, models: Models);
|
|
12
11
|
generate(): Promise<string>;
|
|
13
12
|
private renameFields;
|
|
14
13
|
private createFields;
|