fix: tech debt batch 1 — TS errors, vulnerabilities, dead code
- Fixed 12 TypeScript errors across analytics.ts, observer-project-detail.tsx, bulk-upload/page.tsx, settings/profile/page.tsx - npm audit: 8 vulnerabilities resolved (1 critical, 4 high, 3 moderate) - Deleted 3 dead files: live-control.ts (618 lines), feature-flags.ts, file-type-categories.ts - Removed typescript.ignoreBuildErrors: true — TS errors now block builds Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,49 +0,0 @@
|
||||
import { prisma } from '@/lib/prisma'
|
||||
|
||||
/**
|
||||
* Feature flag keys — used to control progressive rollout of new architecture.
|
||||
* Stored as SystemSetting records with category FEATURE_FLAGS.
|
||||
*/
|
||||
export const FEATURE_FLAGS = {
|
||||
/** Use Competition/Round model instead of Pipeline/Track/Stage */
|
||||
USE_COMPETITION_MODEL: 'feature.useCompetitionModel',
|
||||
} as const
|
||||
|
||||
type FeatureFlagKey = (typeof FEATURE_FLAGS)[keyof typeof FEATURE_FLAGS]
|
||||
|
||||
/**
|
||||
* Check if a feature flag is enabled (server-side).
|
||||
* Returns false if the flag doesn't exist in the database.
|
||||
*/
|
||||
export async function isFeatureEnabled(flag: FeatureFlagKey): Promise<boolean> {
|
||||
try {
|
||||
const setting = await prisma.systemSettings.findUnique({
|
||||
where: { key: flag },
|
||||
})
|
||||
// Default to true for competition model (legacy Pipeline system removed)
|
||||
if (!setting) return flag === FEATURE_FLAGS.USE_COMPETITION_MODEL ? true : false
|
||||
return setting.value === 'true'
|
||||
} catch {
|
||||
return flag === FEATURE_FLAGS.USE_COMPETITION_MODEL ? true : false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a feature flag value (server-side, admin only).
|
||||
*/
|
||||
export async function setFeatureFlag(
|
||||
flag: FeatureFlagKey,
|
||||
enabled: boolean,
|
||||
): Promise<void> {
|
||||
await prisma.systemSettings.upsert({
|
||||
where: { key: flag },
|
||||
update: { value: String(enabled) },
|
||||
create: {
|
||||
key: flag,
|
||||
value: String(enabled),
|
||||
type: 'BOOLEAN',
|
||||
category: 'FEATURE_FLAGS',
|
||||
description: `Feature flag: ${flag}`,
|
||||
},
|
||||
})
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
export type FileTypeCategory = {
|
||||
id: string
|
||||
label: string
|
||||
mimeTypes: string[]
|
||||
extensions: string[]
|
||||
}
|
||||
|
||||
export const FILE_TYPE_CATEGORIES: FileTypeCategory[] = [
|
||||
{ id: 'pdf', label: 'PDF', mimeTypes: ['application/pdf'], extensions: ['.pdf'] },
|
||||
{ id: 'word', label: 'Word', mimeTypes: ['application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'], extensions: ['.doc', '.docx'] },
|
||||
{ id: 'powerpoint', label: 'PowerPoint', mimeTypes: ['application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'], extensions: ['.ppt', '.pptx'] },
|
||||
{ id: 'excel', label: 'Excel', mimeTypes: ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'], extensions: ['.xls', '.xlsx'] },
|
||||
{ id: 'images', label: 'Images', mimeTypes: ['image/*'], extensions: ['.jpg', '.jpeg', '.png', '.gif', '.webp'] },
|
||||
{ id: 'videos', label: 'Videos', mimeTypes: ['video/*'], extensions: ['.mp4', '.mov', '.avi', '.webm'] },
|
||||
]
|
||||
|
||||
/** Get active category IDs from a list of mime types */
|
||||
export function getActiveCategoriesFromMimeTypes(mimeTypes: string[]): string[] {
|
||||
if (!mimeTypes || !Array.isArray(mimeTypes)) return []
|
||||
return FILE_TYPE_CATEGORIES.filter((cat) =>
|
||||
cat.mimeTypes.some((mime) => mimeTypes.includes(mime))
|
||||
).map((cat) => cat.id)
|
||||
}
|
||||
|
||||
/** Convert category IDs to flat mime type array */
|
||||
export function categoriesToMimeTypes(categoryIds: string[]): string[] {
|
||||
return FILE_TYPE_CATEGORIES.filter((cat) => categoryIds.includes(cat.id)).flatMap(
|
||||
(cat) => cat.mimeTypes
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user