sdk: add express sdk
This commit is contained in:
50
packages/sdks/express/index.ts
Normal file
50
packages/sdks/express/index.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
import type { NextFunction, Request, Response } from 'express';
|
||||
import { getClientIp } from 'request-ip';
|
||||
|
||||
import type { OpenpanelSdkOptions } from '@openpanel/sdk';
|
||||
import { OpenpanelSdk } from '@openpanel/sdk';
|
||||
|
||||
export * from '@openpanel/sdk';
|
||||
|
||||
declare global {
|
||||
// eslint-disable-next-line @typescript-eslint/no-namespace
|
||||
namespace Express {
|
||||
export interface Request {
|
||||
op: OpenpanelSdk;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export type OpenpanelOptions = OpenpanelSdkOptions & {
|
||||
trackRequest?: (url: string) => boolean;
|
||||
getProfileId?: (req: Request) => string;
|
||||
};
|
||||
|
||||
export default function createMiddleware(options: OpenpanelOptions) {
|
||||
return function middleware(req: Request, res: Response, next: NextFunction) {
|
||||
const sdk = new OpenpanelSdk(options);
|
||||
const ip = getClientIp(req);
|
||||
if (ip) {
|
||||
sdk.api.headers['x-forwarded-for'] = ip;
|
||||
}
|
||||
|
||||
if (options.getProfileId) {
|
||||
const profileId = options.getProfileId(req);
|
||||
if (profileId) {
|
||||
sdk.setProfileId(profileId);
|
||||
}
|
||||
}
|
||||
|
||||
if (options.trackRequest?.(req.url)) {
|
||||
sdk.event('request', {
|
||||
url: req.url,
|
||||
method: req.method,
|
||||
query: req.query,
|
||||
});
|
||||
}
|
||||
|
||||
req.op = sdk;
|
||||
|
||||
return next();
|
||||
};
|
||||
}
|
||||
36
packages/sdks/express/package.json
Normal file
36
packages/sdks/express/package.json
Normal file
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"name": "@openpanel/express",
|
||||
"version": "0.0.1",
|
||||
"module": "index.ts",
|
||||
"scripts": {
|
||||
"build": "rm -rf dist && tsup",
|
||||
"lint": "eslint .",
|
||||
"format": "prettier --check \"**/*.{mjs,ts,md,json}\"",
|
||||
"typecheck": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"@openpanel/sdk": "workspace:*",
|
||||
"request-ip": "^3.3.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"express": "^3.0.0 || ^4.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@openpanel/eslint-config": "workspace:*",
|
||||
"@openpanel/prettier-config": "workspace:*",
|
||||
"@openpanel/tsconfig": "workspace:*",
|
||||
"@types/express": "^4.17.21",
|
||||
"@types/request-ip": "^0.0.41",
|
||||
"eslint": "^8.48.0",
|
||||
"prettier": "^3.0.3",
|
||||
"tsup": "^7.2.0",
|
||||
"typescript": "^5.2.2"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"root": true,
|
||||
"extends": [
|
||||
"@openpanel/eslint-config/base"
|
||||
]
|
||||
},
|
||||
"prettier": "@openpanel/prettier-config"
|
||||
}
|
||||
8
packages/sdks/express/tsconfig.json
Normal file
8
packages/sdks/express/tsconfig.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"extends": "@openpanel/tsconfig/base.json",
|
||||
"compilerOptions": {
|
||||
"incremental": false,
|
||||
"outDir": "dist"
|
||||
},
|
||||
"exclude": ["dist"]
|
||||
}
|
||||
9
packages/sdks/express/tsup.config.ts
Normal file
9
packages/sdks/express/tsup.config.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { defineConfig } from 'tsup';
|
||||
|
||||
import config from '@openpanel/tsconfig/tsup.config.json' assert { type: 'json' };
|
||||
|
||||
export default defineConfig({
|
||||
...(config as any),
|
||||
entry: ['index.ts', 'cdn.ts'],
|
||||
format: ['cjs', 'esm', 'iife'],
|
||||
});
|
||||
Reference in New Issue
Block a user