@makerx/graphql-core 2.1.0 → 2.2.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 (77) hide show
  1. package/User.d.ts +1 -2
  2. package/User.js +7 -6
  3. package/User.js.map +1 -1
  4. package/User.mjs +48 -0
  5. package/User.mjs.map +1 -0
  6. package/context.d.ts +1 -2
  7. package/context.js +13 -15
  8. package/context.js.map +1 -1
  9. package/context.mjs +75 -0
  10. package/context.mjs.map +1 -0
  11. package/index.d.ts +0 -2
  12. package/index.js +24 -25
  13. package/index.js.map +1 -1
  14. package/index.mjs +7 -0
  15. package/index.mjs.map +1 -0
  16. package/logging.d.ts +4 -4
  17. package/logging.js +19 -21
  18. package/logging.js.map +1 -1
  19. package/logging.mjs +44 -0
  20. package/logging.mjs.map +1 -0
  21. package/models.d.ts +0 -1
  22. package/package.json +29 -11
  23. package/schema-util.d.ts +1 -2
  24. package/schema-util.js +7 -6
  25. package/schema-util.js.map +1 -1
  26. package/schema-util.mjs +29 -0
  27. package/schema-util.mjs.map +1 -0
  28. package/shield.d.ts +5 -5
  29. package/shield.js +11 -10
  30. package/shield.js.map +1 -1
  31. package/shield.mjs +49 -0
  32. package/shield.mjs.map +1 -0
  33. package/subscriptions/context.d.ts +1 -2
  34. package/subscriptions/context.js +15 -14
  35. package/subscriptions/context.js.map +1 -1
  36. package/subscriptions/context.mjs +62 -0
  37. package/subscriptions/context.mjs.map +1 -0
  38. package/subscriptions/index.d.ts +0 -1
  39. package/subscriptions/index.js +12 -22
  40. package/subscriptions/index.js.map +1 -1
  41. package/subscriptions/index.mjs +4 -0
  42. package/subscriptions/index.mjs.map +1 -0
  43. package/subscriptions/server.d.ts +4 -5
  44. package/subscriptions/server.js +24 -26
  45. package/subscriptions/server.js.map +1 -1
  46. package/subscriptions/server.mjs +87 -0
  47. package/subscriptions/server.mjs.map +1 -0
  48. package/subscriptions/utils.d.ts +0 -1
  49. package/subscriptions/utils.js +5 -5
  50. package/subscriptions/utils.js.map +1 -1
  51. package/subscriptions/utils.mjs +21 -0
  52. package/subscriptions/utils.mjs.map +1 -0
  53. package/testing.d.ts +6 -6
  54. package/testing.js +26 -35
  55. package/testing.js.map +1 -1
  56. package/testing.mjs +60 -0
  57. package/testing.mjs.map +1 -0
  58. package/utils.d.ts +0 -1
  59. package/utils.js +6 -6
  60. package/utils.js.map +1 -1
  61. package/utils.mjs +6 -0
  62. package/utils.mjs.map +1 -0
  63. package/User.d.ts.map +0 -1
  64. package/context.d.ts.map +0 -1
  65. package/index.d.ts.map +0 -1
  66. package/logging.d.ts.map +0 -1
  67. package/models.d.ts.map +0 -1
  68. package/models.js +0 -3
  69. package/models.js.map +0 -1
  70. package/schema-util.d.ts.map +0 -1
  71. package/shield.d.ts.map +0 -1
  72. package/subscriptions/context.d.ts.map +0 -1
  73. package/subscriptions/index.d.ts.map +0 -1
  74. package/subscriptions/server.d.ts.map +0 -1
  75. package/subscriptions/utils.d.ts.map +0 -1
  76. package/testing.d.ts.map +0 -1
  77. package/utils.d.ts.map +0 -1
