@gqlbase/plugins 0.0.2 → 0.0.5

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 (89) hide show
  1. package/dist/base/ModelPlugin/ModelPlugin.d.ts +97 -0
  2. package/dist/base/ModelPlugin/ModelPlugin.d.ts.map +1 -0
  3. package/dist/base/ModelPlugin/ModelPlugin.js +405 -0
  4. package/dist/base/ModelPlugin/ModelPlugin.js.map +1 -0
  5. package/dist/base/ModelPlugin/ModelPlugin.utils.d.ts +31 -0
  6. package/dist/base/ModelPlugin/ModelPlugin.utils.d.ts.map +1 -0
  7. package/dist/base/ModelPlugin/ModelPlugin.utils.js +57 -0
  8. package/dist/base/ModelPlugin/ModelPlugin.utils.js.map +1 -0
  9. package/dist/base/ModelPlugin/index.d.ts +3 -0
  10. package/dist/base/ModelPlugin/index.d.ts.map +1 -0
  11. package/dist/base/ModelPlugin/index.js +3 -0
  12. package/dist/base/ModelPlugin/index.js.map +1 -0
  13. package/dist/base/ModelTypesGeneratorPlugin/ModelTypesGeneratorPlugin.d.ts +23 -0
  14. package/dist/base/ModelTypesGeneratorPlugin/ModelTypesGeneratorPlugin.d.ts.map +1 -0
  15. package/dist/base/ModelTypesGeneratorPlugin/ModelTypesGeneratorPlugin.js +161 -0
  16. package/dist/base/ModelTypesGeneratorPlugin/ModelTypesGeneratorPlugin.js.map +1 -0
  17. package/dist/base/ModelTypesGeneratorPlugin/ModelTypesGeneratorPlugin.utils.d.ts +12 -0
  18. package/dist/base/ModelTypesGeneratorPlugin/ModelTypesGeneratorPlugin.utils.d.ts.map +1 -0
  19. package/dist/base/ModelTypesGeneratorPlugin/ModelTypesGeneratorPlugin.utils.js +30 -0
  20. package/dist/base/ModelTypesGeneratorPlugin/ModelTypesGeneratorPlugin.utils.js.map +1 -0
  21. package/dist/base/ModelTypesGeneratorPlugin/index.d.ts +2 -0
  22. package/dist/base/ModelTypesGeneratorPlugin/index.d.ts.map +1 -0
  23. package/dist/base/ModelTypesGeneratorPlugin/index.js +2 -0
  24. package/dist/base/ModelTypesGeneratorPlugin/index.js.map +1 -0
  25. package/dist/base/RelationsPlugin/RelationsPlugin.d.ts +60 -0
  26. package/dist/base/RelationsPlugin/RelationsPlugin.d.ts.map +1 -0
  27. package/dist/base/RelationsPlugin/RelationsPlugin.js +188 -0
  28. package/dist/base/RelationsPlugin/RelationsPlugin.js.map +1 -0
  29. package/dist/base/RelationsPlugin/RelationsPlugin.utils.d.ts +19 -0
  30. package/dist/base/RelationsPlugin/RelationsPlugin.utils.d.ts.map +1 -0
  31. package/dist/base/RelationsPlugin/RelationsPlugin.utils.js +30 -0
  32. package/dist/base/RelationsPlugin/RelationsPlugin.utils.js.map +1 -0
  33. package/dist/base/RelationsPlugin/index.d.ts +3 -0
  34. package/dist/base/RelationsPlugin/index.d.ts.map +1 -0
  35. package/dist/base/RelationsPlugin/index.js +3 -0
  36. package/dist/base/RelationsPlugin/index.js.map +1 -0
  37. package/dist/base/ScalarsPlugin/ScalarsPlugin.d.ts +56 -0
  38. package/dist/base/ScalarsPlugin/ScalarsPlugin.d.ts.map +1 -0
  39. package/dist/base/ScalarsPlugin/ScalarsPlugin.js +140 -0
  40. package/dist/base/ScalarsPlugin/ScalarsPlugin.js.map +1 -0
  41. package/dist/base/ScalarsPlugin/index.d.ts +2 -0
  42. package/dist/base/ScalarsPlugin/index.d.ts.map +1 -0
  43. package/dist/base/ScalarsPlugin/index.js +2 -0
  44. package/dist/base/ScalarsPlugin/index.js.map +1 -0
  45. package/dist/base/SchemaGeneratorPlugin.d.ts +7 -0
  46. package/dist/base/SchemaGeneratorPlugin.d.ts.map +1 -0
  47. package/dist/base/SchemaGeneratorPlugin.js +14 -0
  48. package/dist/base/SchemaGeneratorPlugin.js.map +1 -0
  49. package/dist/base/UtilitiesPlugin/UtilitiesPlugin.d.ts +17 -0
  50. package/dist/base/UtilitiesPlugin/UtilitiesPlugin.d.ts.map +1 -0
  51. package/dist/base/UtilitiesPlugin/UtilitiesPlugin.js +66 -0
  52. package/dist/base/UtilitiesPlugin/UtilitiesPlugin.js.map +1 -0
  53. package/dist/base/UtilitiesPlugin/UtilitiesPlugin.utils.d.ts +25 -0
  54. package/dist/base/UtilitiesPlugin/UtilitiesPlugin.utils.d.ts.map +1 -0
  55. package/dist/base/UtilitiesPlugin/UtilitiesPlugin.utils.js +38 -0
  56. package/dist/base/UtilitiesPlugin/UtilitiesPlugin.utils.js.map +1 -0
  57. package/dist/base/UtilitiesPlugin/index.d.ts +3 -0
  58. package/dist/base/UtilitiesPlugin/index.d.ts.map +1 -0
  59. package/dist/base/UtilitiesPlugin/index.js +3 -0
  60. package/dist/base/UtilitiesPlugin/index.js.map +1 -0
  61. package/dist/base/basePreset.d.ts +15 -0
  62. package/dist/base/basePreset.d.ts.map +1 -0
  63. package/dist/base/basePreset.js +30 -0
  64. package/dist/base/basePreset.js.map +1 -0
  65. package/dist/base/index.d.ts +6 -2
  66. package/dist/base/index.d.ts.map +1 -1
  67. package/dist/base/index.js +7 -2
  68. package/dist/base/index.js.map +1 -0
  69. package/dist/relay/ConnectionPlugin.d.ts +46 -0
  70. package/dist/relay/ConnectionPlugin.d.ts.map +1 -0
  71. package/dist/relay/ConnectionPlugin.js +200 -0
  72. package/dist/relay/ConnectionPlugin.js.map +1 -0
  73. package/dist/{base → relay}/NodeInterfacePlugin.d.ts +1 -0
  74. package/dist/relay/NodeInterfacePlugin.d.ts.map +1 -0
  75. package/dist/{base → relay}/NodeInterfacePlugin.js +20 -6
  76. package/dist/relay/NodeInterfacePlugin.js.map +1 -0
  77. package/dist/relay/index.d.ts +3 -0
  78. package/dist/relay/index.d.ts.map +1 -0
  79. package/dist/relay/index.js +3 -0
  80. package/dist/relay/index.js.map +1 -0
  81. package/dist/relay/relayPreset.d.ts +11 -0
  82. package/dist/relay/relayPreset.d.ts.map +1 -0
  83. package/dist/relay/relayPreset.js +15 -0
  84. package/dist/relay/relayPreset.js.map +1 -0
  85. package/package.json +3 -3
  86. package/dist/base/ModelPlugin.d.ts +0 -59
  87. package/dist/base/ModelPlugin.d.ts.map +0 -1
  88. package/dist/base/ModelPlugin.js +0 -222
  89. package/dist/base/NodeInterfacePlugin.d.ts.map +0 -1
