@unchainedshop/api 3.0.0-alpha3 → 3.0.0-alpha5

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.
@@ -1,9 +1,9 @@
1
1
  import type e from 'express';
2
- import { YogaServer } from 'graphql-yoga';
2
+ import { YogaServerInstance } from 'graphql-yoga';
3
3
  import { mongodb } from '@unchainedshop/mongodb';
4
4
  import { UnchainedCore } from '@unchainedshop/core';
5
5
  export declare const connect: (expressApp: e.Express, { graphqlHandler, db, unchainedAPI, }: {
6
- graphqlHandler: YogaServer<any, any>;
6
+ graphqlHandler: YogaServerInstance<any, any>;
7
7
  db: mongodb.Db;
8
8
  unchainedAPI: UnchainedCore;
9
9
  }) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/express/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAM7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAuGpD,eAAO,MAAM,OAAO,eACN,CAAC,CAAC,OAAO,yCAKlB;IAAE,cAAc,EAAE,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;IAAC,YAAY,EAAE,aAAa,CAAA;CAAE,SAgCzF,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/express/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAM7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAsGpD,eAAO,MAAM,OAAO,eACN,CAAC,CAAC,OAAO,yCAKlB;IAAE,cAAc,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;IAAC,YAAY,EAAE,aAAa,CAAA;CAAE,SAgCjG,CAAC"}
@@ -13,7 +13,7 @@ const resolveUserRemoteAddress = (req) => {
13
13
  const remotePort = req.socket?.remotePort;
14
14
  return { remoteAddress, remotePort };
15
15
  };
16
- const { BULK_IMPORT_API_PATH = '/bulk-import', ERC_METADATA_API_PATH = '/erc-metadata', GRAPHQL_API_PATH = '/graphql', UNCHAINED_COOKIE_NAME = 'unchained_token', UNCHAINED_COOKIE_PATH = '/', UNCHAINED_COOKIE_DOMAIN, NODE_ENV, } = process.env;
16
+ const { BULK_IMPORT_API_PATH = '/bulk-import', ERC_METADATA_API_PATH = '/erc-metadata', GRAPHQL_API_PATH = '/graphql', UNCHAINED_COOKIE_NAME = 'unchained_token', UNCHAINED_COOKIE_PATH = '/', UNCHAINED_COOKIE_DOMAIN, } = process.env;
17
17
  const addContext = async function middlewareWithContext(req, res, next) {
18
18
  try {
19
19
  const setHeader = (key, value) => res.setHeader(key, value);
@@ -91,10 +91,10 @@ export const connect = (expressApp, { graphqlHandler, db, unchainedAPI, }) => {
91
91
  resave: false,
92
92
  cookie: {
93
93
  domain: UNCHAINED_COOKIE_DOMAIN,
94
- httpOnly: Boolean(NODE_ENV === 'production'),
95
94
  path: UNCHAINED_COOKIE_PATH,
96
- sameSite: 'lax',
97
- secure: NODE_ENV === 'production',
95
+ sameSite: 'none',
96
+ secure: true,
97
+ httpOnly: true,
98
98
  maxAge: 1000 * 60 * 60 * 24 * 7,
99
99
  },
100
100
  }), passport.initialize(), passport.session(), passport.authenticate('access-token', { session: false }), addContext);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/express/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/express/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { YogaServerInstance } from 'graphql-yoga';
