@smartive/graphql-magic 23.1.0 → 23.3.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 CHANGED
@@ -1,4 +1,3 @@
1
- ## 23.1.0 (2026-01-28)
1
+ ## 23.3.0 (2026-01-30)
2
2
 
3
- * feat: add utility function to determine if a entity definition acts as a many-to-many entity (#405) ([7ed0303](https://github.com/smartive/graphql-magic/commit/7ed0303)), closes [#405](https://github.com/smartive/graphql-magic/issues/405)
4
- * chore(deps): update dependency prettier to v3.8.1 (#404) ([54b2866](https://github.com/smartive/graphql-magic/commit/54b2866)), closes [#404](https://github.com/smartive/graphql-magic/issues/404)
3
+ * feat: enhance staticEval to support destructuring and rest parameters in function arguments (#406) ([adf91c6](https://github.com/smartive/graphql-magic/commit/adf91c6)), closes [#406](https://github.com/smartive/graphql-magic/issues/406)
package/dist/bin/gqm.cjs CHANGED
@@ -592,9 +592,20 @@ var get = (object2, key) => {
592
592
  }
593
593
  return value2;
594
594
  };
595
- var isManyToManyRelationEntityModel = ({ fields: fields2 }) => {
595
+ var isManyToManyRelationEntityModel = ({
596
+ fields: fields2,
597
+ manyToManyRelation
598
+ }) => {
596
599
  const nonGeneratedFields = fields2.filter((field) => !field.generated);
597
- return nonGeneratedFields.length === 2 && nonGeneratedFields.every((field) => field.kind === "relation");
600
+ const relationFields = nonGeneratedFields.filter((field) => field.kind === "relation");
601
+ if (manyToManyRelation === void 0) {
602
+ return nonGeneratedFields.length === 2 && nonGeneratedFields.length === relationFields.length;
603
+ }
604
+ if (manyToManyRelation === true && relationFields.length !== 2) {
605
+ console.trace();
606
+ throw new Error("Entity is marked as many-to-many relation but does not have exactly 2 relation fields.");
607
+ }
608
+ return manyToManyRelation;
598
609
  };
599
610
 
600
611
  // src/db/generate.ts
@@ -2314,6 +2325,7 @@ var KNOWN_IDENTIFIERS = {
2314
2325
  var staticEval = (node, context) => visit(node, context, VISITOR);
2315
2326
  var VISITOR = {
2316
2327
  undefined: () => void 0,
2328
+ [import_ts_morph2.SyntaxKind.BindingElement]: (node, context) => context[node.getName()],
2317
2329
  [import_ts_morph2.SyntaxKind.VariableDeclaration]: (node, context) => staticEval(node.getInitializer(), context),
2318
2330
  [import_ts_morph2.SyntaxKind.ArrayLiteralExpression]: (node, context) => {
2319
2331
  const values = [];
@@ -2409,7 +2421,41 @@ var VISITOR = {
2409
2421
  const parameters = {};
2410
2422
  let i = 0;
2411
2423
  for (const parameter of node.getParameters()) {
2412
- parameters[parameter.getName()] = args2[i];
2424
+ const argument = args2[i];
2425
+ if (parameter.isRestParameter()) {
2426
+ parameters[parameter.getName()] = args2.slice(i);
2427
+ } else {
2428
+ const nameNode = parameter.getNameNode();
2429
+ if (import_ts_morph2.Node.isObjectBindingPattern(nameNode)) {
2430
+ const value2 = argument ?? {};
2431
+ const usedKeys = /* @__PURE__ */ new Set();
2432
+ for (const element of nameNode.getElements()) {
2433
+ if (element.getDotDotDotToken()) {
2434
+ const restName = element.getName();
2435
+ const restValue = {};
2436
+ for (const key in value2) {
2437
+ if (!usedKeys.has(key)) {
2438
+ restValue[key] = value2[key];
2439
+ }
2440
+ }
2441
+ parameters[restName] = restValue;
2442
+ } else {
2443
+ const propertyNameNode = element.getPropertyNameNode();
2444
+ const elementDetails = element.getNameNode();
2445
+ const key = propertyNameNode ? propertyNameNode.getText() : elementDetails.getText();
2446
+ const variableName = elementDetails.getText();
2447
+ usedKeys.add(key);
2448
+ let propertyValue = value2[key];
2449
+ if (propertyValue === void 0 && element.hasInitializer()) {
2450
+ propertyValue = staticEval(element.getInitializer(), { ...context, ...parameters });
2451
+ }
2452
+ parameters[variableName] = propertyValue;
2453
+ }
2454
+ }
2455
+ } else {
2456
+ parameters[parameter.getName()] = argument;
2457
+ }
2458
+ }
2413
2459
  i++;
2414
2460
  }
2415
2461
  return staticEval(node.getBody(), { ...context, ...parameters });
@@ -891,9 +891,20 @@ var as = (value2, type) => {
891
891
  }
892
892
  return value2;
893
893
  };
894
- var isManyToManyRelationEntityModel = ({ fields: fields2 }) => {
894
+ var isManyToManyRelationEntityModel = ({
895
+ fields: fields2,
896
+ manyToManyRelation
897
+ }) => {
895
898
  const nonGeneratedFields = fields2.filter((field) => !field.generated);
896
- return nonGeneratedFields.length === 2 && nonGeneratedFields.every((field) => field.kind === "relation");
899
+ const relationFields = nonGeneratedFields.filter((field) => field.kind === "relation");
900
+ if (manyToManyRelation === void 0) {
901
+ return nonGeneratedFields.length === 2 && nonGeneratedFields.length === relationFields.length;
902
+ }
903
+ if (manyToManyRelation === true && relationFields.length !== 2) {
904
+ console.trace();
905
+ throw new Error("Entity is marked as many-to-many relation but does not have exactly 2 relation fields.");
906
+ }
907
+ return manyToManyRelation;
897
908
  };
898
909
 
899
910
  // src/client/queries.ts
@@ -170,6 +170,11 @@ export type ModelDefinition = {
170
170
  displayField?: string;
171
171
  defaultOrderBy?: OrderBy[];
172
172
  fields: EntityFieldDefinition[];
173
+ /**
174
+ * Use this field to explicitly mark/unmark an entity model as a many-to-many relation entity.
175
+ * If not set, graphql-magic will try to infer it based on its fields.
176
+ */
177
+ manyToManyRelation?: boolean;
173
178
  deleted?: true;
174
179
  oldName?: string;
175
180
  });
@@ -57,5 +57,5 @@ type Typeof = {
57
57
  function: Function;
58
58
  };
59
59
  export declare const as: <T extends keyof Typeof>(value: unknown, type: T) => Typeof[T];
60
- export declare const isManyToManyRelationEntityModel: ({ fields }: Pick<EntityModelDefinition, "fields">) => boolean;
60
+ export declare const isManyToManyRelationEntityModel: ({ fields, manyToManyRelation, }: Pick<EntityModelDefinition, "fields" | "manyToManyRelation">) => boolean;
61
61
  export {};
@@ -100,8 +100,16 @@ export const as = (value, type) => {
100
100
  }
101
101
  return value;
102
102
  };
103
- export const isManyToManyRelationEntityModel = ({ fields }) => {
103
+ export const isManyToManyRelationEntityModel = ({ fields, manyToManyRelation, }) => {
104
104
  const nonGeneratedFields = fields.filter((field) => !field.generated);
105
- return nonGeneratedFields.length === 2 && nonGeneratedFields.every((field) => field.kind === 'relation');
105
+ const relationFields = nonGeneratedFields.filter((field) => field.kind === 'relation');
106
+ if (manyToManyRelation === undefined) {
107
+ return nonGeneratedFields.length === 2 && nonGeneratedFields.length === relationFields.length;
108
+ }
109
+ if (manyToManyRelation === true && relationFields.length !== 2) {
110
+ console.trace();
111
+ throw new Error('Entity is marked as many-to-many relation but does not have exactly 2 relation fields.');
112
+ }
113
+ return manyToManyRelation;
106
114
  };
107
115
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/models/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/models/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smartive/graphql-magic",
3
- "version": "23.1.0",
3
+ "version": "23.3.0",
4
4
  "description": "",
5
5
  "source": "src/index.ts",
6
6
  "type": "module",
@@ -1,5 +1,6 @@
1
1
  import { camelCase, Dictionary, kebabCase, lowerFirst, snakeCase, startCase, upperFirst } from 'lodash';
2
2
  import {
3
+ BindingElement,
3
4
  CaseClause,
4
5
  ElementAccessExpression,
5
6
  Identifier,
@@ -47,6 +48,7 @@ export const staticEval = (node: Node | undefined, context: Dictionary<unknown>)
47
48
 
48
49
  const VISITOR: Visitor<unknown, Dictionary<unknown>> = {
49
50
  undefined: () => undefined,
51
+ [SyntaxKind.BindingElement]: (node: BindingElement, context) => context[node.getName()],
50
52
  [SyntaxKind.VariableDeclaration]: (node, context) => staticEval(node.getInitializer(), context),
51
53
  [SyntaxKind.ArrayLiteralExpression]: (node, context) => {
52
54
  const values: unknown[] = [];
@@ -146,7 +148,52 @@ const VISITOR: Visitor<unknown, Dictionary<unknown>> = {
146
148
  const parameters: Dictionary<unknown> = {};
147
149
  let i = 0;
148
150
  for (const parameter of node.getParameters()) {
149
- parameters[parameter.getName()] = args[i];
151
+ const argument = args[i];
152
+
153
+ if (parameter.isRestParameter()) {
154
+ parameters[parameter.getName()] = args.slice(i);
155
+ } else {
156
+ const nameNode = parameter.getNameNode();
157
+ if (Node.isObjectBindingPattern(nameNode)) {
158
+ const value = (argument ?? {}) as Dictionary<unknown>;
159
+ const usedKeys = new Set<string>();
160
+
161
+ for (const element of nameNode.getElements()) {
162
+ if (element.getDotDotDotToken()) {
163
+ // Handle rest element (...args)
164
+ const restName = element.getName();
165
+ const restValue: Dictionary<unknown> = {};
166
+ for (const key in value) {
167
+ if (!usedKeys.has(key)) {
168
+ restValue[key] = value[key];
169
+ }
170
+ }
171
+ parameters[restName] = restValue;
172
+ } else {
173
+ // Handle property destructuring (prop: alias = defaultValue)
174
+ const propertyNameNode = element.getPropertyNameNode();
175
+ const elementDetails = element.getNameNode();
176
+
177
+ // If "prop: alias", key is "prop". If just "alias", key is "alias".
178
+ const key = propertyNameNode ? propertyNameNode.getText() : elementDetails.getText();
179
+ const variableName = elementDetails.getText();
180
+
181
+ usedKeys.add(key);
182
+
183
+ let propertyValue = value[key];
184
+
185
+ // Handle default values (= defaultValue)
186
+ if (propertyValue === undefined && element.hasInitializer()) {
187
+ propertyValue = staticEval(element.getInitializer(), { ...context, ...parameters });
188
+ }
189
+
190
+ parameters[variableName] = propertyValue;
191
+ }
192
+ }
193
+ } else {
194
+ parameters[parameter.getName()] = argument;
195
+ }
196
+ }
150
197
  i++;
151
198
  }
152
199
  return staticEval(node.getBody(), { ...context, ...parameters });
@@ -156,6 +156,12 @@ export type ModelDefinition = {
156
156
  defaultOrderBy?: OrderBy[];
157
157
  fields: EntityFieldDefinition[];
158
158
 
159
+ /**
160
+ * Use this field to explicitly mark/unmark an entity model as a many-to-many relation entity.
161
+ * If not set, graphql-magic will try to infer it based on its fields.
162
+ */
163
+ manyToManyRelation?: boolean;
164
+
159
165
  // temporary fields for the generation of migrations
160
166
  deleted?: true;
161
167
  oldName?: string;
@@ -199,8 +199,21 @@ export const as = <T extends keyof Typeof>(value: unknown, type: T): Typeof[T] =
199
199
  return value as Typeof[T];
200
200
  };
201
201
 
202
- export const isManyToManyRelationEntityModel = ({ fields }: Pick<EntityModelDefinition, 'fields'>) => {
202
+ export const isManyToManyRelationEntityModel = ({
203
+ fields,
204
+ manyToManyRelation,
205
+ }: Pick<EntityModelDefinition, 'fields' | 'manyToManyRelation'>) => {
203
206
  const nonGeneratedFields = fields.filter((field) => !field.generated);
207
+ const relationFields = nonGeneratedFields.filter((field) => field.kind === 'relation');
204
208
 
205
- return nonGeneratedFields.length === 2 && nonGeneratedFields.every((field) => field.kind === 'relation');
209
+ if (manyToManyRelation === undefined) {
210
+ return nonGeneratedFields.length === 2 && nonGeneratedFields.length === relationFields.length;
211
+ }
212
+
213
+ if (manyToManyRelation === true && relationFields.length !== 2) {
214
+ console.trace();
215
+ throw new Error('Entity is marked as many-to-many relation but does not have exactly 2 relation fields.');
216
+ }
217
+
218
+ return manyToManyRelation;
206
219
  };