@@ -0,0 +1,200 @@
1
+ import { createPluginFactory } from "@gqlbase/core/plugins";
2
+ import { InputValueNode, InterfaceNode, ObjectNode, FieldNode, UnionNode, NonNullTypeNode, ListTypeNode, NamedTypeNode, DirectiveNode, } from "@gqlbase/core/definition";
3
+ import { TransformerPluginExecutionError } from "@gqlbase/shared/errors";
4
+ import { camelCase, pascalCase } from "@gqlbase/shared/format";
5
+ import { UtilityDirective } from "../base/index.js";
6
+ import { isRelationField } from "../base/RelationsPlugin/index.js";
7
+ export const ConnectionDirective = {
8
+ HAS_ONE: "hasOne",
9
+ HAS_MANY: "hasMany",
10
+ };
11
+ export const RelationType = {
12
+ ONE_TO_ONE: "oneToOne",
13
+ ONE_TO_MANY: "oneToMany",
14
+ MANY_TO_MANY: "manyToMany",
15
+ };
16
+ export const isConnectionNode = (node) => {
17
+ if (node instanceof ObjectNode) {
18
+ if (!node.name.endsWith("Connection"))
19
+ return false;
20
+ if (!node.fields || node.fields.length < 2)
21
+ return false;
22
+ if (!node.hasField("edges") || !node.hasField("pageInfo"))
23
+ return false;
24
+ return true;
25
+ }
26
+ return false;
27
+ };
28
+ export const isEdgeNode = (node) => {
29
+ if (node instanceof ObjectNode) {
30
+ if (!node.name.endsWith("Edge"))
31
+ return false;
32
+ if (!node.fields || node.fields.length < 2)
33
+ return false;
34
+ if (!node.hasField("node") || !node.hasField("cursor"))
35
+ return false;
36
+ return true;
37
+ }
38
+ return false;
39
+ };
40
+ export class ConnectionPlugin {
41
+ name = "ConnectionPlugin";
42
+ context;
43
+ constructor(context) {
44
+ this.context = context;
45
+ }
46
+ _getConnectionTarget(field) {
47
+ const fieldType = this.context.document.getNode(field.type.getTypeName());
48
+ if (isRelationField(field)) {
49
+ return fieldType;
50
+ }
51
+ return undefined;
52
+ }
53
+ _getFieldConnection(object, field) {
54
+ const target = this._getConnectionTarget(field);
55
+ if (!target)
56
+ return null;
57
+ if (!(target instanceof ObjectNode) &&
58
+ !(target instanceof InterfaceNode) &&
59
+ !(target instanceof UnionNode)) {
60
+ throw new TransformerPluginExecutionError(this.name, `Type ${target.name} is not a valid connection target for ${object.name}.${field.name} `);
61
+ }
62
+ let directive = field.getDirective(ConnectionDirective.HAS_ONE);
63
+ if (directive) {
64
+ if (field.hasDirective(ConnectionDirective.HAS_MANY)) {
65
+ throw new TransformerPluginExecutionError(this.name, `Multiple connection directive detected for field: ${field.name}`);
66
+ }
67
+ const args = directive.getArgumentsJSON();
68
+ return {
69
+ relation: RelationType.ONE_TO_ONE,
70
+ target: target,
71
+ key: args.key ?? camelCase(field.name, "id"),
72
+ };
73
+ }
74
+ directive = field.getDirective(ConnectionDirective.HAS_MANY);
75
+ if (directive) {
76
+ const args = directive.getArgumentsJSON();
77
+ return {
78
+ relation: args.relation ?? RelationType.ONE_TO_MANY,
79
+ target: target,
80
+ key: args.key,
81
+ };
82
+ }
83
+ throw new TransformerPluginExecutionError(this.name, `Could not find connection directive: ${field.name}`);
84
+ }
85
+ _setConnectionArguments(field) {
86
+ if (!field.hasArgument("first")) {
87
+ field.addArgument(InputValueNode.create("first", NamedTypeNode.create("Int")));
88
+ }
89
+ if (!field.hasArgument("after")) {
90
+ field.addArgument(InputValueNode.create("after", NamedTypeNode.create("String")));
91
+ }
92
+ }
93
+ /**
94
+ * For one-to-many connections user should be able to add the connection key via mutations.
95
+ * By default the connection key is _writeOnly_ meaning we only add it to the mutation inputs.
96
+ */
97
+ _setConnectionKey(node, key, isPrivate = false) {
98
+ if (!node.hasField(key)) {
99
+ node.addField(FieldNode.create(key, NamedTypeNode.create("ID"), null, [
100
+ isPrivate
101
+ ? DirectiveNode.create(UtilityDirective.SERVER_ONLY)
102
+ : DirectiveNode.create(UtilityDirective.WRITE_ONLY),
103
+ ]));
104
+ }
105
+ }
106
+ _createConnectionTypes(field, connection) {
107
+ const { target } = connection;
108
+ if (!isConnectionNode(target)) {
109
+ const connectionTypeName = pascalCase(target.name, "connection");
110
+ const edgeTypeName = pascalCase(target.name, "edge");
111
+ let connectionType = this.context.document.getNode(connectionTypeName);
112
+ let edgeType = this.context.document.getNode(edgeTypeName);
113
+ if (!connectionType) {
114
+ connectionType = ObjectNode.create(connectionTypeName, [
115
+ FieldNode.create("edges", NonNullTypeNode.create(ListTypeNode.create(NonNullTypeNode.create(edgeTypeName)))),
116
+ FieldNode.create("pageInfo", NonNullTypeNode.create("PageInfo")),
117
+ ]);
118
+ this.context.document.addNode(connectionType);
119
+ }
120
+ if (!edgeType) {
121
+ edgeType = ObjectNode.create(`${target.name}Edge`, [
122
+ FieldNode.create("cursor", NamedTypeNode.create("String"), null, [
123
+ DirectiveNode.create(UtilityDirective.CLIENT_ONLY),
124
+ ]),
125
+ FieldNode.create("node", NamedTypeNode.create(target.name), null, [
126
+ DirectiveNode.create(UtilityDirective.CLIENT_ONLY),
127
+ ]),
128
+ ]);
129
+ this.context.document.addNode(edgeType);
130
+ }
131
+ this._setConnectionArguments(field);
132
+ field.setType(NonNullTypeNode.create(connectionTypeName));
133
+ }
134
+ }
135
+ _createEdgesConnection(parent, field, connection) {
136
+ this._createConnectionTypes(field, connection);
137
+ }
138
+ init() {
139
+ this.context.base.addNode(ObjectNode.create("PageInfo", [
140
+ FieldNode.create("hasNextPage", NamedTypeNode.create("Boolean")),
141
+ FieldNode.create("hasPreviousPage", NamedTypeNode.create("Boolean")),
142
+ FieldNode.create("startCursor", NamedTypeNode.create("String")),
143
+ FieldNode.create("endCursor", NamedTypeNode.create("String")),
144
+ ]));
145
+ }
146
+ match(definition) {
147
+ if (definition instanceof InterfaceNode || definition instanceof ObjectNode) {
148
+ if (definition.name === "Mutation")
149
+ return false;
150
+ if (isConnectionNode(definition) || isEdgeNode(definition))
151
+ return false;
152
+ if (!definition.fields?.length)
153
+ return false;
154
+ return true;
155
+ }
156
+ return false;
157
+ }
158
+ normalize(definition) {
159
+ for (const field of definition.fields ?? []) {
160
+ const connection = this._getFieldConnection(definition, field);
161
+ if (!connection) {
162
+ continue;
163
+ }
164
+ if (connection.relation === RelationType.ONE_TO_ONE && connection.key) {
165
+ this._setConnectionKey(definition, connection.key, true);
166
+ }
167
+ if (connection.relation === RelationType.ONE_TO_MANY &&
168
+ !isConnectionNode(connection.target)) {
169
+ const sourceKey = connection.key ?? camelCase(definition.name, "id");
170
+ if (connection.target instanceof UnionNode) {
171
+ for (const type of connection.target.types ?? []) {
172
+ const unionType = this.context.document.getNode(type.getTypeName());
173
+ if (unionType instanceof ObjectNode || unionType instanceof InterfaceNode) {
174
+ this._setConnectionKey(unionType, sourceKey, false);
175
+ }
176
+ }
177
+ }
178
+ else {
179
+ this._setConnectionKey(connection.target, sourceKey, false);
180
+ }
181
+ }
182
+ }
183
+ }
184
+ execute(definition) {
185
+ if (!definition.fields) {
186
+ throw new TransformerPluginExecutionError(this.name, "Definition does not have any fields. Make sure you run `match` before calling `execute`.");
187
+ }
188
+ for (const field of definition.fields) {
189
+ const connection = this._getFieldConnection(definition, field);
190
+ if (!connection) {
191
+ continue;
192
+ }
193
+ if (connection.relation === RelationType.ONE_TO_MANY) {
194
+ this._createEdgesConnection(definition, field, connection);
195
+ }
196
+ }
197
+ }
198
+ }
199
+ export const connectionPlugin = createPluginFactory(ConnectionPlugin);
200
+ //# sourceMappingURL=ConnectionPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConnectionPlugin.js","sourceRoot":"","sources":["../../src/relay/ConnectionPlugin.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { DefinitionNode, ObjectNode } from "@gqlbase/core/definition";
4
4
  /**
5
5
  * Adds a `Node` interface with an `id: ID!` field to the schema and ensures that all types that implement the `Node` interface also have the `id: ID!` field.
6
6
  *
7
+ * @dependency ModelPlugin
7
8
  */