2
+ import { mongodb } from '@unchainedshop/mongodb';
3
+ import { UnchainedCore } from '@unchainedshop/core';
4
+ export declare const connect: (fastify: any, { graphqlHandler, db, }: {
5
+ graphqlHandler: YogaServerInstance<any, any>;
6
+ db: mongodb.Db;
7
+ unchainedAPI: UnchainedCore;
8
+ }) => void;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fastify/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAyEpD,eAAO,MAAM,OAAO,YACT,GAAG,2BAIT;IAAE,cAAc,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC;IAAC,YAAY,EAAE,aAAa,CAAA;CAAE,SA2CjG,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { getCurrentContextResolver } from '../context.js';
2
+ // import createBulkImportMiddleware from './createBulkImportMiddleware.js';
3
+ // import createERCMetadataMiddleware from './createERCMetadataMiddleware.js';
4
+ import MongoStore from 'connect-mongo';
5
+ import { emit } from '@unchainedshop/events';
6
+ import { API_EVENTS } from '../events.js';
7
+ import fastifySession from '@fastify/session';
8
+ import fastifyCookie from '@fastify/cookie';
9
+ const resolveUserRemoteAddress = (req) => {
10
+ const remoteAddress = req.headers['x-real-ip'] ||
11
+ req.headers['x-forwarded-for'] ||
12
+ req.socket?.remoteAddress;
13
+ const remotePort = req.socket?.remotePort;
14
+ return { remoteAddress, remotePort };
15
+ };
16
+ const { GRAPHQL_API_PATH = '/graphql', UNCHAINED_COOKIE_NAME = 'unchained_token', UNCHAINED_COOKIE_PATH = '/', UNCHAINED_COOKIE_DOMAIN, NODE_ENV, } = process.env;
17
+ const middlewareHook = async function middlewareHook(req, reply) {
18
+ const setHeader = (key, value) => reply.header(key, value);
19
+ const getHeader = (key) => req.headers[key];
20
+ const { remoteAddress, remotePort } = resolveUserRemoteAddress(req);
21
+ const context = getCurrentContextResolver();
22
+ async function login(user) {
23
+ req.session.user = user;
24
+ req.session.userId = user._id;
25
+ const tokenObject = {
26
+ _id: req.session.sessionId,
27
+ /* eslint-disable-next-line */
28
+ tokenExpires: new Date(req.session?.cookie._expires),
29
+ };
30
+ await emit(API_EVENTS.API_LOGIN_TOKEN_CREATED, { userId: user._id, ...tokenObject });
31
+ /* eslint-disable-next-line */
32
+ user._inLoginMethodResponse = true;
33
+ return { user, ...tokenObject };
34
+ }
35
+ async function logout() {
36
+ /* eslint-disable-line */
37
+ if (!req.session?.userId)
38
+ return false;
39
+ const tokenObject = {
40
+ _id: req.session.sessionId,
41
+ userId: req.session?.userId,
42
+ };
43
+ req.session.user = null;
44
+ req.session.userId = null;
45
+ await emit(API_EVENTS.API_LOGOUT, tokenObject);
46
+ return true;
47
+ }
48
+ req.unchainedContext = await context({
49
+ setHeader,
50
+ getHeader,
51
+ remoteAddress,
52
+ remotePort,
53
+ login,
54
+ logout,
55
+ user: req.session.user,
56
+ userId: req.session.userId,
57
+ });
58
+ };
59
+ export const connect = (fastify, { graphqlHandler, db, }) => {
60
+ fastify.register(fastifyCookie);
61
+ fastify.register(fastifySession, {
62
+ secret: process.env.UNCHAINED_TOKEN_SECRET,
63
+ cookieName: UNCHAINED_COOKIE_NAME,
64
+ store: MongoStore.create({
65
+ client: db.client,
66
+ dbName: db.databaseName,
67
+ collectionName: 'sessions',
68
+ }),
69
+ cookie: {
70
+ domain: UNCHAINED_COOKIE_DOMAIN,
71
+ httpOnly: Boolean(NODE_ENV === 'production'),
72
+ path: UNCHAINED_COOKIE_PATH,
73
+ secure: NODE_ENV === 'production',
74
+ maxAge: 1000 * 60 * 60 * 24 * 7,
75
+ },
76
+ });
77
+ fastify.decorateRequest('unchainedContext');
78
+ fastify.addHook('onRequest', middlewareHook);
79
+ fastify.route({
80
+ url: GRAPHQL_API_PATH,
81
+ method: ['GET', 'POST', 'OPTIONS'],
82
+ handler: async (req, reply) => {
83
+ // Second parameter adds Fastify's `req` and `reply` to the GraphQL Context
84
+ const response = await graphqlHandler.handleNodeRequestAndResponse(req, reply, {
85
+ req,
86
+ reply,
87
+ });
88
+ response.headers.forEach((value, key) => {
89
+ reply.header(key, value);
90
+ });
91
+ reply.status(response.status);
92
+ reply.send(response.body);
93
+ return reply;
94
+ },
95
+ });
96
+ // expressApp.use(ERC_METADATA_API_PATH, createERCMetadataMiddleware);
97
+ // expressApp.use(BULK_IMPORT_API_PATH, createBulkImportMiddleware);
98
+ };
99
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fastify/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { JSONResolver, TimestampResolver, DateTimeResolver, DateResolver, LocaleResolver, } from 'graphql-scalars';
1
+ import { GraphQLJSON, GraphQLTimestamp, GraphQLDateTimeISO, GraphQLDate, GraphQLLocale, } from 'graphql-scalars';
2
2
  import Query from './queries/index.js';
3
3
  import Mutation from './mutations/index.js';
