fix: npm run lint(tsc --noEmit) 실제 0 에러 달성 — 기존 93건 정리

- tsconfig에 supabase 제외 (Deno 런타임 코드를 프론트 tsc+DOM lib로 검사하던 오류 79건)
- src/vite-env.d.ts 추가 (import.meta.env 타입 6건)
- @types/react 부재 환경의 JSX key 시임 4건 (ColorSwatchCard·WorkflowCard·EnvKeyRow·ApiCard)
- transformPlan latestPosts 타입 캐스트, transformReport unknown 경유 캐스트, MultiChannelInput trim 가드
- Office 임시 잠금 파일(~$*.pptx) 삭제 반영

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WgWoJZAvvzMxTpWeenZSia
This commit is contained in:
Haewon Kam 2026-08-31 16:17:12 +09:00
parent 58fb4a317d
commit 85d72e4cfb
9 changed files with 13 additions and 8 deletions

View File

@ -132,7 +132,7 @@ export default function MultiChannelInput({ variant = 'hero', onAnalyze }: Multi
gangnamUnni: aggregated.gangnamUnni.length ? aggregated.gangnamUnni : undefined,
},
rawInput: Object.entries(urls)
.filter(([, v]) => v.trim())
.filter(([, v]) => typeof v === 'string' && v.trim() !== '')
.map(([k, v]) => `${k}: ${v}`)
.join('\n'),
};

View File

@ -55,7 +55,7 @@ const statusLabel: Record<string, string> = {
};
/* ─── Color Swatch Editor Popover ─── */
function ColorSwatchCard({ swatch, onUpdate }: { swatch: ColorSwatch; onUpdate: (newHex: string) => void }) {
function ColorSwatchCard({ swatch, onUpdate }: { key?: string; swatch: ColorSwatch; onUpdate: (newHex: string) => void }) {
const [open, setOpen] = useState(false);
const [hexInput, setHexInput] = useState(swatch.hex);
const popoverRef = useRef<HTMLDivElement>(null);

View File

@ -79,6 +79,7 @@ function StageBar({ currentStage }: { currentStage: WorkflowStage }) {
}
function WorkflowCard({ item, onStageChange, onNotesChange }: {
key?: string;
item: WorkflowItem;
onStageChange: (id: string, stage: WorkflowStage) => void;
onNotesChange: (id: string, notes: string) => void;

View File

@ -194,8 +194,10 @@ function buildAssets(enrichment: EnrichmentData | undefined): { assets: AssetCar
// Instagram posts → photo assets
const igAccounts = enrichment.instagramAccounts || (enrichment.instagram ? [enrichment.instagram] : []);
for (const ig of igAccounts) {
if (ig.latestPosts) {
for (const p of (ig.latestPosts as { type?: string; likes?: number; caption?: string }[]).slice(0, 3)) {
const igPosts = (ig as { latestPosts?: { type?: string; likes?: number; caption?: string }[] })
.latestPosts;
if (igPosts) {
for (const p of igPosts.slice(0, 3)) {
assets.push({
id: `ig-${assetIdx++}`,
source: 'social',

View File

@ -159,7 +159,7 @@ function buildDiagnosis(report: ApiReport): DiagnosisItem[] {
}
if (ch.issues) {
for (const issue of ch.issues) {
const issueObj = issue as Record<string, unknown>;
const issueObj = issue as unknown as Record<string, unknown>;
const detail = typeof issue === 'string'
? issue
: typeof issueObj.issue === 'string'

View File

@ -262,7 +262,7 @@ function CategoryBadge({ category }: { category: ApiConfig['category'] }) {
);
}
function EnvKeyRow({ envKey, present, isServerSide }: { envKey: string; present: boolean; isServerSide: boolean }) {
function EnvKeyRow({ envKey, present, isServerSide }: { key?: string; envKey: string; present: boolean; isServerSide: boolean }) {
const [showKey, setShowKey] = useState(false);
const [copied, setCopied] = useState(false);
@ -303,7 +303,7 @@ function EnvKeyRow({ envKey, present, isServerSide }: { envKey: string; present:
);
}
function ApiCard({ api, index }: { api: ApiStatusInfo; index: number }) {
function ApiCard({ api, index }: { key?: string; api: ApiStatusInfo; index: number }) {
const [expanded, setExpanded] = useState(false);
return (

1
src/vite-env.d.ts vendored Normal file
View File

@ -0,0 +1 @@
/// <reference types="vite/client" />

View File

@ -22,5 +22,6 @@
},
"allowImportingTsExtensions": true,
"noEmit": true
}
},
"exclude": ["node_modules", "dist", "supabase"]
}