feat: add basic webui

This commit is contained in:
2024-12-30 06:39:09 +08:00
parent 608a7fb9c6
commit a4c549e7c3
462 changed files with 35900 additions and 2491 deletions

View File

@@ -0,0 +1,26 @@
import { type ApiData, verifyAccess } from '@vercel/flags';
import { type NextRequest, NextResponse } from 'next/server';
import * as flags from './index';
export const getFlags = async (request: NextRequest) => {
const access = await verifyAccess(request.headers.get('Authorization'));
if (!access) {
return NextResponse.json(null, { status: 401 });
}
const definitions = Object.fromEntries(
Object.values(flags).map((flag) => [
flag.key,
{
origin: flag.origin,
description: flag.description,
options: flag.options,
},
])
);
return NextResponse.json<ApiData>({
definitions,
});
};

View File

@@ -0,0 +1,3 @@
import { createFlag } from './lib/create-flag';
export const showBetaFeature = createFlag('showBetaFeature');

View File

@@ -0,0 +1,20 @@
import { analytics } from '@konobangu/analytics/server';
import { getSessionFromHeaders } from '@konobangu/auth/server';
import { unstable_flag as flag } from '@vercel/flags/next';
export const createFlag = (key: string) =>
flag({
key,
defaultValue: false,
async decide() {
const { userId } = await getSessionFromHeaders();
if (!userId) {
return this.defaultValue as boolean;
}
const isEnabled = await analytics.isFeatureEnabled(key, userId);
return isEnabled ?? (this.defaultValue as boolean);
},
});

View File

@@ -0,0 +1,22 @@
{
"name": "@konobangu/feature-flags",
"version": "0.0.0",
"private": true,
"scripts": {
"clean": "git clean -xdf .cache .turbo dist node_modules",
"typecheck": "tsc --noEmit --emitDeclarationOnly false"
},
"dependencies": {
"@konobangu/auth": "workspace:*",
"@konobangu/analytics": "workspace:*",
"@konobangu/design-system": "workspace:*",
"@vercel/flags": "^2.6.3"
},
"peerDependencies": {
"next": "^15.1.3"
},
"devDependencies": {
"typescript": "^5.7.2",
"@konobangu/typescript-config": "workspace:*"
}
}

View File

@@ -0,0 +1,8 @@
{
"extends": "@konobangu/typescript-config/react-library.json",
"compilerOptions": {
"baseUrl": "."
},
"include": ["**/*.ts", "**/*.tsx"],
"exclude": ["node_modules"]
}