4
4
  import Types from './type/index.js';
@@ -6,12 +6,12 @@ import CustomScalars from './scalars/index.js';
6
6
  export default {
7
7
  ...Types,
8
8
  ...CustomScalars,
9
- JSON: JSONResolver,
9
+ JSON: GraphQLJSON,
10
10
  Query,
11
11
  Mutation,
12
- DateTime: DateTimeResolver,
13
- Date: DateResolver,
14
- Timestamp: TimestampResolver,
15
- Locale: LocaleResolver,
12
+ DateTime: GraphQLDateTimeISO,
13
+ Date: GraphQLDate,
14
+ Timestamp: GraphQLTimestamp,
15
+ Locale: GraphQLLocale,
16
16
  };
17
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,MAAM,oBAAoB,CAAC;AACvC,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,KAAK,MAAM,iBAAiB,CAAC;AACpC,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAE/C,eAAe;IACb,GAAG,KAAK;IACR,GAAG,aAAa;IAChB,IAAI,EAAE,YAAY;IAClB,KAAK;IACL,QAAQ;IACR,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,YAAY;IAClB,SAAS,EAAE,iBAAiB;IAC5B,MAAM,EAAE,cAAc;CACW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolvers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,WAAW,EACX,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,MAAM,oBAAoB,CAAC;AACvC,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,KAAK,MAAM,iBAAiB,CAAC;AACpC,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAE/C,eAAe;IACb,GAAG,KAAK;IACR,GAAG,aAAa;IAChB,IAAI,EAAE,WAAW;IACjB,KAAK;IACL,QAAQ;IACR,QAAQ,EAAE,kBAAkB;IAC5B,IAAI,EAAE,WAAW;IACjB,SAAS,EAAE,gBAAgB;IAC3B,MAAM,EAAE,aAAa;CACY,CAAC"}
@@ -4,7 +4,7 @@ export default async function createUser(root, params, context) {
4
4
  const { modules, userId } = context;
5
5
  log('mutation createUser', { email: params.email, username: params.username, userId });
6
6
  if (!params.username && !params.email) {
7
- throw new UsernameOrEmailRequiredError({ username: params?.username });
7
+ throw new UsernameOrEmailRequiredError({});
8
8
  }
9
9
  if (!params.password && !params.webAuthnPublicKeyCredentials) {
10
10
  throw new PasswordOrWebAuthnPublicKeyRequiredError({ username: params?.username });
@@ -1 +1 @@
1
- {"version":3,"file":"createUser.js","sourceRoot":"","sources":["../../../../src/resolvers/mutations/accounts/createUser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,EAC1B,4BAA4B,EAC5B,wCAAwC,EACxC,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,UAAU,CAAC,IAAW,EAAE,MAAgB,EAAE,OAAgB;IACtF,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEpC,GAAG,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvF,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,IAAI,4BAA4B,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC;QAC7D,MAAM,IAAI,wCAAwC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAC9C;YACE,GAAG,MAAM;YACT,eAAe,EAAE,KAAK;SACvB,EACD,EAAE,CACH,CAAC;QAEF,IAAI,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAEvD,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE;YAC3D,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ;YACtC,WAAW,EAAE,OAAO,CAAC,cAAc;SACpC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,CAAC,KAAK,KAAK,eAAe;YAAE,MAAM,IAAI,uBAAuB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;aACxF,IAAI,CAAC,CAAC,KAAK,KAAK,kBAAkB;YACrC,MAAM,IAAI,0BAA0B,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;aAClE,IAAI,CAAC,CAAC,KAAK,KAAK,kBAAkB;YACrC,MAAM,IAAI,oBAAoB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;;YAC5D,MAAM,IAAI,wBAAwB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"createUser.js","sourceRoot":"","sources":["../../../../src/resolvers/mutations/accounts/createUser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,EAC1B,4BAA4B,EAC5B,wCAAwC,EACxC,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,UAAU,CAAC,IAAW,EAAE,MAAgB,EAAE,OAAgB;IACtF,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEpC,GAAG,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvF,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,IAAI,4BAA4B,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,4BAA4B,EAAE,CAAC;QAC7D,MAAM,IAAI,wCAAwC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,UAAU,CAC9C;YACE,GAAG,MAAM;YACT,eAAe,EAAE,KAAK;SACvB,EACD,EAAE,CACH,CAAC;QAEF,IAAI,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAEvD,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE;YAC3D,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ;YACtC,WAAW,EAAE,OAAO,CAAC,cAAc;SACpC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,CAAC,KAAK,KAAK,eAAe;YAAE,MAAM,IAAI,uBAAuB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;aACxF,IAAI,CAAC,CAAC,KAAK,KAAK,kBAAkB;YACrC,MAAM,IAAI,0BAA0B,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;aAClE,IAAI,CAAC,CAAC,KAAK,KAAK,kBAAkB;YACrC,MAAM,IAAI,oBAAoB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;;YAC5D,MAAM,IAAI,wBAAwB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC"}
@@ -2,7 +2,7 @@ import { Context } from '../../../types.js';
2
2
  export default function loginWithPassword(root: never, params: {
3
3
  username?: string;
4
4
  email?: string;
5
- password?: string;
5
+ password: string;
6
6
  }, context: Context): Promise<{
7
7
  _id: string;
8
8
  tokenExpires: Date;
@@ -1 +1 @@
1
- {"version":3,"file":"loginWithPassword.d.ts","sourceRoot":"","sources":["../../../../src/resolvers/mutations/accounts/loginWithPassword.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,wBAA8B,iBAAiB,CAC7C,IAAI,EAAE,KAAK,EACX,MAAM,EAAE;IACN,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,EACD,OAAO,EAAE,OAAO;;;GAsCjB"}
1
+ {"version":3,"file":"loginWithPassword.d.ts","sourceRoot":"","sources":["../../../../src/resolvers/mutations/accounts/loginWithPassword.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,wBAA8B,iBAAiB,CAC7C,IAAI,EAAE,KAAK,EACX,MAAM,EAAE;IACN,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,EACD,OAAO,EAAE,OAAO;;;GAsCjB"}
@@ -1,14 +1,15 @@
1
1
  import { log } from '@unchainedshop/logger';
2
- import { InvalidCredentialsError } from '../../../errors.js';
2
+ import { InvalidCredentialsError, UsernameOrEmailRequiredError } from '../../../errors.js';
3
3
  export default async function loginWithPassword(root, params, context) {
4
4
  const { username, email, password } = params;
5
5
  log('mutation loginWithPassword', { username, email });
6
- if (!password) {
7
- throw new Error('Password is required');
8
- }
6
+ if (!username && !email)
7
+ throw new UsernameOrEmailRequiredError({});
9
8
  let user = username
10
9
  ? await context.modules.users.findUserByUsername(username)
11
10
  : await context.modules.users.findUserByEmail(email);
11
+ if (!user)
12
+ throw new InvalidCredentialsError({ username, email });
12
13
  const verified = user.services?.password &&
13
14
  (await context.modules.users.verifyPassword(user.services.password, password));
14
15
  if (!verified)
@@ -1 +1 @@
1
- {"version":3,"file":"loginWithPassword.js","sourceRoot":"","sources":["../../../../src/resolvers/mutations/accounts/loginWithPassword.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,iBAAiB,CAC7C,IAAW,EACX,MAIC,EACD,OAAgB;IAEhB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC7C,GAAG,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAEvD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,IAAI,GAAG,QAAQ;QACjB,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC;QAC1D,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAEvD,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,EAAE,QAAQ;QACvB,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEjF,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,uBAAuB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAEtE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE;QAC3D,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ;QACtC,WAAW,EAAE,OAAO,CAAC,cAAc;KACpC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC;IAEnG,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"loginWithPassword.js","sourceRoot":"","sources":["../../../../src/resolvers/mutations/accounts/loginWithPassword.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAG3F,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,iBAAiB,CAC7C,IAAW,EACX,MAIC,EACD,OAAgB;IAEhB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC7C,GAAG,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAEvD,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,4BAA4B,CAAC,EAAE,CAAC,CAAC;IAEpE,IAAI,IAAI,GAAG,QAAQ;QACjB,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC;QAC1D,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAEvD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,uBAAuB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAElE,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,EAAE,QAAQ;QACvB,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEjF,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,uBAAuB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAEtE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE;QAC3D,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,QAAQ;QACtC,WAAW,EAAE,OAAO,CAAC,cAAc;KACpC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC;IAEnG,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -5,7 +5,7 @@ export default [
5
5
  """
6
6
  Log the user in with a password.
7
7
  """
8
- loginWithPassword(username: String, email: String, password: String): LoginMethodResponse
8
+ loginWithPassword(username: String, email: String, password: String!): LoginMethodResponse
9
9
 
10
10
  """
11
11
  Log the user in with a WebAuthn device
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unchainedshop/api",
3
- "version": "3.0.0-alpha3",
3
+ "version": "3.0.0-alpha5",
4
4
  "main": "lib/api-index.js",
5
5
  "exports": {
6
6
  ".": "./lib/api-index.js",
@@ -43,34 +43,37 @@
43
43
  "graphql-yoga": "^5.7.0"
44
44
  },
45
45
  "optionalDependencies": {
46
+ "@fastify/cookie": "^11.0.1",
47
+ "@fastify/session": "^11.0.1",
46
48
  "connect-mongo": "~5",
47
- "cookie-parser": "^1.4.6",
49
+ "cookie-parser": "^1.4.7",
48
50
  "express": "~4",
49
51
  "express-session": "~1",
52
+ "fastify": "^5.0.0",
50
53
  "passport": "^0.7.0",
51
54
  "passport-strategy": "^1.0.0"
52
55
  },
53
56
  "dependencies": {
54
- "@metamask/eth-sig-util": "^7.0.3",
55
- "@unchainedshop/core": "^3.0.0-alpha3",
56
- "@unchainedshop/events": "^3.0.0-alpha3",
57
- "@unchainedshop/logger": "^3.0.0-alpha3",
58
- "@unchainedshop/roles": "^3.0.0-alpha3",
59
- "@unchainedshop/utils": "^3.0.0-alpha3",
57
+ "@metamask/eth-sig-util": "^8.0.0",
58
+ "@unchainedshop/core": "^3.0.0-alpha4",
59
+ "@unchainedshop/events": "^3.0.0-alpha4",
60
+ "@unchainedshop/logger": "^3.0.0-alpha4",
61
+ "@unchainedshop/roles": "^3.0.0-alpha4",
62
+ "@unchainedshop/utils": "^3.0.0-alpha4",
60
63
  "accounting": "0.4.1",
61
64
  "dataloader": "^2.2.2",
62
65
  "graphql-scalars": "^1.23.0",
63
66
  "memoizee": "^0.4.17"
64
67
  },
65
68
  "devDependencies": {
66
- "@types/node": "^22.5.5",
69
+ "@types/node": "^22.8.1",
67
70
  "connect-mongo": "^5.1.0",
68
- "express": "^4.21.0",
69
- "express-session": "^1.18.0",
71
+ "express": "^4.21.1",
72
+ "express-session": "^1.18.1",
70
73
  "jest": "^29.7.0",
71
74
  "passport": "^0.7.0",
72
75
  "passport-strategy": "^1.0.0",
73
76
  "ts-jest": "^29.2.5",
74
- "typescript": "^5.6.2"
77
+ "typescript": "^5.6.3"
75
78
  }
76
79
  }
@@ -4,7 +4,7 @@ import createBulkImportMiddleware from './createBulkImportMiddleware.js';
4
4
  import createERCMetadataMiddleware from './createERCMetadataMiddleware.js';
5
5
  import session from 'express-session';
6
6
  import MongoStore from 'connect-mongo';
7
- import { YogaServer } from 'graphql-yoga';
7
+ import { YogaServerInstance } from 'graphql-yoga';
8
8
  import setupPassport from './passport/setup.js';
9
9
  import { mongodb } from '@unchainedshop/mongodb';
10
10
  import { UnchainedCore } from '@unchainedshop/core';
@@ -31,7 +31,6 @@ const {
31
31
  UNCHAINED_COOKIE_NAME = 'unchained_token',
32
32
  UNCHAINED_COOKIE_PATH = '/',
33
33
  UNCHAINED_COOKIE_DOMAIN,
34
- NODE_ENV,
35
34
  } = process.env;
36
35
 
37
36
  const addContext = async function middlewareWithContext(
@@ -116,7 +115,7 @@ export const connect = (
116
115
  graphqlHandler,
117
116
  db,
118
117
  unchainedAPI,
119
- }: { graphqlHandler: YogaServer<any, any>; db: mongodb.Db; unchainedAPI: UnchainedCore },
118
+ }: { graphqlHandler: YogaServerInstance<any, any>; db: mongodb.Db; unchainedAPI: UnchainedCore },
120
119
  ) => {
121
120
  const passport = setupPassport(unchainedAPI);
122
121
 
@@ -133,10 +132,10 @@ export const connect = (
133
132
  resave: false,
134
133
  cookie: {
135
134
  domain: UNCHAINED_COOKIE_DOMAIN,
136
- httpOnly: Boolean(NODE_ENV === 'production'),
137
135
  path: UNCHAINED_COOKIE_PATH,
138
- sameSite: 'lax',
139
- secure: NODE_ENV === 'production',
136
+ sameSite: 'none',
137
+ secure: true,
138
+ httpOnly: true,
140
139
  maxAge: 1000 * 60 * 60 * 24 * 7,
141
140
  },
142
141
  }),
@@ -0,0 +1,128 @@
1
+ import { getCurrentContextResolver } from '../context.js';
2
+ // import createBulkImportMiddleware from './createBulkImportMiddleware.js';
3
+ // import createERCMetadataMiddleware from './createERCMetadataMiddleware.js';
4
+ import MongoStore from 'connect-mongo';
5
+ import { YogaServerInstance } from 'graphql-yoga';
6
+ import { mongodb } from '@unchainedshop/mongodb';
7
+ import { UnchainedCore } from '@unchainedshop/core';
8
+ import { emit } from '@unchainedshop/events';
9
+ import { API_EVENTS } from '../events.js';
10
+ import { User } from '@unchainedshop/core-users';
11
+ import { IncomingMessage } from 'http';
12
+ import fastifySession from '@fastify/session';
13
+ import fastifyCookie from '@fastify/cookie';
14
+
15
+ const resolveUserRemoteAddress = (req: IncomingMessage) => {
16
+ const remoteAddress =
17
+ (req.headers['x-real-ip'] as string) ||
18
+ (req.headers['x-forwarded-for'] as string) ||
19
+ req.socket?.remoteAddress;
20
+
21
+ const remotePort = req.socket?.remotePort;
22
+
23
+ return { remoteAddress, remotePort };
24
+ };
25
+
26
+ const {
27
+ GRAPHQL_API_PATH = '/graphql',
28
+ UNCHAINED_COOKIE_NAME = 'unchained_token',
29
+ UNCHAINED_COOKIE_PATH = '/',
30
+ UNCHAINED_COOKIE_DOMAIN,
31
+ NODE_ENV,
32
+ } = process.env;
33
+
34
+ const middlewareHook = async function middlewareHook(req: any, reply: any) {
35
+ const setHeader = (key, value) => reply.header(key, value);
36
+ const getHeader = (key) => req.headers[key];
37
+ const { remoteAddress, remotePort } = resolveUserRemoteAddress(req);
38
+
39
+ const context = getCurrentContextResolver();
40
+
41
+ async function login(user: User) {
42
+ req.session.user = user;
43
+ req.session.userId = user._id;
44
+ const tokenObject = {
45
+ _id: req.session.sessionId,
46
+ /* eslint-disable-next-line */
47
+ tokenExpires: new Date((req as any).session?.cookie._expires),
48
+ };
49
+ await emit(API_EVENTS.API_LOGIN_TOKEN_CREATED, { userId: user._id, ...tokenObject });
50
+ /* eslint-disable-next-line */
51
+ (user as any)._inLoginMethodResponse = true;
52
+ return { user, ...tokenObject };
53
+ }
54
+
55
+ async function logout() {
56
+ /* eslint-disable-line */
57
+ if (!req.session?.userId) return false;
58
+ const tokenObject = {
59
+ _id: (req as any).session.sessionId,
60
+ userId: req.session?.userId,
61
+ };
62
+ req.session.user = null;
63
+ req.session.userId = null;
64
+ await emit(API_EVENTS.API_LOGOUT, tokenObject);
65
+ return true;
66
+ }
67
+
68
+ (req as any).unchainedContext = await context({
69
+ setHeader,
70
+ getHeader,
71
+ remoteAddress,
72
+ remotePort,
73
+ login,
74
+ logout,
75
+ user: req.session.user,
76
+ userId: req.session.userId,
77
+ });
78
+ };
79
+
80
+ export const connect = (
81
+ fastify: any,
82
+ {
83
+ graphqlHandler,
84
+ db,
85
+ }: { graphqlHandler: YogaServerInstance<any, any>; db: mongodb.Db; unchainedAPI: UnchainedCore },
86
+ ) => {
87
+ fastify.register(fastifyCookie);
88
+ fastify.register(fastifySession, {
89
+ secret: process.env.UNCHAINED_TOKEN_SECRET,
90
+ cookieName: UNCHAINED_COOKIE_NAME,
91
+ store: MongoStore.create({
92
+ client: (db as any).client,
93
+ dbName: db.databaseName,
94
+ collectionName: 'sessions',
95
+ }),
96
+ cookie: {
97
+ domain: UNCHAINED_COOKIE_DOMAIN,
98
+ httpOnly: Boolean(NODE_ENV === 'production'),
99
+ path: UNCHAINED_COOKIE_PATH,
100
+ secure: NODE_ENV === 'production',
101
+ maxAge: 1000 * 60 * 60 * 24 * 7,
102
+ },
103
+ });
104
+
105
+ fastify.decorateRequest('unchainedContext');
106
+ fastify.addHook('onRequest', middlewareHook);
107
+
108
+ fastify.route({
109
+ url: GRAPHQL_API_PATH,
110
+ method: ['GET', 'POST', 'OPTIONS'],
111
+ handler: async (req, reply) => {
112
+ // Second parameter adds Fastify's `req` and `reply` to the GraphQL Context
113
+ const response = await graphqlHandler.handleNodeRequestAndResponse(req, reply, {
114
+ req,
115
+ reply,
116
+ });
117
+ response.headers.forEach((value, key) => {
118
+ reply.header(key, value);
119
+ });
120
+ reply.status(response.status);
121
+ reply.send(response.body);
122
+ return reply;
123
+ },
124
+ });
125
+
126
+ // expressApp.use(ERC_METADATA_API_PATH, createERCMetadataMiddleware);
127
+ // expressApp.use(BULK_IMPORT_API_PATH, createBulkImportMiddleware);
128
+ };
@@ -1,9 +1,9 @@
1
1
  import {
2
- JSONResolver,
3
- TimestampResolver,
4
- DateTimeResolver,
5
- DateResolver,
6
- LocaleResolver,
2
+ GraphQLJSON,
3
+ GraphQLTimestamp,
4
+ GraphQLDateTimeISO,
5
+ GraphQLDate,
6
+ GraphQLLocale,
7
7
  } from 'graphql-scalars';
8
8
  import Query from './queries/index.js';
9
9
  import Mutation from './mutations/index.js';
@@ -13,11 +13,11 @@ import CustomScalars from './scalars/index.js';
13
13
  export default {
14
14
  ...Types,
15
15
  ...CustomScalars,
16
- JSON: JSONResolver,
16
+ JSON: GraphQLJSON,
17
17
  Query,
18
18
  Mutation,
19
- DateTime: DateTimeResolver,
20
- Date: DateResolver,
21
- Timestamp: TimestampResolver,
22
- Locale: LocaleResolver,
19
+ DateTime: GraphQLDateTimeISO,
20
+ Date: GraphQLDate,
21
+ Timestamp: GraphQLTimestamp,
22
+ Locale: GraphQLLocale,
23
23
  } as unknown as Record<string, any>;
@@ -16,7 +16,7 @@ export default async function createUser(root: never, params: UserData, context:
16
16
  log('mutation createUser', { email: params.email, username: params.username, userId });
17
17
 
18
18
  if (!params.username && !params.email) {
19
- throw new UsernameOrEmailRequiredError({ username: params?.username });
19
+ throw new UsernameOrEmailRequiredError({});
20
20
  }
21
21
 
22
22
  if (!params.password && !params.webAuthnPublicKeyCredentials) {
@@ -1,5 +1,5 @@
1
1
  import { log } from '@unchainedshop/logger';
2
- import { InvalidCredentialsError } from '../../../errors.js';
2
+ import { InvalidCredentialsError, UsernameOrEmailRequiredError } from '../../../errors.js';
3
3
  import { Context } from '../../../types.js';
4
4
 
5
5
  export default async function loginWithPassword(
@@ -7,21 +7,21 @@ export default async function loginWithPassword(
7
7
  params: {
8
8
  username?: string;
9
9
  email?: string;
10
- password?: string;
10
+ password: string;
11
11
  },
12
12
  context: Context,
13
13
  ) {
14
14
  const { username, email, password } = params;
15
15
  log('mutation loginWithPassword', { username, email });
16
16
 
17
- if (!password) {
18
- throw new Error('Password is required');
19
- }
17
+ if (!username && !email) throw new UsernameOrEmailRequiredError({});
20
18
 
21
19
  let user = username
22
20
  ? await context.modules.users.findUserByUsername(username)
23
21
  : await context.modules.users.findUserByEmail(email);
24
22
 
23
+ if (!user) throw new InvalidCredentialsError({ username, email });
24
+
25
25
  const verified =
26
26
  user.services?.password &&
27
27
  (await context.modules.users.verifyPassword(user.services.password, password));
@@ -5,7 +5,7 @@ export default [
5
5
  """
6
6
  Log the user in with a password.
7
7
  """
8
- loginWithPassword(username: String, email: String, password: String): LoginMethodResponse
8
+ loginWithPassword(username: String, email: String, password: String!): LoginMethodResponse
9
9
 
10
10
  """
11
11
  Log the user in with a WebAuthn device
@@ -1,15 +1,14 @@
1
1
  // Import the function to be tested.
2
- import {admin} from '../lib/roles/admin.js'
3
- import {actions} from '../lib/roles/index.js';
4
- import {checkAction, ensureActionExists, ensureIsFunction} from '../lib/acl.js'
2
+ import { admin } from '../lib/roles/admin.js';
3
+ import { actions } from '../lib/roles/index.js';
4
+ import { checkAction, ensureActionExists, ensureIsFunction } from '../lib/acl.js';
5
5
  import { NoPermissionError, PermissionSystemError } from '../lib/errors.js';
6
6
  import { Roles } from '@unchainedshop/roles';
7
7
 
8
8
  describe('API', () => {
9
-
10
9
  describe('roles', () => {
11
10
  const role = {
12
- allow: import.meta.jest.fn()
11
+ allow: import.meta.jest.fn(),
13
12
  };
14
13
 
15
14
  it('creates the admin role and grants permissions to all actions', () => {
@@ -17,15 +16,14 @@ describe('API', () => {
17
16
  for (const actionName of Object.keys(actions)) {
18
17
  expect(role.allow).toHaveBeenCalledWith(actions[actionName], expect.any(Function));
19
18
  }
20
- })
21
-
22
- })
19
+ });
20
+ });
23
21
 
24
22
  describe('ensureActionExists', () => {
25
23
  it('should throw a PermissionSystemError if the action is undefined', () => {
26
24
  expect(() => ensureActionExists(undefined, {})).toThrow(PermissionSystemError);
27
25
  });
28
-
26
+
29
27
  it('should not throw an error if the action is defined', () => {
30
28
  expect(() => ensureActionExists('some action', {})).not.toThrow();
31
29
  });
@@ -38,40 +36,44 @@ describe('API', () => {
38
36
  const key = 'some key';
39
37
  expect(() => ensureIsFunction(null, action, options, key)).toThrow(PermissionSystemError);
40
38
  });
41
-
39
+
42
40
  it('should not throw an error if the provided value is a function', () => {
43
41
  const action = 'some action';
44
42
  const options = { showKey: true };
45
43
  const key = 'some key';
46
- expect(() => ensureIsFunction(() => {}, action, options, key)).not.toThrow();
44
+ expect(() =>
45
+ ensureIsFunction(
46
+ () => {
47
+ /**/
48
+ },
49
+ action,
50
+ options,
51
+ key,
52
+ ),
53
+ ).not.toThrow();
47
54
  });
48
55
  });
49
56
 
50
-
51
57
  describe('checkAction', () => {
52
-
53
- it('should throw a NoPermissionError if the user does not have permission to perform the action', async () => {
54
- Roles.userHasPermission = import.meta.jest.fn(async () => false);
58
+ it('should throw a NoPermissionError if the user does not have permission to perform the action', async () => {
59
+ Roles.userHasPermission = import.meta.jest.fn(async () => false);
60
+
61
+ const context = { userId: '123' };
62
+ const action = 'some action';
63
+ const args: any = [];
64
+ const options = { key: 'some key' };
55
65
 
56
- const context = { userId: '123' };
57
- const action = 'some action';
58
- const args: any = [];
59
- const options = { key: 'some key' };
66
+ return expect(checkAction(context, action, args, options)).rejects.toThrow(NoPermissionError);
67
+ });
60
68
 
61
- await expect(checkAction(context, action, args, options)).rejects.toThrow(NoPermissionError);
62
- });
63
-
64
- it('should not throw an error if the user has permission to perform the action', async () => {
65
- Roles.userHasPermission = import.meta.jest.fn(async () => true);
66
- const context = { userId: '123' };
67
- const action = 'some action';
68
- const args: any = {};
69
- const options = { key: 'some key' };
69
+ it('should not throw an error if the user has permission to perform the action', async () => {
70
+ Roles.userHasPermission = import.meta.jest.fn(async () => true);
71
+ const context = { userId: '123' };
72
+ const action = 'some action';
73
+ const args: any = {};
74
+ const options = { key: 'some key' };
70
75
 
71
- await expect(checkAction(context, action, args, options)).resolves.not.toThrow();
76
+ return expect(checkAction(context, action, args, options)).resolves.not.toThrow();
77
+ });
72
78
  });
73
79
  });
74
-
75
-
76
-
77
- });