@smartive/graphql-magic 4.0.0 → 5.0.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.
Files changed (96) hide show
  1. package/CHANGELOG.md +6 -1
  2. package/README.md +46 -0
  3. package/dist/cjs/index.cjs +464 -426
  4. package/dist/esm/api/execute.d.ts +10 -0
  5. package/dist/esm/api/execute.js +32 -0
  6. package/dist/esm/api/execute.js.map +1 -0
  7. package/dist/esm/api/index.d.ts +1 -0
  8. package/dist/esm/api/index.js +3 -0
  9. package/dist/esm/api/index.js.map +1 -0
  10. package/dist/esm/client/index.d.ts +1 -0
  11. package/dist/esm/client/index.js +1 -0
  12. package/dist/esm/client/index.js.map +1 -1
  13. package/dist/esm/{generate → client}/mutations.d.ts +1 -1
  14. package/dist/esm/client/mutations.js.map +1 -0
  15. package/dist/esm/client/queries.d.ts +1 -1
  16. package/dist/esm/client/queries.js +1 -1
  17. package/dist/esm/client/queries.js.map +1 -1
  18. package/dist/esm/context.d.ts +1 -4
  19. package/dist/esm/index.d.ts +3 -3
  20. package/dist/esm/index.js +3 -3
  21. package/dist/esm/index.js.map +1 -1
  22. package/dist/esm/migrations/generate.d.ts +1 -1
  23. package/dist/esm/migrations/generate.js +1 -1
  24. package/dist/esm/migrations/generate.js.map +1 -1
  25. package/dist/esm/models/index.d.ts +2 -0
  26. package/dist/esm/models/index.js +4 -0
  27. package/dist/esm/models/index.js.map +1 -0
  28. package/dist/esm/{models.d.ts → models/models.d.ts} +4 -4
  29. package/dist/esm/{models.js.map → models/models.js.map} +1 -1
  30. package/dist/esm/{utils.d.ts → models/utils.d.ts} +8 -8
  31. package/dist/esm/models/utils.js.map +1 -0
  32. package/dist/esm/permissions/check.d.ts +1 -1
  33. package/dist/esm/permissions/check.js +1 -1
  34. package/dist/esm/permissions/check.js.map +1 -1
  35. package/dist/esm/permissions/generate.d.ts +1 -1
  36. package/dist/esm/permissions/generate.js +1 -1
  37. package/dist/esm/permissions/generate.js.map +1 -1
  38. package/dist/esm/resolvers/arguments.js +1 -1
  39. package/dist/esm/resolvers/arguments.js.map +1 -1
  40. package/dist/esm/resolvers/filters.js +1 -1
  41. package/dist/esm/resolvers/filters.js.map +1 -1
  42. package/dist/esm/resolvers/mutations.js +1 -1
  43. package/dist/esm/resolvers/mutations.js.map +1 -1
  44. package/dist/esm/resolvers/node.d.ts +1 -1
  45. package/dist/esm/resolvers/node.js +1 -1
  46. package/dist/esm/resolvers/node.js.map +1 -1
  47. package/dist/esm/resolvers/resolver.js +1 -1
  48. package/dist/esm/resolvers/resolver.js.map +1 -1
  49. package/dist/esm/resolvers/resolvers.d.ts +1 -1
  50. package/dist/esm/resolvers/resolvers.js +1 -1
  51. package/dist/esm/resolvers/resolvers.js.map +1 -1
  52. package/dist/esm/resolvers/utils.js +1 -1
  53. package/dist/esm/resolvers/utils.js.map +1 -1
  54. package/dist/esm/{generate → schema}/generate.d.ts +1 -1
  55. package/dist/esm/{generate → schema}/generate.js +1 -1
  56. package/dist/esm/{generate → schema}/generate.js.map +1 -1
  57. package/dist/esm/{generate → schema}/index.d.ts +0 -1
  58. package/dist/esm/{generate → schema}/index.js +0 -1
  59. package/dist/esm/schema/index.js.map +1 -0
  60. package/dist/esm/schema/utils.js.map +1 -0
  61. package/package.json +4 -4
  62. package/src/api/execute.ts +45 -0
  63. package/src/api/index.ts +3 -0
  64. package/src/client/index.ts +1 -0
  65. package/src/{generate → client}/mutations.ts +1 -1
  66. package/src/client/queries.ts +2 -2
  67. package/src/context.ts +1 -3
  68. package/src/index.ts +3 -3
  69. package/src/migrations/generate.ts +2 -2
  70. package/src/models/index.ts +4 -0
  71. package/src/{models.ts → models/models.ts} +4 -4
  72. package/src/permissions/check.ts +2 -2
  73. package/src/permissions/generate.ts +2 -2
  74. package/src/resolvers/arguments.ts +1 -1
  75. package/src/resolvers/filters.ts +1 -1
  76. package/src/resolvers/mutations.ts +2 -2
  77. package/src/resolvers/node.ts +2 -2
  78. package/src/resolvers/resolver.ts +1 -1
  79. package/src/resolvers/resolvers.ts +2 -2
  80. package/src/resolvers/utils.ts +1 -1
  81. package/src/{generate → schema}/generate.ts +2 -2
  82. package/src/{generate → schema}/index.ts +0 -1
  83. package/tests/unit/resolve.spec.ts +4 -19
  84. package/tests/utils/models.ts +1 -1
  85. package/tests/utils/server.ts +13 -33
  86. package/dist/esm/generate/index.js.map +0 -1
  87. package/dist/esm/generate/mutations.js.map +0 -1
  88. package/dist/esm/generate/utils.js.map +0 -1
  89. package/dist/esm/utils.js.map +0 -1
  90. /package/dist/esm/{generate → client}/mutations.js +0 -0
  91. /package/dist/esm/{models.js → models/models.js} +0 -0
  92. /package/dist/esm/{utils.js → models/utils.js} +0 -0
  93. /package/dist/esm/{generate → schema}/utils.d.ts +0 -0
  94. /package/dist/esm/{generate → schema}/utils.js +0 -0
  95. /package/src/{utils.ts → models/utils.ts} +0 -0
  96. /package/src/{generate → schema}/utils.ts +0 -0
