@smartive/graphql-magic 2.1.0 → 2.1.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.
- package/CHANGELOG.md +3 -3
- package/dist/cjs/index.cjs +45 -9
- package/dist/esm/db/generate.js +45 -8
- package/dist/esm/db/generate.js.map +1 -1
- package/package.json +1 -1
- package/src/db/generate.ts +63 -17
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
## [2.1.1](https://github.com/smartive/graphql-magic/compare/v2.1.0...v2.1.1) (2023-07-20)
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
###
|
|
4
|
+
### Bug Fixes
|
|
5
5
|
|
|
6
|
-
* Generate db models ([
|
|
6
|
+
* Generate db models correctly, including seed models ([e92c34a](https://github.com/smartive/graphql-magic/commit/e92c34aba934de0c9a9d66c3a483e144b8788cda))
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -491,8 +491,10 @@ var PRIMITIVE_TYPES = {
|
|
|
491
491
|
Upload: "string",
|
|
492
492
|
Int: "number",
|
|
493
493
|
Float: "number",
|
|
494
|
-
String: "string"
|
|
494
|
+
String: "string",
|
|
495
|
+
DateTime: "DateTime | string"
|
|
495
496
|
};
|
|
497
|
+
var OPTIONAL_SEED_FIELDS = ["createdAt", "createdById", "updatedAt", "updatedById", "deletedAt", "deletedById"];
|
|
496
498
|
var generateDBModels = (rawModels) => {
|
|
497
499
|
const writer = new import_code_block_writer.default["default"]({
|
|
498
500
|
useSingleQuote: true,
|
|
@@ -504,30 +506,64 @@ var generateDBModels = (rawModels) => {
|
|
|
504
506
|
}
|
|
505
507
|
const models = getModels(rawModels);
|
|
506
508
|
for (const model of models) {
|
|
509
|
+
const fields2 = model.fields.some((field) => field.foreignKey === "id") ? model.fields.filter((field) => field.name !== "id") : model.fields;
|
|
507
510
|
writer.write(`export type ${model.name} = `).inlineBlock(() => {
|
|
508
|
-
for (const
|
|
509
|
-
writer.write(
|
|
510
|
-
`'${name2}${relation ? "Id" : ""}': ${relation ? "string" : PRIMITIVE_TYPES[type] || type}${nonNull2 ? "" : " | null"},`
|
|
511
|
-
).newLine();
|
|
511
|
+
for (const field of fields2.filter(({ raw }) => !raw)) {
|
|
512
|
+
writer.write(`'${getFieldName(field)}': ${getFieldOutputType(field)}${field.nonNull ? "" : " | null"},`).newLine();
|
|
512
513
|
}
|
|
513
514
|
}).blankLine();
|
|
514
515
|
writer.write(`export type ${model.name}Initializer = `).inlineBlock(() => {
|
|
515
|
-
for (const
|
|
516
|
+
for (const field of fields2.filter(({ raw }) => !raw)) {
|
|
516
517
|
writer.write(
|
|
517
|
-
`'${
|
|
518
|
+
`'${getFieldName(field)}'${field.nonNull && field.default === void 0 ? "" : "?"}: ${getFieldInputType(
|
|
519
|
+
field
|
|
520
|
+
)}${field.nonNull ? "" : " | null"},`
|
|
518
521
|
).newLine();
|
|
519
522
|
}
|
|
520
523
|
}).blankLine();
|
|
521
524
|
writer.write(`export type ${model.name}Mutator = `).inlineBlock(() => {
|
|
522
|
-
for (const
|
|
525
|
+
for (const field of fields2.filter(({ raw }) => !raw)) {
|
|
526
|
+
writer.write(`'${getFieldName(field)}'?: ${getFieldInputType(field)}${field.nonNull ? "" : " | null"},`).newLine();
|
|
527
|
+
}
|
|
528
|
+
}).blankLine();
|
|
529
|
+
writer.write(`export type ${model.name}Seed = `).inlineBlock(() => {
|
|
530
|
+
for (const field of fields2.filter(({ raw }) => !raw)) {
|
|
531
|
+
const fieldName = getFieldName(field);
|
|
523
532
|
writer.write(
|
|
524
|
-
`'${
|
|
533
|
+
`'${getFieldName(field)}'${field.nonNull && field.default === void 0 && !OPTIONAL_SEED_FIELDS.includes(fieldName) ? "" : "?"}: ${getFieldInputType(
|
|
534
|
+
field,
|
|
535
|
+
rawModels.filter(isEnumModel).map(({ name: name2 }) => name2)
|
|
536
|
+
)}${field.list ? " | string" : ""}${field.nonNull ? "" : " | null"},`
|
|
525
537
|
).newLine();
|
|
526
538
|
}
|
|
527
539
|
}).blankLine();
|
|
528
540
|
}
|
|
541
|
+
writer.write(`export type SeedData = `).inlineBlock(() => {
|
|
542
|
+
for (const model of models) {
|
|
543
|
+
writer.write(`${model.name}: ${model.name}Seed[],`).newLine();
|
|
544
|
+
}
|
|
545
|
+
});
|
|
529
546
|
return writer.toString();
|
|
530
547
|
};
|
|
548
|
+
var getFieldName = ({ relation, name: name2, foreignKey }) => {
|
|
549
|
+
return foreignKey || `${name2}${relation ? "Id" : ""}`;
|
|
550
|
+
};
|
|
551
|
+
var getFieldOutputType = ({ relation, type, list: list2, json }) => {
|
|
552
|
+
if (json || relation) {
|
|
553
|
+
return "string";
|
|
554
|
+
}
|
|
555
|
+
return (PRIMITIVE_TYPES[type] || type) + (list2 ? "[]" : "");
|
|
556
|
+
};
|
|
557
|
+
var getFieldInputType = (field, stringTypes = []) => {
|
|
558
|
+
let outputType = getFieldOutputType(field);
|
|
559
|
+
if (field.list || stringTypes.includes(field.type)) {
|
|
560
|
+
outputType += " | string";
|
|
561
|
+
if (field.list && stringTypes.includes(field.type)) {
|
|
562
|
+
outputType += " | string[]";
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
return outputType;
|
|
566
|
+
};
|
|
531
567
|
var generateKnexTables = (rawModels) => {
|
|
532
568
|
const writer = new import_code_block_writer.default["default"]({
|
|
533
569
|
useSingleQuote: true,
|
package/dist/esm/db/generate.js
CHANGED
|
@@ -7,7 +7,9 @@ const PRIMITIVE_TYPES = {
|
|
|
7
7
|
Int: 'number',
|
|
8
8
|
Float: 'number',
|
|
9
9
|
String: 'string',
|
|
10
|
+
DateTime: 'DateTime | string',
|
|
10
11
|
};
|
|
12
|
+
const OPTIONAL_SEED_FIELDS = ['createdAt', 'createdById', 'updatedAt', 'updatedById', 'deletedAt', 'deletedById'];
|
|
11
13
|
export const generateDBModels = (rawModels) => {
|
|
12
14
|
const writer = new CodeBlockWriter['default']({
|
|
13
15
|
useSingleQuote: true,
|
|
@@ -19,22 +21,24 @@ export const generateDBModels = (rawModels) => {
|
|
|
19
21
|
}
|
|
20
22
|
const models = getModels(rawModels);
|
|
21
23
|
for (const model of models) {
|
|
24
|
+
// TODO: deprecate allowing to define foreignKey
|
|
25
|
+
const fields = model.fields.some((field) => field.foreignKey === 'id')
|
|
26
|
+
? model.fields.filter((field) => field.name !== 'id')
|
|
27
|
+
: model.fields;
|
|
22
28
|
writer
|
|
23
29
|
.write(`export type ${model.name} = `)
|
|
24
30
|
.inlineBlock(() => {
|
|
25
|
-
for (const
|
|
26
|
-
writer
|
|
27
|
-
.write(`'${name}${relation ? 'Id' : ''}': ${relation ? 'string' : PRIMITIVE_TYPES[type] || type}${nonNull ? '' : ' | null'},`)
|
|
28
|
-
.newLine();
|
|
31
|
+
for (const field of fields.filter(({ raw }) => !raw)) {
|
|
32
|
+
writer.write(`'${getFieldName(field)}': ${getFieldOutputType(field)}${field.nonNull ? '' : ' | null'},`).newLine();
|
|
29
33
|
}
|
|
30
34
|
})
|
|
31
35
|
.blankLine();
|
|
32
36
|
writer
|
|
33
37
|
.write(`export type ${model.name}Initializer = `)
|
|
34
38
|
.inlineBlock(() => {
|
|
35
|
-
for (const
|
|
39
|
+
for (const field of fields.filter(({ raw }) => !raw)) {
|
|
36
40
|
writer
|
|
37
|
-
.write(`'${
|
|
41
|
+
.write(`'${getFieldName(field)}'${field.nonNull && field.default === undefined ? '' : '?'}: ${getFieldInputType(field)}${field.nonNull ? '' : ' | null'},`)
|
|
38
42
|
.newLine();
|
|
39
43
|
}
|
|
40
44
|
})
|
|
@@ -42,16 +46,49 @@ export const generateDBModels = (rawModels) => {
|
|
|
42
46
|
writer
|
|
43
47
|
.write(`export type ${model.name}Mutator = `)
|
|
44
48
|
.inlineBlock(() => {
|
|
45
|
-
for (const
|
|
49
|
+
for (const field of fields.filter(({ raw }) => !raw)) {
|
|
50
|
+
writer.write(`'${getFieldName(field)}'?: ${getFieldInputType(field)}${field.nonNull ? '' : ' | null'},`).newLine();
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
.blankLine();
|
|
54
|
+
writer
|
|
55
|
+
.write(`export type ${model.name}Seed = `)
|
|
56
|
+
.inlineBlock(() => {
|
|
57
|
+
for (const field of fields.filter(({ raw }) => !raw)) {
|
|
58
|
+
const fieldName = getFieldName(field);
|
|
46
59
|
writer
|
|
47
|
-
.write(`'${
|
|
60
|
+
.write(`'${getFieldName(field)}'${field.nonNull && field.default === undefined && !OPTIONAL_SEED_FIELDS.includes(fieldName) ? '' : '?'}: ${getFieldInputType(field, rawModels.filter(isEnumModel).map(({ name }) => name))}${field.list ? ' | string' : ''}${field.nonNull ? '' : ' | null'},`)
|
|
48
61
|
.newLine();
|
|
49
62
|
}
|
|
50
63
|
})
|
|
51
64
|
.blankLine();
|
|
52
65
|
}
|
|
66
|
+
writer.write(`export type SeedData = `).inlineBlock(() => {
|
|
67
|
+
for (const model of models) {
|
|
68
|
+
writer.write(`${model.name}: ${model.name}Seed[],`).newLine();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
53
71
|
return writer.toString();
|
|
54
72
|
};
|
|
73
|
+
const getFieldName = ({ relation, name, foreignKey }) => {
|
|
74
|
+
return foreignKey || `${name}${relation ? 'Id' : ''}`;
|
|
75
|
+
};
|
|
76
|
+
const getFieldOutputType = ({ relation, type, list, json }) => {
|
|
77
|
+
if (json || relation) {
|
|
78
|
+
return 'string';
|
|
79
|
+
}
|
|
80
|
+
return (PRIMITIVE_TYPES[type] || type) + (list ? '[]' : '');
|
|
81
|
+
};
|
|
82
|
+
const getFieldInputType = (field, stringTypes = []) => {
|
|
83
|
+
let outputType = getFieldOutputType(field);
|
|
84
|
+
if (field.list || stringTypes.includes(field.type)) {
|
|
85
|
+
outputType += ' | string';
|
|
86
|
+
if (field.list && stringTypes.includes(field.type)) {
|
|
87
|
+
outputType += ' | string[]';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return outputType;
|
|
91
|
+
};
|
|
55
92
|
export const generateKnexTables = (rawModels) => {
|
|
56
93
|
const writer = new CodeBlockWriter['default']({
|
|
57
94
|
useSingleQuote: true,
|
|
@@ -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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"}
|
package/package.json
CHANGED
package/src/db/generate.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import CodeBlockWriter from 'code-block-writer';
|
|
2
|
-
import { RawModels, getModels, isEnumModel } from '..';
|
|
2
|
+
import { ModelField, RawModels, getModels, isEnumModel } from '..';
|
|
3
3
|
|
|
4
4
|
const PRIMITIVE_TYPES = {
|
|
5
5
|
ID: 'string',
|
|
@@ -8,8 +8,11 @@ const PRIMITIVE_TYPES = {
|
|
|
8
8
|
Int: 'number',
|
|
9
9
|
Float: 'number',
|
|
10
10
|
String: 'string',
|
|
11
|
+
DateTime: 'DateTime | string',
|
|
11
12
|
};
|
|
12
13
|
|
|
14
|
+
const OPTIONAL_SEED_FIELDS = ['createdAt', 'createdById', 'updatedAt', 'updatedById', 'deletedAt', 'deletedById'];
|
|
15
|
+
|
|
13
16
|
export const generateDBModels = (rawModels: RawModels) => {
|
|
14
17
|
const writer: CodeBlockWriter = new CodeBlockWriter['default']({
|
|
15
18
|
useSingleQuote: true,
|
|
@@ -25,17 +28,16 @@ export const generateDBModels = (rawModels: RawModels) => {
|
|
|
25
28
|
const models = getModels(rawModels);
|
|
26
29
|
|
|
27
30
|
for (const model of models) {
|
|
31
|
+
// TODO: deprecate allowing to define foreignKey
|
|
32
|
+
const fields = model.fields.some((field) => field.foreignKey === 'id')
|
|
33
|
+
? model.fields.filter((field) => field.name !== 'id')
|
|
34
|
+
: model.fields;
|
|
35
|
+
|
|
28
36
|
writer
|
|
29
37
|
.write(`export type ${model.name} = `)
|
|
30
38
|
.inlineBlock(() => {
|
|
31
|
-
for (const
|
|
32
|
-
writer
|
|
33
|
-
.write(
|
|
34
|
-
`'${name}${relation ? 'Id' : ''}': ${relation ? 'string' : PRIMITIVE_TYPES[type] || type}${
|
|
35
|
-
nonNull ? '' : ' | null'
|
|
36
|
-
},`
|
|
37
|
-
)
|
|
38
|
-
.newLine();
|
|
39
|
+
for (const field of fields.filter(({ raw }) => !raw)) {
|
|
40
|
+
writer.write(`'${getFieldName(field)}': ${getFieldOutputType(field)}${field.nonNull ? '' : ' | null'},`).newLine();
|
|
39
41
|
}
|
|
40
42
|
})
|
|
41
43
|
.blankLine();
|
|
@@ -43,12 +45,12 @@ export const generateDBModels = (rawModels: RawModels) => {
|
|
|
43
45
|
writer
|
|
44
46
|
.write(`export type ${model.name}Initializer = `)
|
|
45
47
|
.inlineBlock(() => {
|
|
46
|
-
for (const
|
|
48
|
+
for (const field of fields.filter(({ raw }) => !raw)) {
|
|
47
49
|
writer
|
|
48
50
|
.write(
|
|
49
|
-
`'${
|
|
50
|
-
|
|
51
|
-
}${nonNull ? '' : ' | null'},`
|
|
51
|
+
`'${getFieldName(field)}'${field.nonNull && field.default === undefined ? '' : '?'}: ${getFieldInputType(
|
|
52
|
+
field
|
|
53
|
+
)}${field.nonNull ? '' : ' | null'},`
|
|
52
54
|
)
|
|
53
55
|
.newLine();
|
|
54
56
|
}
|
|
@@ -58,12 +60,25 @@ export const generateDBModels = (rawModels: RawModels) => {
|
|
|
58
60
|
writer
|
|
59
61
|
.write(`export type ${model.name}Mutator = `)
|
|
60
62
|
.inlineBlock(() => {
|
|
61
|
-
for (const
|
|
63
|
+
for (const field of fields.filter(({ raw }) => !raw)) {
|
|
64
|
+
writer.write(`'${getFieldName(field)}'?: ${getFieldInputType(field)}${field.nonNull ? '' : ' | null'},`).newLine();
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
.blankLine();
|
|
68
|
+
|
|
69
|
+
writer
|
|
70
|
+
.write(`export type ${model.name}Seed = `)
|
|
71
|
+
.inlineBlock(() => {
|
|
72
|
+
for (const field of fields.filter(({ raw }) => !raw)) {
|
|
73
|
+
const fieldName = getFieldName(field);
|
|
62
74
|
writer
|
|
63
75
|
.write(
|
|
64
|
-
`'${
|
|
65
|
-
nonNull ? '' : '
|
|
66
|
-
}
|
|
76
|
+
`'${getFieldName(field)}'${
|
|
77
|
+
field.nonNull && field.default === undefined && !OPTIONAL_SEED_FIELDS.includes(fieldName) ? '' : '?'
|
|
78
|
+
}: ${getFieldInputType(
|
|
79
|
+
field,
|
|
80
|
+
rawModels.filter(isEnumModel).map(({ name }) => name)
|
|
81
|
+
)}${field.list ? ' | string' : ''}${field.nonNull ? '' : ' | null'},`
|
|
67
82
|
)
|
|
68
83
|
.newLine();
|
|
69
84
|
}
|
|
@@ -71,9 +86,40 @@ export const generateDBModels = (rawModels: RawModels) => {
|
|
|
71
86
|
.blankLine();
|
|
72
87
|
}
|
|
73
88
|
|
|
89
|
+
writer.write(`export type SeedData = `).inlineBlock(() => {
|
|
90
|
+
for (const model of models) {
|
|
91
|
+
writer.write(`${model.name}: ${model.name}Seed[],`).newLine();
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
74
95
|
return writer.toString();
|
|
75
96
|
};
|
|
76
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';
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return (PRIMITIVE_TYPES[type] || type) + (list ? '[]' : '');
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const getFieldInputType = (field: ModelField, stringTypes: string[] = []) => {
|
|
111
|
+
let outputType = getFieldOutputType(field);
|
|
112
|
+
|
|
113
|
+
if (field.list || stringTypes.includes(field.type)) {
|
|
114
|
+
outputType += ' | string';
|
|
115
|
+
if (field.list && stringTypes.includes(field.type)) {
|
|
116
|
+
outputType += ' | string[]';
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return outputType;
|
|
121
|
+
};
|
|
122
|
+
|
|
77
123
|
export const generateKnexTables = (rawModels: RawModels) => {
|
|
78
124
|
const writer: CodeBlockWriter = new CodeBlockWriter['default']({
|
|
79
125
|
useSingleQuote: true,
|