Răsfoiți Sursa

move AccessTokenParser type to @growi/core

Yuki Takei 2 luni în urmă
părinte
comite
cbadb436f1

+ 5 - 0
.changeset/chatty-mayflies-own.md

@@ -0,0 +1,5 @@
+---
+'@growi/core': minor
+---
+
+Add AccessTokenParser type

+ 1 - 1
apps/app/src/server/middlewares/access-token-parser/access-token.integ.ts

@@ -1,5 +1,6 @@
 import { faker } from '@faker-js/faker';
 import { SCOPE } from '@growi/core/dist/interfaces';
+import type { AccessTokenParserReq } from '@growi/core/dist/interfaces/server';
 import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
 import type { Response } from 'express';
 import { mock } from 'vitest-mock-extended';
@@ -9,7 +10,6 @@ import type UserEvent from '~/server/events/user';
 import { AccessToken } from '~/server/models/access-token';
 
 import { parserForAccessToken } from './access-token';
-import type { AccessTokenParserReq } from './interfaces';
 
 vi.mock('@growi/core/dist/models/serializers', { spy: true });
 

+ 1 - 1
apps/app/src/server/middlewares/access-token-parser/access-token.ts

@@ -1,4 +1,5 @@
 import type { IUserHasId, Scope } from '@growi/core/dist/interfaces';
+import type { AccessTokenParserReq } from '@growi/core/dist/interfaces/server';
 import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
 import type { Response } from 'express';
 
@@ -6,7 +7,6 @@ import { AccessToken } from '~/server/models/access-token';
 import loggerFactory from '~/utils/logger';
 
 import { extractBearerToken } from './extract-bearer-token';