8
9
  export declare class NodeInterfacePlugin implements ITransformerPlugin {
9
10
  readonly name = "NodeInterfacePlugin";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeInterfacePlugin.d.ts","sourceRoot":"","sources":["../../src/relay/NodeInterfacePlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EACL,cAAc,EAOd,UAAU,EACX,MAAM,0BAA0B,CAAC;AAIlC;;;;GAIG;AAEH,qBAAa,mBAAoB,YAAW,kBAAkB;IAC5D,SAAgB,IAAI,yBAAyB;IAC7C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;gBAE1B,OAAO,EAAE,mBAAmB;IAIjC,IAAI,IAAI,IAAI;IAInB,KAAK,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO;IAU1C,MAAM,IAAI,IAAI;IA8Bd,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAmC9B,KAAK,IAAI,IAAI;CAiBrB;AAED,eAAO,MAAM,mBAAmB,uEAA2C,CAAC"}
@@ -1,9 +1,11 @@
1
1
  import { createPluginFactory } from "@gqlbase/core/plugins";
2
2
  import { DirectiveNode, FieldNode, InputValueNode, InterfaceNode, NamedTypeNode, NonNullTypeNode, ObjectNode, } from "@gqlbase/core/definition";
3
- import { TransformerPluginExecutionError } from "@gqlbase/shared/errors";
3
+ import { InvalidDefinitionError, TransformerPluginExecutionError } from "@gqlbase/shared/errors";
4
+ import { isModel } from "../base/index.js";
4
5
  /**
5
6
  * Adds a `Node` interface with an `id: ID!` field to the schema and ensures that all types that implement the `Node` interface also have the `id: ID!` field.
6
7
  *
8
+ * @dependency ModelPlugin
7
9
  */
8
10
  export class NodeInterfacePlugin {
9
11
  name = "NodeInterfacePlugin";
@@ -12,19 +14,30 @@ export class NodeInterfacePlugin {
12
14
  this.context = context;
13
15
  }
14
16
  init() {
15
- this.context.base.addNode(InterfaceNode.create("Node", [
16
- FieldNode.create("id", NonNullTypeNode.create(NamedTypeNode.create("ID"))),
17
- ]));
17
+ // No initialization needed
18
18
  }
19
19
  match(definition) {
20
20
  if (definition instanceof ObjectNode) {
21
- if (definition.hasInterface("Node") || definition.hasDirective("model")) {
21
+ if (definition.hasInterface("Node") || isModel(definition)) {
22
22
  return true;
23
23
  }
24
24
  }
25
25
  return false;
26
26
  }
27
27
  before() {
28
+ let node = this.context.document.getNode("Node");
29
+ if (node) {
30
+ if (!(node instanceof InterfaceNode)) {
31
+ throw new InvalidDefinitionError("Node type must be an interface");
32
+ }
33
+ }
34
+ else {
35
+ node = InterfaceNode.create("Node", []);
36
+ this.context.document.addNode(node);
37
+ }
38
+ if (!node.hasField("id")) {
39
+ node.addField(FieldNode.create("id", NonNullTypeNode.create(NamedTypeNode.create("ID"))));
40
+ }
28
41
  const queryNode = this.context.document.getQueryNode();
29
42
  if (!queryNode.hasField("node")) {
30
43
  queryNode.addField(FieldNode.create("node", NamedTypeNode.create("Node"), [InputValueNode.create("id", NonNullTypeNode.create(NamedTypeNode.create("ID")))], [DirectiveNode.create("hasOne")]));
@@ -36,7 +49,7 @@ export class NodeInterfacePlugin {
36
49
  throw new TransformerPluginExecutionError(this.name, "Node Interface not found. Make sure you run `plugin.init()` before executing.");
37
50
  }
38
51
  // In definition has directive `@model` it should also implement `Node` interface
39
- if (definition.hasDirective("model")) {
52
+ if (isModel(definition) && !definition.hasInterface("Node")) {
40
53
  definition.addInterface(nodeInterface.name);
41
54
  }
42
55
  // Make sure that all fields declared by `Node` interface are declared by definition as well
@@ -68,3 +81,4 @@ export class NodeInterfacePlugin {
68
81
  }
69
82
  }
70
83
  export const nodeInterfacePlugin = createPluginFactory(NodeInterfacePlugin);
84
+ //# sourceMappingURL=NodeInterfacePlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeInterfacePlugin.js","sourceRoot":"","sources":["../../src/relay/NodeInterfacePlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { ConnectionPlugin, ConnectionDirective, connectionPlugin, isConnectionNode, isEdgeNode, } from "./ConnectionPlugin.js";
2
+ export { NodeInterfacePlugin, nodeInterfacePlugin } from "./NodeInterfacePlugin.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/relay/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { ConnectionPlugin, ConnectionDirective, connectionPlugin, isConnectionNode, isEdgeNode, } from "./ConnectionPlugin.js";
2
+ export { NodeInterfacePlugin, nodeInterfacePlugin } from "./NodeInterfacePlugin.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/relay/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,GACX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * A preset that includes all the Relay plugins
3
+ *
4
+ * Inludes:
5
+ * - `NodeInterfacePlugin`
6
+ * - `ConnectionPlugin`
7
+ *
8
+ * @returns An array of plugin factories.
9
+ */
10
+ export declare function relayPreset(): import("@gqlbase/core").IPluginFactory[];
11
+ //# sourceMappingURL=relayPreset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayPreset.d.ts","sourceRoot":"","sources":["../../src/relay/relayPreset.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,wBAAgB,WAAW,6CAE1B"}
@@ -0,0 +1,15 @@
1
+ import { connectionPlugin } from "./ConnectionPlugin.js";
2
+ import { nodeInterfacePlugin } from "./NodeInterfacePlugin.js";
3
+ /**
4
+ * A preset that includes all the Relay plugins
5
+ *
6
+ * Inludes:
7
+ * - `NodeInterfacePlugin`
8
+ * - `ConnectionPlugin`
9
+ *
10
+ * @returns An array of plugin factories.
11
+ */
12
+ export function relayPreset() {
13
+ return [nodeInterfacePlugin(), connectionPlugin()];
14
+ }
15
+ //# sourceMappingURL=relayPreset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayPreset.js","sourceRoot":"","sources":["../../src/relay/relayPreset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;;;;;;;GAQG;AAEH,MAAM,UAAU,WAAW;IACzB,OAAO,CAAC,mBAAmB,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;AACrD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gqlbase/plugins",
3
- "version": "0.0.2",
3
+ "version": "0.0.5",
4
4
  "description": "Collection of plugins and presets for gqlbase, providing common transformations and utilities that can be used in GraphQL schema transformation processes.",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -42,8 +42,8 @@
42
42
  "test": "vitest run"
43
43
  },
44
44
  "dependencies": {
45
- "@gqlbase/core": "*",
46
- "@gqlbase/shared": "*"
45
+ "@gqlbase/core": "^0.0.5",
46
+ "@gqlbase/shared": "^0.0.5"
47
47
  },
48
48
  "peerDependencies": {
49
49
  "graphql": ">=16"
@@ -1,59 +0,0 @@
1
- import { ITransformerPlugin } from "@gqlbase/core";
2
- import type { ITransformerContext } from "@gqlbase/core/context";
3
- import { DefinitionNode, ObjectNode } from "@gqlbase/core/definition";
4
- export declare const ModelDirective: {
5
- readonly MODEL: "model";
6
- };
7
- export declare const ModelOperation: {
8
- readonly GET: "get";
9
- readonly LIST: "list";
10
- readonly SYNC: "sync";
11
- readonly SUBSCRIBE: "subscribe";
12
- readonly CREATE: "create";
13
- readonly UPDATE: "update";
14
- readonly UPSERT: "upsert";
15
- readonly DELETE: "delete";
16
- readonly READ: "read";
17
- readonly WRITE: "write";
18
- };
19
- type OperationType = (typeof ModelOperation)[keyof typeof ModelOperation];
20
- export declare const DEFAULT_READ_OPERATIONS: OperationType[];
21
- export declare const DEFAULT_WRITE_OPERATIONS: OperationType[];
22
- export declare const isModel: (definition: DefinitionNode) => definition is ObjectNode;
23
- export interface ModelPluginOptions {
24
- operations: OperationType[];
25
- }
26
- export declare class ModelPlugin implements ITransformerPlugin {
27
- readonly name = "ModelPlugin";
28
- readonly context: ITransformerContext;
29
- private _defaultOperations;
30
- constructor(context: ITransformerContext, options?: ModelPluginOptions);
31
- private _expandOperations;
32
- private _getOperationNames;
33
- private _createGetQuery;
34
- private _createListQuery;
35
- private _shouldSkipFieldFromMutationInput;
36
- private _isBuildInScalarType;
37
- /**
38
- * For each field in the model
39
- * 1. If has `@readOnly` or connection directives - skip
40
- * 2. If scalar or enum - add to input;
41
- * 3. If union - skip;
42
- * 4. If object or interface - check definition;
43
- * 4.1 If `@model` - skip;
44
- * 4.2 If implements `Node` interface - skip
45
- * 4.3 If fields are `@readOnly` - skip;
46
- */
47
- private _createMutationInput;
48
- private _createDeleteMutationField;
49
- private _createMutationField;
50
- private _createMutation;
51
- init(): void;
52
- match(definition: DefinitionNode): definition is ObjectNode;
53
- execute(definition: ObjectNode): void;
54
- cleanup(definition: ObjectNode): void;
55
- after(): void;
56
- }
57
- export declare const modelPlugin: (options?: ModelPluginOptions | undefined) => import("@gqlbase/core").IPluginFactory;
58
- export {};
59
- //# sourceMappingURL=ModelPlugin.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ModelPlugin.d.ts","sourceRoot":"","sources":["../../src/base/ModelPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EACL,cAAc,EAUd,UAAU,EAEX,MAAM,0BAA0B,CAAC;AAKlC,eAAO,MAAM,cAAc;;CAEjB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;;;;;;;CAWjB,CAAC;AAEX,KAAK,aAAa,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAE1E,eAAO,MAAM,uBAAuB,EAAE,aAAa,EAAoB,CAAC;AACxE,eAAO,MAAM,wBAAwB,EAAE,aAAa,EAAmC,CAAC;AAExF,eAAO,MAAM,OAAO,GAAI,YAAY,cAAc,KAAG,UAAU,IAAI,UAElE,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED,qBAAa,WAAY,YAAW,kBAAkB;IACpD,SAAgB,IAAI,iBAAiB;IACrC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,OAAO,CAAC,kBAAkB,CAAkB;gBAG1C,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE,kBAAsD;IASjE,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,kBAAkB;IAmB1B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,iCAAiC;IAUzC,OAAO,CAAC,oBAAoB;IAI5B;;;;;;;;;OASG;IAEH,OAAO,CAAC,oBAAoB;IAkE5B,OAAO,CAAC,0BAA0B;IAYlC,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,eAAe;IAehB,IAAI;IAqBJ,KAAK,CAAC,UAAU,EAAE,cAAc;IAIhC,OAAO,CAAC,UAAU,EAAE,UAAU;IAwB9B,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAIrC,KAAK,IAAI,IAAI;CAGrB;AAED,eAAO,MAAM,WAAW,sFAAmC,CAAC"}
@@ -1,222 +0,0 @@
1
- import { DirectiveDefinitionNode, DirectiveNode, EnumNode, FieldNode, InputObjectNode, InputValueNode, ListTypeNode, NamedTypeNode, NonNullTypeNode, ObjectNode, ScalarNode, } from "@gqlbase/core/definition";
2
- import { createPluginFactory, InternalDirective } from "@gqlbase/core/plugins";
3
- import { TransformerPluginExecutionError } from "@gqlbase/shared/errors";
4
- import { camelCase, pascalCase, pluralize } from "@gqlbase/shared/format";
5
- export const ModelDirective = {
6
- MODEL: "model",
7
- };
8
- export const ModelOperation = {
9
- GET: "get",
10
- LIST: "list",
11
- SYNC: "sync",
12
- SUBSCRIBE: "subscribe",
13
- CREATE: "create",
14
- UPDATE: "update",
15
- UPSERT: "upsert",
16
- DELETE: "delete",
17
- READ: "read",
18
- WRITE: "write",
19
- };
20
- export const DEFAULT_READ_OPERATIONS = ["get", "list"];
21
- export const DEFAULT_WRITE_OPERATIONS = ["create", "update", "delete"];
22
- export const isModel = (definition) => {
23
- return definition instanceof ObjectNode && definition.hasDirective(ModelDirective.MODEL);
24
- };
25
- export class ModelPlugin {
26
- name = "ModelPlugin";
27
- context;
28
- _defaultOperations;
29
- constructor(context, options = { operations: ["read", "write"] }) {
30
- this.context = context;
31
- this._defaultOperations = this._expandOperations(options.operations);
32
- }
33
- // #region Operations
34
- _expandOperations(operations) {
35
- const expandedOperations = new Set();
36
- for (const operation of operations) {
37
- if (operation === "read") {
38
- DEFAULT_READ_OPERATIONS.forEach((op) => expandedOperations.add(op));
39
- }
40
- else if (operation === "write") {
41
- DEFAULT_WRITE_OPERATIONS.forEach((op) => expandedOperations.add(op));
42
- }
43
- else {
44
- expandedOperations.add(operation);
45
- }
46
- }
47
- return Array.from(expandedOperations);
48
- }
49
- _getOperationNames(object) {
50
- const directive = object.getDirective("model");
51
- if (!directive) {
52
- throw new TransformerPluginExecutionError(this.name, `@model directive not found for type ${object.name}`);
53
- }
54
- const args = directive.getArgumentsJSON();
55
- if (args.operations && args.operations.length > 0) {
56
- return this._expandOperations(args.operations);
57
- }
58
- return this._defaultOperations;
59
- }
60
- _createGetQuery(model) {
61
- const fieldName = camelCase("get", model.name);
62
- const queryNode = this.context.document.getQueryNode();
63
- // We allow users to implement custom definition for fields.
64
- // So, if the field already exists, we skip creating it.
65
- if (!queryNode.hasField(fieldName)) {
66
- const field = FieldNode.create(fieldName, NamedTypeNode.create(model.name), [InputValueNode.create("id", NonNullTypeNode.create("ID"))], [DirectiveNode.create("hasOne")]);
67
- queryNode.addField(field);
68
- }
69
- }
70
- _createListQuery(model) {
71
- const fieldName = camelCase("list", pluralize(model.name));
72
- const queryNode = this.context.document.getQueryNode();
73
- if (!queryNode.hasField(fieldName)) {
74
- const field = FieldNode.create(fieldName, NamedTypeNode.create(model.name), null, [
75
- DirectiveNode.create("hasMany"),
76
- ]);
77
- queryNode.addField(field);
78
- }
79
- }
80
- _shouldSkipFieldFromMutationInput(field) {
81
- return (field.hasDirective("readOnly") ||
82
- field.hasDirective("serverOnly") ||
83
- field.hasDirective("clientOnly") ||
84
- field.hasDirective("hasOne") ||
85
- field.hasDirective("hasMany"));
86
- }
87
- _isBuildInScalarType(typeName) {
88
- return ["ID", "String", "Int", "Float", "Boolean"].includes(typeName);
89
- }
90
- /**
91
- * For each field in the model
92
- * 1. If has `@readOnly` or connection directives - skip
93
- * 2. If scalar or enum - add to input;
94
- * 3. If union - skip;
95
- * 4. If object or interface - check definition;
96
- * 4.1 If `@model` - skip;
97
- * 4.2 If implements `Node` interface - skip
98
- * 4.3 If fields are `@readOnly` - skip;
99
- */
100
- _createMutationInput(model, inputName, requiredFields = []) {
101
- const input = InputObjectNode.create(inputName);
102
- if (inputName.startsWith("Delete")) {
103
- input.addField(InputValueNode.create("id", NonNullTypeNode.create(NamedTypeNode.create("ID"))));
104
- }
105
- else {
106
- for (const field of model.fields ?? []) {
107
- if (this._shouldSkipFieldFromMutationInput(field)) {
108
- continue;
109
- }
110
- const fieldTypeName = field.type.getTypeName();
111
- if (requiredFields.includes(field.name)) {
112
- input.addField(InputValueNode.create(field.name, NonNullTypeNode.create(fieldTypeName)));
113
- continue;
114
- }
115
- // Buildin scalars
116
- if (this._isBuildInScalarType(fieldTypeName)) {
117
- input.addField(InputValueNode.create(field.name, NamedTypeNode.create(fieldTypeName)));
118
- continue;
119
- }
120
- const typeDef = this.context.document.getNode(fieldTypeName);
121
- if (!typeDef) {
122
- throw new TransformerPluginExecutionError(this.name, `Unknown type ${fieldTypeName}`);
123
- }
124
- if (typeDef instanceof ScalarNode || typeDef instanceof EnumNode) {
125
- input.addField(InputValueNode.create(field.name, NamedTypeNode.create(fieldTypeName)));
126
- continue;
127
- }
128
- if (typeDef instanceof ObjectNode) {
129
- if (typeDef.hasDirective("model") ||
130
- typeDef.hasDirective("readOnly") ||
131
- typeDef.hasDirective("serverOnly") ||
132
- typeDef.hasDirective("clientOnly") ||
133
- typeDef.hasInterface("Node")) {
134
- continue;
135
- }
136
- const inputName = pascalCase(fieldTypeName, "input");
137
- if (!this.context.document.hasNode(inputName)) {
138
- this._createMutationInput(typeDef, inputName);
139
- }
140
- input.addField(InputValueNode.create(field.name, NamedTypeNode.create(inputName)));
141
- }
142
- }
143
- }
144
- this.context.document.addNode(input);
145
- }
146
- _createDeleteMutationField(model, fieldName) {
147
- const mutationNode = this.context.document.getMutationNode();
148
- if (!mutationNode.hasField(fieldName)) {
149
- const field = FieldNode.create(fieldName, NamedTypeNode.create(model.name), [
150
- InputValueNode.create("id", NonNullTypeNode.create(NamedTypeNode.create("ID"))),
151
- ]);
152
- mutationNode.addField(field);
153
- }
154
- }
155
- _createMutationField(model, fieldName, inputName, requiredFields) {
156
- const mutationNode = this.context.document.getMutationNode();
157
- if (!this.context.document.getNode(inputName)) {
158
- this._createMutationInput(model, inputName, requiredFields);
159
- }
160
- if (!mutationNode.hasField(fieldName)) {
161
- const field = FieldNode.create(fieldName, NamedTypeNode.create(model.name), [
162
- InputValueNode.create("input", NonNullTypeNode.create(NamedTypeNode.create(inputName))),
163
- ]);
164
- mutationNode.addField(field);
165
- }
166
- }
167
- _createMutation(model, verb) {
168
- const fieldName = camelCase(verb, model.name);
169
- const inputName = pascalCase(verb, model.name, "input");
170
- if (verb === "delete") {
171
- this._createDeleteMutationField(model, fieldName);
172
- }
173
- else if (verb === "update") {
174
- this._createMutationField(model, fieldName, inputName, ["id"]);
175
- }
176
- else {
177
- this._createMutationField(model, fieldName, inputName);
178
- }
179
- }
180
- // #endregion Operations
181
- init() {
182
- this.context.base
183
- .addNode(EnumNode.create("ModelOperation", Object.values(ModelOperation), [
184
- DirectiveNode.create(InternalDirective.INTERNAL),
185
- ]))
186
- .addNode(DirectiveDefinitionNode.create("model", ["OBJECT"], [
187
- InputValueNode.create("operations", ListTypeNode.create(NonNullTypeNode.create("ModelOperation"))),
188
- ]));
189
- }
190
- match(definition) {
191
- return isModel(definition);
192
- }
193
- execute(definition) {
194
- // 1. Add operation fields
195
- const operations = this._getOperationNames(definition);
196
- for (const verb of operations) {
197
- switch (verb) {
198
- case "get":
199
- this._createGetQuery(definition);
200
- break;
201
- case "list":
202
- this._createListQuery(definition);
203
- break;
204
- case "create":
205
- case "upsert":
206
- case "update":
207
- case "delete":
208
- this._createMutation(definition, verb);
209
- break;
210
- default:
211
- continue;
212
- }
213
- }
214
- }
215
- cleanup(definition) {
216
- definition.removeDirective(ModelDirective.MODEL);
217
- }
218
- after() {
219
- this.context.document.removeNode(ModelDirective.MODEL).removeNode("ModelOperation");
220
- }
221
- }
222
- export const modelPlugin = createPluginFactory(ModelPlugin);