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, gangnamUnni: aggregated.gangnamUnni.length ? aggregated.gangnamUnni : undefined,
}, },
rawInput: Object.entries(urls) rawInput: Object.entries(urls)
.filter(([, v]) => v.trim()) .filter(([, v]) => typeof v === 'string' && v.trim() !== '')
.map(([k, v]) => `${k}: ${v}`) .map(([k, v]) => `${k}: ${v}`)
.join('\n'), .join('\n'),
}; };

View File

@ -55,7 +55,7 @@ const statusLabel: Record<string, string> = {
}; };
/* ─── Color Swatch Editor Popover ─── */ /* ─── 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 [open, setOpen] = useState(false);
const [hexInput, setHexInput] = useState(swatch.hex); const [hexInput, setHexInput] = useState(swatch.hex);
const popoverRef = useRef<HTMLDivElement>(null); const popoverRef = useRef<HTMLDivElement>(null);

View File

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

View File

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

View File

@ -159,7 +159,7 @@ function buildDiagnosis(report: ApiReport): DiagnosisItem[] {
} }
if (ch.issues) { if (ch.issues) {
for (const issue of 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' const detail = typeof issue === 'string'
? issue ? issue
: typeof issueObj.issue === 'string' : 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 [showKey, setShowKey] = useState(false);
const [copied, setCopied] = 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); const [expanded, setExpanded] = useState(false);
return ( 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, "allowImportingTsExtensions": true,
"noEmit": true "noEmit": true
} },
"exclude": ["node_modules", "dist", "supabase"]
} }