-import type { AccessTokenParserReq } from './interfaces';
 
 const logger = loggerFactory(
   'growi:middleware:access-token-parser:access-token',

+ 1 - 1
apps/app/src/server/middlewares/access-token-parser/api-token.integ.ts

@@ -1,4 +1,5 @@
 import { faker } from '@faker-js/faker';
+import type { AccessTokenParserReq } from '@growi/core/dist/interfaces/server';
 import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
 import type { Response } from 'express';
 import { mock } from 'vitest-mock-extended';
@@ -7,7 +8,6 @@ import type Crowi from '~/server/crowi';
 import type UserEvent from '~/server/events/user';
 
 import { parserForApiToken } from './api-token';
-import type { AccessTokenParserReq } from './interfaces';
 
 vi.mock('@growi/core/dist/models/serializers', { spy: true });
 

+ 1 - 1
apps/app/src/server/middlewares/access-token-parser/api-token.ts

@@ -1,4 +1,5 @@
 import type { IUser, IUserHasId } from '@growi/core/dist/interfaces';
+import type { AccessTokenParserReq } from '@growi/core/dist/interfaces/server';
 import { serializeUserSecurely } from '@growi/core/dist/models/serializers';
 import type { Response } from 'express';
 import type { HydratedDocument } from 'mongoose';
@@ -7,7 +8,6 @@ import mongoose from 'mongoose';
 import loggerFactory from '~/utils/logger';
 
 import { extractBearerToken } from './extract-bearer-token';
-import type { AccessTokenParserReq } from './interfaces';
 
 const logger = loggerFactory('growi:middleware:access-token-parser:api-token');
 

+ 6 - 11
apps/app/src/server/middlewares/access-token-parser/index.ts

@@ -1,23 +1,18 @@
-import type { Scope } from '@growi/core/dist/interfaces';
-import type { NextFunction, Response } from 'express';
+import type {
+  AccessTokenParser,
+  AccessTokenParserReq,
+} from '@growi/core/dist/interfaces/server';
 
 import loggerFactory from '~/utils/logger';
 
 import { parserForAccessToken } from './access-token';
 import { parserForApiToken } from './api-token';
-import type { AccessTokenParserReq } from './interfaces';
 
 const logger = loggerFactory('growi:middleware:access-token-parser');
 
-export type AccessTokenParser = (
-  scopes?: Scope[],
-  opts?: { acceptLegacy: boolean },
-) => (
-  req: AccessTokenParserReq,
-  res: Response,
-  next: NextFunction,
-) => Promise<void>;
+export type { AccessTokenParser, AccessTokenParserReq };
 
+// @ts-expect-error - Scope type causes "Type instantiation is excessively deep" with tsgo
 export const accessTokenParser: AccessTokenParser = (scopes, opts) => {
   return async (req, res, next): Promise<void> => {
     if (scopes == null || scopes.length === 0) {

+ 0 - 15
apps/app/src/server/middlewares/access-token-parser/interfaces.ts

@@ -1,15 +0,0 @@
-import type { IUserHasId } from '@growi/core/dist/interfaces';
-import type { IUserSerializedSecurely } from '@growi/core/dist/models/serializers';
-import type { Request } from 'express';
-
-type ReqQuery = {
-  access_token?: string;
-};
-type ReqBody = {
-  access_token?: string;
-};
-
-export interface AccessTokenParserReq
-  extends Request<undefined, undefined, ReqBody, ReqQuery> {
-  user?: IUserSerializedSecurely<IUserHasId>;
-}

+ 1 - 1
apps/app/src/server/middlewares/certify-origin.ts

@@ -4,7 +4,7 @@ import type { NextFunction, Response } from 'express';
 import loggerFactory from '../../utils/logger';
 import { configManager } from '../service/config-manager';
 import isSimpleRequest from '../util/is-simple-request';
-import type { AccessTokenParserReq } from './access-token-parser/interfaces';
+import type { AccessTokenParserReq } from './access-token-parser';
 
 const logger = loggerFactory('growi:middleware:certify-origin');
 

+ 1 - 1
apps/app/src/server/util/is-simple-request.ts

@@ -1,6 +1,6 @@
 import type { Request } from 'express';
 
-import type { AccessTokenParserReq } from '~/server/middlewares/access-token-parser/interfaces';
+import type { AccessTokenParserReq } from '~/server/middlewares/access-token-parser';
 
 const allowedMethods = ['GET', 'HEAD', 'POST'] as const;
 type AllowedMethod = (typeof allowedMethods)[number];

+ 5 - 0
packages/core/package.json

@@ -26,6 +26,10 @@
       "import": "./dist/interfaces/index.js",
       "require": "./dist/interfaces/index.cjs"
     },
+    "./dist/interfaces/server": {
+      "import": "./dist/interfaces/server/index.js",
+      "require": "./dist/interfaces/server/index.cjs"
+    },
     "./dist/models": {
       "import": "./dist/models/index.js",
       "require": "./dist/models/index.cjs"
@@ -73,6 +77,7 @@
     "escape-string-regexp": "^4.0.0"
   },
   "devDependencies": {
+    "@types/express": "^4",
     "mongoose": "^6.13.6",
     "socket.io-client": "^4.7.5",
     "swr": "^2.2.2"

+ 22 - 0
packages/core/src/interfaces/server/access-token-parser.ts

@@ -0,0 +1,22 @@
+import type { Request, RequestHandler } from 'express';
+
+import type { IUserSerializedSecurely } from '../../models/serializers';
+import type { Scope } from '../scope';
+import type { IUserHasId } from '../user';
+
+export interface AccessTokenParserReq extends Request {
+  user?: IUserSerializedSecurely<IUserHasId>;
+  query: Request['query'] & {
+    access_token?: string;
+  };
+  body: Request['body'] & {
+    access_token?: string;
+  };
+}
+
+export type AccessTokenParser = (
+  // biome-ignore lint/suspicious/noTsIgnore: Suppress auto fix by lefthook
+  // @ts-ignore - Scope type causes "Type instantiation is excessively deep" with tsgo
+  scopes?: Scope[],
+  opts?: { acceptLegacy: boolean },
+) => RequestHandler;

+ 1 - 0
packages/core/src/interfaces/server/index.ts

@@ -0,0 +1 @@
+export * from './access-token-parser';