@smartive/graphql-magic 19.1.0-next.3 → 19.1.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/CHANGELOG.md +3 -3
- package/dist/bin/gqm.cjs +11 -3
- package/dist/cjs/index.cjs +11 -3
- package/dist/esm/permissions/generate-types.js +10 -3
- package/dist/esm/permissions/generate-types.js.map +1 -1
- package/migrations/20230912185644_setup.ts +12 -25
- package/package.json +1 -1
- package/src/permissions/generate-types.ts +15 -3
- package/tests/generated/permissions.ts +1 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# [19.1.0
|
|
1
|
+
# [19.1.0](https://github.com/smartive/graphql-magic/compare/v19.0.0...v19.1.0) (2025-06-04)
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
###
|
|
4
|
+
### Features
|
|
5
5
|
|
|
6
|
-
*
|
|
6
|
+
* Permissions Typing ([#303](https://github.com/smartive/graphql-magic/issues/303)) ([2be1899](https://github.com/smartive/graphql-magic/commit/2be189913e0fa91cadf805fd715e25c9351e13dd))
|
package/dist/bin/gqm.cjs
CHANGED
|
@@ -1278,9 +1278,7 @@ var generatePermissionTypes = (models) => {
|
|
|
1278
1278
|
}
|
|
1279
1279
|
})
|
|
1280
1280
|
);
|
|
1281
|
-
|
|
1282
|
-
sourceFile.addStatements((writer) => writer.write(`type ${enm2.name} = ${enm2.values.map((v) => `'${v}'`).join(" | ")};`));
|
|
1283
|
-
}
|
|
1281
|
+
const usedEnums = /* @__PURE__ */ new Set(["Role"]);
|
|
1284
1282
|
for (const model of models.entities) {
|
|
1285
1283
|
sourceFile.addStatements(
|
|
1286
1284
|
(writer) => writer.write(`export type ${model.name}Where = `).inlineBlock(() => {
|
|
@@ -1290,6 +1288,9 @@ var generatePermissionTypes = (models) => {
|
|
|
1290
1288
|
} else if (!field.kind || field.kind === "primitive") {
|
|
1291
1289
|
writer.writeLine(`${field.name}?: ${PRIMITIVE_TYPES[field.type]} | ${PRIMITIVE_TYPES[field.type]}[],`);
|
|
1292
1290
|
} else {
|
|
1291
|
+
if (field.kind === "enum") {
|
|
1292
|
+
usedEnums.add(field.type);
|
|
1293
|
+
}
|
|
1293
1294
|
writer.writeLine(`${field.name}?: ${field.type} | ${field.type}[],`);
|
|
1294
1295
|
}
|
|
1295
1296
|
}
|
|
@@ -1312,6 +1313,13 @@ var generatePermissionTypes = (models) => {
|
|
|
1312
1313
|
})
|
|
1313
1314
|
);
|
|
1314
1315
|
}
|
|
1316
|
+
for (const name2 of usedEnums) {
|
|
1317
|
+
sourceFile.addStatements(
|
|
1318
|
+
(writer) => writer.write(
|
|
1319
|
+
`type ${name2} = ${models.getModel(name2, "enum").values.map((v) => `'${v}'`).join(" | ")};`
|
|
1320
|
+
)
|
|
1321
|
+
);
|
|
1322
|
+
}
|
|
1315
1323
|
return sourceFile.getFullText();
|
|
1316
1324
|
};
|
|
1317
1325
|
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -2092,9 +2092,7 @@ var generatePermissionTypes = (models) => {
|
|
|
2092
2092
|
}
|
|
2093
2093
|
})
|
|
2094
2094
|
);
|
|
2095
|
-
|
|
2096
|
-
sourceFile.addStatements((writer) => writer.write(`type ${enm2.name} = ${enm2.values.map((v) => `'${v}'`).join(" | ")};`));
|
|
2097
|
-
}
|
|
2095
|
+
const usedEnums = /* @__PURE__ */ new Set(["Role"]);
|
|
2098
2096
|
for (const model of models.entities) {
|
|
2099
2097
|
sourceFile.addStatements(
|
|
2100
2098
|
(writer) => writer.write(`export type ${model.name}Where = `).inlineBlock(() => {
|
|
@@ -2104,6 +2102,9 @@ var generatePermissionTypes = (models) => {
|
|
|
2104
2102
|
} else if (!field.kind || field.kind === "primitive") {
|
|
2105
2103
|
writer.writeLine(`${field.name}?: ${PRIMITIVE_TYPES[field.type]} | ${PRIMITIVE_TYPES[field.type]}[],`);
|
|
2106
2104
|
} else {
|
|
2105
|
+
if (field.kind === "enum") {
|
|
2106
|
+
usedEnums.add(field.type);
|
|
2107
|
+
}
|
|
2107
2108
|
writer.writeLine(`${field.name}?: ${field.type} | ${field.type}[],`);
|
|
2108
2109
|
}
|
|
2109
2110
|
}
|
|
@@ -2126,6 +2127,13 @@ var generatePermissionTypes = (models) => {
|
|
|
2126
2127
|
})
|
|
2127
2128
|
);
|
|
2128
2129
|
}
|
|
2130
|
+
for (const name2 of usedEnums) {
|
|
2131
|
+
sourceFile.addStatements(
|
|
2132
|
+
(writer) => writer.write(
|
|
2133
|
+
`type ${name2} = ${models.getModel(name2, "enum").values.map((v) => `'${v}'`).join(" | ")};`
|
|
2134
|
+
)
|
|
2135
|
+
);
|
|
2136
|
+
}
|
|
2129
2137
|
return sourceFile.getFullText();
|
|
2130
2138
|
};
|
|
2131
2139
|
|
|
@@ -17,9 +17,7 @@ export const generatePermissionTypes = (models) => {
|
|
|
17
17
|
writer.writeLine(`${model.name}?: ${model.name}Permissions,`);
|
|
18
18
|
}
|
|
19
19
|
}));
|
|
20
|
-
|
|
21
|
-
sourceFile.addStatements((writer) => writer.write(`type ${enm.name} = ${enm.values.map((v) => `'${v}'`).join(' | ')};`));
|
|
22
|
-
}
|
|
20
|
+
const usedEnums = new Set(['Role']);
|
|
23
21
|
for (const model of models.entities) {
|
|
24
22
|
sourceFile.addStatements((writer) => writer.write(`export type ${model.name}Where = `).inlineBlock(() => {
|
|
25
23
|
for (const field of model.fields.filter((field) => field.filterable)) {
|
|
@@ -30,6 +28,9 @@ export const generatePermissionTypes = (models) => {
|
|
|
30
28
|
writer.writeLine(`${field.name}?: ${PRIMITIVE_TYPES[field.type]} | ${PRIMITIVE_TYPES[field.type]}[],`);
|
|
31
29
|
}
|
|
32
30
|
else {
|
|
31
|
+
if (field.kind === 'enum') {
|
|
32
|
+
usedEnums.add(field.type);
|
|
33
|
+
}
|
|
33
34
|
writer.writeLine(`${field.name}?: ${field.type} | ${field.type}[],`);
|
|
34
35
|
}
|
|
35
36
|
}
|
|
@@ -49,6 +50,12 @@ export const generatePermissionTypes = (models) => {
|
|
|
49
50
|
}
|
|
50
51
|
}));
|
|
51
52
|
}
|
|
53
|
+
for (const name of usedEnums) {
|
|
54
|
+
sourceFile.addStatements((writer) => writer.write(`type ${name} = ${models
|
|
55
|
+
.getModel(name, 'enum')
|
|
56
|
+
.values.map((v) => `'${v}'`)
|
|
57
|
+
.join(' | ')};`));
|
|
58
|
+
}
|
|
52
59
|
return sourceFile.getFullText();
|
|
53
60
|
};
|
|
54
61
|
//# sourceMappingURL=generate-types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-types.js","sourceRoot":"","sources":["../../../src/permissions/generate-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAc,EAAE,EAAE;IACxD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;QAC1B,oBAAoB,EAAE;YACpB,eAAe,EAAE,eAAe,CAAC,SAAS;SAC3C;KACF,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,EAAE,EAAE;QAChE,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,UAAU,CAAC,aAAa,CAAC,iEAAiE,CAAC,CAAC;IAE5F,UAAU,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,CAClC,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE;QACtE,MAAM,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,
|
|
1
|
+
{"version":3,"file":"generate-types.js","sourceRoot":"","sources":["../../../src/permissions/generate-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAc,EAAE,EAAE;IACxD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;QAC1B,oBAAoB,EAAE;YACpB,eAAe,EAAE,eAAe,CAAC,SAAS;SAC3C;KACF,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,EAAE,EAAE;QAChE,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,UAAU,CAAC,aAAa,CAAC,iEAAiE,CAAC,CAAC;IAE5F,UAAU,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,CAClC,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE;QACtE,MAAM,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpC,UAAU,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,CAClC,MAAM,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE;YACjE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrE,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC9B,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC;gBAC1D,CAAC;qBAAM,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBACrD,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,IAAI,MAAM,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzG,CAAC;qBAAM,CAAC;oBACN,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC1B,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC5B,CAAC;oBACD,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,UAAU,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,CAClC,MAAM,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,IAAI,gBAAgB,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE;YACvE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC;YACxC,CAAC;YACD,MAAM,CAAC,SAAS,CAAC,WAAW,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC;YAChD,MAAM,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAClE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE;oBAC5C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;wBACjC,MAAM,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,WAAW,CAAC,IAAI,cAAc,CAAC,CAAC;oBAClF,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,UAAU,CAAC,aAAa,CAAC,CAAC,MAAM,EAAE,EAAE,CAClC,MAAM,CAAC,KAAK,CACV,QAAQ,IAAI,MAAM,MAAM;aACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;aACtB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;aAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAClB,CACF,CAAC;IACJ,CAAC;IAED,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC,CAAC"}
|
|
@@ -3,10 +3,18 @@ import { Knex } from 'knex';
|
|
|
3
3
|
export const up = async (knex: Knex) => {
|
|
4
4
|
await knex.raw(`CREATE TYPE "someEnum" AS ENUM ('A','B','C')`);
|
|
5
5
|
|
|
6
|
+
await knex.raw(`CREATE TYPE "role" AS ENUM ('ADMIN','USER')`);
|
|
7
|
+
|
|
6
8
|
await knex.raw(`CREATE TYPE "reactionType" AS ENUM ('Review','Question','Answer')`);
|
|
7
9
|
|
|
8
|
-
await knex.schema.
|
|
9
|
-
table.
|
|
10
|
+
await knex.schema.createTable('User', (table) => {
|
|
11
|
+
table.uuid('id').notNullable().primary();
|
|
12
|
+
table.string('username', undefined).nullable();
|
|
13
|
+
table.enum('role', null, {
|
|
14
|
+
useNative: true,
|
|
15
|
+
existingType: true,
|
|
16
|
+
enumName: 'role',
|
|
17
|
+
}).notNullable();
|
|
10
18
|
});
|
|
11
19
|
|
|
12
20
|
await knex.schema.createTable('AnotherObject', (table) => {
|
|
@@ -115,29 +123,9 @@ export const up = async (knex: Knex) => {
|
|
|
115
123
|
table.decimal('rating', undefined, undefined).nullable();
|
|
116
124
|
});
|
|
117
125
|
|
|
118
|
-
await knex.schema.alterTable('User', (table) => {
|
|
119
|
-
table.dropColumn('createdAt');
|
|
120
|
-
table.dropColumn('updatedAt');
|
|
121
|
-
});
|
|
122
|
-
|
|
123
126
|
};
|
|
124
127
|
|
|
125
128
|
export const down = async (knex: Knex) => {
|
|
126
|
-
await knex.schema.alterTable('User', (table) => {
|
|
127
|
-
table.timestamp('createdAt');
|
|
128
|
-
table.timestamp('updatedAt');
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
await knex('User').update({
|
|
132
|
-
createdAt: 'TODO',
|
|
133
|
-
updatedAt: 'TODO',
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
await knex.schema.alterTable('User', (table) => {
|
|
137
|
-
table.timestamp('createdAt').notNullable().alter();
|
|
138
|
-
table.timestamp('updatedAt').notNullable().alter();
|
|
139
|
-
});
|
|
140
|
-
|
|
141
129
|
await knex.schema.dropTable('ReviewRevision');
|
|
142
130
|
|
|
143
131
|
await knex.schema.dropTable('Review');
|
|
@@ -152,11 +140,10 @@ export const down = async (knex: Knex) => {
|
|
|
152
140
|
|
|
153
141
|
await knex.schema.dropTable('AnotherObject');
|
|
154
142
|
|
|
155
|
-
await knex.schema.
|
|
156
|
-
table.dropColumn('username');
|
|
157
|
-
});
|
|
143
|
+
await knex.schema.dropTable('User');
|
|
158
144
|
|
|
159
145
|
await knex.raw('DROP TYPE "reactionType"');
|
|
146
|
+
await knex.raw('DROP TYPE "role"');
|
|
160
147
|
await knex.raw('DROP TYPE "someEnum"');
|
|
161
148
|
};
|
|
162
149
|
|
package/package.json
CHANGED
|
@@ -25,9 +25,7 @@ export const generatePermissionTypes = (models: Models) => {
|
|
|
25
25
|
}),
|
|
26
26
|
);
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
sourceFile.addStatements((writer) => writer.write(`type ${enm.name} = ${enm.values.map((v) => `'${v}'`).join(' | ')};`));
|
|
30
|
-
}
|
|
28
|
+
const usedEnums = new Set<string>(['Role']);
|
|
31
29
|
|
|
32
30
|
for (const model of models.entities) {
|
|
33
31
|
sourceFile.addStatements((writer) =>
|
|
@@ -38,6 +36,9 @@ export const generatePermissionTypes = (models: Models) => {
|
|
|
38
36
|
} else if (!field.kind || field.kind === 'primitive') {
|
|
39
37
|
writer.writeLine(`${field.name}?: ${PRIMITIVE_TYPES[field.type]} | ${PRIMITIVE_TYPES[field.type]}[],`);
|
|
40
38
|
} else {
|
|
39
|
+
if (field.kind === 'enum') {
|
|
40
|
+
usedEnums.add(field.type);
|
|
41
|
+
}
|
|
41
42
|
writer.writeLine(`${field.name}?: ${field.type} | ${field.type}[],`);
|
|
42
43
|
}
|
|
43
44
|
}
|
|
@@ -62,5 +63,16 @@ export const generatePermissionTypes = (models: Models) => {
|
|
|
62
63
|
);
|
|
63
64
|
}
|
|
64
65
|
|
|
66
|
+
for (const name of usedEnums) {
|
|
67
|
+
sourceFile.addStatements((writer) =>
|
|
68
|
+
writer.write(
|
|
69
|
+
`type ${name} = ${models
|
|
70
|
+
.getModel(name, 'enum')
|
|
71
|
+
.values.map((v) => `'${v}'`)
|
|
72
|
+
.join(' | ')};`,
|
|
73
|
+
),
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
65
77
|
return sourceFile.getFullText();
|
|
66
78
|
};
|
|
@@ -9,9 +9,6 @@ export type PermissionsBlock = true | {
|
|
|
9
9
|
Question?: QuestionPermissions,
|
|
10
10
|
Answer?: AnswerPermissions,
|
|
11
11
|
}
|
|
12
|
-
type SomeEnum = 'A' | 'B' | 'C';
|
|
13
|
-
type Role = 'ADMIN' | 'USER';
|
|
14
|
-
type ReactionType = 'Review' | 'Question' | 'Answer';
|
|
15
12
|
export type UserWhere = {
|
|
16
13
|
}
|
|
17
14
|
export type UserPermissions = {
|
|
@@ -169,3 +166,4 @@ export type AnswerPermissions = {
|
|
|
169
166
|
childAnswers?: AnswerPermissions,
|
|
170
167
|
}
|
|
171
168
|
}
|
|
169
|
+
type Role = 'ADMIN' | 'USER';
|