package/User.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { JwtPayload } from './context';
1
+ import type { JwtPayload } from './context';
2
2
  export declare class User {
3
3
  readonly token: string;
4
4
  readonly claims: JwtPayload;
@@ -11,4 +11,3 @@ export declare class User {
11
11
  private first;
12
12
  private firstOrThrow;
13
13
  }
14
- //# sourceMappingURL=User.d.ts.map
package/User.js CHANGED
@@ -1,7 +1,7 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.User = void 0;
4
- const utils_1 = require("./utils");
1
+ 'use strict';
2
+
3
+ var utils = require('./utils.js');
4
+
5
5
  class User {
6
6
  constructor(claims, accessToken) {
7
7
  this.claims = claims;
@@ -17,7 +17,7 @@ class User {
17
17
  get name() {
18
18
  if (this.claims.name)
19
19
  return this.claims.name;
20
- const otherNames = [this.claims.given_name, this.claims.family_name].filter(utils_1.isNotNil);
20
+ const otherNames = [this.claims.given_name, this.claims.family_name].filter(utils.isNotNil);
21
21
  if (otherNames.length > 0)
22
22
  return otherNames.join(' ');
23
23
  return undefined;
@@ -45,5 +45,6 @@ class User {
45
45
  return first;
46
46
  }
47
47
  }
48
+
48
49
  exports.User = User;
49
- //# sourceMappingURL=User.js.map
50
+ //# sourceMappingURL=User.js.map
package/User.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"User.js","sourceRoot":"","sources":["../src/User.ts"],"names":[],"mappings":";;;AACA,mCAAkC;AAElC,MAAa,IAAI;IAIf,YAAY,MAAkB,EAAE,WAAmB;QACjD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAA;IAC1B,CAAC;IAED,IAAI,KAAK;QACP,OAAO,CACL,IAAI,CAAC,MAAM,CAAC,KAAK;YAChB,IAAI,CAAC,MAAM,CAAC,MAA+B,EAAE,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,kBAAkB;YAC9B,IAAI,CAAC,MAAM,CAAC,WAAW;YACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAChB,CAAA;IACH,CAAC;IAED,IAAI,IAAI;QACN,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;QAC7C,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,gBAAQ,CAAC,CAAA;QACrF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACtD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IACxC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1D,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA;IAChC,CAAC;IAEO,KAAK,CAAC,GAAG,MAA+B;QAC9C,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;YACxB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAW,CAAA;SACxD;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAEO,YAAY,CAAC,GAAG,MAA+B;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAA;QACnC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACjF,OAAO,KAAK,CAAA;IACd,CAAC;CACF;AAlDD,oBAkDC"}
1
+ {"version":3,"file":"User.js","sources":["../src/User.ts"],"sourcesContent":["import type { JwtPayload } from './context'\nimport { isNotNil } from './utils'\n\nexport class User {\n public readonly token: string\n public readonly claims: JwtPayload\n\n constructor(claims: JwtPayload, accessToken: string) {\n this.claims = claims\n this.token = accessToken\n }\n\n get email(): string | undefined {\n return (\n this.claims.email ??\n (this.claims.emails as string[] | undefined)?.[0] ??\n this.claims.preferred_username ??\n this.claims.unique_name ??\n this.claims.upn\n )\n }\n\n get name(): string | undefined {\n if (this.claims.name) return this.claims.name\n const otherNames = [this.claims.given_name, this.claims.family_name].filter(isNotNil)\n if (otherNames.length > 0) return otherNames.join(' ')\n return undefined\n }\n\n get id(): string {\n return this.firstOrThrow('oid', 'sub')\n }\n\n get scopes(): string[] {\n return this.claims.scp ? this.claims.scp.split(' ') : []\n }\n\n get roles(): string[] {\n return this.claims.roles ?? []\n }\n\n private first(...claims: Array<keyof JwtPayload>): string | undefined {\n for (const key of claims) {\n if (this.claims[key]) return this.claims[key] as string\n }\n return undefined\n }\n\n private firstOrThrow(...claims: Array<keyof JwtPayload>): string {\n const first = this.first(...claims)\n if (!first) throw new Error(`claims do not include any of: ${claims.join(', ')}`)\n return first\n }\n}\n"],"names":["isNotNil"],"mappings":";;;;MAGa,IAAI,CAAA;IAIf,WAAY,CAAA,MAAkB,EAAE,WAAmB,EAAA;AACjD,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,WAAW,CAAA;KACzB;AAED,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,QACE,IAAI,CAAC,MAAM,CAAC,KAAK;AAChB,YAAA,IAAI,CAAC,MAAM,CAAC,MAA+B,GAAG,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,kBAAkB;YAC9B,IAAI,CAAC,MAAM,CAAC,WAAW;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,EAChB;KACF;AAED,IAAA,IAAI,IAAI,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;QAC7C,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAACA,cAAQ,CAAC,CAAA;AACrF,QAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACtD,QAAA,OAAO,SAAS,CAAA;KACjB;AAED,IAAA,IAAI,EAAE,GAAA;QACJ,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;KACvC;AAED,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;KACzD;AAED,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA;KAC/B;IAEO,KAAK,CAAC,GAAG,MAA+B,EAAA;AAC9C,QAAA,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAW,CAAA;SACxD;AACD,QAAA,OAAO,SAAS,CAAA;KACjB;IAEO,YAAY,CAAC,GAAG,MAA+B,EAAA;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAA;AACnC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,8BAAA,EAAiC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAE,CAAA,CAAC,CAAA;AACjF,QAAA,OAAO,KAAK,CAAA;KACb;AACF;;;;"}
package/User.mjs ADDED
@@ -0,0 +1,48 @@
1
+ import { isNotNil } from './utils.mjs';
2
+
3
+ class User {
4
+ constructor(claims, accessToken) {
5
+ this.claims = claims;
6
+ this.token = accessToken;
7
+ }
8
+ get email() {
9
+ return (this.claims.email ??
10
+ this.claims.emails?.[0] ??
11
+ this.claims.preferred_username ??
12
+ this.claims.unique_name ??
13
+ this.claims.upn);
14
+ }
15
+ get name() {
16
+ if (this.claims.name)
17
+ return this.claims.name;
18
+ const otherNames = [this.claims.given_name, this.claims.family_name].filter(isNotNil);
19
+ if (otherNames.length > 0)
20
+ return otherNames.join(' ');
21
+ return undefined;
22
+ }
23
+ get id() {
24
+ return this.firstOrThrow('oid', 'sub');
25
+ }
26
+ get scopes() {
27
+ return this.claims.scp ? this.claims.scp.split(' ') : [];
28
+ }
29
+ get roles() {
30
+ return this.claims.roles ?? [];
31
+ }
32
+ first(...claims) {
33
+ for (const key of claims) {
34
+ if (this.claims[key])
35
+ return this.claims[key];
36
+ }
37
+ return undefined;
38
+ }
39
+ firstOrThrow(...claims) {
40
+ const first = this.first(...claims);
41
+ if (!first)
42
+ throw new Error(`claims do not include any of: ${claims.join(', ')}`);
43
+ return first;
44
+ }
45
+ }
46
+
47
+ export { User };
48
+ //# sourceMappingURL=User.mjs.map
package/User.mjs.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"User.mjs","sources":["../src/User.ts"],"sourcesContent":["import type { JwtPayload } from './context'\nimport { isNotNil } from './utils'\n\nexport class User {\n public readonly token: string\n public readonly claims: JwtPayload\n\n constructor(claims: JwtPayload, accessToken: string) {\n this.claims = claims\n this.token = accessToken\n }\n\n get email(): string | undefined {\n return (\n this.claims.email ??\n (this.claims.emails as string[] | undefined)?.[0] ??\n this.claims.preferred_username ??\n this.claims.unique_name ??\n this.claims.upn\n )\n }\n\n get name(): string | undefined {\n if (this.claims.name) return this.claims.name\n const otherNames = [this.claims.given_name, this.claims.family_name].filter(isNotNil)\n if (otherNames.length > 0) return otherNames.join(' ')\n return undefined\n }\n\n get id(): string {\n return this.firstOrThrow('oid', 'sub')\n }\n\n get scopes(): string[] {\n return this.claims.scp ? this.claims.scp.split(' ') : []\n }\n\n get roles(): string[] {\n return this.claims.roles ?? []\n }\n\n private first(...claims: Array<keyof JwtPayload>): string | undefined {\n for (const key of claims) {\n if (this.claims[key]) return this.claims[key] as string\n }\n return undefined\n }\n\n private firstOrThrow(...claims: Array<keyof JwtPayload>): string {\n const first = this.first(...claims)\n if (!first) throw new Error(`claims do not include any of: ${claims.join(', ')}`)\n return first\n }\n}\n"],"names":[],"mappings":";;MAGa,IAAI,CAAA;IAIf,WAAY,CAAA,MAAkB,EAAE,WAAmB,EAAA;AACjD,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,WAAW,CAAA;KACzB;AAED,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,QACE,IAAI,CAAC,MAAM,CAAC,KAAK;AAChB,YAAA,IAAI,CAAC,MAAM,CAAC,MAA+B,GAAG,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,kBAAkB;YAC9B,IAAI,CAAC,MAAM,CAAC,WAAW;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,EAChB;KACF;AAED,IAAA,IAAI,IAAI,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAA;QAC7C,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;AACrF,QAAA,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACtD,QAAA,OAAO,SAAS,CAAA;KACjB;AAED,IAAA,IAAI,EAAE,GAAA;QACJ,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;KACvC;AAED,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;KACzD;AAED,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA;KAC/B;IAEO,KAAK,CAAC,GAAG,MAA+B,EAAA;AAC9C,QAAA,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAW,CAAA;SACxD;AACD,QAAA,OAAO,SAAS,CAAA;KACjB;IAEO,YAAY,CAAC,GAAG,MAA+B,EAAA;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAA;AACnC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,8BAAA,EAAiC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAE,CAAA,CAAC,CAAA;AACjF,QAAA,OAAO,KAAK,CAAA;KACb;AACF;;;;"}
package/context.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Logger } from '@makerx/node-common';
1
+ import type { Logger } from '@makerx/node-common';
2
2
  import type { Request } from 'express';
3
3
  import { User } from './User';
4
4
  export interface GraphQLContext<TLogger extends Logger = Logger, TRequestInfo extends BaseRequestInfo = RequestInfo, TUser = User | undefined> {
@@ -68,4 +68,3 @@ export interface CreateContextConfig<TContext extends AnyGraphqlContext = GraphQ
68
68
  }
69
69
  export declare const createContextFactory: <TContext extends AnyGraphqlContext = GraphQLContext<Logger, RequestInfo, User | undefined>>({ requestLogger, augmentRequestInfo, claimsToLog, createUser, requestInfoToLog, augmentContext, }: CreateContextConfig<TContext>) => CreateContext<TContext>;
70
70
  export declare const defaultCreateUser: CreateUser<User | undefined>;
71
- //# sourceMappingURL=context.d.ts.map
package/context.js CHANGED
@@ -1,19 +1,16 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.defaultCreateUser = exports.createContextFactory = void 0;
7
- const crypto_1 = require("crypto");
8
- const lodash_pick_1 = __importDefault(require("lodash.pick"));
9
- const User_1 = require("./User");
1
+ 'use strict';
2
+
3
+ var crypto = require('crypto');
4
+ var lodash = require('lodash');
5
+ var User = require('./User.js');
6
+
10
7
  const createContextFactory = ({ requestLogger, augmentRequestInfo, claimsToLog, createUser, requestInfoToLog, augmentContext, }) => {
11
8
  // the function that creates the GraphQL context
12
9
  return async (input) => {
13
10
  const { req, claims, context } = input;
14
11
  // build base request info from the request
15
12
  const baseRequestInfo = {
16
- requestId: req.headers['x-request-id']?.toString() ?? (0, crypto_1.randomUUID)(),
13
+ requestId: req.headers['x-request-id']?.toString() ?? crypto.randomUUID(),
17
14
  protocol: req.protocol,
18
15
  host: req.hostname ?? '',
19
16
  method: req.method ?? '',
@@ -48,10 +45,10 @@ const createContextFactory = ({ requestLogger, augmentRequestInfo, claimsToLog,
48
45
  const requestLoggerMetadata = {};
49
46
  // add request info to log
50
47
  if (requestInfoToLog?.length)
51
- requestLoggerMetadata.request = (0, lodash_pick_1.default)(requestInfo, requestInfoToLog);
48
+ requestLoggerMetadata.request = lodash.pick(requestInfo, requestInfoToLog);
52
49
  // add user claims to log
53
50
  if (claims && claimsToLog?.length)
54
- requestLoggerMetadata.user = (0, lodash_pick_1.default)(claims, claimsToLog);
51
+ requestLoggerMetadata.user = lodash.pick(claims, claimsToLog);
55
52
  // build the request logger
56
53
  logger = requestLogger(requestLoggerMetadata);
57
54
  }
@@ -69,12 +66,13 @@ const createContextFactory = ({ requestLogger, augmentRequestInfo, claimsToLog,
69
66
  return augmentedGraphQLContext;
70
67
  };
71
68
  };
72
- exports.createContextFactory = createContextFactory;
73
69
  const defaultCreateUser = ({ req, claims }) => {
74
70
  if (!claims)
75
71
  return Promise.resolve(undefined);
76
72
  const accessToken = req.headers.authorization?.startsWith('Bearer') ? req.headers.authorization?.substring(7) ?? '' : '';
77
- return Promise.resolve(new User_1.User(claims, accessToken));
73
+ return Promise.resolve(new User.User(claims, accessToken));
78
74
  };
75
+
76
+ exports.createContextFactory = createContextFactory;
79
77
  exports.defaultCreateUser = defaultCreateUser;
80
- //# sourceMappingURL=context.js.map
78
+ //# sourceMappingURL=context.js.map
package/context.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.js","sources":["../src/context.ts"],"sourcesContent":["import type { Logger } from '@makerx/node-common'\nimport { randomUUID } from 'crypto'\nimport type { Request } from 'express'\nimport { pick } from 'lodash'\nimport { User } from './User'\n\nexport interface GraphQLContext<\n TLogger extends Logger = Logger,\n TRequestInfo extends BaseRequestInfo = RequestInfo,\n TUser = User | undefined,\n> {\n logger: TLogger\n requestInfo: TRequestInfo\n user: TUser\n started: number\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyGraphqlContext = GraphQLContext<any, any, any>\n\nexport interface BaseRequestInfo extends Record<string, unknown> {\n requestId: string\n protocol: 'http' | 'https' | 'ws'\n host: string\n method: string\n url: string\n origin: string\n referer?: string\n correlationId?: string\n arrLogId?: string\n clientIp?: string\n}\n\nexport interface LambdaContext {\n functionName?: string\n awsRequestId?: string\n}\nexport type LambdaEvent = never\nexport type LambdaRequestInfo = BaseRequestInfo & LambdaContext\nexport type RequestInfo = BaseRequestInfo | LambdaRequestInfo\n\n// standard claims https://datatracker.ietf.org/doc/html/rfc7519#section-4.1\nexport interface JwtPayload {\n [key: string]: unknown\n name?: string | undefined\n email?: string | undefined\n given_name?: string | undefined\n family_name?: string | undefined\n preferred_username?: string | undefined\n upn?: string | undefined\n unique_name?: string | undefined\n oid?: string | undefined\n iss?: string | undefined\n sub?: string | undefined\n aud?: string | string[] | undefined\n roles?: string[] | undefined\n scp?: string | undefined\n exp?: number | undefined\n nbf?: number | undefined\n iat?: number | undefined\n jti?: string | undefined\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type InferUserFromContext<TContext extends AnyGraphqlContext> =\n TContext extends GraphQLContext<any, any, infer TUser> ? TUser : never\nexport type CreateUser<T = User | undefined> = (input: Omit<ContextInput, 'createUser'>) => Promise<T> | T\nexport interface ContextInput {\n req: Request\n claims?: JwtPayload\n context?: LambdaContext\n event?: LambdaEvent\n}\nexport type CreateContext<TContext = GraphQLContext> = (input: ContextInput) => Promise<TContext>\nexport type CreateRequestLogger = (requestMetadata: Record<string, unknown>) => Logger\nexport type AugmentRequestInfo = (input: ContextInput) => Record<string, unknown>\n\nexport interface CreateContextConfig<TContext extends AnyGraphqlContext = GraphQLContext> {\n requestLogger: CreateRequestLogger | Logger\n augmentRequestInfo?: AugmentRequestInfo\n claimsToLog?: string[]\n createUser: CreateUser<InferUserFromContext<TContext>>\n requestInfoToLog?: Array<keyof RequestInfo>\n augmentContext?: (context: TContext) => Record<string, unknown> | Promise<Record<string, unknown>>\n}\n\nexport const createContextFactory = <TContext extends AnyGraphqlContext = GraphQLContext>({\n requestLogger,\n augmentRequestInfo,\n claimsToLog,\n createUser,\n requestInfoToLog,\n augmentContext,\n}: CreateContextConfig<TContext>): CreateContext<TContext> => {\n // the function that creates the GraphQL context\n return async (input: ContextInput) => {\n const { req, claims, context } = input\n\n // build base request info from the request\n const baseRequestInfo: BaseRequestInfo = {\n requestId: req.headers['x-request-id']?.toString() ?? randomUUID(),\n protocol: req.protocol as 'http' | 'https',\n host: req.hostname ?? '',\n method: req.method ?? '',\n url: req.originalUrl,\n origin: req.get('Origin') ?? '',\n referer: req.headers.referer?.toString() ?? '',\n arrLogId: req.headers['x-arr-log-id']?.toString() ?? undefined,\n clientIp: req.headers['x-forwarded-for']?.toString() ?? req.socket.remoteAddress,\n correlationId: req.headers['x-correlation-id']?.toString() ?? undefined,\n }\n\n // add lambda info from the context, if present\n let lambdaRequestInfo: LambdaRequestInfo | undefined\n if (context) {\n const { awsRequestId, functionName } = context\n lambdaRequestInfo = {\n awsRequestId,\n functionName,\n ...baseRequestInfo,\n }\n }\n\n // augment request info with the supplied function, if present\n let requestInfo: RequestInfo = lambdaRequestInfo ?? baseRequestInfo\n if (augmentRequestInfo)\n requestInfo = {\n ...requestInfo,\n ...augmentRequestInfo(input),\n }\n\n // create request logger\n let logger: Logger\n if (typeof requestLogger === 'function') {\n // build request logger metadata\n const requestLoggerMetadata: Record<string, unknown> = {}\n // add request info to log\n if (requestInfoToLog?.length) requestLoggerMetadata.request = pick(requestInfo, requestInfoToLog)\n // add user claims to log\n if (claims && claimsToLog?.length) requestLoggerMetadata.user = pick(claims, claimsToLog)\n // build the request logger\n logger = requestLogger(requestLoggerMetadata)\n } else logger = requestLogger\n\n const graphqlContext: GraphQLContext = {\n requestInfo,\n logger,\n user: createUser ? await createUser(input) : undefined,\n started: Date.now(),\n }\n\n const augmentedGraphQLContext = augmentContext\n ? { ...graphqlContext, ...(await augmentContext(graphqlContext as TContext)) }\n : graphqlContext\n\n return augmentedGraphQLContext as TContext\n }\n}\n\nexport const defaultCreateUser: CreateUser<User | undefined> = ({ req, claims }) => {\n if (!claims) return Promise.resolve(undefined)\n const accessToken = req.headers.authorization?.startsWith('Bearer') ? req.headers.authorization?.substring(7) ?? '' : ''\n return Promise.resolve(new User(claims, accessToken))\n}\n"],"names":["randomUUID","pick","User"],"mappings":"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"}
package/context.mjs ADDED
@@ -0,0 +1,75 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { pick } from 'lodash';
3
+ import { User } from './User.mjs';
4
+
5
+ const createContextFactory = ({ requestLogger, augmentRequestInfo, claimsToLog, createUser, requestInfoToLog, augmentContext, }) => {
6
+ // the function that creates the GraphQL context
7
+ return async (input) => {
8
+ const { req, claims, context } = input;
9
+ // build base request info from the request
10
+ const baseRequestInfo = {
11
+ requestId: req.headers['x-request-id']?.toString() ?? randomUUID(),
12
+ protocol: req.protocol,
13
+ host: req.hostname ?? '',
14
+ method: req.method ?? '',
15
+ url: req.originalUrl,
16
+ origin: req.get('Origin') ?? '',
17
+ referer: req.headers.referer?.toString() ?? '',
18
+ arrLogId: req.headers['x-arr-log-id']?.toString() ?? undefined,
19
+ clientIp: req.headers['x-forwarded-for']?.toString() ?? req.socket.remoteAddress,
20
+ correlationId: req.headers['x-correlation-id']?.toString() ?? undefined,
21
+ };
22
+ // add lambda info from the context, if present
23
+ let lambdaRequestInfo;
24
+ if (context) {
25
+ const { awsRequestId, functionName } = context;
26
+ lambdaRequestInfo = {
27
+ awsRequestId,
28
+ functionName,
29
+ ...baseRequestInfo,
30
+ };
31
+ }
32
+ // augment request info with the supplied function, if present
33
+ let requestInfo = lambdaRequestInfo ?? baseRequestInfo;
34
+ if (augmentRequestInfo)
35
+ requestInfo = {
36
+ ...requestInfo,
37
+ ...augmentRequestInfo(input),
38
+ };
39
+ // create request logger
40
+ let logger;
41
+ if (typeof requestLogger === 'function') {
42
+ // build request logger metadata
43
+ const requestLoggerMetadata = {};
44
+ // add request info to log
45
+ if (requestInfoToLog?.length)
46
+ requestLoggerMetadata.request = pick(requestInfo, requestInfoToLog);
47
+ // add user claims to log
48
+ if (claims && claimsToLog?.length)
49
+ requestLoggerMetadata.user = pick(claims, claimsToLog);
50
+ // build the request logger
51
+ logger = requestLogger(requestLoggerMetadata);
52
+ }
53
+ else
54
+ logger = requestLogger;
55
+ const graphqlContext = {
56
+ requestInfo,
57
+ logger,
58
+ user: createUser ? await createUser(input) : undefined,
59
+ started: Date.now(),
60
+ };
61
+ const augmentedGraphQLContext = augmentContext
62
+ ? { ...graphqlContext, ...(await augmentContext(graphqlContext)) }
63
+ : graphqlContext;
64
+ return augmentedGraphQLContext;
65
+ };
66
+ };
67
+ const defaultCreateUser = ({ req, claims }) => {
68
+ if (!claims)
69
+ return Promise.resolve(undefined);
70
+ const accessToken = req.headers.authorization?.startsWith('Bearer') ? req.headers.authorization?.substring(7) ?? '' : '';
71
+ return Promise.resolve(new User(claims, accessToken));
72
+ };
73
+
74
+ export { createContextFactory, defaultCreateUser };
75
+ //# sourceMappingURL=context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.mjs","sources":["../src/context.ts"],"sourcesContent":["import type { Logger } from '@makerx/node-common'\nimport { randomUUID } from 'crypto'\nimport type { Request } from 'express'\nimport { pick } from 'lodash'\nimport { User } from './User'\n\nexport interface GraphQLContext<\n TLogger extends Logger = Logger,\n TRequestInfo extends BaseRequestInfo = RequestInfo,\n TUser = User | undefined,\n> {\n logger: TLogger\n requestInfo: TRequestInfo\n user: TUser\n started: number\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyGraphqlContext = GraphQLContext<any, any, any>\n\nexport interface BaseRequestInfo extends Record<string, unknown> {\n requestId: string\n protocol: 'http' | 'https' | 'ws'\n host: string\n method: string\n url: string\n origin: string\n referer?: string\n correlationId?: string\n arrLogId?: string\n clientIp?: string\n}\n\nexport interface LambdaContext {\n functionName?: string\n awsRequestId?: string\n}\nexport type LambdaEvent = never\nexport type LambdaRequestInfo = BaseRequestInfo & LambdaContext\nexport type RequestInfo = BaseRequestInfo | LambdaRequestInfo\n\n// standard claims https://datatracker.ietf.org/doc/html/rfc7519#section-4.1\nexport interface JwtPayload {\n [key: string]: unknown\n name?: string | undefined\n email?: string | undefined\n given_name?: string | undefined\n family_name?: string | undefined\n preferred_username?: string | undefined\n upn?: string | undefined\n unique_name?: string | undefined\n oid?: string | undefined\n iss?: string | undefined\n sub?: string | undefined\n aud?: string | string[] | undefined\n roles?: string[] | undefined\n scp?: string | undefined\n exp?: number | undefined\n nbf?: number | undefined\n iat?: number | undefined\n jti?: string | undefined\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type InferUserFromContext<TContext extends AnyGraphqlContext> =\n TContext extends GraphQLContext<any, any, infer TUser> ? TUser : never\nexport type CreateUser<T = User | undefined> = (input: Omit<ContextInput, 'createUser'>) => Promise<T> | T\nexport interface ContextInput {\n req: Request\n claims?: JwtPayload\n context?: LambdaContext\n event?: LambdaEvent\n}\nexport type CreateContext<TContext = GraphQLContext> = (input: ContextInput) => Promise<TContext>\nexport type CreateRequestLogger = (requestMetadata: Record<string, unknown>) => Logger\nexport type AugmentRequestInfo = (input: ContextInput) => Record<string, unknown>\n\nexport interface CreateContextConfig<TContext extends AnyGraphqlContext = GraphQLContext> {\n requestLogger: CreateRequestLogger | Logger\n augmentRequestInfo?: AugmentRequestInfo\n claimsToLog?: string[]\n createUser: CreateUser<InferUserFromContext<TContext>>\n requestInfoToLog?: Array<keyof RequestInfo>\n augmentContext?: (context: TContext) => Record<string, unknown> | Promise<Record<string, unknown>>\n}\n\nexport const createContextFactory = <TContext extends AnyGraphqlContext = GraphQLContext>({\n requestLogger,\n augmentRequestInfo,\n claimsToLog,\n createUser,\n requestInfoToLog,\n augmentContext,\n}: CreateContextConfig<TContext>): CreateContext<TContext> => {\n // the function that creates the GraphQL context\n return async (input: ContextInput) => {\n const { req, claims, context } = input\n\n // build base request info from the request\n const baseRequestInfo: BaseRequestInfo = {\n requestId: req.headers['x-request-id']?.toString() ?? randomUUID(),\n protocol: req.protocol as 'http' | 'https',\n host: req.hostname ?? '',\n method: req.method ?? '',\n url: req.originalUrl,\n origin: req.get('Origin') ?? '',\n referer: req.headers.referer?.toString() ?? '',\n arrLogId: req.headers['x-arr-log-id']?.toString() ?? undefined,\n clientIp: req.headers['x-forwarded-for']?.toString() ?? req.socket.remoteAddress,\n correlationId: req.headers['x-correlation-id']?.toString() ?? undefined,\n }\n\n // add lambda info from the context, if present\n let lambdaRequestInfo: LambdaRequestInfo | undefined\n if (context) {\n const { awsRequestId, functionName } = context\n lambdaRequestInfo = {\n awsRequestId,\n functionName,\n ...baseRequestInfo,\n }\n }\n\n // augment request info with the supplied function, if present\n let requestInfo: RequestInfo = lambdaRequestInfo ?? baseRequestInfo\n if (augmentRequestInfo)\n requestInfo = {\n ...requestInfo,\n ...augmentRequestInfo(input),\n }\n\n // create request logger\n let logger: Logger\n if (typeof requestLogger === 'function') {\n // build request logger metadata\n const requestLoggerMetadata: Record<string, unknown> = {}\n // add request info to log\n if (requestInfoToLog?.length) requestLoggerMetadata.request = pick(requestInfo, requestInfoToLog)\n // add user claims to log\n if (claims && claimsToLog?.length) requestLoggerMetadata.user = pick(claims, claimsToLog)\n // build the request logger\n logger = requestLogger(requestLoggerMetadata)\n } else logger = requestLogger\n\n const graphqlContext: GraphQLContext = {\n requestInfo,\n logger,\n user: createUser ? await createUser(input) : undefined,\n started: Date.now(),\n }\n\n const augmentedGraphQLContext = augmentContext\n ? { ...graphqlContext, ...(await augmentContext(graphqlContext as TContext)) }\n : graphqlContext\n\n return augmentedGraphQLContext as TContext\n }\n}\n\nexport const defaultCreateUser: CreateUser<User | undefined> = ({ req, claims }) => {\n if (!claims) return Promise.resolve(undefined)\n const accessToken = req.headers.authorization?.startsWith('Bearer') ? req.headers.authorization?.substring(7) ?? '' : ''\n return Promise.resolve(new User(claims, accessToken))\n}\n"],"names":[],"mappings":";;;;AAqFa,MAAA,oBAAoB,GAAG,CAAsD,EACxF,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,cAAc,GACgB,KAA6B;;AAE3D,IAAA,OAAO,OAAO,KAAmB,KAAI;QACnC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;;AAGtC,QAAA,MAAM,eAAe,GAAoB;AACvC,YAAA,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,UAAU,EAAE;YAClE,QAAQ,EAAE,GAAG,CAAC,QAA4B;AAC1C,YAAA,IAAI,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;AACxB,YAAA,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;YACxB,GAAG,EAAE,GAAG,CAAC,WAAW;YACpB,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;YAC/B,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC9C,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,SAAS;AAC9D,YAAA,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa;YAChF,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,IAAI,SAAS;SACxE,CAAA;;AAGD,QAAA,IAAI,iBAAgD,CAAA;QACpD,IAAI,OAAO,EAAE;AACX,YAAA,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,OAAO,CAAA;AAC9C,YAAA,iBAAiB,GAAG;gBAClB,YAAY;gBACZ,YAAY;AACZ,gBAAA,GAAG,eAAe;aACnB,CAAA;SACF;;AAGD,QAAA,IAAI,WAAW,GAAgB,iBAAiB,IAAI,eAAe,CAAA;AACnE,QAAA,IAAI,kBAAkB;AACpB,YAAA,WAAW,GAAG;AACZ,gBAAA,GAAG,WAAW;gBACd,GAAG,kBAAkB,CAAC,KAAK,CAAC;aAC7B,CAAA;;AAGH,QAAA,IAAI,MAAc,CAAA;AAClB,QAAA,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE;;YAEvC,MAAM,qBAAqB,GAA4B,EAAE,CAAA;;YAEzD,IAAI,gBAAgB,EAAE,MAAM;gBAAE,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;;AAEjG,YAAA,IAAI,MAAM,IAAI,WAAW,EAAE,MAAM;gBAAE,qBAAqB,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;;AAEzF,YAAA,MAAM,GAAG,aAAa,CAAC,qBAAqB,CAAC,CAAA;SAC9C;;YAAM,MAAM,GAAG,aAAa,CAAA;AAE7B,QAAA,MAAM,cAAc,GAAmB;YACrC,WAAW;YACX,MAAM;AACN,YAAA,IAAI,EAAE,UAAU,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,GAAG,SAAS;AACtD,YAAA,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;SACpB,CAAA;QAED,MAAM,uBAAuB,GAAG,cAAc;AAC5C,cAAE,EAAE,GAAG,cAAc,EAAE,IAAI,MAAM,cAAc,CAAC,cAA0B,CAAC,GAAG;cAC5E,cAAc,CAAA;AAElB,QAAA,OAAO,uBAAmC,CAAA;AAC5C,KAAC,CAAA;AACH,EAAC;AAEY,MAAA,iBAAiB,GAAiC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAI;AACjF,IAAA,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AAC9C,IAAA,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAA;AACxH,IAAA,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;AACvD;;;;"}
package/index.d.ts CHANGED
@@ -2,8 +2,6 @@ export * from './context';
2
2
  export * from './User';
3
3
  export * from './utils';
4
4
  export * from './logging';
5
- export * from './subscriptions';
6
5
  export * from './schema-util';
7
6
  export * from './shield';
8
7
  export * from './models';
9
- //# sourceMappingURL=index.d.ts.map
package/index.js CHANGED
@@ -1,25 +1,24 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./context"), exports);
18
- __exportStar(require("./User"), exports);
19
- __exportStar(require("./utils"), exports);
20
- __exportStar(require("./logging"), exports);
21
- __exportStar(require("./subscriptions"), exports);
22
- __exportStar(require("./schema-util"), exports);
23
- __exportStar(require("./shield"), exports);
24
- __exportStar(require("./models"), exports);
25
- //# sourceMappingURL=index.js.map
1
+ 'use strict';
2
+
3
+ var context = require('./context.js');
4
+ var User = require('./User.js');
5
+ var utils = require('./utils.js');
6
+ var logging = require('./logging.js');
7
+ var schemaUtil = require('./schema-util.js');
8
+ var shield = require('./shield.js');
9
+
10
+
11
+
12
+ exports.createContextFactory = context.createContextFactory;
13
+ exports.defaultCreateUser = context.defaultCreateUser;
14
+ exports.User = User.User;
15
+ exports.isIntrospectionQuery = utils.isIntrospectionQuery;
16
+ exports.isNil = utils.isNil;
17
+ exports.isNotNil = utils.isNotNil;
18
+ exports.logGraphQLOperation = logging.logGraphQLOperation;
19
+ exports.logSubscriptionOperation = logging.logSubscriptionOperation;
20
+ exports.requireExplicitResolversForScalars = schemaUtil.requireExplicitResolversForScalars;
21
+ exports.combineRuleWithAll = shield.combineRuleWithAll;
22
+ exports.createRule = shield.createRule;
23
+ exports.createShieldSchema = shield.createShieldSchema;
24
+ //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAAyB;AACzB,yCAAsB;AACtB,0CAAuB;AACvB,4CAAyB;AACzB,kDAA+B;AAC/B,gDAA6B;AAC7B,2CAAwB;AACxB,2CAAwB"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;"}
package/index.mjs ADDED
@@ -0,0 +1,7 @@
1
+ export { createContextFactory, defaultCreateUser } from './context.mjs';
2
+ export { User } from './User.mjs';
3
+ export { isIntrospectionQuery, isNil, isNotNil } from './utils.mjs';
4
+ export { logGraphQLOperation, logSubscriptionOperation } from './logging.mjs';
5
+ export { requireExplicitResolversForScalars } from './schema-util.mjs';
6
+ export { combineRuleWithAll, createRule, createShieldSchema } from './shield.mjs';
7
+ //# sourceMappingURL=index.mjs.map
package/index.mjs.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
package/logging.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { Logger } from '@makerx/node-common';
2
- import { ExecutionArgs, GraphQLFormattedError, OperationTypeNode } from 'graphql';
3
- import { ExecutionResult } from 'graphql-ws';
1
+ import type { Logger } from '@makerx/node-common';
2
+ import type { ExecutionArgs, GraphQLFormattedError } from 'graphql';
3
+ import { OperationTypeNode } from 'graphql';
4
+ import type { ExecutionResult } from 'graphql-ws';
4
5
  type LogFunction = Logger['info'];
5
6
  export type LoggerLogFunctions<T extends Logger> = {
6
7
  [Property in keyof T]: LogFunction;
@@ -76,4 +77,3 @@ export declare const logSubscriptionOperation: <TLogger extends Logger = Logger>
76
77
  logLevel?: keyof TLogger | undefined;
77
78
  }) => void;
78
79
  export {};
79
- //# sourceMappingURL=logging.d.ts.map
package/logging.js CHANGED
@@ -1,49 +1,47 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.logSubscriptionOperation = exports.logGraphQLOperation = void 0;
7
- const node_common_1 = require("@makerx/node-common");
8
- const graphql_1 = require("graphql");
9
- const lodash_omitby_1 = __importDefault(require("lodash.omitby"));
10
- const utils_1 = require("./utils");
1
+ 'use strict';
2
+
3
+ var nodeCommon = require('@makerx/node-common');
4
+ var graphql = require('graphql');
5
+ var lodash = require('lodash');
6
+ var utils = require('./utils.js');
7
+
11
8
  /**
12
9
  * Logs a GraphQL operation in a consistent format with the option of including any additional data.
13
10
  * Top level and result entries with null or undefined values will be omitted.
14
11
  */
15
12
  const logGraphQLOperation = ({ message = 'GraphQL operation', started, type, operationName, query, variables, result, logger, logLevel = 'info', ...rest }) => {
16
- const isIntrospection = query && (0, utils_1.isIntrospectionQuery)(query);
17
- if (node_common_1.isLocalDev && isIntrospection)
13
+ const isIntrospection = query && utils.isIntrospectionQuery(query);
14
+ if (nodeCommon.isLocalDev && isIntrospection)
18
15
  return;
19
- logger[logLevel](message, (0, lodash_omitby_1.default)({
16
+ logger[logLevel](message, lodash.omitBy({
20
17
  type,
21
18
  operationName,
22
19
  query,
23
20
  variables: variables && Object.keys(variables).length > 0 ? variables : undefined,
24
21
  duration: started ? Date.now() - started : undefined,
25
- result: result ? (0, lodash_omitby_1.default)(result, utils_1.isNil) : undefined,
22
+ result: result ? lodash.omitBy(result, utils.isNil) : undefined,
26
23
  isIntrospectionQuery: isIntrospection || undefined,
27
- ...(0, lodash_omitby_1.default)(rest, utils_1.isNil),
28
- }, utils_1.isNil));
24
+ ...lodash.omitBy(rest, utils.isNil),
25
+ }, utils.isNil));
29
26
  };
30
- exports.logGraphQLOperation = logGraphQLOperation;
31
27
  const logSubscriptionOperation = ({ args, result, message, logLevel, }) => {
32
28
  const logger = args.contextValue.logger;
33
29
  if (!logger)
34
30
  return;
35
31
  const { operationName, variableValues, document } = args;
36
32
  const { data, ...resultWithoutData } = result ?? {};
37
- (0, exports.logGraphQLOperation)({
33
+ logGraphQLOperation({
38
34
  message,
39
- type: graphql_1.OperationTypeNode.SUBSCRIPTION,
35
+ type: graphql.OperationTypeNode.SUBSCRIPTION,
40
36
  operationName,
41
- query: (0, graphql_1.print)(document),
37
+ query: graphql.print(document),
42
38
  variables: variableValues,
43
39
  result: resultWithoutData,
44
40
  logger,
45
41
  logLevel,
46
42
  });
47
43
  };
44
+
45
+ exports.logGraphQLOperation = logGraphQLOperation;
48
46
  exports.logSubscriptionOperation = logSubscriptionOperation;
49
- //# sourceMappingURL=logging.js.map
47
+ //# sourceMappingURL=logging.js.map
package/logging.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":";;;;;;AAAA,qDAAwD;AACxD,qCAAwF;AAExF,kEAAkC;AAElC,mCAAqD;AAmErD;;;GAGG;AACI,MAAM,mBAAmB,GAAG,CAAkC,EACnE,OAAO,GAAG,mBAAmB,EAC7B,OAAO,EACP,IAAI,EACJ,aAAa,EACb,KAAK,EACL,SAAS,EACT,MAAM,EACN,MAAM,EACN,QAAQ,GAAG,MAAM,EACjB,GAAG,IAAI,EAC0B,EAAE,EAAE;IACrC,MAAM,eAAe,GAAG,KAAK,IAAI,IAAA,4BAAoB,EAAC,KAAK,CAAC,CAAA;IAC5D,IAAI,wBAAU,IAAI,eAAe;QAAE,OAAM;IACzC,MAAM,CAAC,QAAwB,CAAC,CAC9B,OAAO,EACP,IAAA,uBAAM,EACJ;QACE,IAAI;QACJ,aAAa;QACb,KAAK;QACL,SAAS,EAAE,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QACjF,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS;QACpD,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAA,uBAAM,EAAC,MAAM,EAAE,aAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAClD,oBAAoB,EAAE,eAAe,IAAI,SAAS;QAClD,GAAG,IAAA,uBAAM,EAAC,IAAI,EAAE,aAAK,CAAC;KACvB,EACD,aAAK,CACN,CACF,CAAA;AACH,CAAC,CAAA;AA9BY,QAAA,mBAAmB,uBA8B/B;AAEM,MAAM,wBAAwB,GAAG,CAAkC,EACxE,IAAI,EACJ,MAAM,EACN,OAAO,EACP,QAAQ,GAMT,EAAE,EAAE;IACH,MAAM,MAAM,GAAI,IAAI,CAAC,YAA+B,CAAC,MAAiB,CAAA;IACtE,IAAI,CAAC,MAAM;QAAE,OAAM;IAEnB,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IACxD,MAAM,EAAE,IAAI,EAAE,GAAG,iBAAiB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAEnD,IAAA,2BAAmB,EAAC;QAClB,OAAO;QACP,IAAI,EAAE,2BAAiB,CAAC,YAAY;QACpC,aAAa;QACb,KAAK,EAAE,IAAA,eAAK,EAAC,QAAQ,CAAC;QACtB,SAAS,EAAE,cAAc;QACzB,MAAM,EAAE,iBAAiB;QACzB,MAAM;QACN,QAAQ;KACT,CAAC,CAAA;AACJ,CAAC,CAAA;AA3BY,QAAA,wBAAwB,4BA2BpC"}
1
+ {"version":3,"file":"logging.js","sources":["../src/logging.ts"],"sourcesContent":["import type { Logger } from '@makerx/node-common'\nimport { isLocalDev } from '@makerx/node-common'\nimport type { ExecutionArgs, GraphQLFormattedError } from 'graphql'\nimport { OperationTypeNode, print } from 'graphql'\nimport type { ExecutionResult } from 'graphql-ws'\nimport { omitBy } from 'lodash'\nimport type { GraphQLContext } from './context'\nimport { isIntrospectionQuery, isNil } from './utils'\n\ntype LogFunction = Logger['info']\nexport type LoggerLogFunctions<T extends Logger> = {\n [Property in keyof T]: LogFunction\n}\n\n/**\n * Info for logging a GraphQL operation in a consistent format with the option of including any additional data.\n */\nexport interface GraphQLLogOperationInfo<TLogger extends Logger = Logger> extends Record<string, unknown> {\n /**\n * The message to log, defaults to 'GraphQL operation'.\n */\n message?: string\n /**\n * The timestamp when the operation started, if supplied, the duration will be logged.\n */\n started?: number\n /**\n * The type of GraphQL operation.\n */\n type?: OperationTypeNode | null\n /**\n * The name of the GraphQL operation.\n */\n operationName?: string | null\n /**\n * The formatted GraphQL query.\n */\n query?: string | null\n /**\n * The GraphQL variables.\n */\n variables?: Record<string, unknown> | null\n /**\n * The result of the GraphQL operation.\n * Generally, we don't log the data or extensions, just errors.\n */\n result?: {\n data?: Record<string, unknown> | null\n errors?: readonly GraphQLFormattedError[] | null\n extensions?: Record<string, unknown> | null\n hasNext?: boolean\n }\n /**\n * Whether the operation is an introspection query.\n */\n isIntrospectionQuery?: boolean\n /**\n * Whether the operation is part of an incremental response.\n */\n isIncrementalResponse?: boolean\n /**\n * Whether the operation is a subsequent payload of an incremental response.\n */\n isSubsequentPayload?: boolean\n /**\n * The logger to use.\n */\n logger: TLogger\n /**\n * The logger function to use, defaults to 'info'.\n */\n logLevel?: keyof LoggerLogFunctions<TLogger>\n}\n\n/**\n * Logs a GraphQL operation in a consistent format with the option of including any additional data.\n * Top level and result entries with null or undefined values will be omitted.\n */\nexport const logGraphQLOperation = <TLogger extends Logger = Logger>({\n message = 'GraphQL operation',\n started,\n type,\n operationName,\n query,\n variables,\n result,\n logger,\n logLevel = 'info',\n ...rest\n}: GraphQLLogOperationInfo<TLogger>) => {\n const isIntrospection = query && isIntrospectionQuery(query)\n if (isLocalDev && isIntrospection) return\n logger[logLevel as keyof Logger](\n message,\n omitBy(\n {\n type,\n operationName,\n query,\n variables: variables && Object.keys(variables).length > 0 ? variables : undefined,\n duration: started ? Date.now() - started : undefined,\n result: result ? omitBy(result, isNil) : undefined,\n isIntrospectionQuery: isIntrospection || undefined,\n ...omitBy(rest, isNil),\n },\n isNil,\n ),\n )\n}\n\nexport const logSubscriptionOperation = <TLogger extends Logger = Logger>({\n args,\n result,\n message,\n logLevel,\n}: {\n args: ExecutionArgs\n result?: ExecutionResult\n message?: string\n logLevel?: keyof LoggerLogFunctions<TLogger>\n}) => {\n const logger = (args.contextValue as GraphQLContext).logger as TLogger\n if (!logger) return\n\n const { operationName, variableValues, document } = args\n const { data, ...resultWithoutData } = result ?? {}\n\n logGraphQLOperation({\n message,\n type: OperationTypeNode.SUBSCRIPTION,\n operationName,\n query: print(document),\n variables: variableValues,\n result: resultWithoutData,\n logger,\n logLevel,\n })\n}\n"],"names":["isIntrospectionQuery","isLocalDev","omitBy","isNil","OperationTypeNode","print"],"mappings":";;;;;;;AA0EA;;;AAGG;AACI,MAAM,mBAAmB,GAAG,CAAkC,EACnE,OAAO,GAAG,mBAAmB,EAC7B,OAAO,EACP,IAAI,EACJ,aAAa,EACb,KAAK,EACL,SAAS,EACT,MAAM,EACN,MAAM,EACN,QAAQ,GAAG,MAAM,EACjB,GAAG,IAAI,EAC0B,KAAI;IACrC,MAAM,eAAe,GAAG,KAAK,IAAIA,0BAAoB,CAAC,KAAK,CAAC,CAAA;IAC5D,IAAIC,qBAAU,IAAI,eAAe;QAAE,OAAM;AACzC,IAAA,MAAM,CAAC,QAAwB,CAAC,CAC9B,OAAO,EACPC,aAAM,CACJ;QACE,IAAI;QACJ,aAAa;QACb,KAAK;QACL,SAAS,EAAE,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,GAAG,SAAS;AACjF,QAAA,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,SAAS;AACpD,QAAA,MAAM,EAAE,MAAM,GAAGA,aAAM,CAAC,MAAM,EAAEC,WAAK,CAAC,GAAG,SAAS;QAClD,oBAAoB,EAAE,eAAe,IAAI,SAAS;AAClD,QAAA,GAAGD,aAAM,CAAC,IAAI,EAAEC,WAAK,CAAC;KACvB,EACDA,WAAK,CACN,CACF,CAAA;AACH,EAAC;AAEM,MAAM,wBAAwB,GAAG,CAAkC,EACxE,IAAI,EACJ,MAAM,EACN,OAAO,EACP,QAAQ,GAMT,KAAI;AACH,IAAA,MAAM,MAAM,GAAI,IAAI,CAAC,YAA+B,CAAC,MAAiB,CAAA;AACtE,IAAA,IAAI,CAAC,MAAM;QAAE,OAAM;IAEnB,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IACxD,MAAM,EAAE,IAAI,EAAE,GAAG,iBAAiB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;AAEnD,IAAA,mBAAmB,CAAC;QAClB,OAAO;QACP,IAAI,EAAEC,yBAAiB,CAAC,YAAY;QACpC,aAAa;AACb,QAAA,KAAK,EAAEC,aAAK,CAAC,QAAQ,CAAC;AACtB,QAAA,SAAS,EAAE,cAAc;AACzB,QAAA,MAAM,EAAE,iBAAiB;QACzB,MAAM;QACN,QAAQ;AACT,KAAA,CAAC,CAAA;AACJ;;;;;"}
package/logging.mjs ADDED
@@ -0,0 +1,44 @@
1
+ import { isLocalDev } from '@makerx/node-common';
2
+ import { OperationTypeNode, print } from 'graphql';
3
+ import { omitBy } from 'lodash';
4
+ import { isIntrospectionQuery, isNil } from './utils.mjs';
5
+
6
+ /**
7
+ * Logs a GraphQL operation in a consistent format with the option of including any additional data.
8
+ * Top level and result entries with null or undefined values will be omitted.
9
+ */
10
+ const logGraphQLOperation = ({ message = 'GraphQL operation', started, type, operationName, query, variables, result, logger, logLevel = 'info', ...rest }) => {
11
+ const isIntrospection = query && isIntrospectionQuery(query);
12
+ if (isLocalDev && isIntrospection)
13
+ return;
14
+ logger[logLevel](message, omitBy({
15
+ type,
16
+ operationName,
17
+ query,
18
+ variables: variables && Object.keys(variables).length > 0 ? variables : undefined,
19
+ duration: started ? Date.now() - started : undefined,
20
+ result: result ? omitBy(result, isNil) : undefined,
21
+ isIntrospectionQuery: isIntrospection || undefined,
22
+ ...omitBy(rest, isNil),
23
+ }, isNil));
24
+ };
25
+ const logSubscriptionOperation = ({ args, result, message, logLevel, }) => {
26
+ const logger = args.contextValue.logger;
27
+ if (!logger)
28
+ return;
29
+ const { operationName, variableValues, document } = args;
30
+ const { data, ...resultWithoutData } = result ?? {};
31
+ logGraphQLOperation({
32
+ message,
33
+ type: OperationTypeNode.SUBSCRIPTION,
34
+ operationName,
35
+ query: print(document),
36
+ variables: variableValues,
37
+ result: resultWithoutData,
38
+ logger,
39
+ logLevel,
40
+ });
41
+ };
42
+
43
+ export { logGraphQLOperation, logSubscriptionOperation };
44
+ //# sourceMappingURL=logging.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.mjs","sources":["../src/logging.ts"],"sourcesContent":["import type { Logger } from '@makerx/node-common'\nimport { isLocalDev } from '@makerx/node-common'\nimport type { ExecutionArgs, GraphQLFormattedError } from 'graphql'\nimport { OperationTypeNode, print } from 'graphql'\nimport type { ExecutionResult } from 'graphql-ws'\nimport { omitBy } from 'lodash'\nimport type { GraphQLContext } from './context'\nimport { isIntrospectionQuery, isNil } from './utils'\n\ntype LogFunction = Logger['info']\nexport type LoggerLogFunctions<T extends Logger> = {\n [Property in keyof T]: LogFunction\n}\n\n/**\n * Info for logging a GraphQL operation in a consistent format with the option of including any additional data.\n */\nexport interface GraphQLLogOperationInfo<TLogger extends Logger = Logger> extends Record<string, unknown> {\n /**\n * The message to log, defaults to 'GraphQL operation'.\n */\n message?: string\n /**\n * The timestamp when the operation started, if supplied, the duration will be logged.\n */\n started?: number\n /**\n * The type of GraphQL operation.\n */\n type?: OperationTypeNode | null\n /**\n * The name of the GraphQL operation.\n */\n operationName?: string | null\n /**\n * The formatted GraphQL query.\n */\n query?: string | null\n /**\n * The GraphQL variables.\n */\n variables?: Record<string, unknown> | null\n /**\n * The result of the GraphQL operation.\n * Generally, we don't log the data or extensions, just errors.\n */\n result?: {\n data?: Record<string, unknown> | null\n errors?: readonly GraphQLFormattedError[] | null\n extensions?: Record<string, unknown> | null\n hasNext?: boolean\n }\n /**\n * Whether the operation is an introspection query.\n */\n isIntrospectionQuery?: boolean\n /**\n * Whether the operation is part of an incremental response.\n */\n isIncrementalResponse?: boolean\n /**\n * Whether the operation is a subsequent payload of an incremental response.\n */\n isSubsequentPayload?: boolean\n /**\n * The logger to use.\n */\n logger: TLogger\n /**\n * The logger function to use, defaults to 'info'.\n */\n logLevel?: keyof LoggerLogFunctions<TLogger>\n}\n\n/**\n * Logs a GraphQL operation in a consistent format with the option of including any additional data.\n * Top level and result entries with null or undefined values will be omitted.\n */\nexport const logGraphQLOperation = <TLogger extends Logger = Logger>({\n message = 'GraphQL operation',\n started,\n type,\n operationName,\n query,\n variables,\n result,\n logger,\n logLevel = 'info',\n ...rest\n}: GraphQLLogOperationInfo<TLogger>) => {\n const isIntrospection = query && isIntrospectionQuery(query)\n if (isLocalDev && isIntrospection) return\n logger[logLevel as keyof Logger](\n message,\n omitBy(\n {\n type,\n operationName,\n query,\n variables: variables && Object.keys(variables).length > 0 ? variables : undefined,\n duration: started ? Date.now() - started : undefined,\n result: result ? omitBy(result, isNil) : undefined,\n isIntrospectionQuery: isIntrospection || undefined,\n ...omitBy(rest, isNil),\n },\n isNil,\n ),\n )\n}\n\nexport const logSubscriptionOperation = <TLogger extends Logger = Logger>({\n args,\n result,\n message,\n logLevel,\n}: {\n args: ExecutionArgs\n result?: ExecutionResult\n message?: string\n logLevel?: keyof LoggerLogFunctions<TLogger>\n}) => {\n const logger = (args.contextValue as GraphQLContext).logger as TLogger\n if (!logger) return\n\n const { operationName, variableValues, document } = args\n const { data, ...resultWithoutData } = result ?? {}\n\n logGraphQLOperation({\n message,\n type: OperationTypeNode.SUBSCRIPTION,\n operationName,\n query: print(document),\n variables: variableValues,\n result: resultWithoutData,\n logger,\n logLevel,\n })\n}\n"],"names":[],"mappings":";;;;;AA0EA;;;AAGG;AACI,MAAM,mBAAmB,GAAG,CAAkC,EACnE,OAAO,GAAG,mBAAmB,EAC7B,OAAO,EACP,IAAI,EACJ,aAAa,EACb,KAAK,EACL,SAAS,EACT,MAAM,EACN,MAAM,EACN,QAAQ,GAAG,MAAM,EACjB,GAAG,IAAI,EAC0B,KAAI;IACrC,MAAM,eAAe,GAAG,KAAK,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAA;IAC5D,IAAI,UAAU,IAAI,eAAe;QAAE,OAAM;AACzC,IAAA,MAAM,CAAC,QAAwB,CAAC,CAC9B,OAAO,EACP,MAAM,CACJ;QACE,IAAI;QACJ,aAAa;QACb,KAAK;QACL,SAAS,EAAE,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,GAAG,SAAS;AACjF,QAAA,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,SAAS;AACpD,QAAA,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,SAAS;QAClD,oBAAoB,EAAE,eAAe,IAAI,SAAS;AAClD,QAAA,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;KACvB,EACD,KAAK,CACN,CACF,CAAA;AACH,EAAC;AAEM,MAAM,wBAAwB,GAAG,CAAkC,EACxE,IAAI,EACJ,MAAM,EACN,OAAO,EACP,QAAQ,GAMT,KAAI;AACH,IAAA,MAAM,MAAM,GAAI,IAAI,CAAC,YAA+B,CAAC,MAAiB,CAAA;AACtE,IAAA,IAAI,CAAC,MAAM;QAAE,OAAM;IAEnB,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;IACxD,MAAM,EAAE,IAAI,EAAE,GAAG,iBAAiB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;AAEnD,IAAA,mBAAmB,CAAC;QAClB,OAAO;QACP,IAAI,EAAE,iBAAiB,CAAC,YAAY;QACpC,aAAa;AACb,QAAA,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC;AACtB,QAAA,SAAS,EAAE,cAAc;AACzB,QAAA,MAAM,EAAE,iBAAiB;QACzB,MAAM;QACN,QAAQ;AACT,KAAA,CAAC,CAAA;AACJ;;;;"}
package/models.d.ts CHANGED
@@ -2,4 +2,3 @@ export type Primitive = string | number | symbol | bigint | boolean | null | und
2
2
  type ScalarPropsInternal<T, TKey extends keyof T, TAdditionalScalars = never> = TKey extends any ? T[TKey] extends Primitive | TAdditionalScalars ? TKey : never : never;
3
3
  export type ScalarProps<T, TAdditionalScalars = never> = Pick<T, ScalarPropsInternal<T, keyof T, TAdditionalScalars>>;
4
4
  export {};
5
- //# sourceMappingURL=models.d.ts.map