@smartive/graphql-magic 8.0.0 → 8.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 +6 -1
- package/README.md +8 -15
- package/dist/bin/gqm.cjs +1812 -0
- package/dist/cjs/index.cjs +544 -6
- package/dist/esm/bin/gqm.d.ts +2 -0
- package/dist/esm/bin/gqm.js +121 -0
- package/dist/esm/bin/gqm.js.map +1 -0
- package/dist/esm/client/mutations.d.ts +2 -2
- package/dist/esm/client/mutations.js +2 -1
- package/dist/esm/client/mutations.js.map +1 -1
- package/dist/esm/gqm/codegen.d.ts +2 -0
- package/dist/esm/gqm/codegen.js +46 -0
- package/dist/esm/gqm/codegen.js.map +1 -0
- package/dist/esm/gqm/index.d.ts +9 -0
- package/dist/esm/gqm/index.js +11 -0
- package/dist/esm/gqm/index.js.map +1 -0
- package/dist/esm/gqm/parse-knexfile.d.ts +2 -0
- package/dist/esm/gqm/parse-knexfile.js +19 -0
- package/dist/esm/gqm/parse-knexfile.js.map +1 -0
- package/dist/esm/gqm/parse-models.d.ts +2 -0
- package/dist/esm/gqm/parse-models.js +19 -0
- package/dist/esm/gqm/parse-models.js.map +1 -0
- package/dist/esm/gqm/readline.d.ts +1 -0
- package/dist/esm/gqm/readline.js +14 -0
- package/dist/esm/gqm/readline.js.map +1 -0
- package/dist/esm/gqm/settings.d.ts +9 -0
- package/dist/esm/gqm/settings.js +98 -0
- package/dist/esm/gqm/settings.js.map +1 -0
- package/dist/esm/gqm/static-eval.d.ts +3 -0
- package/dist/esm/gqm/static-eval.js +188 -0
- package/dist/esm/gqm/static-eval.js.map +1 -0
- package/dist/esm/gqm/templates.d.ts +4 -0
- package/dist/esm/gqm/templates.js +62 -0
- package/dist/esm/gqm/templates.js.map +1 -0
- package/dist/esm/gqm/utils.d.ts +2 -0
- package/dist/esm/gqm/utils.js +22 -0
- package/dist/esm/gqm/utils.js.map +1 -0
- package/dist/esm/gqm/visitor.d.ts +8 -0
- package/dist/esm/gqm/visitor.js +15 -0
- package/dist/esm/gqm/visitor.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/migrations/generate.d.ts +1 -0
- package/dist/esm/migrations/generate.js +11 -0
- package/dist/esm/migrations/generate.js.map +1 -1
- package/dist/esm/models/models.d.ts +6 -0
- package/dist/esm/models/utils.d.ts +8 -0
- package/dist/esm/models/utils.js +1 -0
- package/dist/esm/models/utils.js.map +1 -1
- package/dist/esm/schema/generate.js +14 -2
- package/dist/esm/schema/generate.js.map +1 -1
- package/package.json +17 -4
- package/src/bin/gqm.ts +146 -0
- package/src/client/mutations.ts +4 -3
- package/src/gqm/codegen.ts +47 -0
- package/src/gqm/index.ts +11 -0
- package/src/gqm/parse-knexfile.ts +21 -0
- package/src/gqm/parse-models.ts +24 -0
- package/src/gqm/readline.ts +15 -0
- package/src/gqm/settings.ts +112 -0
- package/src/gqm/static-eval.ts +203 -0
- package/src/gqm/templates.ts +64 -0
- package/src/gqm/utils.ts +23 -0
- package/src/gqm/visitor.ts +29 -0
- package/src/index.ts +1 -0
- package/src/migrations/generate.ts +13 -0
- package/src/models/models.ts +5 -0
- package/src/models/utils.ts +3 -0
- package/src/schema/generate.ts +14 -1
- package/tests/utils/generate-migration.ts +2 -13
package/dist/cjs/index.cjs
CHANGED
|
@@ -30,10 +30,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
var src_exports = {};
|
|
31
31
|
__export(src_exports, {
|
|
32
32
|
AliasGenerator: () => AliasGenerator,
|
|
33
|
+
CLIENT_CODEGEN: () => CLIENT_CODEGEN,
|
|
34
|
+
EMPTY_MODELS: () => EMPTY_MODELS,
|
|
33
35
|
Enum: () => Enum,
|
|
34
36
|
ForbiddenError: () => ForbiddenError,
|
|
37
|
+
GRAPHQL_CODEGEN: () => GRAPHQL_CODEGEN,
|
|
35
38
|
GraphQLError: () => GraphQLError,
|
|
36
39
|
ID_ALIAS: () => ID_ALIAS,
|
|
40
|
+
KNEXFILE: () => KNEXFILE,
|
|
41
|
+
KNEXFILE_PATH: () => KNEXFILE_PATH,
|
|
37
42
|
MigrationGenerator: () => MigrationGenerator,
|
|
38
43
|
NotFoundError: () => NotFoundError,
|
|
39
44
|
PermissionError: () => PermissionError,
|
|
@@ -53,12 +58,16 @@ __export(src_exports, {
|
|
|
53
58
|
displayField: () => displayField,
|
|
54
59
|
document: () => document,
|
|
55
60
|
enm: () => enm,
|
|
61
|
+
ensureFileExists: () => ensureFileExists,
|
|
56
62
|
execute: () => execute,
|
|
57
63
|
fieldType: () => fieldType,
|
|
58
64
|
fields: () => fields,
|
|
65
|
+
findDeclarationInFile: () => findDeclarationInFile,
|
|
59
66
|
generate: () => generate,
|
|
60
67
|
generateDBModels: () => generateDBModels,
|
|
61
68
|
generateDefinitions: () => generateDefinitions,
|
|
69
|
+
generateGraphqlApiTypes: () => generateGraphqlApiTypes,
|
|
70
|
+
generateGraphqlClientTypes: () => generateGraphqlClientTypes,
|
|
62
71
|
generateKnexTables: () => generateKnexTables,
|
|
63
72
|
generateMutations: () => generateMutations,
|
|
64
73
|
generatePermissions: () => generatePermissions,
|
|
@@ -76,6 +85,7 @@ __export(src_exports, {
|
|
|
76
85
|
getManyToManyRelation: () => getManyToManyRelation,
|
|
77
86
|
getManyToManyRelations: () => getManyToManyRelations,
|
|
78
87
|
getManyToManyRelationsQuery: () => getManyToManyRelationsQuery,
|
|
88
|
+
getMigrationDate: () => getMigrationDate,
|
|
79
89
|
getModelLabel: () => getModelLabel,
|
|
80
90
|
getModelLabelPlural: () => getModelLabelPlural,
|
|
81
91
|
getModelPlural: () => getModelPlural,
|
|
@@ -88,6 +98,8 @@ __export(src_exports, {
|
|
|
88
98
|
getResolverNode: () => getResolverNode,
|
|
89
99
|
getResolvers: () => getResolvers,
|
|
90
100
|
getRootFieldNode: () => getRootFieldNode,
|
|
101
|
+
getSetting: () => getSetting,
|
|
102
|
+
getSettings: () => getSettings,
|
|
91
103
|
getSimpleFields: () => getSimpleFields,
|
|
92
104
|
getString: () => getString,
|
|
93
105
|
getType: () => getType,
|
|
@@ -110,6 +122,7 @@ __export(src_exports, {
|
|
|
110
122
|
isFieldNode: () => isFieldNode,
|
|
111
123
|
isFragmentSpreadNode: () => isFragmentSpreadNode,
|
|
112
124
|
isInlineFragmentNode: () => isInlineFragmentNode,
|
|
125
|
+
isInputModel: () => isInputModel,
|
|
113
126
|
isListType: () => isListType,
|
|
114
127
|
isObjectModel: () => isObjectModel,
|
|
115
128
|
isPrimitive: () => isPrimitive,
|
|
@@ -137,19 +150,25 @@ __export(src_exports, {
|
|
|
137
150
|
not: () => not,
|
|
138
151
|
object: () => object,
|
|
139
152
|
ors: () => ors,
|
|
153
|
+
parseKnexfile: () => parseKnexfile,
|
|
154
|
+
parseModels: () => parseModels,
|
|
140
155
|
printSchema: () => printSchema,
|
|
141
156
|
printSchemaFromDocument: () => printSchemaFromDocument,
|
|
142
157
|
printSchemaFromModels: () => printSchemaFromModels,
|
|
143
158
|
queryRelations: () => queryRelations,
|
|
144
159
|
queryResolver: () => queryResolver,
|
|
160
|
+
readLine: () => readLine,
|
|
145
161
|
resolve: () => resolve,
|
|
146
162
|
retry: () => retry,
|
|
147
163
|
scalar: () => scalar,
|
|
164
|
+
staticEval: () => staticEval,
|
|
148
165
|
summon: () => summon,
|
|
149
166
|
summonByKey: () => summonByKey,
|
|
150
167
|
summonByName: () => summonByName,
|
|
151
168
|
typeToField: () => typeToField,
|
|
152
|
-
value: () => value
|
|
169
|
+
value: () => value,
|
|
170
|
+
visit: () => visit,
|
|
171
|
+
writeToFile: () => writeToFile
|
|
153
172
|
});
|
|
154
173
|
module.exports = __toCommonJS(src_exports);
|
|
155
174
|
|
|
@@ -202,7 +221,7 @@ var import_upperCase = __toESM(require("lodash/upperCase"), 1);
|
|
|
202
221
|
var constantCase = (str) => (0, import_upperCase.default)(str).replace(/ /g, "_");
|
|
203
222
|
var generateMutations = (models) => {
|
|
204
223
|
const parts = [];
|
|
205
|
-
for (const { name: name2, creatable, updatable, deletable } of models) {
|
|
224
|
+
for (const { name: name2, creatable, updatable, deletable } of models.filter(isEntityModel)) {
|
|
206
225
|
if (creatable) {
|
|
207
226
|
parts.push(
|
|
208
227
|
`export const CREATE_${constantCase(
|
|
@@ -266,6 +285,7 @@ var isEnumModel = (model) => model.kind === "enum";
|
|
|
266
285
|
var isRawEnumModel = (model) => model.kind === "raw-enum";
|
|
267
286
|
var isScalarModel = (model) => model.kind === "scalar";
|
|
268
287
|
var isObjectModel = (model) => model.kind === "object";
|
|
288
|
+
var isInputModel = (model) => model.kind === "input";
|
|
269
289
|
var isEnumList = (models, field) => field?.list === true && models.find(({ name: name2 }) => name2 === field.kind)?.kind === "enum";
|
|
270
290
|
var and = (...predicates) => (field) => predicates.every((predicate) => predicate(field));
|
|
271
291
|
var not = (predicate) => (field) => !predicate(field);
|
|
@@ -701,6 +721,491 @@ var generateKnexTables = (rawModels) => {
|
|
|
701
721
|
return writer.toString();
|
|
702
722
|
};
|
|
703
723
|
|
|
724
|
+
// src/gqm/codegen.ts
|
|
725
|
+
var import_cli = require("@graphql-codegen/cli");
|
|
726
|
+
|
|
727
|
+
// src/gqm/settings.ts
|
|
728
|
+
var import_fs = require("fs");
|
|
729
|
+
var import_path = require("path");
|
|
730
|
+
|
|
731
|
+
// src/gqm/readline.ts
|
|
732
|
+
var import_readline = __toESM(require("readline"), 1);
|
|
733
|
+
var readLine = (prompt) => {
|
|
734
|
+
const rl = import_readline.default.createInterface({
|
|
735
|
+
input: process.stdin,
|
|
736
|
+
output: process.stdout
|
|
737
|
+
});
|
|
738
|
+
return new Promise((resolve2) => {
|
|
739
|
+
rl.question(prompt, (answer) => {
|
|
740
|
+
rl.close();
|
|
741
|
+
resolve2(answer);
|
|
742
|
+
});
|
|
743
|
+
});
|
|
744
|
+
};
|
|
745
|
+
|
|
746
|
+
// src/gqm/templates.ts
|
|
747
|
+
var EMPTY_MODELS = `
|
|
748
|
+
import { RawModels, getModels } from '@smartive/graphql-magic';
|
|
749
|
+
|
|
750
|
+
export const rawModels: RawModels = [
|
|
751
|
+
{
|
|
752
|
+
kind: 'entity',
|
|
753
|
+
name: 'User',
|
|
754
|
+
fields: []
|
|
755
|
+
},
|
|
756
|
+
]
|
|
757
|
+
|
|
758
|
+
export const models = getModels(rawModels);
|
|
759
|
+
`;
|
|
760
|
+
var GRAPHQL_CODEGEN = (path) => `
|
|
761
|
+
overwrite: true
|
|
762
|
+
schema: '${path}/schema.graphql'
|
|
763
|
+
documents: null
|
|
764
|
+
generates:
|
|
765
|
+
${path}/api/index.ts:
|
|
766
|
+
plugins:
|
|
767
|
+
- 'typescript'
|
|
768
|
+
- 'typescript-resolvers'
|
|
769
|
+
- add:
|
|
770
|
+
content: "import { DateTime } from 'luxon'"
|
|
771
|
+
config:
|
|
772
|
+
scalars:
|
|
773
|
+
DateTime: DateTime
|
|
774
|
+
`;
|
|
775
|
+
var CLIENT_CODEGEN = (path) => `
|
|
776
|
+
schema: ${path}/schema.graphql
|
|
777
|
+
documents: [ './src/**/*.ts', './src/**/*.tsx' ]
|
|
778
|
+
generates:
|
|
779
|
+
${path}/client/index.ts:
|
|
780
|
+
plugins:
|
|
781
|
+
- typescript
|
|
782
|
+
- typescript-operations
|
|
783
|
+
- typescript-compatibility
|
|
784
|
+
|
|
785
|
+
config:
|
|
786
|
+
preResolveTypes: true # Simplifies the generated types
|
|
787
|
+
namingConvention: keep # Keeps naming as-is
|
|
788
|
+
nonOptionalTypename: true # Forces \`__typename\` on all selection sets
|
|
789
|
+
skipTypeNameForRoot: true # Don't generate __typename for root types
|
|
790
|
+
avoidOptionals: # Avoids optionals on the level of the field
|
|
791
|
+
field: true
|
|
792
|
+
scalars:
|
|
793
|
+
DateTime: string
|
|
794
|
+
`;
|
|
795
|
+
var KNEXFILE = `
|
|
796
|
+
const config = {
|
|
797
|
+
client: 'postgresql',
|
|
798
|
+
connection: {
|
|
799
|
+
host: process.env.DATABASE_HOST,
|
|
800
|
+
database: process.env.DATABASE_NAME,
|
|
801
|
+
user: process.env.DATABASE_USER,
|
|
802
|
+
password: process.env.DATABASE_PASSWORD,
|
|
803
|
+
},
|
|
804
|
+
} as const;
|
|
805
|
+
|
|
806
|
+
export default config;
|
|
807
|
+
`;
|
|
808
|
+
|
|
809
|
+
// src/gqm/settings.ts
|
|
810
|
+
var SETTINGS_PATH = ".gqmrc.json";
|
|
811
|
+
var DEFAULTS = {
|
|
812
|
+
modelsPath: {
|
|
813
|
+
question: "What is the models path?",
|
|
814
|
+
defaultValue: "src/config/models.ts",
|
|
815
|
+
init: (path) => {
|
|
816
|
+
ensureFileExists(path, EMPTY_MODELS);
|
|
817
|
+
}
|
|
818
|
+
},
|
|
819
|
+
generatedFolderPath: {
|
|
820
|
+
question: "What is the path for generated stuff?",
|
|
821
|
+
defaultValue: "src/generated",
|
|
822
|
+
init: (path) => {
|
|
823
|
+
ensureFileExists(`${path}/.gitkeep`, "");
|
|
824
|
+
ensureFileExists(`${path}/db/.gitkeep`, "");
|
|
825
|
+
ensureFileExists(`${path}/api/.gitkeep`, "");
|
|
826
|
+
ensureFileExists(`${path}/client/.gitkeep`, "");
|
|
827
|
+
ensureFileExists(`graphql-codegen.yml`, GRAPHQL_CODEGEN(path));
|
|
828
|
+
ensureFileExists(`client-codegen.yml`, CLIENT_CODEGEN(path));
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
};
|
|
832
|
+
var initSetting = async (name2) => {
|
|
833
|
+
const { question, defaultValue, init } = DEFAULTS[name2];
|
|
834
|
+
const value2 = await readLine(`${question} (${defaultValue})`) || defaultValue;
|
|
835
|
+
init(value2);
|
|
836
|
+
return value2;
|
|
837
|
+
};
|
|
838
|
+
var initSettings = async () => {
|
|
839
|
+
const settings = {};
|
|
840
|
+
for (const name2 of Object.keys(DEFAULTS)) {
|
|
841
|
+
settings[name2] = await initSetting(name2);
|
|
842
|
+
}
|
|
843
|
+
saveSettings(settings);
|
|
844
|
+
};
|
|
845
|
+
var saveSettings = (settings) => {
|
|
846
|
+
writeToFile(SETTINGS_PATH, JSON.stringify(settings, null, 2));
|
|
847
|
+
};
|
|
848
|
+
var getSettings = async () => {
|
|
849
|
+
if (!(0, import_fs.existsSync)(SETTINGS_PATH)) {
|
|
850
|
+
await initSettings();
|
|
851
|
+
}
|
|
852
|
+
return JSON.parse((0, import_fs.readFileSync)(SETTINGS_PATH, "utf8"));
|
|
853
|
+
};
|
|
854
|
+
var getSetting = async (name2) => {
|
|
855
|
+
const settings = await getSettings();
|
|
856
|
+
if (!(name2 in settings)) {
|
|
857
|
+
settings[name2] = await initSetting(name2);
|
|
858
|
+
saveSettings(settings);
|
|
859
|
+
}
|
|
860
|
+
return settings[name2];
|
|
861
|
+
};
|
|
862
|
+
var ensureDirectoryExists = (filePath) => {
|
|
863
|
+
const dir = (0, import_path.dirname)(filePath);
|
|
864
|
+
if ((0, import_fs.existsSync)(dir)) {
|
|
865
|
+
return true;
|
|
866
|
+
}
|
|
867
|
+
ensureDirectoryExists(dir);
|
|
868
|
+
try {
|
|
869
|
+
(0, import_fs.mkdirSync)(dir);
|
|
870
|
+
return true;
|
|
871
|
+
} catch (err) {
|
|
872
|
+
if (err.code === "EEXIST") {
|
|
873
|
+
return true;
|
|
874
|
+
}
|
|
875
|
+
throw err;
|
|
876
|
+
}
|
|
877
|
+
};
|
|
878
|
+
var ensureFileExists = (filePath, content) => {
|
|
879
|
+
if (!(0, import_fs.existsSync)(filePath)) {
|
|
880
|
+
console.info(`Creating ${filePath}`);
|
|
881
|
+
ensureDirectoryExists(filePath);
|
|
882
|
+
(0, import_fs.writeFileSync)(filePath, content);
|
|
883
|
+
}
|
|
884
|
+
};
|
|
885
|
+
var writeToFile = (filePath, content) => {
|
|
886
|
+
ensureDirectoryExists(filePath);
|
|
887
|
+
if ((0, import_fs.existsSync)(filePath)) {
|
|
888
|
+
const currentContent = (0, import_fs.readFileSync)(filePath, "utf-8");
|
|
889
|
+
if (content === currentContent) {
|
|
890
|
+
} else {
|
|
891
|
+
(0, import_fs.writeFileSync)(filePath, content);
|
|
892
|
+
console.info(`${filePath} updated`);
|
|
893
|
+
}
|
|
894
|
+
} else {
|
|
895
|
+
(0, import_fs.writeFileSync)(filePath, content);
|
|
896
|
+
console.info(`Created ${filePath}`);
|
|
897
|
+
}
|
|
898
|
+
};
|
|
899
|
+
|
|
900
|
+
// src/gqm/codegen.ts
|
|
901
|
+
var generateGraphqlApiTypes = async () => {
|
|
902
|
+
const generatedFolderPath = await getSetting("generatedFolderPath");
|
|
903
|
+
await (0, import_cli.generate)({
|
|
904
|
+
overwrite: true,
|
|
905
|
+
schema: `${generatedFolderPath}/schema.graphql`,
|
|
906
|
+
documents: null,
|
|
907
|
+
generates: {
|
|
908
|
+
[`${generatedFolderPath}/api/index.ts`]: {
|
|
909
|
+
plugins: ["typescript", "typescript-resolvers", { add: { content: `import { DateTime } from 'luxon';` } }]
|
|
910
|
+
}
|
|
911
|
+
},
|
|
912
|
+
config: {
|
|
913
|
+
scalars: {
|
|
914
|
+
DateTime: "DateTime"
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
});
|
|
918
|
+
};
|
|
919
|
+
var generateGraphqlClientTypes = async () => {
|
|
920
|
+
const generatedFolderPath = await getSetting("generatedFolderPath");
|
|
921
|
+
await (0, import_cli.generate)({
|
|
922
|
+
schema: `${generatedFolderPath}/schema.graphql`,
|
|
923
|
+
documents: ["./src/**/*.ts", "./src/**/*.tsx"],
|
|
924
|
+
generates: {
|
|
925
|
+
[`${generatedFolderPath}/client/index.ts`]: {
|
|
926
|
+
plugins: ["typescript", "typescript-operations", "typescript-compatibility"]
|
|
927
|
+
}
|
|
928
|
+
},
|
|
929
|
+
config: {
|
|
930
|
+
preResolveTypes: true,
|
|
931
|
+
// Simplifies the generated types
|
|
932
|
+
namingConvention: "keep",
|
|
933
|
+
// Keeps naming as-is
|
|
934
|
+
nonOptionalTypename: true,
|
|
935
|
+
// Forces `__typename` on all selection sets
|
|
936
|
+
skipTypeNameForRoot: true,
|
|
937
|
+
// Don't generate __typename for root types
|
|
938
|
+
avoidOptionals: {
|
|
939
|
+
// Avoids optionals on the level of the field
|
|
940
|
+
field: true
|
|
941
|
+
},
|
|
942
|
+
scalars: {
|
|
943
|
+
DateTime: "string"
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
});
|
|
947
|
+
};
|
|
948
|
+
|
|
949
|
+
// src/gqm/parse-knexfile.ts
|
|
950
|
+
var import_ts_morph4 = require("ts-morph");
|
|
951
|
+
|
|
952
|
+
// src/gqm/static-eval.ts
|
|
953
|
+
var import_ts_morph2 = require("ts-morph");
|
|
954
|
+
|
|
955
|
+
// src/gqm/visitor.ts
|
|
956
|
+
var import_ts_morph = require("ts-morph");
|
|
957
|
+
var visit = (node, context, visitor2) => {
|
|
958
|
+
const kind = node?.getKind();
|
|
959
|
+
if (kind in visitor2) {
|
|
960
|
+
return visitor2[kind](node.asKindOrThrow(kind), context);
|
|
961
|
+
}
|
|
962
|
+
if ("unknown" in visitor2) {
|
|
963
|
+
return visitor2.unknown(node);
|
|
964
|
+
}
|
|
965
|
+
console.error(node.getText());
|
|
966
|
+
console.error(node.getParent().getText());
|
|
967
|
+
throw new Error(
|
|
968
|
+
`Cannot handle kind ${get(
|
|
969
|
+
Object.entries(import_ts_morph.SyntaxKind).find(([, val]) => val === kind),
|
|
970
|
+
0
|
|
971
|
+
)}`
|
|
972
|
+
);
|
|
973
|
+
};
|
|
974
|
+
|
|
975
|
+
// src/gqm/static-eval.ts
|
|
976
|
+
var staticEval = (node, context) => visit(node, context, visitor);
|
|
977
|
+
var visitor = {
|
|
978
|
+
undefined: () => void 0,
|
|
979
|
+
[import_ts_morph2.SyntaxKind.VariableDeclaration]: (node, context) => staticEval(node.getInitializer(), context),
|
|
980
|
+
[import_ts_morph2.SyntaxKind.ArrayLiteralExpression]: (node, context) => {
|
|
981
|
+
const values = [];
|
|
982
|
+
for (const value2 of node.getElements()) {
|
|
983
|
+
if (value2.isKind(import_ts_morph2.SyntaxKind.SpreadElement)) {
|
|
984
|
+
values.push(...staticEval(value2, context));
|
|
985
|
+
} else {
|
|
986
|
+
values.push(staticEval(value2, context));
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
return values;
|
|
990
|
+
},
|
|
991
|
+
[import_ts_morph2.SyntaxKind.ObjectLiteralExpression]: (node, context) => {
|
|
992
|
+
const result = {};
|
|
993
|
+
for (const property of node.getProperties()) {
|
|
994
|
+
Object.assign(result, staticEval(property, context));
|
|
995
|
+
}
|
|
996
|
+
return result;
|
|
997
|
+
},
|
|
998
|
+
[import_ts_morph2.SyntaxKind.StringLiteral]: (node) => node.getLiteralValue(),
|
|
999
|
+
[import_ts_morph2.SyntaxKind.PropertyAssignment]: (node, context) => ({
|
|
1000
|
+
[node.getName()]: staticEval(node.getInitializer(), context)
|
|
1001
|
+
}),
|
|
1002
|
+
[import_ts_morph2.SyntaxKind.ShorthandPropertyAssignment]: (node, context) => ({
|
|
1003
|
+
[node.getName()]: staticEval(node.getNameNode(), context)
|
|
1004
|
+
}),
|
|
1005
|
+
[import_ts_morph2.SyntaxKind.SpreadElement]: (node, context) => staticEval(node.getExpression(), context),
|
|
1006
|
+
[import_ts_morph2.SyntaxKind.SpreadAssignment]: (node, context) => staticEval(node.getExpression(), context),
|
|
1007
|
+
[import_ts_morph2.SyntaxKind.Identifier]: (node, context) => {
|
|
1008
|
+
switch (node.getText()) {
|
|
1009
|
+
case "undefined":
|
|
1010
|
+
return void 0;
|
|
1011
|
+
case "process":
|
|
1012
|
+
return process;
|
|
1013
|
+
}
|
|
1014
|
+
const definitionNodes = node.getDefinitionNodes();
|
|
1015
|
+
if (!definitionNodes.length) {
|
|
1016
|
+
throw new Error(`No definition node found for identifier ${node.getText()}.`);
|
|
1017
|
+
}
|
|
1018
|
+
return staticEval(definitionNodes[0], context);
|
|
1019
|
+
},
|
|
1020
|
+
[import_ts_morph2.SyntaxKind.ParenthesizedExpression]: (node, context) => staticEval(node.getExpression(), context),
|
|
1021
|
+
[import_ts_morph2.SyntaxKind.AsExpression]: (node, context) => staticEval(node.getExpression(), context),
|
|
1022
|
+
[import_ts_morph2.SyntaxKind.ConditionalExpression]: (node, context) => staticEval(node.getCondition(), context) ? staticEval(node.getWhenTrue(), context) : staticEval(node.getWhenFalse(), context),
|
|
1023
|
+
[import_ts_morph2.SyntaxKind.TrueKeyword]: () => true,
|
|
1024
|
+
[import_ts_morph2.SyntaxKind.FalseKeyword]: () => false,
|
|
1025
|
+
[import_ts_morph2.SyntaxKind.NumericLiteral]: (node) => node.getLiteralValue(),
|
|
1026
|
+
[import_ts_morph2.SyntaxKind.CallExpression]: (node, context) => {
|
|
1027
|
+
const method = staticEval(node.getExpression(), context);
|
|
1028
|
+
const args2 = node.getArguments().map((arg) => staticEval(arg, context));
|
|
1029
|
+
return method(...args2);
|
|
1030
|
+
},
|
|
1031
|
+
[import_ts_morph2.SyntaxKind.PropertyAccessExpression]: (node, context) => {
|
|
1032
|
+
const target = staticEval(node.getExpression(), context);
|
|
1033
|
+
const property = target[node.getName()];
|
|
1034
|
+
if (typeof property === "function") {
|
|
1035
|
+
if (Array.isArray(target)) {
|
|
1036
|
+
switch (node.getName()) {
|
|
1037
|
+
case "map":
|
|
1038
|
+
case "flatMap":
|
|
1039
|
+
case "includes":
|
|
1040
|
+
case "some":
|
|
1041
|
+
case "find":
|
|
1042
|
+
case "filter":
|
|
1043
|
+
return target[node.getName()].bind(target);
|
|
1044
|
+
}
|
|
1045
|
+
} else if (typeof target === "string") {
|
|
1046
|
+
const name2 = node.getName();
|
|
1047
|
+
switch (name2) {
|
|
1048
|
+
case "slice":
|
|
1049
|
+
case "toUpperCase":
|
|
1050
|
+
case "toLowerCase":
|
|
1051
|
+
return target[name2].bind(target);
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
throw new Error(`Cannot handle method ${node.getName()} on type ${typeof target}`);
|
|
1055
|
+
}
|
|
1056
|
+
return property;
|
|
1057
|
+
},
|
|
1058
|
+
[import_ts_morph2.SyntaxKind.ArrowFunction]: (node, context) => {
|
|
1059
|
+
return (...args2) => {
|
|
1060
|
+
const parameters = {};
|
|
1061
|
+
let i = 0;
|
|
1062
|
+
for (const parameter of node.getParameters()) {
|
|
1063
|
+
parameters[parameter.getName()] = args2[i];
|
|
1064
|
+
i++;
|
|
1065
|
+
}
|
|
1066
|
+
return staticEval(node.getBody(), { ...context, ...parameters });
|
|
1067
|
+
};
|
|
1068
|
+
},
|
|
1069
|
+
[import_ts_morph2.SyntaxKind.Block]: (node, context) => {
|
|
1070
|
+
for (const statement of node.getStatements()) {
|
|
1071
|
+
return staticEval(statement, context);
|
|
1072
|
+
}
|
|
1073
|
+
},
|
|
1074
|
+
[import_ts_morph2.SyntaxKind.CaseClause]: (node, context) => {
|
|
1075
|
+
const statements = node.getStatements();
|
|
1076
|
+
if (statements.length !== 1) {
|
|
1077
|
+
console.error(node.getText());
|
|
1078
|
+
throw new Error(`Can only handle code blocks with 1 statement.`);
|
|
1079
|
+
}
|
|
1080
|
+
return staticEval(statements[0], context);
|
|
1081
|
+
},
|
|
1082
|
+
[import_ts_morph2.SyntaxKind.DefaultClause]: (node, context) => {
|
|
1083
|
+
const statements = node.getStatements();
|
|
1084
|
+
if (statements.length !== 1) {
|
|
1085
|
+
console.error(node.getText());
|
|
1086
|
+
throw new Error(`Can only handle code blocks with exactly 1 statement.`);
|
|
1087
|
+
}
|
|
1088
|
+
return staticEval(statements[0], context);
|
|
1089
|
+
},
|
|
1090
|
+
[import_ts_morph2.SyntaxKind.ReturnStatement]: (node, context) => {
|
|
1091
|
+
return staticEval(node.getExpression(), context);
|
|
1092
|
+
},
|
|
1093
|
+
[import_ts_morph2.SyntaxKind.SwitchStatement]: (node, context) => {
|
|
1094
|
+
const value2 = staticEval(node.getExpression(), context);
|
|
1095
|
+
let active = false;
|
|
1096
|
+
for (const clause of node.getCaseBlock().getClauses()) {
|
|
1097
|
+
switch (clause.getKind()) {
|
|
1098
|
+
case import_ts_morph2.SyntaxKind.DefaultClause:
|
|
1099
|
+
return staticEval(clause, context);
|
|
1100
|
+
case import_ts_morph2.SyntaxKind.CaseClause: {
|
|
1101
|
+
const caseClause = clause.asKindOrThrow(import_ts_morph2.SyntaxKind.CaseClause);
|
|
1102
|
+
if (caseClause.getStatements().length && active) {
|
|
1103
|
+
return staticEval(clause, context);
|
|
1104
|
+
}
|
|
1105
|
+
const caseValue = staticEval(caseClause.getExpression(), context);
|
|
1106
|
+
if (value2 === caseValue) {
|
|
1107
|
+
active = true;
|
|
1108
|
+
if (caseClause.getStatements().length) {
|
|
1109
|
+
return staticEval(clause, context);
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
},
|
|
1116
|
+
[import_ts_morph2.SyntaxKind.Parameter]: (node, context) => context[node.getName()],
|
|
1117
|
+
[import_ts_morph2.SyntaxKind.BinaryExpression]: (node, context) => {
|
|
1118
|
+
switch (node.getOperatorToken().getKind()) {
|
|
1119
|
+
case import_ts_morph2.SyntaxKind.EqualsEqualsEqualsToken:
|
|
1120
|
+
return staticEval(node.getLeft(), context) === staticEval(node.getRight(), context);
|
|
1121
|
+
case import_ts_morph2.SyntaxKind.BarBarToken:
|
|
1122
|
+
return staticEval(node.getLeft(), context) || staticEval(node.getRight(), context);
|
|
1123
|
+
default:
|
|
1124
|
+
throw new Error(`Cannot handle operator of kind ${node.getOperatorToken().getKindName()}`);
|
|
1125
|
+
}
|
|
1126
|
+
},
|
|
1127
|
+
[import_ts_morph2.SyntaxKind.SatisfiesExpression]: (node, context) => staticEval(node.getExpression(), context),
|
|
1128
|
+
[import_ts_morph2.SyntaxKind.TemplateExpression]: (node, context) => node.getHead().getLiteralText() + node.getTemplateSpans().map((span) => staticEval(span.getExpression(), context) + staticEval(span.getLiteral(), context)).join(""),
|
|
1129
|
+
[import_ts_morph2.SyntaxKind.TemplateTail]: (node) => node.getLiteralText(),
|
|
1130
|
+
[import_ts_morph2.SyntaxKind.TemplateMiddle]: (node) => node.getLiteralText(),
|
|
1131
|
+
[import_ts_morph2.SyntaxKind.PrefixUnaryExpression]: (node, context) => {
|
|
1132
|
+
switch (node.getOperatorToken()) {
|
|
1133
|
+
case import_ts_morph2.SyntaxKind.PlusToken:
|
|
1134
|
+
return +staticEval(node.getOperand(), context);
|
|
1135
|
+
case import_ts_morph2.SyntaxKind.MinusToken:
|
|
1136
|
+
return -staticEval(node.getOperand(), context);
|
|
1137
|
+
case import_ts_morph2.SyntaxKind.TildeToken:
|
|
1138
|
+
return ~staticEval(node.getOperand(), context);
|
|
1139
|
+
case import_ts_morph2.SyntaxKind.ExclamationToken:
|
|
1140
|
+
return !staticEval(node.getOperand(), context);
|
|
1141
|
+
case import_ts_morph2.SyntaxKind.PlusPlusToken:
|
|
1142
|
+
case import_ts_morph2.SyntaxKind.MinusMinusToken:
|
|
1143
|
+
throw new Error(`Cannot handle assignments.`);
|
|
1144
|
+
}
|
|
1145
|
+
},
|
|
1146
|
+
[import_ts_morph2.SyntaxKind.ElementAccessExpression]: (node, context) => {
|
|
1147
|
+
const target = staticEval(node.getExpression(), context);
|
|
1148
|
+
const argument = staticEval(node.getArgumentExpression(), context);
|
|
1149
|
+
return target[argument];
|
|
1150
|
+
},
|
|
1151
|
+
[import_ts_morph2.SyntaxKind.NoSubstitutionTemplateLiteral]: (node) => node.getLiteralValue()
|
|
1152
|
+
};
|
|
1153
|
+
|
|
1154
|
+
// src/gqm/utils.ts
|
|
1155
|
+
var import_ts_morph3 = require("ts-morph");
|
|
1156
|
+
var findDeclarationInFile = (sourceFile, name2) => {
|
|
1157
|
+
const syntaxList = sourceFile.getChildrenOfKind(import_ts_morph3.SyntaxKind.SyntaxList)[0];
|
|
1158
|
+
if (!syntaxList) {
|
|
1159
|
+
throw new Error("No SyntaxList");
|
|
1160
|
+
}
|
|
1161
|
+
const declaration = findDeclaration(syntaxList, name2);
|
|
1162
|
+
if (!declaration) {
|
|
1163
|
+
throw new Error(`No ${name2} declaration`);
|
|
1164
|
+
}
|
|
1165
|
+
return declaration;
|
|
1166
|
+
};
|
|
1167
|
+
var findDeclaration = (syntaxList, name2) => {
|
|
1168
|
+
for (const variableStatement of syntaxList.getChildrenOfKind(import_ts_morph3.SyntaxKind.VariableStatement)) {
|
|
1169
|
+
for (const declaration of variableStatement.getDeclarationList().getDeclarations()) {
|
|
1170
|
+
if (declaration.getName() === name2) {
|
|
1171
|
+
return declaration;
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
};
|
|
1176
|
+
|
|
1177
|
+
// src/gqm/parse-knexfile.ts
|
|
1178
|
+
var KNEXFILE_PATH = `knexfile.ts`;
|
|
1179
|
+
var parseKnexfile = async () => {
|
|
1180
|
+
const project = new import_ts_morph4.Project({
|
|
1181
|
+
manipulationSettings: {
|
|
1182
|
+
indentationText: import_ts_morph4.IndentationText.TwoSpaces
|
|
1183
|
+
}
|
|
1184
|
+
});
|
|
1185
|
+
ensureFileExists(KNEXFILE_PATH, KNEXFILE);
|
|
1186
|
+
const sourceFile = project.addSourceFileAtPath(KNEXFILE_PATH);
|
|
1187
|
+
const configDeclaration = findDeclarationInFile(sourceFile, "config");
|
|
1188
|
+
const config = staticEval(configDeclaration, {});
|
|
1189
|
+
return config;
|
|
1190
|
+
};
|
|
1191
|
+
|
|
1192
|
+
// src/gqm/parse-models.ts
|
|
1193
|
+
var import_ts_morph5 = require("ts-morph");
|
|
1194
|
+
var parseModels = async () => {
|
|
1195
|
+
const project = new import_ts_morph5.Project({
|
|
1196
|
+
manipulationSettings: {
|
|
1197
|
+
indentationText: import_ts_morph5.IndentationText.TwoSpaces
|
|
1198
|
+
}
|
|
1199
|
+
});
|
|
1200
|
+
const modelsPath = await getSetting("modelsPath");
|
|
1201
|
+
const sourceFile = project.addSourceFileAtPath(modelsPath);
|
|
1202
|
+
const modelsDeclaration = findDeclarationInFile(sourceFile, "rawModels");
|
|
1203
|
+
const rawModels = staticEval(modelsDeclaration, {});
|
|
1204
|
+
const generatedFolderPath = await getSetting("generatedFolderPath");
|
|
1205
|
+
writeToFile(`${generatedFolderPath}/models.json`, JSON.stringify(rawModels, null, 2));
|
|
1206
|
+
return rawModels;
|
|
1207
|
+
};
|
|
1208
|
+
|
|
704
1209
|
// src/migrations/generate.ts
|
|
705
1210
|
var import_code_block_writer2 = __toESM(require("code-block-writer"), 1);
|
|
706
1211
|
var import_knex_schema_inspector = require("knex-schema-inspector");
|
|
@@ -1147,6 +1652,7 @@ var MigrationGenerator = class {
|
|
|
1147
1652
|
};
|
|
1148
1653
|
const kind = field.kind;
|
|
1149
1654
|
switch (kind) {
|
|
1655
|
+
case void 0:
|
|
1150
1656
|
case "primitive":
|
|
1151
1657
|
switch (field.type) {
|
|
1152
1658
|
case "Boolean":
|
|
@@ -1209,6 +1715,16 @@ var MigrationGenerator = class {
|
|
|
1209
1715
|
}
|
|
1210
1716
|
}
|
|
1211
1717
|
};
|
|
1718
|
+
var getMigrationDate = () => {
|
|
1719
|
+
const date = /* @__PURE__ */ new Date();
|
|
1720
|
+
const year = date.getFullYear();
|
|
1721
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
1722
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
1723
|
+
const hours = String(date.getHours()).padStart(2, "0");
|
|
1724
|
+
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
1725
|
+
const seconds = String(date.getSeconds()).padStart(2, "0");
|
|
1726
|
+
return `${year}${month}${day}${hours}${minutes}${seconds}`;
|
|
1727
|
+
};
|
|
1212
1728
|
|
|
1213
1729
|
// src/errors.ts
|
|
1214
1730
|
var import_graphql2 = require("graphql");
|
|
@@ -2528,7 +3044,8 @@ var generateDefinitions = (rawModels) => {
|
|
|
2528
3044
|
...rawModels.filter(isEnumModel).map((model) => enm(model.name, model.values)),
|
|
2529
3045
|
...rawModels.filter(isRawEnumModel).map((model) => enm(model.name, model.values)),
|
|
2530
3046
|
...rawModels.filter(isScalarModel).map((model) => scalar(model.name)),
|
|
2531
|
-
...rawModels.filter(isObjectModel).map((model) => object(model.name, model.fields)),
|
|
3047
|
+
...rawModels.filter(isObjectModel).filter(({ name: name2 }) => !["Query", "Mutation"].includes(name2)).map((model) => object(model.name, model.fields)),
|
|
3048
|
+
...rawModels.filter(isInputModel).map((model) => input(model.name, model.fields)),
|
|
2532
3049
|
...rawModels.filter(isObjectModel).filter(
|
|
2533
3050
|
(model) => models.some((m) => m.creatable && m.fields.some((f) => f.creatable && f.kind === "json" && f.type === model.name))
|
|
2534
3051
|
).map((model) => input(`Create${model.name}`, model.fields)),
|
|
@@ -2656,7 +3173,8 @@ var generateDefinitions = (rawModels) => {
|
|
|
2656
3173
|
{ name: "limit", type: "Int" },
|
|
2657
3174
|
{ name: "offset", type: "Int" }
|
|
2658
3175
|
]
|
|
2659
|
-
}))
|
|
3176
|
+
})),
|
|
3177
|
+
...rawModels.filter(isObjectModel).filter((model) => model.name === "Query").flatMap((model) => model.fields)
|
|
2660
3178
|
]),
|
|
2661
3179
|
object("Mutation", [
|
|
2662
3180
|
...(0, import_flatMap2.default)(
|
|
@@ -2727,7 +3245,8 @@ var generateDefinitions = (rawModels) => {
|
|
|
2727
3245
|
}
|
|
2728
3246
|
return mutations;
|
|
2729
3247
|
})
|
|
2730
|
-
)
|
|
3248
|
+
),
|
|
3249
|
+
...rawModels.filter(isObjectModel).filter((model) => model.name === "Mutation").flatMap((model) => model.fields)
|
|
2731
3250
|
])
|
|
2732
3251
|
];
|
|
2733
3252
|
};
|
|
@@ -2742,10 +3261,15 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
2742
3261
|
// Annotate the CommonJS export names for ESM import in node:
|
|
2743
3262
|
0 && (module.exports = {
|
|
2744
3263
|
AliasGenerator,
|
|
3264
|
+
CLIENT_CODEGEN,
|
|
3265
|
+
EMPTY_MODELS,
|
|
2745
3266
|
Enum,
|
|
2746
3267
|
ForbiddenError,
|
|
3268
|
+
GRAPHQL_CODEGEN,
|
|
2747
3269
|
GraphQLError,
|
|
2748
3270
|
ID_ALIAS,
|
|
3271
|
+
KNEXFILE,
|
|
3272
|
+
KNEXFILE_PATH,
|
|
2749
3273
|
MigrationGenerator,
|
|
2750
3274
|
NotFoundError,
|
|
2751
3275
|
PermissionError,
|
|
@@ -2765,12 +3289,16 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
2765
3289
|
displayField,
|
|
2766
3290
|
document,
|
|
2767
3291
|
enm,
|
|
3292
|
+
ensureFileExists,
|
|
2768
3293
|
execute,
|
|
2769
3294
|
fieldType,
|
|
2770
3295
|
fields,
|
|
3296
|
+
findDeclarationInFile,
|
|
2771
3297
|
generate,
|
|
2772
3298
|
generateDBModels,
|
|
2773
3299
|
generateDefinitions,
|
|
3300
|
+
generateGraphqlApiTypes,
|
|
3301
|
+
generateGraphqlClientTypes,
|
|
2774
3302
|
generateKnexTables,
|
|
2775
3303
|
generateMutations,
|
|
2776
3304
|
generatePermissions,
|
|
@@ -2788,6 +3316,7 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
2788
3316
|
getManyToManyRelation,
|
|
2789
3317
|
getManyToManyRelations,
|
|
2790
3318
|
getManyToManyRelationsQuery,
|
|
3319
|
+
getMigrationDate,
|
|
2791
3320
|
getModelLabel,
|
|
2792
3321
|
getModelLabelPlural,
|
|
2793
3322
|
getModelPlural,
|
|
@@ -2800,6 +3329,8 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
2800
3329
|
getResolverNode,
|
|
2801
3330
|
getResolvers,
|
|
2802
3331
|
getRootFieldNode,
|
|
3332
|
+
getSetting,
|
|
3333
|
+
getSettings,
|
|
2803
3334
|
getSimpleFields,
|
|
2804
3335
|
getString,
|
|
2805
3336
|
getType,
|
|
@@ -2822,6 +3353,7 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
2822
3353
|
isFieldNode,
|
|
2823
3354
|
isFragmentSpreadNode,
|
|
2824
3355
|
isInlineFragmentNode,
|
|
3356
|
+
isInputModel,
|
|
2825
3357
|
isListType,
|
|
2826
3358
|
isObjectModel,
|
|
2827
3359
|
isPrimitive,
|
|
@@ -2849,17 +3381,23 @@ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildAST
|
|
|
2849
3381
|
not,
|
|
2850
3382
|
object,
|
|
2851
3383
|
ors,
|
|
3384
|
+
parseKnexfile,
|
|
3385
|
+
parseModels,
|
|
2852
3386
|
printSchema,
|
|
2853
3387
|
printSchemaFromDocument,
|
|
2854
3388
|
printSchemaFromModels,
|
|
2855
3389
|
queryRelations,
|
|
2856
3390
|
queryResolver,
|
|
3391
|
+
readLine,
|
|
2857
3392
|
resolve,
|
|
2858
3393
|
retry,
|
|
2859
3394
|
scalar,
|
|
3395
|
+
staticEval,
|
|
2860
3396
|
summon,
|
|
2861
3397
|
summonByKey,
|
|
2862
3398
|
summonByName,
|
|
2863
3399
|
typeToField,
|
|
2864
|
-
value
|
|
3400
|
+
value,
|
|
3401
|
+
visit,
|
|
3402
|
+
writeToFile
|
|
2865
3403
|
});
|