@@ -53,6 +53,7 @@ __export(src_exports, {
53
53
  displayField: () => displayField,
54
54
  document: () => document,
55
55
  enm: () => enm,
56
+ execute: () => execute,
56
57
  fieldType: () => fieldType,
57
58
  fields: () => fields,
58
59
  generate: () => generate,
@@ -150,6 +151,42 @@ __export(src_exports, {
150
151
  });
151
152
  module.exports = __toCommonJS(src_exports);
152
153
 
154
+ // src/api/execute.ts
155
+ var import_schema = require("@graphql-tools/schema");
156
+ var import_graphql = require("graphql");
157
+ var execute = async ({
158
+ additionalResolvers,
159
+ body,
160
+ ...ctx
161
+ }) => {
162
+ const document2 = generate(ctx.rawModels);
163
+ const generatedResolvers = getResolvers(ctx.models);
164
+ const schema = (0, import_schema.makeExecutableSchema)({
165
+ typeDefs: document2,
166
+ resolvers: {
167
+ ...generatedResolvers,
168
+ ...additionalResolvers
169
+ }
170
+ });
171
+ const contextValue = {
172
+ document: document2,
173
+ ...ctx
174
+ };
175
+ const result = await (0, import_graphql.execute)({
176
+ schema,
177
+ document: (0, import_graphql.parse)(new import_graphql.Source(body.query, "GraphQL request")),
178
+ contextValue,
179
+ variableValues: body.variables,
180
+ operationName: body.operationName,
181
+ fieldResolver: (parent, _args, _ctx, info) => {
182
+ const node = get(info.fieldNodes, 0);
183
+ const alias = node.alias;
184
+ return parent[alias ? alias.value : node.name.value];
185
+ }
186
+ });
187
+ return result;
188
+ };
189
+
153
190
  // src/client/gql.ts
154
191
  var gql = (chunks, ...variables) => {
155
192
  return chunks.reduce(
@@ -158,10 +195,55 @@ var gql = (chunks, ...variables) => {
158
195
  );
159
196
  };
160
197
 
198
+ // src/client/mutations.ts
199
+ var import_upperCase = __toESM(require("lodash/upperCase"), 1);
200
+ var constantCase = (str) => (0, import_upperCase.default)(str).replace(/ /g, "_");
201
+ var generateMutations = (models) => {
202
+ const parts = [];
203
+ for (const { name: name2, creatable, updatable, deletable } of models) {
204
+ if (creatable) {
205
+ parts.push(
206
+ `export const CREATE_${constantCase(
207
+ name2
208
+ )} = gql\`
209
+ mutation Create${name2}Mutation($data: Create${name2}!) {
210
+ create${name2}(data: $data) { id }
211
+ }
212
+ \`;`
213
+ );
214
+ }
215
+ if (updatable) {
216
+ parts.push(
217
+ `export const UPDATE_${constantCase(
218
+ name2
219
+ )} = gql\`
220
+ mutation Update${name2}Mutation($id: ID!, $data: Update${name2}!) {
221
+ update${name2}(where: { id: $id }, data: $data) { id }
222
+ }
223
+ \`;`
224
+ );
225
+ }
226
+ if (deletable) {
227
+ parts.push(
228
+ `export const DELETE_${constantCase(
229
+ name2
230
+ )} = gql\`
231
+ mutation Delete${name2}Mutation($id: ID!) {
232
+ delete${name2}(where: { id: $id })
233
+ }
234
+ \`;`
235
+ );
236
+ }
237
+ }
238
+ return `import { gql } from "@smartive/graphql-magic";
239
+
240
+ ${parts.join("\n\n")}`;
241
+ };
242
+
161
243
  // src/client/queries.ts
162
244
  var import_upperFirst = __toESM(require("lodash/upperFirst"), 1);
163
245
 
164
- // src/utils.ts
246
+ // src/models/utils.ts
165
247
  var import_assert = __toESM(require("assert"), 1);
166
248
  var import_inflection = require("inflection");
167
249
  var import_camelCase = __toESM(require("lodash/camelCase"), 1);
@@ -620,429 +702,15 @@ var generateKnexTables = (rawModels) => {
620
702
  return writer.toString();
621
703
  };
622
704
 
623
- // src/generate/generate.ts
624
- var import_graphql = require("graphql");
625
- var import_flatMap = __toESM(require("lodash/flatMap"), 1);
626
-
627
- // src/generate/utils.ts
628
- var import_luxon = require("luxon");
629
-
630
- // src/values.ts
631
- var Enum = class {
632
- constructor(value2) {
633
- this.value = value2;
634
- }
635
- };
636
-
637
- // src/generate/utils.ts
638
- var document = (definitions) => ({
639
- kind: "Document",
640
- definitions
641
- });
642
- var directive = (nme, locations, fields2) => ({
643
- name: name(nme),
644
- repeatable: false,
645
- kind: "DirectiveDefinition",
646
- arguments: fields2 && inputValues(fields2),
647
- locations: locations.map(name)
648
- });
649
- var scalar = (nme) => ({
650
- name: name(nme),
651
- kind: "ScalarTypeDefinition"
652
- });
653
- var input = (nme, fields2, dvs) => ({
654
- name: name(nme),
655
- fields: inputValues(fields2),
656
- kind: "InputObjectTypeDefinition",
657
- directives: directives(dvs)
658
- });
659
- var object = (nme, fds, interfaces, dvs) => ({
660
- name: name(nme),
661
- fields: fields(fds),
662
- kind: "ObjectTypeDefinition",
663
- interfaces: interfaces && interfaces.map((i) => namedType(i)),
664
- directives: directives(dvs)
665
- });
666
- var iface = (nme, fds, dvs) => ({
667
- name: name(nme),
668
- fields: fields(fds),
669
- kind: "InterfaceTypeDefinition",
670
- directives: directives(dvs)
671
- });
672
- var inputValues = (fields2) => fields2.map(
673
- (field) => ({
674
- kind: "InputValueDefinition",
675
- name: name(field.name),
676
- type: fieldType(field),
677
- defaultValue: field.default === void 0 ? void 0 : value(field.default),
678
- directives: directives(field.directives)
679
- })
680
- );
681
- var fields = (fields2) => fields2.map(
682
- (field) => ({
683
- kind: "FieldDefinition",
684
- name: name(field.name),
685
- type: fieldType(field),
686
- arguments: field.args?.map((arg) => ({
687
- kind: "InputValueDefinition",
688
- name: name(arg.name),
689
- type: fieldType(arg),
690
- defaultValue: arg.default === void 0 ? void 0 : value(arg.default)
691
- })),
692
- directives: directives(field.directives)
693
- })
694
- );
695
- var inputValue = (nme, type, dvs, description, defaultValue) => ({
696
- name: name(nme),
697
- type,
698
- kind: "InputValueDefinition",
699
- directives: directives(dvs),
700
- defaultValue: defaultValue ? value(defaultValue) : void 0,
701
- description: description ? value(description) : void 0
702
- });
703
- var directives = (directives2) => directives2?.map(
704
- (directive2) => ({
705
- kind: "Directive",
706
- name: name(directive2.name),
707
- arguments: args(directive2.values)
708
- })
709
- );
710
- var args = (ags) => ags?.map(
711
- (argument) => ({
712
- kind: "Argument",
713
- name: name(argument.name),
714
- value: value(argument.values)
715
- })
716
- );
717
- var enm = (nme, values) => ({
718
- name: name(nme),
719
- kind: "EnumTypeDefinition",
720
- values: values.map(
721
- (v) => ({
722
- kind: "EnumValueDefinition",
723
- name: name(v)
724
- })
725
- )
726
- });
727
- var nonNull = (type) => ({
728
- type,
729
- kind: "NonNullType"
730
- });
731
- var namedType = (nme) => ({
732
- kind: "NamedType",
733
- name: name(nme)
734
- });
735
- var list = (type) => ({
736
- type,
737
- kind: "ListType"
738
- });
739
- var name = (name2) => ({
740
- kind: "Name",
741
- value: name2
742
- });
743
- var fieldType = (field) => {
744
- let type = namedType(field.type);
745
- if (field.list) {
746
- type = list(nonNull(type));
747
- }
748
- if (field.nonNull) {
749
- type = nonNull(type);
750
- }
751
- return type;
752
- };
753
- var value = (val = null) => val === null ? {
754
- kind: "NullValue"
755
- } : typeof val === "boolean" ? {
756
- kind: "BooleanValue",
757
- value: val
758
- } : typeof val === "number" ? {
759
- kind: "IntValue",
760
- value: `${val}`
761
- } : typeof val === "string" ? {
762
- kind: "StringValue",
763
- value: val
764
- } : val instanceof Enum ? {
765
- kind: "EnumValue",
766
- value: val.value
767
- } : Array.isArray(val) ? {
768
- kind: "ListValue",
769
- values: val.map(value)
770
- } : val instanceof import_luxon.DateTime ? {
771
- kind: "StringValue",
772
- value: val.toString()
773
- } : {
774
- kind: "ObjectValue",
775
- fields: Object.keys(val).map(
776
- (nme) => ({
777
- kind: "ObjectField",
778
- name: name(nme),
779
- value: value(val[nme])
780
- })
781
- )
782
- };
783
-
784
- // src/generate/generate.ts
785
- var generateDefinitions = (rawModels) => {
786
- const models = getModels(rawModels);
787
- return [
788
- // Predefined types
789
- enm("Order", ["ASC", "DESC"]),
790
- scalar("DateTime"),
791
- scalar("Upload"),
792
- ...rawModels.filter(isEnumModel).map((model) => enm(model.name, model.values)),
793
- ...rawModels.filter(isRawEnumModel).map((model) => enm(model.name, model.values)),
794
- ...rawModels.filter(isScalarModel).map((model) => scalar(model.name)),
795
- ...rawModels.filter(isRawObjectModel).map((model) => object(model.name, model.fields)),
796
- ...(0, import_flatMap.default)(
797
- models.map((model) => {
798
- const types = [
799
- object(
800
- model.name,
801
- [
802
- ...model.fields.filter(isQueriableField).map((field) => ({
803
- ...field,
804
- type: field.type === "relation" || field.type === "enum" || field.type === "raw" ? field.typeName : field.type,
805
- args: [...field.args || []],
806
- directives: field.directives
807
- })),
808
- ...model.reverseRelations.map(({ name: name2, field, model: model2 }) => ({
809
- name: name2,
810
- type: model2.name,
811
- list: !field.toOne,
812
- nonNull: !field.toOne,
813
- args: [
814
- { name: "where", type: `${model2.name}Where` },
815
- ...model2.fields.some(({ searchable }) => searchable) ? [{ name: "search", type: "String" }] : [],
816
- ...model2.fields.some(({ orderable }) => orderable) ? [{ name: "orderBy", type: `${model2.name}OrderBy`, list: true }] : [],
817
- { name: "limit", type: "Int" },
818
- { name: "offset", type: "Int" }
819
- ]
820
- }))
821
- ],
822
- model.interfaces
823
- ),
824
- input(`${model.name}Where`, [
825
- ...model.fields.filter(({ type, unique, filterable }) => (unique || filterable) && type !== "relation").map(({ type, name: name2, filterable }) => ({
826
- name: name2,
827
- type,
828
- list: true,
829
- default: typeof filterable === "object" ? filterable.default : void 0
830
- })),
831
- ...(0, import_flatMap.default)(
832
- model.fields.filter(({ comparable }) => comparable),
833
- ({ name: name2, type }) => [
834
- { name: `${name2}_GT`, type },
835
- { name: `${name2}_GTE`, type },
836
- { name: `${name2}_LT`, type },
837
- { name: `${name2}_LTE`, type }
838
- ]
839
- ),
840
- ...model.fields.filter(isRelation).filter(({ filterable }) => filterable).map(({ name: name2, typeName }) => ({
841
- name: name2,
842
- type: `${typeName}Where`
843
- }))
844
- ]),
845
- input(
846
- `${model.name}WhereUnique`,
847
- model.fields.filter(({ unique }) => unique).map(({ name: name2, type }) => ({ name: name2, type }))
848
- ),
849
- ...model.fields.some(({ orderable }) => orderable) ? [
850
- input(
851
- `${model.name}OrderBy`,
852
- model.fields.filter(({ orderable }) => orderable).map(({ name: name2 }) => ({ name: name2, type: "Order" }))
853
- )
854
- ] : []
855
- ];
856
- if (model.creatable) {
857
- types.push(
858
- input(
859
- `Create${model.name}`,
860
- model.fields.filter(({ creatable }) => creatable).map(
861
- ({ name: name2, nonNull: nonNull2, list: list2, default: defaultValue, ...field }) => field.type === "relation" ? { name: `${name2}Id`, type: "ID", nonNull: nonNull2 } : { name: name2, type: field.type, list: list2, nonNull: nonNull2 && defaultValue === void 0 }
862
- )
863
- )
864
- );
865
- }
866
- if (model.updatable) {
867
- types.push(
868
- input(
869
- `Update${model.name}`,
870
- model.fields.filter(({ updatable }) => updatable).map(
871
- ({ name: name2, type, list: list2 }) => type === "relation" ? { name: `${name2}Id`, type: "ID" } : { name: name2, type, list: list2 }
872
- )
873
- )
874
- );
875
- }
876
- return types;
877
- })
878
- ),
879
- object("Query", [
880
- {
881
- name: "me",
882
- type: "User"
883
- },
884
- ...models.filter(({ queriable }) => queriable).map(({ name: name2 }) => ({
885
- name: typeToField(name2),
886
- type: name2,
887
- nonNull: true,
888
- args: [
889
- {
890
- name: "where",
891
- type: `${name2}WhereUnique`,
892
- nonNull: true
893
- }
894
- ]
895
- })),
896
- ...models.filter(({ listQueriable }) => listQueriable).map((model) => ({
897
- name: getModelPluralField(model),
898
- type: model.name,
899
- list: true,
900
- nonNull: true,
901
- args: [
902
- { name: "where", type: `${model.name}Where` },
903
- ...model.fields.some(({ searchable }) => searchable) ? [{ name: "search", type: "String" }] : [],
904
- ...model.fields.some(({ orderable }) => orderable) ? [{ name: "orderBy", type: `${model.name}OrderBy`, list: true }] : [],
905
- { name: "limit", type: "Int" },
906
- { name: "offset", type: "Int" }
907
- ]
908
- }))
909
- ]),
910
- object("Mutation", [
911
- ...(0, import_flatMap.default)(
912
- models.map((model) => {
913
- const mutations = [];
914
- if (model.creatable) {
915
- mutations.push({
916
- name: `create${model.name}`,
917
- type: model.name,
918
- nonNull: true,
919
- args: [
920
- {
921
- name: "data",
922
- type: `Create${model.name}`,
923
- nonNull: true
924
- }
925
- ]
926
- });
927
- }
928
- if (model.updatable) {
929
- mutations.push({
930
- name: `update${model.name}`,
931
- type: model.name,
932
- nonNull: true,
933
- args: [
934
- {
935
- name: "where",
936
- type: `${model.name}WhereUnique`,
937
- nonNull: true
938
- },
939
- {
940
- name: "data",
941
- type: `Update${model.name}`,
942
- nonNull: true
943
- }
944
- ]
945
- });
946
- }
947
- if (model.deletable) {
948
- mutations.push({
949
- name: `delete${model.name}`,
950
- type: "ID",
951
- nonNull: true,
952
- args: [
953
- {
954
- name: "where",
955
- type: `${model.name}WhereUnique`,
956
- nonNull: true
957
- },
958
- {
959
- name: "dryRun",
960
- type: "Boolean"
961
- }
962
- ]
963
- });
964
- mutations.push({
965
- name: `restore${model.name}`,
966
- type: "ID",
967
- nonNull: true,
968
- args: [
969
- {
970
- name: "where",
971
- type: `${model.name}WhereUnique`,
972
- nonNull: true
973
- }
974
- ]
975
- });
976
- }
977
- return mutations;
978
- })
979
- )
980
- ])
981
- ];
982
- };
983
- var generate = (rawModels) => document(generateDefinitions(rawModels));
984
- var printSchema = (schema) => [
985
- ...schema.getDirectives().map((d) => d.astNode && (0, import_graphql.print)(d.astNode)),
986
- ...Object.values(schema.getTypeMap()).filter((t) => !t.name.match(/^__/)).sort((a, b) => a.name > b.name ? 1 : -1).map((t) => t.astNode && (0, import_graphql.print)(t.astNode))
987
- ].filter(Boolean).map((s) => `${s}
988
- `).join("\n");
989
- var printSchemaFromDocument = (document2) => printSchema((0, import_graphql.buildASTSchema)(document2));
990
- var printSchemaFromModels = (models) => printSchema((0, import_graphql.buildASTSchema)(generate(models)));
991
-
992
- // src/generate/mutations.ts
993
- var import_upperCase = __toESM(require("lodash/upperCase"), 1);
994
- var constantCase = (str) => (0, import_upperCase.default)(str).replace(/ /g, "_");
995
- var generateMutations = (models) => {
996
- const parts = [];
997
- for (const { name: name2, creatable, updatable, deletable } of models) {
998
- if (creatable) {
999
- parts.push(
1000
- `export const CREATE_${constantCase(
1001
- name2
1002
- )} = gql\`
1003
- mutation Create${name2}Mutation($data: Create${name2}!) {
1004
- create${name2}(data: $data) { id }
1005
- }
1006
- \`;`
1007
- );
1008
- }
1009
- if (updatable) {
1010
- parts.push(
1011
- `export const UPDATE_${constantCase(
1012
- name2
1013
- )} = gql\`
1014
- mutation Update${name2}Mutation($id: ID!, $data: Update${name2}!) {
1015
- update${name2}(where: { id: $id }, data: $data) { id }
1016
- }
1017
- \`;`
1018
- );
1019
- }
1020
- if (deletable) {
1021
- parts.push(
1022
- `export const DELETE_${constantCase(
1023
- name2
1024
- )} = gql\`
1025
- mutation Delete${name2}Mutation($id: ID!) {
1026
- delete${name2}(where: { id: $id })
1027
- }
1028
- \`;`
1029
- );
1030
- }
1031
- }
1032
- return `import { gql } from "@smartive/graphql-magic";
1033
-
1034
- ${parts.join("\n\n")}`;
1035
- };
1036
-
1037
- // src/migrations/generate.ts
1038
- var import_code_block_writer2 = __toESM(require("code-block-writer"), 1);
1039
- var import_knex_schema_inspector = require("knex-schema-inspector");
1040
- var import_lowerFirst = __toESM(require("lodash/lowerFirst"), 1);
1041
- var MigrationGenerator = class {
1042
- constructor(knex, rawModels) {
1043
- this.rawModels = rawModels;
1044
- this.schema = (0, import_knex_schema_inspector.SchemaInspector)(knex);
1045
- this.models = getModels(rawModels);
705
+ // src/migrations/generate.ts
706
+ var import_code_block_writer2 = __toESM(require("code-block-writer"), 1);
707
+ var import_knex_schema_inspector = require("knex-schema-inspector");
708
+ var import_lowerFirst = __toESM(require("lodash/lowerFirst"), 1);
709
+ var MigrationGenerator = class {
710
+ constructor(knex, rawModels) {
711
+ this.rawModels = rawModels;
712
+ this.schema = (0, import_knex_schema_inspector.SchemaInspector)(knex);
713
+ this.models = getModels(rawModels);
1046
714
  }
1047
715
  writer = new import_code_block_writer2.default["default"]({
1048
716
  useSingleQuote: true,
@@ -2132,7 +1800,7 @@ var import_uuid = require("uuid");
2132
1800
 
2133
1801
  // src/resolvers/resolver.ts
2134
1802
  var import_cloneDeep = __toESM(require("lodash/cloneDeep"), 1);
2135
- var import_flatMap2 = __toESM(require("lodash/flatMap"), 1);
1803
+ var import_flatMap = __toESM(require("lodash/flatMap"), 1);
2136
1804
 
2137
1805
  // src/resolvers/node.ts
2138
1806
  var getResolverNode = ({
@@ -2376,7 +2044,7 @@ var applySubQueries = async (node, entries, parentVerifiedPermissionStacks) => {
2376
2044
  }
2377
2045
  await applySubQueries(
2378
2046
  subNode,
2379
- (0, import_flatMap2.default)(
2047
+ (0, import_flatMap.default)(
2380
2048
  entries.map((entry) => {
2381
2049
  const children2 = entry[fieldName];
2382
2050
  return isList ? children2 : children2 ? [children2] : [];
@@ -2676,6 +2344,375 @@ var getResolvers = (models) => ({
2676
2344
  }))
2677
2345
  ])
2678
2346
  });
2347
+
2348
+ // src/schema/generate.ts
2349
+ var import_graphql5 = require("graphql");
2350
+ var import_flatMap2 = __toESM(require("lodash/flatMap"), 1);
2351
+
2352
+ // src/schema/utils.ts
2353
+ var import_luxon = require("luxon");
2354
+
2355
+ // src/values.ts
2356
+ var Enum = class {
2357
+ constructor(value2) {
2358
+ this.value = value2;
2359
+ }
2360
+ };
2361
+
2362
+ // src/schema/utils.ts
2363
+ var document = (definitions) => ({
2364
+ kind: "Document",
2365
+ definitions
2366
+ });
2367
+ var directive = (nme, locations, fields2) => ({
2368
+ name: name(nme),
2369
+ repeatable: false,
2370
+ kind: "DirectiveDefinition",
2371
+ arguments: fields2 && inputValues(fields2),
2372
+ locations: locations.map(name)
2373
+ });
2374
+ var scalar = (nme) => ({
2375
+ name: name(nme),
2376
+ kind: "ScalarTypeDefinition"
2377
+ });
2378
+ var input = (nme, fields2, dvs) => ({
2379
+ name: name(nme),
2380
+ fields: inputValues(fields2),
2381
+ kind: "InputObjectTypeDefinition",
2382
+ directives: directives(dvs)
2383
+ });
2384
+ var object = (nme, fds, interfaces, dvs) => ({
2385
+ name: name(nme),
2386
+ fields: fields(fds),
2387
+ kind: "ObjectTypeDefinition",
2388
+ interfaces: interfaces && interfaces.map((i) => namedType(i)),
2389
+ directives: directives(dvs)
2390
+ });
2391
+ var iface = (nme, fds, dvs) => ({
2392
+ name: name(nme),
2393
+ fields: fields(fds),
2394
+ kind: "InterfaceTypeDefinition",
2395
+ directives: directives(dvs)
2396
+ });
2397
+ var inputValues = (fields2) => fields2.map(
2398
+ (field) => ({
2399
+ kind: "InputValueDefinition",
2400
+ name: name(field.name),
2401
+ type: fieldType(field),
2402
+ defaultValue: field.default === void 0 ? void 0 : value(field.default),
2403
+ directives: directives(field.directives)
2404
+ })
2405
+ );
2406
+ var fields = (fields2) => fields2.map(
2407
+ (field) => ({
2408
+ kind: "FieldDefinition",
2409
+ name: name(field.name),
2410
+ type: fieldType(field),
2411
+ arguments: field.args?.map((arg) => ({
2412
+ kind: "InputValueDefinition",
2413
+ name: name(arg.name),
2414
+ type: fieldType(arg),
2415
+ defaultValue: arg.default === void 0 ? void 0 : value(arg.default)
2416
+ })),
2417
+ directives: directives(field.directives)
2418
+ })
2419
+ );
2420
+ var inputValue = (nme, type, dvs, description, defaultValue) => ({
2421
+ name: name(nme),
2422
+ type,
2423
+ kind: "InputValueDefinition",
2424
+ directives: directives(dvs),
2425
+ defaultValue: defaultValue ? value(defaultValue) : void 0,
2426
+ description: description ? value(description) : void 0
2427
+ });
2428
+ var directives = (directives2) => directives2?.map(
2429
+ (directive2) => ({
2430
+ kind: "Directive",
2431
+ name: name(directive2.name),
2432
+ arguments: args(directive2.values)
2433
+ })
2434
+ );
2435
+ var args = (ags) => ags?.map(
2436
+ (argument) => ({
2437
+ kind: "Argument",
2438
+ name: name(argument.name),
2439
+ value: value(argument.values)
2440
+ })
2441
+ );
2442
+ var enm = (nme, values) => ({
2443
+ name: name(nme),
2444
+ kind: "EnumTypeDefinition",
2445
+ values: values.map(
2446
+ (v) => ({
2447
+ kind: "EnumValueDefinition",
2448
+ name: name(v)
2449
+ })
2450
+ )
2451
+ });
2452
+ var nonNull = (type) => ({
2453
+ type,
2454
+ kind: "NonNullType"
2455
+ });
2456
+ var namedType = (nme) => ({
2457
+ kind: "NamedType",
2458
+ name: name(nme)
2459
+ });
2460
+ var list = (type) => ({
2461
+ type,
2462
+ kind: "ListType"
2463
+ });
2464
+ var name = (name2) => ({
2465
+ kind: "Name",
2466
+ value: name2
2467
+ });
2468
+ var fieldType = (field) => {
2469
+ let type = namedType(field.type);
2470
+ if (field.list) {
2471
+ type = list(nonNull(type));
2472
+ }
2473
+ if (field.nonNull) {
2474
+ type = nonNull(type);
2475
+ }
2476
+ return type;
2477
+ };
2478
+ var value = (val = null) => val === null ? {
2479
+ kind: "NullValue"
2480
+ } : typeof val === "boolean" ? {
2481
+ kind: "BooleanValue",
2482
+ value: val
2483
+ } : typeof val === "number" ? {
2484
+ kind: "IntValue",
2485
+ value: `${val}`
2486
+ } : typeof val === "string" ? {
2487
+ kind: "StringValue",
2488
+ value: val
2489
+ } : val instanceof Enum ? {
2490
+ kind: "EnumValue",
2491
+ value: val.value
2492
+ } : Array.isArray(val) ? {
2493
+ kind: "ListValue",
2494
+ values: val.map(value)
2495
+ } : val instanceof import_luxon.DateTime ? {
2496
+ kind: "StringValue",
2497
+ value: val.toString()
2498
+ } : {
2499
+ kind: "ObjectValue",
2500
+ fields: Object.keys(val).map(
2501
+ (nme) => ({
2502
+ kind: "ObjectField",
2503
+ name: name(nme),
2504
+ value: value(val[nme])
2505
+ })
2506
+ )
2507
+ };
2508
+
2509
+ // src/schema/generate.ts
2510
+ var generateDefinitions = (rawModels) => {
2511
+ const models = getModels(rawModels);
2512
+ return [
2513
+ // Predefined types
2514
+ enm("Order", ["ASC", "DESC"]),
2515
+ scalar("DateTime"),
2516
+ scalar("Upload"),
2517
+ ...rawModels.filter(isEnumModel).map((model) => enm(model.name, model.values)),
2518
+ ...rawModels.filter(isRawEnumModel).map((model) => enm(model.name, model.values)),
2519
+ ...rawModels.filter(isScalarModel).map((model) => scalar(model.name)),
2520
+ ...rawModels.filter(isRawObjectModel).map((model) => object(model.name, model.fields)),
2521
+ ...(0, import_flatMap2.default)(
2522
+ models.map((model) => {
2523
+ const types = [
2524
+ object(
2525
+ model.name,
2526
+ [
2527
+ ...model.fields.filter(isQueriableField).map((field) => ({
2528
+ ...field,
2529
+ type: field.type === "relation" || field.type === "enum" || field.type === "raw" ? field.typeName : field.type,
2530
+ args: [...field.args || []],
2531
+ directives: field.directives
2532
+ })),
2533
+ ...model.reverseRelations.map(({ name: name2, field, model: model2 }) => ({
2534
+ name: name2,
2535
+ type: model2.name,
2536
+ list: !field.toOne,
2537
+ nonNull: !field.toOne,
2538
+ args: [
2539
+ { name: "where", type: `${model2.name}Where` },
2540
+ ...model2.fields.some(({ searchable }) => searchable) ? [{ name: "search", type: "String" }] : [],
2541
+ ...model2.fields.some(({ orderable }) => orderable) ? [{ name: "orderBy", type: `${model2.name}OrderBy`, list: true }] : [],
2542
+ { name: "limit", type: "Int" },
2543
+ { name: "offset", type: "Int" }
2544
+ ]
2545
+ }))
2546
+ ],
2547
+ model.interfaces
2548
+ ),
2549
+ input(`${model.name}Where`, [
2550
+ ...model.fields.filter(({ type, unique, filterable }) => (unique || filterable) && type !== "relation").map(({ type, name: name2, filterable }) => ({
2551
+ name: name2,
2552
+ type,
2553
+ list: true,
2554
+ default: typeof filterable === "object" ? filterable.default : void 0
2555
+ })),
2556
+ ...(0, import_flatMap2.default)(
2557
+ model.fields.filter(({ comparable }) => comparable),
2558
+ ({ name: name2, type }) => [
2559
+ { name: `${name2}_GT`, type },
2560
+ { name: `${name2}_GTE`, type },
2561
+ { name: `${name2}_LT`, type },
2562
+ { name: `${name2}_LTE`, type }
2563
+ ]
2564
+ ),
2565
+ ...model.fields.filter(isRelation).filter(({ filterable }) => filterable).map(({ name: name2, typeName }) => ({
2566
+ name: name2,
2567
+ type: `${typeName}Where`
2568
+ }))
2569
+ ]),
2570
+ input(
2571
+ `${model.name}WhereUnique`,
2572
+ model.fields.filter(({ unique }) => unique).map(({ name: name2, type }) => ({ name: name2, type }))
2573
+ ),
2574
+ ...model.fields.some(({ orderable }) => orderable) ? [
2575
+ input(
2576
+ `${model.name}OrderBy`,
2577
+ model.fields.filter(({ orderable }) => orderable).map(({ name: name2 }) => ({ name: name2, type: "Order" }))
2578
+ )
2579
+ ] : []
2580
+ ];
2581
+ if (model.creatable) {
2582
+ types.push(
2583
+ input(
2584
+ `Create${model.name}`,
2585
+ model.fields.filter(({ creatable }) => creatable).map(
2586
+ ({ name: name2, nonNull: nonNull2, list: list2, default: defaultValue, ...field }) => field.type === "relation" ? { name: `${name2}Id`, type: "ID", nonNull: nonNull2 } : { name: name2, type: field.type, list: list2, nonNull: nonNull2 && defaultValue === void 0 }
2587
+ )
2588
+ )
2589
+ );
2590
+ }
2591
+ if (model.updatable) {
2592
+ types.push(
2593
+ input(
2594
+ `Update${model.name}`,
2595
+ model.fields.filter(({ updatable }) => updatable).map(
2596
+ ({ name: name2, type, list: list2 }) => type === "relation" ? { name: `${name2}Id`, type: "ID" } : { name: name2, type, list: list2 }
2597
+ )
2598
+ )
2599
+ );
2600
+ }
2601
+ return types;
2602
+ })
2603
+ ),
2604
+ object("Query", [
2605
+ {
2606
+ name: "me",
2607
+ type: "User"
2608
+ },
2609
+ ...models.filter(({ queriable }) => queriable).map(({ name: name2 }) => ({
2610
+ name: typeToField(name2),
2611
+ type: name2,
2612
+ nonNull: true,
2613
+ args: [
2614
+ {
2615
+ name: "where",
2616
+ type: `${name2}WhereUnique`,
2617
+ nonNull: true
2618
+ }
2619
+ ]
2620
+ })),
2621
+ ...models.filter(({ listQueriable }) => listQueriable).map((model) => ({
2622
+ name: getModelPluralField(model),
2623
+ type: model.name,
2624
+ list: true,
2625
+ nonNull: true,
2626
+ args: [
2627
+ { name: "where", type: `${model.name}Where` },
2628
+ ...model.fields.some(({ searchable }) => searchable) ? [{ name: "search", type: "String" }] : [],
2629
+ ...model.fields.some(({ orderable }) => orderable) ? [{ name: "orderBy", type: `${model.name}OrderBy`, list: true }] : [],
2630
+ { name: "limit", type: "Int" },
2631
+ { name: "offset", type: "Int" }
2632
+ ]
2633
+ }))
2634
+ ]),
2635
+ object("Mutation", [
2636
+ ...(0, import_flatMap2.default)(
2637
+ models.map((model) => {
2638
+ const mutations = [];
2639
+ if (model.creatable) {
2640
+ mutations.push({
2641
+ name: `create${model.name}`,
2642
+ type: model.name,
2643
+ nonNull: true,
2644
+ args: [
2645
+ {
2646
+ name: "data",
2647
+ type: `Create${model.name}`,
2648
+ nonNull: true
2649
+ }
2650
+ ]
2651
+ });
2652
+ }
2653
+ if (model.updatable) {
2654
+ mutations.push({
2655
+ name: `update${model.name}`,
2656
+ type: model.name,
2657
+ nonNull: true,
2658
+ args: [
2659
+ {
2660
+ name: "where",
2661
+ type: `${model.name}WhereUnique`,
2662
+ nonNull: true
2663
+ },
2664
+ {
2665
+ name: "data",
2666
+ type: `Update${model.name}`,
2667
+ nonNull: true
2668
+ }
2669
+ ]
2670
+ });
2671
+ }
2672
+ if (model.deletable) {
2673
+ mutations.push({
2674
+ name: `delete${model.name}`,
2675
+ type: "ID",
2676
+ nonNull: true,
2677
+ args: [
2678
+ {
2679
+ name: "where",
2680
+ type: `${model.name}WhereUnique`,
2681
+ nonNull: true
2682
+ },
2683
+ {
2684
+ name: "dryRun",
2685
+ type: "Boolean"
2686
+ }
2687
+ ]
2688
+ });
2689
+ mutations.push({
2690
+ name: `restore${model.name}`,
2691
+ type: "ID",
2692
+ nonNull: true,
2693
+ args: [
2694
+ {
2695
+ name: "where",
2696
+ type: `${model.name}WhereUnique`,
2697
+ nonNull: true
2698
+ }
2699
+ ]
2700
+ });
2701
+ }
2702
+ return mutations;
2703
+ })
2704
+ )
2705
+ ])
2706
+ ];
2707
+ };
2708
+ var generate = (rawModels) => document(generateDefinitions(rawModels));
2709
+ var printSchema = (schema) => [
2710
+ ...schema.getDirectives().map((d) => d.astNode && (0, import_graphql5.print)(d.astNode)),
2711
+ ...Object.values(schema.getTypeMap()).filter((t) => !t.name.match(/^__/)).sort((a, b) => a.name > b.name ? 1 : -1).map((t) => t.astNode && (0, import_graphql5.print)(t.astNode))
2712
+ ].filter(Boolean).map((s) => `${s}
2713
+ `).join("\n");
2714
+ var printSchemaFromDocument = (document2) => printSchema((0, import_graphql5.buildASTSchema)(document2));
2715
+ var printSchemaFromModels = (models) => printSchema((0, import_graphql5.buildASTSchema)(generate(models)));
2679
2716
  // Annotate the CommonJS export names for ESM import in node:
2680
2717
  0 && (module.exports = {
2681
2718
  AliasGenerator,
@@ -2702,6 +2739,7 @@ var getResolvers = (models) => ({
2702
2739
  displayField,
2703
2740
  document,
2704
2741
  enm,
2742
+ execute,
2705
2743
  fieldType,
2706
2744
  fields,
2707
2745
  generate,