metadatafy 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ import l from'typescript';import*as g from'path';import*as P from'fs';import*as G from'crypto';import {glob}from'glob';import*as k from'fs/promises';var L={"page.tsx":"route","page.ts":"route","page.jsx":"route","page.js":"route","layout.tsx":"route","layout.ts":"route","layout.jsx":"route","layout.js":"route","route.tsx":"api","route.ts":"api","route.js":"api"},$={"/api/":"api"},K=["supabase/migrations","prisma/migrations","migrations","db/migrations","database/migrations"];var X={"app/**/page.tsx":"route","app/**/page.ts":"route","app/**/layout.tsx":"route","app/**/layout.ts":"route","app/**/route.tsx":"api","app/**/route.ts":"api","app/api/**/*.ts":"api","app/api/**/*.tsx":"api","src/app/**/page.tsx":"route","src/app/**/page.ts":"route","src/app/**/layout.tsx":"route","src/app/**/layout.ts":"route","src/app/**/route.tsx":"api","src/app/**/route.ts":"api","src/app/api/**/*.ts":"api","src/app/api/**/*.tsx":"api","pages/**/*.tsx":"route","pages/**/*.ts":"route","pages/api/**/*.ts":"api","src/pages/**/*.tsx":"route","src/pages/**/*.ts":"route","src/pages/api/**/*.ts":"api","supabase/migrations/*.sql":"table","prisma/migrations/**/*.sql":"table"},Q=["app/**/*.{ts,tsx}","pages/**/*.{ts,tsx}","components/**/*.{ts,tsx}","hooks/**/*.{ts,tsx}","services/**/*.ts","lib/**/*.ts","utils/**/*.ts","src/**/*.{ts,tsx}","supabase/migrations/*.sql"],tt=["**/node_modules/**","**/.next/**","**/dist/**","**/*.test.{ts,tsx}","**/*.spec.{ts,tsx}","**/__tests__/**","**/*.d.ts","**/coverage/**"];function rt(f={}){return {projectId:f.projectId||"default",include:f.include||Q,exclude:f.exclude||tt,fileTypeMapping:{...X,...f.fileTypeMapping},output:{file:{enabled:true,path:"project-metadata.json",...f.output?.file},api:{enabled:false,endpoint:"",...f.output?.api}},koreanKeywords:f.koreanKeywords,mode:f.mode||"production",verbose:f.verbose||false}}function it(f){let t=[];return f.projectId||t.push("projectId is required"),f.output.api?.enabled&&!f.output.api.endpoint&&t.push("API endpoint is required when api output is enabled"),f.include.length===0&&t.push("At least one include pattern is required"),t}function O(f){let t=f.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"{{GLOBSTAR}}").replace(/\*/g,"[^/]*").replace(/{{GLOBSTAR}}/g,".*").replace(/\{([^}]+)\}/g,(e,s)=>`(${s.split(",").map(i=>i.trim()).join("|")})`);return new RegExp(`^${t}$`)}var C=class{constructor(){this.compilerOptions={target:l.ScriptTarget.ESNext,module:l.ModuleKind.ESNext,jsx:l.JsxEmit.React,esModuleInterop:true,allowSyntheticDefaultImports:true,strict:false};}parse(t,e){return l.createSourceFile(e,t,this.compilerOptions.target,true,this.getScriptKind(e))}getScriptKind(t){let e=t.toLowerCase();return e.endsWith(".tsx")?l.ScriptKind.TSX:e.endsWith(".ts")?l.ScriptKind.TS:e.endsWith(".jsx")?l.ScriptKind.JSX:e.endsWith(".js")?l.ScriptKind.JS:l.ScriptKind.Unknown}traverse(t,e){e(t)!==false&&l.forEachChild(t,r=>this.traverse(r,e));}findNodes(t,e){let s=[];return this.traverse(t,r=>{e(r)&&s.push(r);}),s}getNodeText(t,e){return t.getText(e)}getJSDocComment(t){let e=l.getJSDocCommentsAndTags(t);if(e.length!==0)return e.filter(l.isJSDoc).map(s=>s.comment).filter(Boolean).join(`
2
+ `)}};new C;var v=class{parse(t,e){let s=this.extractTables(t),r=s[0]?.name||this.extractNameFromPath(e);return {path:e,type:"table",name:r,imports:[],exports:s.map(i=>({name:i.name,isDefault:false,isTypeOnly:false,kind:"variable"})),metadata:{tableName:r,columns:s[0]?.columns||[]}}}extractTables(t){let e=[],s=/CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?["']?(\w+)["']?\s*\(([\s\S]*?)\);/gi,r;for(;(r=s.exec(t))!==null;){let n=r[1],o=r[2],c=this.parseColumns(o);e.push({name:n,columns:c});}let i=/ALTER\s+TABLE\s+["']?(\w+)["']?\s+ADD\s+(?:COLUMN\s+)?["']?(\w+)["']?\s+(\w+)/gi;for(;(r=i.exec(t))!==null;){let n=r[1],o=r[2],c=r[3],p=e.find(u=>u.name===n);p||(p={name:n,columns:[]},e.push(p)),p.columns.push({name:o,type:c,nullable:true,isPrimaryKey:false,isForeignKey:false});}return e}parseColumns(t){let e=[],s=t.split(",").map(r=>r.trim()).filter(r=>r&&!r.toUpperCase().startsWith("CONSTRAINT")&&!r.toUpperCase().startsWith("PRIMARY KEY")&&!r.toUpperCase().startsWith("FOREIGN KEY")&&!r.toUpperCase().startsWith("UNIQUE")&&!r.toUpperCase().startsWith("CHECK"));for(let r of s){let i=this.parseColumnDefinition(r);i&&e.push(i);}return e}parseColumnDefinition(t){let e=t.match(/^["']?(\w+)["']?\s+(\w+(?:\([^)]+\))?)/i);if(!e)return null;let[,s,r]=e,i=t.toUpperCase();return {name:s,type:r.toUpperCase(),nullable:!i.includes("NOT NULL"),isPrimaryKey:i.includes("PRIMARY KEY"),isForeignKey:i.includes("REFERENCES"),references:this.extractReference(t)}}extractReference(t){let e=t.match(/REFERENCES\s+["']?(\w+)["']?\s*\(["']?(\w+)["']?\)/i);if(e)return {table:e[1],column:e[2]}}extractNameFromPath(t){let e=g.basename(t),s=e.match(/create_(\w+)_table/i);return s?s[1]:e.replace(".sql","")}};var w=class{extract(t){let e=[];return l.forEachChild(t,s=>{if(l.isImportDeclaration(s)){let r=this.parseImportDeclaration(s);r&&e.push(r);}}),e}parseImportDeclaration(t){let e=t.moduleSpecifier;if(!l.isStringLiteral(e))return null;let s=e.text,r=[],i=false,n=t.importClause?.isTypeOnly||false,o=t.importClause;if(!o)return {source:s,specifiers:[],isDefault:false,isTypeOnly:false};o.name&&(r.push(o.name.text),i=true);let c=o.namedBindings;if(c){if(l.isNamespaceImport(c))r.push(`* as ${c.name.text}`);else if(l.isNamedImports(c))for(let p of c.elements){let u=p.name.text,a=p.propertyName?.text;a?r.push(`${a} as ${u}`):r.push(u);}}return {source:s,specifiers:r,isDefault:i,isTypeOnly:n}}};var I=class{extract(t){let e=[];return l.forEachChild(t,s=>{let r=this.extractFromNode(s,t);e.push(...r);}),e}extractFromNode(t,e){let s=[];if(l.isFunctionDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name?.text||"anonymous",isDefault:this.hasDefaultModifier(t),isTypeOnly:false,kind:"function"}),l.isClassDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name?.text||"anonymous",isDefault:this.hasDefaultModifier(t),isTypeOnly:false,kind:"class"}),l.isVariableStatement(t)&&this.hasExportModifier(t))for(let r of t.declarationList.declarations)l.isIdentifier(r.name)&&s.push({name:r.name.text,isDefault:false,isTypeOnly:false,kind:"variable"});if(l.isTypeAliasDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name.text,isDefault:false,isTypeOnly:true,kind:"type"}),l.isInterfaceDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name.text,isDefault:false,isTypeOnly:true,kind:"interface"}),l.isExportAssignment(t)&&!t.isExportEquals){let r=this.getExportDefaultName(t,e);s.push({name:r,isDefault:true,isTypeOnly:false,kind:"variable"});}if(l.isExportDeclaration(t)){let r=t.exportClause;if(r&&l.isNamedExports(r))for(let i of r.elements)s.push({name:i.name.text,isDefault:false,isTypeOnly:t.isTypeOnly,kind:"variable"});}return s}hasExportModifier(t){return (l.canHaveModifiers(t)?l.getModifiers(t):void 0)?.some(s=>s.kind===l.SyntaxKind.ExportKeyword)||false}hasDefaultModifier(t){return (l.canHaveModifiers(t)?l.getModifiers(t):void 0)?.some(s=>s.kind===l.SyntaxKind.DefaultKeyword)||false}getExportDefaultName(t,e){let s=t.expression;if(l.isIdentifier(s))return s.text;if(l.isArrowFunction(s)||l.isFunctionExpression(s))return "default";if(l.isCallExpression(s)&&l.isIdentifier(s.expression)){let r=s.arguments[0];if(r&&l.isIdentifier(r))return r.text}return "default"}};var b=class{extract(t){let e=[],s=this.findPropsType(t);s&&e.push(...this.extractFromTypeNode(s,t));let r=this.findComponentFunction(t);return r&&e.push(...this.extractFromFunctionParams(r,t)),this.deduplicateProps(e)}findPropsType(t){let e;return l.forEachChild(t,s=>{l.isInterfaceDeclaration(s)&&s.name.text.endsWith("Props")&&(e=s),l.isTypeAliasDeclaration(s)&&s.name.text.endsWith("Props")&&(e=s.type);}),e}findComponentFunction(t){let e;return l.forEachChild(t,s=>{if(l.isFunctionDeclaration(s)&&this.isExported(s)&&(e=s),l.isVariableStatement(s)&&this.isExported(s))for(let r of s.declarationList.declarations)r.initializer&&(l.isArrowFunction(r.initializer)||l.isFunctionExpression(r.initializer))&&(e=r.initializer);}),e}extractFromTypeNode(t,e){let s=[];if(l.isInterfaceDeclaration(t)){for(let r of t.members){let i=this.extractMemberProp(r,e);i&&s.push(i);}return s}if(l.isTypeLiteralNode(t))for(let r of t.members){let i=this.extractMemberProp(r,e);i&&s.push(i);}if(l.isIntersectionTypeNode(t))for(let r of t.types)s.push(...this.extractFromTypeNode(r,e));return s}extractMemberProp(t,e){if(!l.isPropertySignature(t))return null;let s=t.name;if(!l.isIdentifier(s)&&!l.isStringLiteral(s))return null;let r=(l.isIdentifier(s),s.text),i=!t.questionToken,n=t.type?t.type.getText(e):"any";return {name:r,type:n,required:i}}extractFromFunctionParams(t,e){let s=[],r=t.parameters[0];if(!r)return s;if(l.isObjectBindingPattern(r.name))for(let i of r.name.elements)l.isBindingElement(i)&&l.isIdentifier(i.name)&&s.push({name:i.name.text,type:"unknown",required:!i.initializer,defaultValue:i.initializer?.getText(e)});return s}isExported(t){return (l.canHaveModifiers(t)?l.getModifiers(t):void 0)?.some(s=>s.kind===l.SyntaxKind.ExportKeyword)||false}deduplicateProps(t){let e=new Set;return t.filter(s=>e.has(s.name)?false:(e.add(s.name),true))}};function M(f){return f.replace(/([a-z])([A-Z])/g,"$1 $2").split(" ").filter(Boolean)}function W(f){return f.replace(/([A-Z])([A-Z][a-z])/g,"$1 $2").replace(/([a-z])([A-Z])/g,"$1 $2").split(" ").filter(Boolean)}function B(f){return f.split("_").filter(Boolean)}function Tt(f){return f.split("-").filter(Boolean)}function et(f){let t=new Set,e=f.split(/[-_]/);for(let s of e)M(s).forEach(i=>t.add(i.toLowerCase()));return [...t]}function U(f){let t=[],e=f.match(/[A-Z]{2,}/g);return e&&t.push(...e),t}function Pt(f){let t=et(f);return {camel:t.map((e,s)=>s===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(""),pascal:t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(""),snake:t.map(e=>e.toLowerCase()).join("_"),kebab:t.map(e=>e.toLowerCase()).join("-")}}var R={create:["\uC0DD\uC131","\uB9CC\uB4E4\uAE30","\uCD94\uAC00"],read:["\uC77D\uAE30","\uC870\uD68C"],update:["\uC218\uC815","\uC5C5\uB370\uC774\uD2B8","\uBCC0\uACBD"],delete:["\uC0AD\uC81C","\uC81C\uAC70"],list:["\uBAA9\uB85D","\uB9AC\uC2A4\uD2B8"],search:["\uAC80\uC0C9","\uCC3E\uAE30"],filter:["\uD544\uD130","\uD544\uD130\uB9C1"],sort:["\uC815\uB82C"],submit:["\uC81C\uCD9C","\uC804\uC1A1"],cancel:["\uCDE8\uC18C"],confirm:["\uD655\uC778"],save:["\uC800\uC7A5"],load:["\uB85C\uB4DC","\uBD88\uB7EC\uC624\uAE30"],fetch:["\uAC00\uC838\uC624\uAE30","\uBD88\uB7EC\uC624\uAE30"],button:["\uBC84\uD2BC"],modal:["\uBAA8\uB2EC","\uD31D\uC5C5"],dialog:["\uB2E4\uC774\uC5BC\uB85C\uADF8","\uB300\uD654\uC0C1\uC790"],form:["\uD3FC","\uC591\uC2DD"],input:["\uC785\uB825","\uC778\uD48B"],select:["\uC120\uD0DD","\uC140\uB809\uD2B8","\uB4DC\uB86D\uB2E4\uC6B4"],checkbox:["\uCCB4\uD06C\uBC15\uC2A4","\uCCB4\uD06C"],table:["\uD14C\uC774\uBE14","\uD45C"],card:["\uCE74\uB4DC"],tab:["\uD0ED"],menu:["\uBA54\uB274"],header:["\uD5E4\uB354","\uBA38\uB9AC\uAE00"],footer:["\uD478\uD130","\uBC14\uB2E5\uAE00"],sidebar:["\uC0AC\uC774\uB4DC\uBC14"],navbar:["\uB124\uBE44\uAC8C\uC774\uC158","\uB124\uBE44\uBC14"],auth:["\uC778\uC99D","\uB85C\uADF8\uC778"],login:["\uB85C\uADF8\uC778"],logout:["\uB85C\uADF8\uC544\uC6C3"],register:["\uD68C\uC6D0\uAC00\uC785","\uAC00\uC785"],signup:["\uD68C\uC6D0\uAC00\uC785","\uAC00\uC785"],user:["\uC0AC\uC6A9\uC790","\uC720\uC800","\uD68C\uC6D0"],profile:["\uD504\uB85C\uD544"],password:["\uBE44\uBC00\uBC88\uD638","\uC554\uD638"],permission:["\uAD8C\uD55C"],attendance:["\uCD9C\uC11D","\uCD9C\uACB0"],check:["\uCCB4\uD06C","\uD655\uC778"],schedule:["\uC2A4\uCF00\uC904","\uC77C\uC815"],calendar:["\uCE98\uB9B0\uB354","\uB2EC\uB825"],notification:["\uC54C\uB9BC","\uD1B5\uC9C0"],message:["\uBA54\uC2DC\uC9C0","\uC54C\uB9BC"],setting:["\uC124\uC815"],settings:["\uC124\uC815"],payment:["\uACB0\uC81C","\uC9C0\uBD88"],order:["\uC8FC\uBB38"],product:["\uC0C1\uD488","\uC81C\uD488"],cart:["\uC7A5\uBC14\uAD6C\uB2C8"],checkout:["\uACB0\uC81C","\uCCB4\uD06C\uC544\uC6C3"],invoice:["\uC1A1\uC7A5","\uCCAD\uAD6C\uC11C"],report:["\uB9AC\uD3EC\uD2B8","\uBCF4\uACE0\uC11C"],dashboard:["\uB300\uC2DC\uBCF4\uB4DC"],analytics:["\uBD84\uC11D","\uD1B5\uACC4"],statistics:["\uD1B5\uACC4"],status:["\uC0C1\uD0DC"],pending:["\uB300\uAE30\uC911","\uB300\uAE30"],active:["\uD65C\uC131","\uD65C\uC131\uD654"],inactive:["\uBE44\uD65C\uC131","\uBE44\uD65C\uC131\uD654"],completed:["\uC644\uB8CC"],error:["\uC5D0\uB7EC","\uC624\uB958"],success:["\uC131\uACF5"],loading:["\uB85C\uB529","\uB85C\uB4DC\uC911"],date:["\uB0A0\uC9DC"],time:["\uC2DC\uAC04"],image:["\uC774\uBBF8\uC9C0","\uC0AC\uC9C4"],file:["\uD30C\uC77C"],upload:["\uC5C5\uB85C\uB4DC","\uC62C\uB9AC\uAE30"],download:["\uB2E4\uC6B4\uB85C\uB4DC","\uB0B4\uB824\uBC1B\uAE30"],export:["\uB0B4\uBCF4\uB0B4\uAE30","\uC775\uC2A4\uD3EC\uD2B8"],import:["\uAC00\uC838\uC624\uAE30","\uC784\uD3EC\uD2B8"],api:["API","\uC5D0\uC774\uD53C\uC544\uC774"],service:["\uC11C\uBE44\uC2A4"],hook:["\uD6C5"],component:["\uCEF4\uD3EC\uB10C\uD2B8"],page:["\uD398\uC774\uC9C0"],route:["\uB77C\uC6B0\uD2B8","\uACBD\uB85C"]};function q(f){let t=f.toLowerCase();if(R[t])return R[t];let e=[];for(let[s,r]of Object.entries(R))(t.includes(s)||s.includes(t))&&e.push(...r);return [...new Set(e)]}function vt(f){return {...R,...f}}var F=class{constructor(t){this.customKoreanMap=t||{};}extract(t,e,s=[],r=[]){let i=new Set;this.extractFromName(t,i),this.extractFromPath(e,i);for(let o of s)this.extractFromName(o,i);for(let o of r)this.extractFromName(o,i);let n=[...i];for(let o of n)this.findKorean(o).forEach(p=>i.add(p));return [...i].filter(o=>o.length>1)}extractFromName(t,e){e.add(t.toLowerCase()),M(t).forEach(o=>e.add(o.toLowerCase())),W(t).forEach(o=>e.add(o.toLowerCase())),B(t).forEach(o=>e.add(o.toLowerCase())),U(t).forEach(o=>e.add(o.toLowerCase()));}extractFromPath(t,e){let s=new Set(["src","app","components","hooks","services","lib","utils","pages","api"]),r=t.replace(/\.[^/.]+$/,"").split("/").filter(i=>!s.has(i));for(let i of r)this.extractFromName(i,e);}findKorean(t){let e=this.customKoreanMap[t.toLowerCase()];return e||q(t)}};var A=class{constructor(t={},e=[".ts",".tsx",".js",".jsx"]){this.aliasMap=new Map(Object.entries(t)),this.extensions=e;}resolve(t,e,s){if(this.isExternalPackage(t))return null;let r=this.resolveAlias(t),i;if(r.startsWith("./")||r.startsWith("../")){let o=g.dirname(g.resolve(s,e));i=g.resolve(o,r);}else if(r!==t)i=g.resolve(s,r);else return null;let n=this.resolveWithExtensions(i);return n?g.relative(s,n):null}isExternalPackage(t){if(t.startsWith("./")||t.startsWith("../"))return false;for(let e of this.aliasMap.keys())if(t.startsWith(e))return false;return true}resolveAlias(t){for(let[e,s]of this.aliasMap.entries()){if(t===e)return s;if(t.startsWith(e+"/"))return t.replace(e,s)}return t}resolveWithExtensions(t){if(P.existsSync(t))try{let e=P.statSync(t);if(e.isFile())return t;if(e.isDirectory())return this.findIndexFile(t)}catch{}for(let e of this.extensions){let s=t+e;if(P.existsSync(s))return s}return this.findIndexFile(t)}findIndexFile(t){for(let e of this.extensions){let s=g.join(t,`index${e}`);if(P.existsSync(s))return s}return null}};var D=class{constructor(t){let e={"@":"src","@/":"src/","~":"src","~/":"src/"};this.resolver=new A({...e,...t});}build(t,e){let s=new Map,r=new Set(t.map(i=>i.path));for(let i of t){let n=this.resolveCalls(i,e,r);s.set(i.path,{calls:n,calledBy:[]});}for(let[i,n]of s.entries())for(let o of n.calls){let c=s.get(o);c&&c.calledBy.push(i);}return s}resolveCalls(t,e,s){let r=[];for(let i of t.imports){if(i.isTypeOnly)continue;let n=this.resolver.resolve(i.source,t.path,e);n&&s.has(n)&&r.push(n);}return [...new Set(r)]}};function H(f,t){let e=`${f}:${t}`;return G.createHash("sha256").update(e).digest("hex").slice(0,16)}var N=class{detect(t){let e=[],s=this.detectHook(t);s&&e.push(s);let r=this.detectComponent(t);r&&e.push(r);let i=this.detectApiRoute(t);i&&e.push(i);let n=this.detectService(t);n&&e.push(n);let o=this.detectUtility(t);return o&&e.push(o),e.length===0?null:e.sort((c,p)=>p.confidence-c.confidence)[0]}detectHook(t){let e=[],s=0,r=new Set,n=u=>{if(l.isFunctionDeclaration(u)&&u.name){let a=u.name.text;a.startsWith("use")&&a.length>3&&a[3]===a[3].toUpperCase()&&(e.push(`\uD568\uC218 '${a}'\uAC00 use\uB85C \uC2DC\uC791 (Hook \uB124\uC774\uBC0D \uCEE8\uBCA4\uC158)`),s+=.4);}if(l.isVariableDeclaration(u)&&u.name&&l.isIdentifier(u.name)){let a=u.name.text;a.startsWith("use")&&a.length>3&&a[3]===a[3].toUpperCase()&&(e.push(`\uD568\uC218 '${a}'\uAC00 use\uB85C \uC2DC\uC791 (Hook \uB124\uC774\uBC0D \uCEE8\uBCA4\uC158)`),s+=.4);}if(l.isCallExpression(u)&&l.isIdentifier(u.expression)){let a=u.expression.text;a.startsWith("use")&&a.length>3&&r.add(a);}l.forEachChild(u,n);};n(t);let o=["useState","useEffect","useCallback","useMemo","useRef","useContext","useReducer"],c=o.filter(u=>r.has(u));c.length>0&&(e.push(`React Hook \uC0AC\uC6A9: ${c.join(", ")}`),s+=.2*Math.min(c.length,3));let p=Array.from(r).filter(u=>!o.includes(u));return p.length>0&&(e.push(`\uCEE4\uC2A4\uD140 Hook \uD638\uCD9C: ${p.slice(0,3).join(", ")}`),s+=.1),s<.3?null:{type:"hook",confidence:Math.min(s,1),reasons:e}}detectComponent(t){let e=[],s=0,r=false,i=false,n=0,o=c=>{if((l.isJsxElement(c)||l.isJsxSelfClosingElement(c)||l.isJsxFragment(c))&&(n++,r=true),l.isFunctionDeclaration(c)||l.isArrowFunction(c)||l.isFunctionExpression(c)){let p=c.parameters;if(p.length>0){let u=p[0];if(u.name){let a=u.name.getText(t);(a==="props"||a.startsWith("{"))&&(i=true);}}}l.forEachChild(c,o);};return o(t),r&&(e.push("JSX \uC694\uC18C \uBC18\uD658"),s+=.5,n>3&&(e.push(`\uB2E4\uC218\uC758 JSX \uC694\uC18C (${n}\uAC1C)`),s+=.2)),i&&(e.push("props \uB9E4\uAC1C\uBCC0\uC218 \uC0AC\uC6A9"),s+=.2),t.fileName.match(/\.(tsx|jsx)$/)&&(s+=.1),s<.4?null:{type:"component",confidence:Math.min(s,1),reasons:e}}detectApiRoute(t){let e=[],s=0,r=new Set,i=false,n=false,o=c=>{if(l.isFunctionDeclaration(c)&&c.name){let p=c.name.text;["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"].includes(p)&&l.getModifiers(c)?.some(h=>h.kind===l.SyntaxKind.ExportKeyword)&&r.add(p);}if(l.isVariableStatement(c)&&l.getModifiers(c)?.some(a=>a.kind===l.SyntaxKind.ExportKeyword)){for(let a of c.declarationList.declarations)if(l.isIdentifier(a.name)){let h=a.name.text;["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"].includes(h)&&r.add(h);}}if(l.isImportDeclaration(c)){let p=c.moduleSpecifier;if(l.isStringLiteral(p)&&p.text==="next/server"){let a=c.importClause;if(a?.namedBindings&&l.isNamedImports(a.namedBindings))for(let h of a.namedBindings.elements){let T=h.name.text;T==="NextRequest"&&(i=true),T==="NextResponse"&&(n=true);}}}l.forEachChild(c,o);};return o(t),r.size>0&&(e.push(`HTTP \uBA54\uC11C\uB4DC export: ${Array.from(r).join(", ")}`),s+=.6),(i||n)&&(e.push("Next.js server import (NextRequest/NextResponse)"),s+=.3),s<.5?null:{type:"api",confidence:Math.min(s,1),reasons:e}}detectService(t){let e=[],s=0,r=0,i=0,n=0,c=p=>{if(l.isCallExpression(p)&&l.isIdentifier(p.expression)&&p.expression.text==="fetch"&&r++,l.isCallExpression(p)){let u=p.expression;l.isPropertyAccessExpression(u)&&l.isIdentifier(u.expression)&&u.expression.text==="axios"&&i++,l.isIdentifier(u)&&u.text==="axios"&&i++;}if((l.isFunctionDeclaration(p)||l.isArrowFunction(p)||l.isMethodDeclaration(p))&&l.getModifiers(p)?.some(a=>a.kind===l.SyntaxKind.AsyncKeyword)&&n++,l.isClassDeclaration(p)&&p.name){let u=p.name.text;(u.toLowerCase().includes("service")||u.toLowerCase().includes("api")||u.toLowerCase().includes("client"))&&(e.push(`\uC11C\uBE44\uC2A4 \uD074\uB798\uC2A4: ${u}`),s+=.5);}l.forEachChild(p,c);};return c(t),r>0&&(e.push(`fetch \uD638\uCD9C ${r}\uD68C`),s+=.2*Math.min(r,3)),i>0&&(e.push(`axios \uD638\uCD9C ${i}\uD68C`),s+=.2*Math.min(i,3)),n>=2&&(e.push(`async \uD568\uC218 ${n}\uAC1C`),s+=.15),s<.3?null:{type:"service",confidence:Math.min(s,1),reasons:e}}detectUtility(t){let e=[],s=0,r=0,i=false,n=false,o=[],c=a=>{if(l.isImportDeclaration(a)){let h=a.moduleSpecifier;if(l.isStringLiteral(h)){let T=h.text;(T==="react"||T.startsWith("react/"))&&(i=true);}}if((l.isJsxElement(a)||l.isJsxSelfClosingElement(a))&&(n=true),l.isFunctionDeclaration(a)&&a.name&&l.getModifiers(a)?.some(E=>E.kind===l.SyntaxKind.ExportKeyword)&&(r++,o.push(a.name.text)),l.isVariableStatement(a)&&l.getModifiers(a)?.some(E=>E.kind===l.SyntaxKind.ExportKeyword))for(let E of a.declarationList.declarations)E.initializer&&(l.isArrowFunction(E.initializer)||l.isFunctionExpression(E.initializer))&&l.isIdentifier(E.name)&&(r++,o.push(E.name.text));l.forEachChild(a,c);};if(c(t),n||i)return null;r>=2&&(e.push(`${r}\uAC1C\uC758 \uD568\uC218 export`),s+=.3+.1*Math.min(r-2,5));let p=["format","parse","convert","validate","is","has","get","set","create","generate","calculate","transform"],u=o.filter(a=>p.some(h=>a.toLowerCase().startsWith(h)));return u.length>0&&(e.push(`\uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\uBA85 \uD328\uD134: ${u.slice(0,3).join(", ")}`),s+=.2),s<.3?null:{type:"utility",confidence:Math.min(s,1),reasons:e}}};var z=class{constructor(t){this.config=t,this.tsParser=new C,this.sqlParser=new v,this.importExtractor=new w,this.exportExtractor=new I,this.propsExtractor=new b,this.keywordExtractor=new F(t.koreanKeywords),this.callGraphBuilder=new D,this.codePatternDetector=new N;}async analyze(t){let e=Date.now(),s=[],r=await this.collectFiles(t);this.config.verbose&&console.log(`[metadata-plugin] Found ${r.length} files to analyze`);let i=[];for(let p of r)try{let u=await this.parseFile(p,t);u&&i.push(u);}catch(u){let a=u instanceof Error?u.message:"Unknown error";s.push(`${p}: ${a}`);}let n=this.callGraphBuilder.build(i,t),o=i.map(p=>this.createIndexItem(p,n)),c=this.calculateStats(o,s);return this.config.verbose&&(console.log(`[metadata-plugin] Analysis completed in ${Date.now()-e}ms`),console.log(`[metadata-plugin] Processed ${o.length} items`)),{projectId:this.config.projectId,items:o,stats:c,timestamp:new Date().toISOString()}}async collectFiles(t){let e=[];for(let s of this.config.include){let r=await glob(s,{cwd:t,ignore:this.config.exclude,absolute:true});e.push(...r);}return [...new Set(e)]}async parseFile(t,e){let s=g.relative(e,t),r=await k.readFile(t,"utf-8");if(g.extname(t)===".sql")return this.determineFileType(s)?this.sqlParser.parse(r,s):null;let n=this.tsParser.parse(r,t),o=this.determineFileType(s);if(!o){let a=this.codePatternDetector.detect(n);a&&a.confidence>=.4&&(o=a.type,this.config.verbose&&(console.log(`[metadata-plugin] \uCF54\uB4DC \uBD84\uC11D\uC73C\uB85C \uAC10\uC9C0: ${s} \u2192 ${o} (${(a.confidence*100).toFixed(0)}%)`),a.reasons.forEach(h=>console.log(` - ${h}`))));}if(!o)return null;let c=this.importExtractor.extract(n),p=this.exportExtractor.extract(n),u=o==="component"?this.propsExtractor.extract(n):void 0;return {path:s,type:o,name:this.extractName(s,p),imports:c,exports:p,props:u}}determineFileType(t){let e=t.replace(/\\/g,"/"),s=g.basename(e),r=g.extname(s),i=e.split("/");if(r===".sql"){for(let c of K)if(e.includes(c))return "table";return null}let n=L[s];if(n)return n;for(let[c,p]of Object.entries($))if(e.includes(c))return p;let o=Object.entries(this.config.fileTypeMapping).sort(([c],[p])=>p.length-c.length);for(let[c,p]of o)if(O(c).test(e))return p;return i.includes("pages")&&(r===".tsx"||r===".ts"||r===".jsx"||r===".js")?"route":null}extractName(t,e){let s=e.find(i=>i.isDefault);if(s&&s.name!=="default")return s.name;let r=g.basename(t,g.extname(t));if(["index","page","layout","route"].includes(r)){let i=g.dirname(t),n=g.basename(i);return n!=="."?n:r}return r}createIndexItem(t,e){let s=e.get(t.path)||{calls:[],calledBy:[]},r=this.keywordExtractor.extract(t.name,t.path,t.exports.map(n=>n.name),t.props?.map(n=>n.name)),i=this.buildSearchText(t,r);return {id:H(this.config.projectId,t.path),projectId:this.config.projectId,type:t.type,name:t.name,path:t.path,keywords:r,searchText:i,calls:s.calls,calledBy:s.calledBy,metadata:{exports:t.exports.map(n=>n.name),props:t.props?.map(n=>n.name),...t.metadata}}}buildSearchText(t,e){return [t.name,t.path,...e,...t.exports.map(r=>r.name),...t.props?.map(r=>r.name)||[]].join(" ").toLowerCase()}calculateStats(t,e){let s={route:0,component:0,hook:0,service:0,api:0,table:0,utility:0};for(let r of t)s[r.type]++;return {totalFiles:t.length,byType:s,parseErrors:e}}};var Y=class{constructor(t){this.config=t;}async write(t,e){let s=g.dirname(e);await k.mkdir(s,{recursive:true});let r=this.formatOutput(t);await k.writeFile(e,r,"utf-8");}formatOutput(t){let e={version:"1.0.0",projectId:this.config.projectId,generatedAt:t.timestamp,stats:t.stats,items:t.items};return this.config.mode==="production"?JSON.stringify(e):JSON.stringify(e,null,2)}};var j=class{constructor(t,e={}){this.config=t,this.maxRetries=e.maxRetries??3,this.retryDelay=e.retryDelay??1e3;}async send(t){let e=this.config.output.api;if(!e?.enabled||!e.endpoint)return;let s={projectId:this.config.projectId,timestamp:t.timestamp,items:t.items,stats:t.stats},r=null;for(let i=0;i<this.maxRetries;i++)try{await this.sendRequest(e.endpoint,s,e.headers);return}catch(n){r=n instanceof Error?n:new Error(String(n)),this.config.verbose&&console.warn(`[metadata-plugin] API send attempt ${i+1} failed:`,r.message),i<this.maxRetries-1&&await this.delay(this.retryDelay*(i+1));}throw new Error(`Failed to send metadata after ${this.maxRetries} attempts: ${r?.message}`)}async sendRequest(t,e,s){let r=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",...s},body:JSON.stringify(e)});if(!r.ok){let i=await r.text();throw new Error(`API request failed: ${r.status} ${i}`)}}delay(t){return new Promise(e=>setTimeout(e,t))}},V=class extends j{async send(t){let e=this.config.output.api;if(!e?.enabled||!e.endpoint)return;let s=t.items.map(i=>({id:i.id,project_id:i.projectId,type:i.type,name:i.name,path:i.path,keywords:i.keywords,search_text:i.searchText,calls:i.calls,called_by:i.calledBy,metadata:i.metadata,updated_at:t.timestamp})),r=500;for(let i=0;i<s.length;i+=r){let n=s.slice(i,i+r),o=await fetch(e.endpoint,{method:"POST",headers:{"Content-Type":"application/json",Prefer:"resolution=merge-duplicates",...e.headers},body:JSON.stringify(n)});if(!o.ok)throw new Error(`Supabase upsert failed: ${o.status}`)}}};export{j as A,V as B,X as a,Q as b,tt as c,rt as d,it as e,C as f,v as g,w as h,I as i,b as j,M as k,W as l,B as m,Tt as n,et as o,U as p,Pt as q,R as r,q as s,vt as t,F as u,A as v,D as w,H as x,z as y,Y as z};
@@ -0,0 +1 @@
1
+ import*as l from'fs';import*as c from'path';import {config}from'dotenv';function f(o,e){let n=e||process.env.NODE_ENV||"development",d=[".env",".env.local",`.env.${n}`,`.env.${n}.local`],s=[],t={};for(let i of d){let r=c.join(o,i);if(l.existsSync(r)){let a=config({path:r,override:true});a.parsed&&(s.push(i),Object.assign(t,a.parsed));}}return {loaded:s,variables:t}}function p(o,e=false){let{loaded:n}=f(o);e&&n.length>0&&console.log(`\u{1F4E6} Loaded env files: ${n.join(", ")}`);}export{f as a,p as b};
@@ -0,0 +1,2 @@
1
+ 'use strict';var l=require('typescript'),g=require('path'),P=require('fs'),G=require('crypto'),glob=require('glob'),k=require('fs/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var l__default=/*#__PURE__*/_interopDefault(l);var g__namespace=/*#__PURE__*/_interopNamespace(g);var P__namespace=/*#__PURE__*/_interopNamespace(P);var G__namespace=/*#__PURE__*/_interopNamespace(G);var k__namespace=/*#__PURE__*/_interopNamespace(k);var L={"page.tsx":"route","page.ts":"route","page.jsx":"route","page.js":"route","layout.tsx":"route","layout.ts":"route","layout.jsx":"route","layout.js":"route","route.tsx":"api","route.ts":"api","route.js":"api"},$={"/api/":"api"},K=["supabase/migrations","prisma/migrations","migrations","db/migrations","database/migrations"];var X={"app/**/page.tsx":"route","app/**/page.ts":"route","app/**/layout.tsx":"route","app/**/layout.ts":"route","app/**/route.tsx":"api","app/**/route.ts":"api","app/api/**/*.ts":"api","app/api/**/*.tsx":"api","src/app/**/page.tsx":"route","src/app/**/page.ts":"route","src/app/**/layout.tsx":"route","src/app/**/layout.ts":"route","src/app/**/route.tsx":"api","src/app/**/route.ts":"api","src/app/api/**/*.ts":"api","src/app/api/**/*.tsx":"api","pages/**/*.tsx":"route","pages/**/*.ts":"route","pages/api/**/*.ts":"api","src/pages/**/*.tsx":"route","src/pages/**/*.ts":"route","src/pages/api/**/*.ts":"api","supabase/migrations/*.sql":"table","prisma/migrations/**/*.sql":"table"},Q=["app/**/*.{ts,tsx}","pages/**/*.{ts,tsx}","components/**/*.{ts,tsx}","hooks/**/*.{ts,tsx}","services/**/*.ts","lib/**/*.ts","utils/**/*.ts","src/**/*.{ts,tsx}","supabase/migrations/*.sql"],tt=["**/node_modules/**","**/.next/**","**/dist/**","**/*.test.{ts,tsx}","**/*.spec.{ts,tsx}","**/__tests__/**","**/*.d.ts","**/coverage/**"];function rt(f={}){return {projectId:f.projectId||"default",include:f.include||Q,exclude:f.exclude||tt,fileTypeMapping:{...X,...f.fileTypeMapping},output:{file:{enabled:true,path:"project-metadata.json",...f.output?.file},api:{enabled:false,endpoint:"",...f.output?.api}},koreanKeywords:f.koreanKeywords,mode:f.mode||"production",verbose:f.verbose||false}}function it(f){let t=[];return f.projectId||t.push("projectId is required"),f.output.api?.enabled&&!f.output.api.endpoint&&t.push("API endpoint is required when api output is enabled"),f.include.length===0&&t.push("At least one include pattern is required"),t}function O(f){let t=f.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"{{GLOBSTAR}}").replace(/\*/g,"[^/]*").replace(/{{GLOBSTAR}}/g,".*").replace(/\{([^}]+)\}/g,(e,s)=>`(${s.split(",").map(i=>i.trim()).join("|")})`);return new RegExp(`^${t}$`)}var C=class{constructor(){this.compilerOptions={target:l__default.default.ScriptTarget.ESNext,module:l__default.default.ModuleKind.ESNext,jsx:l__default.default.JsxEmit.React,esModuleInterop:true,allowSyntheticDefaultImports:true,strict:false};}parse(t,e){return l__default.default.createSourceFile(e,t,this.compilerOptions.target,true,this.getScriptKind(e))}getScriptKind(t){let e=t.toLowerCase();return e.endsWith(".tsx")?l__default.default.ScriptKind.TSX:e.endsWith(".ts")?l__default.default.ScriptKind.TS:e.endsWith(".jsx")?l__default.default.ScriptKind.JSX:e.endsWith(".js")?l__default.default.ScriptKind.JS:l__default.default.ScriptKind.Unknown}traverse(t,e){e(t)!==false&&l__default.default.forEachChild(t,r=>this.traverse(r,e));}findNodes(t,e){let s=[];return this.traverse(t,r=>{e(r)&&s.push(r);}),s}getNodeText(t,e){return t.getText(e)}getJSDocComment(t){let e=l__default.default.getJSDocCommentsAndTags(t);if(e.length!==0)return e.filter(l__default.default.isJSDoc).map(s=>s.comment).filter(Boolean).join(`
2
+ `)}};new C;var v=class{parse(t,e){let s=this.extractTables(t),r=s[0]?.name||this.extractNameFromPath(e);return {path:e,type:"table",name:r,imports:[],exports:s.map(i=>({name:i.name,isDefault:false,isTypeOnly:false,kind:"variable"})),metadata:{tableName:r,columns:s[0]?.columns||[]}}}extractTables(t){let e=[],s=/CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?["']?(\w+)["']?\s*\(([\s\S]*?)\);/gi,r;for(;(r=s.exec(t))!==null;){let n=r[1],o=r[2],c=this.parseColumns(o);e.push({name:n,columns:c});}let i=/ALTER\s+TABLE\s+["']?(\w+)["']?\s+ADD\s+(?:COLUMN\s+)?["']?(\w+)["']?\s+(\w+)/gi;for(;(r=i.exec(t))!==null;){let n=r[1],o=r[2],c=r[3],p=e.find(u=>u.name===n);p||(p={name:n,columns:[]},e.push(p)),p.columns.push({name:o,type:c,nullable:true,isPrimaryKey:false,isForeignKey:false});}return e}parseColumns(t){let e=[],s=t.split(",").map(r=>r.trim()).filter(r=>r&&!r.toUpperCase().startsWith("CONSTRAINT")&&!r.toUpperCase().startsWith("PRIMARY KEY")&&!r.toUpperCase().startsWith("FOREIGN KEY")&&!r.toUpperCase().startsWith("UNIQUE")&&!r.toUpperCase().startsWith("CHECK"));for(let r of s){let i=this.parseColumnDefinition(r);i&&e.push(i);}return e}parseColumnDefinition(t){let e=t.match(/^["']?(\w+)["']?\s+(\w+(?:\([^)]+\))?)/i);if(!e)return null;let[,s,r]=e,i=t.toUpperCase();return {name:s,type:r.toUpperCase(),nullable:!i.includes("NOT NULL"),isPrimaryKey:i.includes("PRIMARY KEY"),isForeignKey:i.includes("REFERENCES"),references:this.extractReference(t)}}extractReference(t){let e=t.match(/REFERENCES\s+["']?(\w+)["']?\s*\(["']?(\w+)["']?\)/i);if(e)return {table:e[1],column:e[2]}}extractNameFromPath(t){let e=g__namespace.basename(t),s=e.match(/create_(\w+)_table/i);return s?s[1]:e.replace(".sql","")}};var w=class{extract(t){let e=[];return l__default.default.forEachChild(t,s=>{if(l__default.default.isImportDeclaration(s)){let r=this.parseImportDeclaration(s);r&&e.push(r);}}),e}parseImportDeclaration(t){let e=t.moduleSpecifier;if(!l__default.default.isStringLiteral(e))return null;let s=e.text,r=[],i=false,n=t.importClause?.isTypeOnly||false,o=t.importClause;if(!o)return {source:s,specifiers:[],isDefault:false,isTypeOnly:false};o.name&&(r.push(o.name.text),i=true);let c=o.namedBindings;if(c){if(l__default.default.isNamespaceImport(c))r.push(`* as ${c.name.text}`);else if(l__default.default.isNamedImports(c))for(let p of c.elements){let u=p.name.text,a=p.propertyName?.text;a?r.push(`${a} as ${u}`):r.push(u);}}return {source:s,specifiers:r,isDefault:i,isTypeOnly:n}}};var I=class{extract(t){let e=[];return l__default.default.forEachChild(t,s=>{let r=this.extractFromNode(s,t);e.push(...r);}),e}extractFromNode(t,e){let s=[];if(l__default.default.isFunctionDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name?.text||"anonymous",isDefault:this.hasDefaultModifier(t),isTypeOnly:false,kind:"function"}),l__default.default.isClassDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name?.text||"anonymous",isDefault:this.hasDefaultModifier(t),isTypeOnly:false,kind:"class"}),l__default.default.isVariableStatement(t)&&this.hasExportModifier(t))for(let r of t.declarationList.declarations)l__default.default.isIdentifier(r.name)&&s.push({name:r.name.text,isDefault:false,isTypeOnly:false,kind:"variable"});if(l__default.default.isTypeAliasDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name.text,isDefault:false,isTypeOnly:true,kind:"type"}),l__default.default.isInterfaceDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name.text,isDefault:false,isTypeOnly:true,kind:"interface"}),l__default.default.isExportAssignment(t)&&!t.isExportEquals){let r=this.getExportDefaultName(t,e);s.push({name:r,isDefault:true,isTypeOnly:false,kind:"variable"});}if(l__default.default.isExportDeclaration(t)){let r=t.exportClause;if(r&&l__default.default.isNamedExports(r))for(let i of r.elements)s.push({name:i.name.text,isDefault:false,isTypeOnly:t.isTypeOnly,kind:"variable"});}return s}hasExportModifier(t){return (l__default.default.canHaveModifiers(t)?l__default.default.getModifiers(t):void 0)?.some(s=>s.kind===l__default.default.SyntaxKind.ExportKeyword)||false}hasDefaultModifier(t){return (l__default.default.canHaveModifiers(t)?l__default.default.getModifiers(t):void 0)?.some(s=>s.kind===l__default.default.SyntaxKind.DefaultKeyword)||false}getExportDefaultName(t,e){let s=t.expression;if(l__default.default.isIdentifier(s))return s.text;if(l__default.default.isArrowFunction(s)||l__default.default.isFunctionExpression(s))return "default";if(l__default.default.isCallExpression(s)&&l__default.default.isIdentifier(s.expression)){let r=s.arguments[0];if(r&&l__default.default.isIdentifier(r))return r.text}return "default"}};var b=class{extract(t){let e=[],s=this.findPropsType(t);s&&e.push(...this.extractFromTypeNode(s,t));let r=this.findComponentFunction(t);return r&&e.push(...this.extractFromFunctionParams(r,t)),this.deduplicateProps(e)}findPropsType(t){let e;return l__default.default.forEachChild(t,s=>{l__default.default.isInterfaceDeclaration(s)&&s.name.text.endsWith("Props")&&(e=s),l__default.default.isTypeAliasDeclaration(s)&&s.name.text.endsWith("Props")&&(e=s.type);}),e}findComponentFunction(t){let e;return l__default.default.forEachChild(t,s=>{if(l__default.default.isFunctionDeclaration(s)&&this.isExported(s)&&(e=s),l__default.default.isVariableStatement(s)&&this.isExported(s))for(let r of s.declarationList.declarations)r.initializer&&(l__default.default.isArrowFunction(r.initializer)||l__default.default.isFunctionExpression(r.initializer))&&(e=r.initializer);}),e}extractFromTypeNode(t,e){let s=[];if(l__default.default.isInterfaceDeclaration(t)){for(let r of t.members){let i=this.extractMemberProp(r,e);i&&s.push(i);}return s}if(l__default.default.isTypeLiteralNode(t))for(let r of t.members){let i=this.extractMemberProp(r,e);i&&s.push(i);}if(l__default.default.isIntersectionTypeNode(t))for(let r of t.types)s.push(...this.extractFromTypeNode(r,e));return s}extractMemberProp(t,e){if(!l__default.default.isPropertySignature(t))return null;let s=t.name;if(!l__default.default.isIdentifier(s)&&!l__default.default.isStringLiteral(s))return null;let r=(l__default.default.isIdentifier(s),s.text),i=!t.questionToken,n=t.type?t.type.getText(e):"any";return {name:r,type:n,required:i}}extractFromFunctionParams(t,e){let s=[],r=t.parameters[0];if(!r)return s;if(l__default.default.isObjectBindingPattern(r.name))for(let i of r.name.elements)l__default.default.isBindingElement(i)&&l__default.default.isIdentifier(i.name)&&s.push({name:i.name.text,type:"unknown",required:!i.initializer,defaultValue:i.initializer?.getText(e)});return s}isExported(t){return (l__default.default.canHaveModifiers(t)?l__default.default.getModifiers(t):void 0)?.some(s=>s.kind===l__default.default.SyntaxKind.ExportKeyword)||false}deduplicateProps(t){let e=new Set;return t.filter(s=>e.has(s.name)?false:(e.add(s.name),true))}};function M(f){return f.replace(/([a-z])([A-Z])/g,"$1 $2").split(" ").filter(Boolean)}function W(f){return f.replace(/([A-Z])([A-Z][a-z])/g,"$1 $2").replace(/([a-z])([A-Z])/g,"$1 $2").split(" ").filter(Boolean)}function B(f){return f.split("_").filter(Boolean)}function Tt(f){return f.split("-").filter(Boolean)}function et(f){let t=new Set,e=f.split(/[-_]/);for(let s of e)M(s).forEach(i=>t.add(i.toLowerCase()));return [...t]}function U(f){let t=[],e=f.match(/[A-Z]{2,}/g);return e&&t.push(...e),t}function Pt(f){let t=et(f);return {camel:t.map((e,s)=>s===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(""),pascal:t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(""),snake:t.map(e=>e.toLowerCase()).join("_"),kebab:t.map(e=>e.toLowerCase()).join("-")}}var R={create:["\uC0DD\uC131","\uB9CC\uB4E4\uAE30","\uCD94\uAC00"],read:["\uC77D\uAE30","\uC870\uD68C"],update:["\uC218\uC815","\uC5C5\uB370\uC774\uD2B8","\uBCC0\uACBD"],delete:["\uC0AD\uC81C","\uC81C\uAC70"],list:["\uBAA9\uB85D","\uB9AC\uC2A4\uD2B8"],search:["\uAC80\uC0C9","\uCC3E\uAE30"],filter:["\uD544\uD130","\uD544\uD130\uB9C1"],sort:["\uC815\uB82C"],submit:["\uC81C\uCD9C","\uC804\uC1A1"],cancel:["\uCDE8\uC18C"],confirm:["\uD655\uC778"],save:["\uC800\uC7A5"],load:["\uB85C\uB4DC","\uBD88\uB7EC\uC624\uAE30"],fetch:["\uAC00\uC838\uC624\uAE30","\uBD88\uB7EC\uC624\uAE30"],button:["\uBC84\uD2BC"],modal:["\uBAA8\uB2EC","\uD31D\uC5C5"],dialog:["\uB2E4\uC774\uC5BC\uB85C\uADF8","\uB300\uD654\uC0C1\uC790"],form:["\uD3FC","\uC591\uC2DD"],input:["\uC785\uB825","\uC778\uD48B"],select:["\uC120\uD0DD","\uC140\uB809\uD2B8","\uB4DC\uB86D\uB2E4\uC6B4"],checkbox:["\uCCB4\uD06C\uBC15\uC2A4","\uCCB4\uD06C"],table:["\uD14C\uC774\uBE14","\uD45C"],card:["\uCE74\uB4DC"],tab:["\uD0ED"],menu:["\uBA54\uB274"],header:["\uD5E4\uB354","\uBA38\uB9AC\uAE00"],footer:["\uD478\uD130","\uBC14\uB2E5\uAE00"],sidebar:["\uC0AC\uC774\uB4DC\uBC14"],navbar:["\uB124\uBE44\uAC8C\uC774\uC158","\uB124\uBE44\uBC14"],auth:["\uC778\uC99D","\uB85C\uADF8\uC778"],login:["\uB85C\uADF8\uC778"],logout:["\uB85C\uADF8\uC544\uC6C3"],register:["\uD68C\uC6D0\uAC00\uC785","\uAC00\uC785"],signup:["\uD68C\uC6D0\uAC00\uC785","\uAC00\uC785"],user:["\uC0AC\uC6A9\uC790","\uC720\uC800","\uD68C\uC6D0"],profile:["\uD504\uB85C\uD544"],password:["\uBE44\uBC00\uBC88\uD638","\uC554\uD638"],permission:["\uAD8C\uD55C"],attendance:["\uCD9C\uC11D","\uCD9C\uACB0"],check:["\uCCB4\uD06C","\uD655\uC778"],schedule:["\uC2A4\uCF00\uC904","\uC77C\uC815"],calendar:["\uCE98\uB9B0\uB354","\uB2EC\uB825"],notification:["\uC54C\uB9BC","\uD1B5\uC9C0"],message:["\uBA54\uC2DC\uC9C0","\uC54C\uB9BC"],setting:["\uC124\uC815"],settings:["\uC124\uC815"],payment:["\uACB0\uC81C","\uC9C0\uBD88"],order:["\uC8FC\uBB38"],product:["\uC0C1\uD488","\uC81C\uD488"],cart:["\uC7A5\uBC14\uAD6C\uB2C8"],checkout:["\uACB0\uC81C","\uCCB4\uD06C\uC544\uC6C3"],invoice:["\uC1A1\uC7A5","\uCCAD\uAD6C\uC11C"],report:["\uB9AC\uD3EC\uD2B8","\uBCF4\uACE0\uC11C"],dashboard:["\uB300\uC2DC\uBCF4\uB4DC"],analytics:["\uBD84\uC11D","\uD1B5\uACC4"],statistics:["\uD1B5\uACC4"],status:["\uC0C1\uD0DC"],pending:["\uB300\uAE30\uC911","\uB300\uAE30"],active:["\uD65C\uC131","\uD65C\uC131\uD654"],inactive:["\uBE44\uD65C\uC131","\uBE44\uD65C\uC131\uD654"],completed:["\uC644\uB8CC"],error:["\uC5D0\uB7EC","\uC624\uB958"],success:["\uC131\uACF5"],loading:["\uB85C\uB529","\uB85C\uB4DC\uC911"],date:["\uB0A0\uC9DC"],time:["\uC2DC\uAC04"],image:["\uC774\uBBF8\uC9C0","\uC0AC\uC9C4"],file:["\uD30C\uC77C"],upload:["\uC5C5\uB85C\uB4DC","\uC62C\uB9AC\uAE30"],download:["\uB2E4\uC6B4\uB85C\uB4DC","\uB0B4\uB824\uBC1B\uAE30"],export:["\uB0B4\uBCF4\uB0B4\uAE30","\uC775\uC2A4\uD3EC\uD2B8"],import:["\uAC00\uC838\uC624\uAE30","\uC784\uD3EC\uD2B8"],api:["API","\uC5D0\uC774\uD53C\uC544\uC774"],service:["\uC11C\uBE44\uC2A4"],hook:["\uD6C5"],component:["\uCEF4\uD3EC\uB10C\uD2B8"],page:["\uD398\uC774\uC9C0"],route:["\uB77C\uC6B0\uD2B8","\uACBD\uB85C"]};function q(f){let t=f.toLowerCase();if(R[t])return R[t];let e=[];for(let[s,r]of Object.entries(R))(t.includes(s)||s.includes(t))&&e.push(...r);return [...new Set(e)]}function vt(f){return {...R,...f}}var F=class{constructor(t){this.customKoreanMap=t||{};}extract(t,e,s=[],r=[]){let i=new Set;this.extractFromName(t,i),this.extractFromPath(e,i);for(let o of s)this.extractFromName(o,i);for(let o of r)this.extractFromName(o,i);let n=[...i];for(let o of n)this.findKorean(o).forEach(p=>i.add(p));return [...i].filter(o=>o.length>1)}extractFromName(t,e){e.add(t.toLowerCase()),M(t).forEach(o=>e.add(o.toLowerCase())),W(t).forEach(o=>e.add(o.toLowerCase())),B(t).forEach(o=>e.add(o.toLowerCase())),U(t).forEach(o=>e.add(o.toLowerCase()));}extractFromPath(t,e){let s=new Set(["src","app","components","hooks","services","lib","utils","pages","api"]),r=t.replace(/\.[^/.]+$/,"").split("/").filter(i=>!s.has(i));for(let i of r)this.extractFromName(i,e);}findKorean(t){let e=this.customKoreanMap[t.toLowerCase()];return e||q(t)}};var A=class{constructor(t={},e=[".ts",".tsx",".js",".jsx"]){this.aliasMap=new Map(Object.entries(t)),this.extensions=e;}resolve(t,e,s){if(this.isExternalPackage(t))return null;let r=this.resolveAlias(t),i;if(r.startsWith("./")||r.startsWith("../")){let o=g__namespace.dirname(g__namespace.resolve(s,e));i=g__namespace.resolve(o,r);}else if(r!==t)i=g__namespace.resolve(s,r);else return null;let n=this.resolveWithExtensions(i);return n?g__namespace.relative(s,n):null}isExternalPackage(t){if(t.startsWith("./")||t.startsWith("../"))return false;for(let e of this.aliasMap.keys())if(t.startsWith(e))return false;return true}resolveAlias(t){for(let[e,s]of this.aliasMap.entries()){if(t===e)return s;if(t.startsWith(e+"/"))return t.replace(e,s)}return t}resolveWithExtensions(t){if(P__namespace.existsSync(t))try{let e=P__namespace.statSync(t);if(e.isFile())return t;if(e.isDirectory())return this.findIndexFile(t)}catch{}for(let e of this.extensions){let s=t+e;if(P__namespace.existsSync(s))return s}return this.findIndexFile(t)}findIndexFile(t){for(let e of this.extensions){let s=g__namespace.join(t,`index${e}`);if(P__namespace.existsSync(s))return s}return null}};var D=class{constructor(t){let e={"@":"src","@/":"src/","~":"src","~/":"src/"};this.resolver=new A({...e,...t});}build(t,e){let s=new Map,r=new Set(t.map(i=>i.path));for(let i of t){let n=this.resolveCalls(i,e,r);s.set(i.path,{calls:n,calledBy:[]});}for(let[i,n]of s.entries())for(let o of n.calls){let c=s.get(o);c&&c.calledBy.push(i);}return s}resolveCalls(t,e,s){let r=[];for(let i of t.imports){if(i.isTypeOnly)continue;let n=this.resolver.resolve(i.source,t.path,e);n&&s.has(n)&&r.push(n);}return [...new Set(r)]}};function H(f,t){let e=`${f}:${t}`;return G__namespace.createHash("sha256").update(e).digest("hex").slice(0,16)}var N=class{detect(t){let e=[],s=this.detectHook(t);s&&e.push(s);let r=this.detectComponent(t);r&&e.push(r);let i=this.detectApiRoute(t);i&&e.push(i);let n=this.detectService(t);n&&e.push(n);let o=this.detectUtility(t);return o&&e.push(o),e.length===0?null:e.sort((c,p)=>p.confidence-c.confidence)[0]}detectHook(t){let e=[],s=0,r=new Set,n=u=>{if(l__default.default.isFunctionDeclaration(u)&&u.name){let a=u.name.text;a.startsWith("use")&&a.length>3&&a[3]===a[3].toUpperCase()&&(e.push(`\uD568\uC218 '${a}'\uAC00 use\uB85C \uC2DC\uC791 (Hook \uB124\uC774\uBC0D \uCEE8\uBCA4\uC158)`),s+=.4);}if(l__default.default.isVariableDeclaration(u)&&u.name&&l__default.default.isIdentifier(u.name)){let a=u.name.text;a.startsWith("use")&&a.length>3&&a[3]===a[3].toUpperCase()&&(e.push(`\uD568\uC218 '${a}'\uAC00 use\uB85C \uC2DC\uC791 (Hook \uB124\uC774\uBC0D \uCEE8\uBCA4\uC158)`),s+=.4);}if(l__default.default.isCallExpression(u)&&l__default.default.isIdentifier(u.expression)){let a=u.expression.text;a.startsWith("use")&&a.length>3&&r.add(a);}l__default.default.forEachChild(u,n);};n(t);let o=["useState","useEffect","useCallback","useMemo","useRef","useContext","useReducer"],c=o.filter(u=>r.has(u));c.length>0&&(e.push(`React Hook \uC0AC\uC6A9: ${c.join(", ")}`),s+=.2*Math.min(c.length,3));let p=Array.from(r).filter(u=>!o.includes(u));return p.length>0&&(e.push(`\uCEE4\uC2A4\uD140 Hook \uD638\uCD9C: ${p.slice(0,3).join(", ")}`),s+=.1),s<.3?null:{type:"hook",confidence:Math.min(s,1),reasons:e}}detectComponent(t){let e=[],s=0,r=false,i=false,n=0,o=c=>{if((l__default.default.isJsxElement(c)||l__default.default.isJsxSelfClosingElement(c)||l__default.default.isJsxFragment(c))&&(n++,r=true),l__default.default.isFunctionDeclaration(c)||l__default.default.isArrowFunction(c)||l__default.default.isFunctionExpression(c)){let p=c.parameters;if(p.length>0){let u=p[0];if(u.name){let a=u.name.getText(t);(a==="props"||a.startsWith("{"))&&(i=true);}}}l__default.default.forEachChild(c,o);};return o(t),r&&(e.push("JSX \uC694\uC18C \uBC18\uD658"),s+=.5,n>3&&(e.push(`\uB2E4\uC218\uC758 JSX \uC694\uC18C (${n}\uAC1C)`),s+=.2)),i&&(e.push("props \uB9E4\uAC1C\uBCC0\uC218 \uC0AC\uC6A9"),s+=.2),t.fileName.match(/\.(tsx|jsx)$/)&&(s+=.1),s<.4?null:{type:"component",confidence:Math.min(s,1),reasons:e}}detectApiRoute(t){let e=[],s=0,r=new Set,i=false,n=false,o=c=>{if(l__default.default.isFunctionDeclaration(c)&&c.name){let p=c.name.text;["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"].includes(p)&&l__default.default.getModifiers(c)?.some(h=>h.kind===l__default.default.SyntaxKind.ExportKeyword)&&r.add(p);}if(l__default.default.isVariableStatement(c)&&l__default.default.getModifiers(c)?.some(a=>a.kind===l__default.default.SyntaxKind.ExportKeyword)){for(let a of c.declarationList.declarations)if(l__default.default.isIdentifier(a.name)){let h=a.name.text;["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"].includes(h)&&r.add(h);}}if(l__default.default.isImportDeclaration(c)){let p=c.moduleSpecifier;if(l__default.default.isStringLiteral(p)&&p.text==="next/server"){let a=c.importClause;if(a?.namedBindings&&l__default.default.isNamedImports(a.namedBindings))for(let h of a.namedBindings.elements){let T=h.name.text;T==="NextRequest"&&(i=true),T==="NextResponse"&&(n=true);}}}l__default.default.forEachChild(c,o);};return o(t),r.size>0&&(e.push(`HTTP \uBA54\uC11C\uB4DC export: ${Array.from(r).join(", ")}`),s+=.6),(i||n)&&(e.push("Next.js server import (NextRequest/NextResponse)"),s+=.3),s<.5?null:{type:"api",confidence:Math.min(s,1),reasons:e}}detectService(t){let e=[],s=0,r=0,i=0,n=0,c=p=>{if(l__default.default.isCallExpression(p)&&l__default.default.isIdentifier(p.expression)&&p.expression.text==="fetch"&&r++,l__default.default.isCallExpression(p)){let u=p.expression;l__default.default.isPropertyAccessExpression(u)&&l__default.default.isIdentifier(u.expression)&&u.expression.text==="axios"&&i++,l__default.default.isIdentifier(u)&&u.text==="axios"&&i++;}if((l__default.default.isFunctionDeclaration(p)||l__default.default.isArrowFunction(p)||l__default.default.isMethodDeclaration(p))&&l__default.default.getModifiers(p)?.some(a=>a.kind===l__default.default.SyntaxKind.AsyncKeyword)&&n++,l__default.default.isClassDeclaration(p)&&p.name){let u=p.name.text;(u.toLowerCase().includes("service")||u.toLowerCase().includes("api")||u.toLowerCase().includes("client"))&&(e.push(`\uC11C\uBE44\uC2A4 \uD074\uB798\uC2A4: ${u}`),s+=.5);}l__default.default.forEachChild(p,c);};return c(t),r>0&&(e.push(`fetch \uD638\uCD9C ${r}\uD68C`),s+=.2*Math.min(r,3)),i>0&&(e.push(`axios \uD638\uCD9C ${i}\uD68C`),s+=.2*Math.min(i,3)),n>=2&&(e.push(`async \uD568\uC218 ${n}\uAC1C`),s+=.15),s<.3?null:{type:"service",confidence:Math.min(s,1),reasons:e}}detectUtility(t){let e=[],s=0,r=0,i=false,n=false,o=[],c=a=>{if(l__default.default.isImportDeclaration(a)){let h=a.moduleSpecifier;if(l__default.default.isStringLiteral(h)){let T=h.text;(T==="react"||T.startsWith("react/"))&&(i=true);}}if((l__default.default.isJsxElement(a)||l__default.default.isJsxSelfClosingElement(a))&&(n=true),l__default.default.isFunctionDeclaration(a)&&a.name&&l__default.default.getModifiers(a)?.some(E=>E.kind===l__default.default.SyntaxKind.ExportKeyword)&&(r++,o.push(a.name.text)),l__default.default.isVariableStatement(a)&&l__default.default.getModifiers(a)?.some(E=>E.kind===l__default.default.SyntaxKind.ExportKeyword))for(let E of a.declarationList.declarations)E.initializer&&(l__default.default.isArrowFunction(E.initializer)||l__default.default.isFunctionExpression(E.initializer))&&l__default.default.isIdentifier(E.name)&&(r++,o.push(E.name.text));l__default.default.forEachChild(a,c);};if(c(t),n||i)return null;r>=2&&(e.push(`${r}\uAC1C\uC758 \uD568\uC218 export`),s+=.3+.1*Math.min(r-2,5));let p=["format","parse","convert","validate","is","has","get","set","create","generate","calculate","transform"],u=o.filter(a=>p.some(h=>a.toLowerCase().startsWith(h)));return u.length>0&&(e.push(`\uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\uBA85 \uD328\uD134: ${u.slice(0,3).join(", ")}`),s+=.2),s<.3?null:{type:"utility",confidence:Math.min(s,1),reasons:e}}};var z=class{constructor(t){this.config=t,this.tsParser=new C,this.sqlParser=new v,this.importExtractor=new w,this.exportExtractor=new I,this.propsExtractor=new b,this.keywordExtractor=new F(t.koreanKeywords),this.callGraphBuilder=new D,this.codePatternDetector=new N;}async analyze(t){let e=Date.now(),s=[],r=await this.collectFiles(t);this.config.verbose&&console.log(`[metadata-plugin] Found ${r.length} files to analyze`);let i=[];for(let p of r)try{let u=await this.parseFile(p,t);u&&i.push(u);}catch(u){let a=u instanceof Error?u.message:"Unknown error";s.push(`${p}: ${a}`);}let n=this.callGraphBuilder.build(i,t),o=i.map(p=>this.createIndexItem(p,n)),c=this.calculateStats(o,s);return this.config.verbose&&(console.log(`[metadata-plugin] Analysis completed in ${Date.now()-e}ms`),console.log(`[metadata-plugin] Processed ${o.length} items`)),{projectId:this.config.projectId,items:o,stats:c,timestamp:new Date().toISOString()}}async collectFiles(t){let e=[];for(let s of this.config.include){let r=await glob.glob(s,{cwd:t,ignore:this.config.exclude,absolute:true});e.push(...r);}return [...new Set(e)]}async parseFile(t,e){let s=g__namespace.relative(e,t),r=await k__namespace.readFile(t,"utf-8");if(g__namespace.extname(t)===".sql")return this.determineFileType(s)?this.sqlParser.parse(r,s):null;let n=this.tsParser.parse(r,t),o=this.determineFileType(s);if(!o){let a=this.codePatternDetector.detect(n);a&&a.confidence>=.4&&(o=a.type,this.config.verbose&&(console.log(`[metadata-plugin] \uCF54\uB4DC \uBD84\uC11D\uC73C\uB85C \uAC10\uC9C0: ${s} \u2192 ${o} (${(a.confidence*100).toFixed(0)}%)`),a.reasons.forEach(h=>console.log(` - ${h}`))));}if(!o)return null;let c=this.importExtractor.extract(n),p=this.exportExtractor.extract(n),u=o==="component"?this.propsExtractor.extract(n):void 0;return {path:s,type:o,name:this.extractName(s,p),imports:c,exports:p,props:u}}determineFileType(t){let e=t.replace(/\\/g,"/"),s=g__namespace.basename(e),r=g__namespace.extname(s),i=e.split("/");if(r===".sql"){for(let c of K)if(e.includes(c))return "table";return null}let n=L[s];if(n)return n;for(let[c,p]of Object.entries($))if(e.includes(c))return p;let o=Object.entries(this.config.fileTypeMapping).sort(([c],[p])=>p.length-c.length);for(let[c,p]of o)if(O(c).test(e))return p;return i.includes("pages")&&(r===".tsx"||r===".ts"||r===".jsx"||r===".js")?"route":null}extractName(t,e){let s=e.find(i=>i.isDefault);if(s&&s.name!=="default")return s.name;let r=g__namespace.basename(t,g__namespace.extname(t));if(["index","page","layout","route"].includes(r)){let i=g__namespace.dirname(t),n=g__namespace.basename(i);return n!=="."?n:r}return r}createIndexItem(t,e){let s=e.get(t.path)||{calls:[],calledBy:[]},r=this.keywordExtractor.extract(t.name,t.path,t.exports.map(n=>n.name),t.props?.map(n=>n.name)),i=this.buildSearchText(t,r);return {id:H(this.config.projectId,t.path),projectId:this.config.projectId,type:t.type,name:t.name,path:t.path,keywords:r,searchText:i,calls:s.calls,calledBy:s.calledBy,metadata:{exports:t.exports.map(n=>n.name),props:t.props?.map(n=>n.name),...t.metadata}}}buildSearchText(t,e){return [t.name,t.path,...e,...t.exports.map(r=>r.name),...t.props?.map(r=>r.name)||[]].join(" ").toLowerCase()}calculateStats(t,e){let s={route:0,component:0,hook:0,service:0,api:0,table:0,utility:0};for(let r of t)s[r.type]++;return {totalFiles:t.length,byType:s,parseErrors:e}}};var Y=class{constructor(t){this.config=t;}async write(t,e){let s=g__namespace.dirname(e);await k__namespace.mkdir(s,{recursive:true});let r=this.formatOutput(t);await k__namespace.writeFile(e,r,"utf-8");}formatOutput(t){let e={version:"1.0.0",projectId:this.config.projectId,generatedAt:t.timestamp,stats:t.stats,items:t.items};return this.config.mode==="production"?JSON.stringify(e):JSON.stringify(e,null,2)}};var j=class{constructor(t,e={}){this.config=t,this.maxRetries=e.maxRetries??3,this.retryDelay=e.retryDelay??1e3;}async send(t){let e=this.config.output.api;if(!e?.enabled||!e.endpoint)return;let s={projectId:this.config.projectId,timestamp:t.timestamp,items:t.items,stats:t.stats},r=null;for(let i=0;i<this.maxRetries;i++)try{await this.sendRequest(e.endpoint,s,e.headers);return}catch(n){r=n instanceof Error?n:new Error(String(n)),this.config.verbose&&console.warn(`[metadata-plugin] API send attempt ${i+1} failed:`,r.message),i<this.maxRetries-1&&await this.delay(this.retryDelay*(i+1));}throw new Error(`Failed to send metadata after ${this.maxRetries} attempts: ${r?.message}`)}async sendRequest(t,e,s){let r=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",...s},body:JSON.stringify(e)});if(!r.ok){let i=await r.text();throw new Error(`API request failed: ${r.status} ${i}`)}}delay(t){return new Promise(e=>setTimeout(e,t))}},V=class extends j{async send(t){let e=this.config.output.api;if(!e?.enabled||!e.endpoint)return;let s=t.items.map(i=>({id:i.id,project_id:i.projectId,type:i.type,name:i.name,path:i.path,keywords:i.keywords,search_text:i.searchText,calls:i.calls,called_by:i.calledBy,metadata:i.metadata,updated_at:t.timestamp})),r=500;for(let i=0;i<s.length;i+=r){let n=s.slice(i,i+r),o=await fetch(e.endpoint,{method:"POST",headers:{"Content-Type":"application/json",Prefer:"resolution=merge-duplicates",...e.headers},body:JSON.stringify(n)});if(!o.ok)throw new Error(`Supabase upsert failed: ${o.status}`)}}};exports.A=j;exports.B=V;exports.a=X;exports.b=Q;exports.c=tt;exports.d=rt;exports.e=it;exports.f=C;exports.g=v;exports.h=w;exports.i=I;exports.j=b;exports.k=M;exports.l=W;exports.m=B;exports.n=Tt;exports.o=et;exports.p=U;exports.q=Pt;exports.r=R;exports.s=q;exports.t=vt;exports.u=F;exports.v=A;exports.w=D;exports.x=H;exports.y=z;exports.z=Y;
@@ -0,0 +1 @@
1
+ 'use strict';var l=require('fs'),c=require('path'),dotenv=require('dotenv');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var l__namespace=/*#__PURE__*/_interopNamespace(l);var c__namespace=/*#__PURE__*/_interopNamespace(c);function f(o,e){let n=e||process.env.NODE_ENV||"development",d=[".env",".env.local",`.env.${n}`,`.env.${n}.local`],s=[],t={};for(let i of d){let r=c__namespace.join(o,i);if(l__namespace.existsSync(r)){let a=dotenv.config({path:r,override:true});a.parsed&&(s.push(i),Object.assign(t,a.parsed));}}return {loaded:s,variables:t}}function p(o,e=false){let{loaded:n}=f(o);e&&n.length>0&&console.log(`\u{1F4E6} Loaded env files: ${n.join(", ")}`);}exports.a=f;exports.b=p;
package/dist/cli.cjs CHANGED
@@ -1,47 +1,49 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var chunkXR3EVOXW_cjs=require('./chunk-XR3EVOXW.cjs'),chunkGHNW3BJ2_cjs=require('./chunk-GHNW3BJ2.cjs'),util=require('util'),m=require('path'),b=require('fs/promises'),_=require('readline');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var m__namespace=/*#__PURE__*/_interopNamespace(m);var b__namespace=/*#__PURE__*/_interopNamespace(b);var ___namespace=/*#__PURE__*/_interopNamespace(_);async function oe(e){let a=[{file:"pnpm-lock.yaml",manager:"pnpm"},{file:"yarn.lock",manager:"yarn"},{file:"package-lock.json",manager:"npm"}];for(let{file:t,manager:o}of a)try{return await b__namespace.access(m__namespace.join(e,t)),o}catch{}return "npm"}async function ae(e){let a={};try{let o=await b__namespace.readFile(m__namespace.join(e,"package.json"),"utf-8");a=JSON.parse(o);}catch{return "unknown"}let t={...a.dependencies||{},...a.devDependencies||{}};return t.next?await v(m__namespace.join(e,"app"))||await v(m__namespace.join(e,"src","app"))?"nextjs-app":"nextjs-pages":t.vite?"vite":t["react-scripts"]?"cra":t.express||t.fastify||t.koa?"node":"unknown"}async function C(e){let[a,t]=await Promise.all([ae(e),oe(e)]),o=await se(m__namespace.join(e,"tsconfig.json")),s=await v(m__namespace.join(e,"src")),n=["app","pages","components","hooks","services","lib","utils","api","src/app","src/pages","src/components","src/hooks","src/services","src/lib","src/utils"],c=[];for(let i of n)await v(m__namespace.join(e,i))&&c.push(i);let r=await v(m__namespace.join(e,"prisma")),g=await v(m__namespace.join(e,"supabase"));return {type:a,packageManager:t,hasTypescript:o,hasSrc:s,existingFolders:c,hasPrisma:r,hasSupabase:g}}async function se(e){try{return (await b__namespace.stat(e)).isFile()}catch{return false}}async function v(e){try{return (await b__namespace.stat(e)).isDirectory()}catch{return false}}function D(e){return {"nextjs-app":"Next.js (App Router)","nextjs-pages":"Next.js (Pages Router)",vite:"Vite + React",cra:"Create React App",node:"Node.js Backend",unknown:"Unknown"}[e]}var S=null;function ne(){return S||(S=___namespace.createInterface({input:process.stdin,output:process.stdout,terminal:false})),S}function y(e){return new Promise(a=>{process.stdout.write(e),ne().once("line",t=>{a(t);});})}function O(){S&&(S.close(),S=null);}async function F(e){let a=[{key:"1",type:"nextjs-app",label:"Next.js (App Router)"},{key:"2",type:"nextjs-pages",label:"Next.js (Pages Router)"},{key:"3",type:"vite",label:"Vite + React"},{key:"4",type:"cra",label:"Create React App"},{key:"5",type:"node",label:"Node.js Backend"}],t=a.findIndex(r=>r.type===e),o=t>=0?a[t].key:"1";console.log(`
3
- \u{1F4E6} \uD504\uB85C\uC81D\uD2B8 \uD0C0\uC785\uC744 \uC120\uD0DD\uD558\uC138\uC694:`),a.forEach(r=>{let i=r.type===e?" (\uAC10\uC9C0\uB428)":"";console.log(` ${r.key}) ${r.label}${i}`);});let n=(await y(`
4
- \uC120\uD0DD [${o}]: `)).trim()||o;return a.find(r=>r.key===n)?.type||e}async function M(e){let a=[{key:"1",manager:"npm"},{key:"2",manager:"yarn"},{key:"3",manager:"pnpm"}],t=a.findIndex(r=>r.manager===e),o=t>=0?a[t].key:"1";console.log(`
5
- \u{1F4E6} \uD328\uD0A4\uC9C0 \uB9E4\uB2C8\uC800\uB97C \uC120\uD0DD\uD558\uC138\uC694:`),a.forEach(r=>{let i=r.manager===e?" (\uAC10\uC9C0\uB428)":"";console.log(` ${r.key}) ${r.manager}${i}`);});let n=(await y(`
6
- \uC120\uD0DD [${o}]: `)).trim()||o;return a.find(r=>r.key===n)?.manager||e}async function B(e){if(e==="node"||e==="unknown")return false;let a=e.startsWith("nextjs")?"next.config":"vite.config";return console.log(`
7
- \u{1F527} ${a} \uD30C\uC77C\uC5D0 metadatafy \uD50C\uB7EC\uADF8\uC778\uC744 \uC790\uB3D9\uC73C\uB85C \uCD94\uAC00\uD560\uAE4C\uC694?`),console.log(" \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uAC00 \uC0DD\uC131\uB429\uB2C8\uB2E4."),(await y(`
8
- \uCD94\uAC00\uD560\uAE4C\uC694? [Y/n]: `)).trim().toLowerCase()!=="n"}async function K(){console.log(`
9
- \u2601\uFE0F API \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC804\uC1A1\uD560\uAE4C\uC694?`),console.log(" \uBE48\uCE78\uC73C\uB85C \uB450\uBA74 \uD30C\uC77C\uB9CC \uC0DD\uC131\uB429\uB2C8\uB2E4.");let a=(await y(`
10
- API URL (\uC120\uD0DD\uC0AC\uD56D): `)).trim();if(!a)return null;try{return new URL(a),a}catch{return console.log("\u26A0\uFE0F \uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 URL\uC785\uB2C8\uB2E4. API \uC804\uC1A1\uC744 \uAC74\uB108\uB701\uB2C8\uB2E4."),null}}async function W(e,a=true){let s=(await y(`${e} ${a?"[Y/n]":"[y/N]"}: `)).trim().toLowerCase();return s===""?a:s==="y"||s==="yes"}async function V(){return console.log(`
11
- \u{1F5C4}\uFE0F Supabase\uC5D0 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC790\uB3D9 \uC800\uC7A5\uD560\uAE4C\uC694?`),console.log(" \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC5C5\uB85C\uB4DC\uB429\uB2C8\uB2E4."),(await y(`
12
- Supabase \uC5F0\uB3D9 \uC124\uC815? [y/N]: `)).trim().toLowerCase()==="y"}async function J(){console.log(`
13
- \u{1F527} Supabase \uC124\uC815`),console.log(`Settings > API\uC5D0\uC11C \uD655\uC778\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.
14
- `),console.log("\u{1F4A1} \uD658\uACBD\uBCC0\uC218 \uC774\uB984\uC744 \uC785\uB825\uD558\uBA74 ${VAR} \uD615\uC2DD\uC73C\uB85C \uC800\uC7A5\uB429\uB2C8\uB2E4."),console.log(" \uC608: SUPABASE_URL \u2192 ${SUPABASE_URL}\n");let e=await y("Supabase URL \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_URL]: "),a=await y("Service Role Key \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_SERVICE_ROLE_KEY]: "),t=await y("\uD14C\uC774\uBE14 \uC774\uB984 [project_metadata]: "),o=e.trim()||"SUPABASE_URL",s=a.trim()||"SUPABASE_SERVICE_ROLE_KEY",n=t.trim()||"project_metadata";return {url:`\${${o}}`,serviceRoleKey:`\${${s}}`,tableName:n}}function re(e){let{projectType:a,projectInfo:t}=e,o=[],s=t.hasTypescript?"{ts,tsx}":"{js,jsx}";switch(a){case "nextjs-app":t.hasSrc?o.push(`src/app/**/*.${s}`):o.push(`app/**/*.${s}`),o.push(`components/**/*.${s}`),o.push(`hooks/**/*.${s}`),o.push(`lib/**/*.${s}`);break;case "nextjs-pages":t.hasSrc?o.push(`src/pages/**/*.${s}`):o.push(`pages/**/*.${s}`),o.push(`components/**/*.${s}`),o.push(`hooks/**/*.${s}`),o.push(`lib/**/*.${s}`);break;case "vite":case "cra":o.push(`src/**/*.${s}`);break;case "node":o.push(`src/**/*.${t.hasTypescript?"ts":"js"}`),o.push(`routes/**/*.${t.hasTypescript?"ts":"js"}`),o.push(`controllers/**/*.${t.hasTypescript?"ts":"js"}`);break;default:o.push(`src/**/*.${s}`);}return t.hasPrisma&&o.push("prisma/migrations/**/*.sql"),t.hasSupabase&&o.push("supabase/migrations/*.sql"),o}async function z(e,a,t){let o=m__namespace.join(e,"metadata.config.json"),s={projectId:a,include:re(t),exclude:["**/node_modules/**","**/.next/**","**/dist/**","**/build/**","**/*.test.{ts,tsx,js,jsx}","**/*.spec.{ts,tsx,js,jsx}","**/__tests__/**"],output:{file:{enabled:true,path:"project-metadata.json"},api:{enabled:!!t.apiEndpoint,endpoint:t.apiEndpoint||""},...t.supabase&&{database:{enabled:true,provider:"supabase",supabase:{url:t.supabase.url,serviceRoleKey:t.supabase.serviceRoleKey,tableName:t.supabase.tableName,fields:{projectId:"project_id",metadata:"metadata",createdAt:"created_at",updatedAt:"updated_at"}}}}},koreanKeywords:{},verbose:false};return await b__namespace.writeFile(o,JSON.stringify(s,null,2)),o}async function Y(e){let a=["vite.config.ts","vite.config.js","vite.config.mts","vite.config.mjs"];for(let t of a){let o=m__namespace.join(e,t);try{let s=await b__namespace.readFile(o,"utf-8");if(s.includes("metadatafy"))return !0;let n=`import metadatafy from 'metadatafy/vite';
15
- `;return s.includes("from 'vite'")?s=s.replace(/^(import .+ from ['"]vite['"];?\n)/m,`$1${n}`):s=n+s,s.includes("plugins:")?s=s.replace(/plugins:\s*\[/,`plugins: [
16
- metadatafy(),`):s.includes("defineConfig(")&&(s=s.replace(/defineConfig\(\{/,`defineConfig({
17
- plugins: [metadatafy()],`)),await b__namespace.writeFile(o,s),!0}catch{}}return false}async function q(e){let a=["next.config.ts","next.config.mjs","next.config.js"];for(let t of a){let o=m__namespace.join(e,t);try{let s=await b__namespace.readFile(o,"utf-8");if(s.includes("metadatafy")||s.includes("withMetadatafy"))return !0;let n=t.endsWith(".ts");return s=(t.endsWith(".mjs")||n?`import { withMetadatafy } from 'metadatafy/next';
2
+ 'use strict';var chunkXR3EVOXW_cjs=require('./chunk-XR3EVOXW.cjs'),chunkRLSFEATG_cjs=require('./chunk-RLSFEATG.cjs'),chunkZAACVJBX_cjs=require('./chunk-ZAACVJBX.cjs'),util=require('util'),f=require('path'),m=require('fs/promises'),_=require('readline');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var f__namespace=/*#__PURE__*/_interopNamespace(f);var m__namespace=/*#__PURE__*/_interopNamespace(m);var ___namespace=/*#__PURE__*/_interopNamespace(_);async function oe(e){let s=[{file:"pnpm-lock.yaml",manager:"pnpm"},{file:"yarn.lock",manager:"yarn"},{file:"package-lock.json",manager:"npm"}];for(let{file:t,manager:a}of s)try{return await m__namespace.access(f__namespace.join(e,t)),a}catch{}return "npm"}async function ae(e){let s={};try{let a=await m__namespace.readFile(f__namespace.join(e,"package.json"),"utf-8");s=JSON.parse(a);}catch{return "unknown"}let t={...s.dependencies||{},...s.devDependencies||{}};return t.next?await S(f__namespace.join(e,"app"))||await S(f__namespace.join(e,"src","app"))?"nextjs-app":"nextjs-pages":t.vite?"vite":t["react-scripts"]?"cra":t.express||t.fastify||t.koa?"node":"unknown"}async function D(e){let[s,t]=await Promise.all([ae(e),oe(e)]),a=await se(f__namespace.join(e,"tsconfig.json")),o=await S(f__namespace.join(e,"src")),n=["app","pages","components","hooks","services","lib","utils","api","src/app","src/pages","src/components","src/hooks","src/services","src/lib","src/utils"],i=[];for(let c of n)await S(f__namespace.join(e,c))&&i.push(c);let r=await S(f__namespace.join(e,"prisma")),u=await S(f__namespace.join(e,"supabase"));return {type:s,packageManager:t,hasTypescript:a,hasSrc:o,existingFolders:i,hasPrisma:r,hasSupabase:u}}async function se(e){try{return (await m__namespace.stat(e)).isFile()}catch{return false}}async function S(e){try{return (await m__namespace.stat(e)).isDirectory()}catch{return false}}function O(e){return {"nextjs-app":"Next.js (App Router)","nextjs-pages":"Next.js (Pages Router)",vite:"Vite + React",cra:"Create React App",node:"Node.js Backend",unknown:"Unknown"}[e]}var x=null;function ne(){return x||(x=___namespace.createInterface({input:process.stdin,output:process.stdout,terminal:false})),x}function b(e){return new Promise(s=>{process.stdout.write(e),ne().once("line",t=>{s(t);});})}function F(){x&&(x.close(),x=null);}async function M(e){let s=[{key:"1",type:"nextjs-app",label:"Next.js (App Router)"},{key:"2",type:"nextjs-pages",label:"Next.js (Pages Router)"},{key:"3",type:"vite",label:"Vite + React"},{key:"4",type:"cra",label:"Create React App"},{key:"5",type:"node",label:"Node.js Backend"}],t=s.findIndex(r=>r.type===e),a=t>=0?s[t].key:"1";console.log(`
3
+ \u{1F4E6} \uD504\uB85C\uC81D\uD2B8 \uD0C0\uC785\uC744 \uC120\uD0DD\uD558\uC138\uC694:`),s.forEach(r=>{let c=r.type===e?" (\uAC10\uC9C0\uB428)":"";console.log(` ${r.key}) ${r.label}${c}`);});let n=(await b(`
4
+ \uC120\uD0DD [${a}]: `)).trim()||a;return s.find(r=>r.key===n)?.type||e}async function B(e){let s=[{key:"1",manager:"npm"},{key:"2",manager:"yarn"},{key:"3",manager:"pnpm"}],t=s.findIndex(r=>r.manager===e),a=t>=0?s[t].key:"1";console.log(`
5
+ \u{1F4E6} \uD328\uD0A4\uC9C0 \uB9E4\uB2C8\uC800\uB97C \uC120\uD0DD\uD558\uC138\uC694:`),s.forEach(r=>{let c=r.manager===e?" (\uAC10\uC9C0\uB428)":"";console.log(` ${r.key}) ${r.manager}${c}`);});let n=(await b(`
6
+ \uC120\uD0DD [${a}]: `)).trim()||a;return s.find(r=>r.key===n)?.manager||e}async function K(e){if(e==="node"||e==="unknown")return false;let s=e.startsWith("nextjs")?"next.config":"vite.config";return console.log(`
7
+ \u{1F527} ${s} \uD30C\uC77C\uC5D0 metadatafy \uD50C\uB7EC\uADF8\uC778\uC744 \uC790\uB3D9\uC73C\uB85C \uCD94\uAC00\uD560\uAE4C\uC694?`),console.log(" \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uAC00 \uC0DD\uC131\uB429\uB2C8\uB2E4."),(await b(`
8
+ \uCD94\uAC00\uD560\uAE4C\uC694? [Y/n]: `)).trim().toLowerCase()!=="n"}async function W(e,s=true){let o=(await b(`${e} ${s?"[Y/n]":"[y/N]"}: `)).trim().toLowerCase();return o===""?s:o==="y"||o==="yes"}async function J(){return console.log(`
9
+ \u{1F5C4}\uFE0F Supabase\uC5D0 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC790\uB3D9 \uC800\uC7A5\uD560\uAE4C\uC694?`),console.log(" \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC5C5\uB85C\uB4DC\uB429\uB2C8\uB2E4."),(await b(`
10
+ Supabase \uC5F0\uB3D9 \uC124\uC815? [y/N]: `)).trim().toLowerCase()==="y"}async function V(e={}){console.log(`
11
+ \u{1F527} Supabase \uC124\uC815`),console.log(`\uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C \uC0AC\uC6A9 \uC911\uC778 \uD658\uACBD\uBCC0\uC218 \uC774\uB984\uC744 \uC785\uB825\uD558\uC138\uC694.
12
+ `);let s=Object.keys(e).filter(l=>l.toLowerCase().includes("supabase"));s.length>0&&(console.log("\u{1F4CB} \uAC10\uC9C0\uB41C Supabase \uAD00\uB828 \uD658\uACBD\uBCC0\uC218:"),s.forEach(l=>console.log(` - ${l}`)),console.log(""));let t=await b("Supabase URL \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_URL]: "),a=await b("Service Role Key \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_SERVICE_ROLE_KEY]: "),o=t.trim()||"SUPABASE_URL",n=a.trim()||"SUPABASE_SERVICE_ROLE_KEY",i=!!e[o],r=!!e[n];if(i&&r)console.log(`
13
+ \u2705 .env \uD30C\uC77C\uC5D0\uC11C \uD658\uACBD\uBCC0\uC218\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4:`),console.log(` ${o}: ${e[o].substring(0,30)}...`),console.log(` ${n}: ****${e[n].slice(-8)}`);else {let l=[];i||l.push(o),r||l.push(n),console.log(`
14
+ \u26A0\uFE0F .env \uD30C\uC77C\uC5D0 \uB2E4\uC74C \uD658\uACBD\uBCC0\uC218\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4:`),l.forEach(p=>console.log(` - ${p}`)),console.log(`
15
+ \uB098\uC911\uC5D0 .env \uD30C\uC77C\uC5D0 \uCD94\uAC00\uD574\uC8FC\uC138\uC694.`);}let c=(await b(`
16
+ \uD14C\uC774\uBE14 \uC774\uB984 [project_metadata]: `)).trim()||"project_metadata";return {urlEnvName:o,serviceRoleKeyEnvName:n,tableName:c}}function re(e){let{projectType:s,projectInfo:t}=e,a=[],o=t.hasTypescript?"{ts,tsx}":"{js,jsx}";switch(s){case "nextjs-app":t.hasSrc?a.push(`src/app/**/*.${o}`):a.push(`app/**/*.${o}`),a.push(`components/**/*.${o}`),a.push(`hooks/**/*.${o}`),a.push(`lib/**/*.${o}`);break;case "nextjs-pages":t.hasSrc?a.push(`src/pages/**/*.${o}`):a.push(`pages/**/*.${o}`),a.push(`components/**/*.${o}`),a.push(`hooks/**/*.${o}`),a.push(`lib/**/*.${o}`);break;case "vite":case "cra":a.push(`src/**/*.${o}`);break;case "node":a.push(`src/**/*.${t.hasTypescript?"ts":"js"}`),a.push(`routes/**/*.${t.hasTypescript?"ts":"js"}`),a.push(`controllers/**/*.${t.hasTypescript?"ts":"js"}`);break;default:a.push(`src/**/*.${o}`);}return t.hasPrisma&&a.push("prisma/migrations/**/*.sql"),t.hasSupabase&&a.push("supabase/migrations/*.sql"),a}async function z(e,s,t){let a=f__namespace.join(e,"metadata.config.json"),o={projectId:s,include:re(t),exclude:["**/node_modules/**","**/.next/**","**/dist/**","**/build/**","**/*.test.{ts,tsx,js,jsx}","**/*.spec.{ts,tsx,js,jsx}","**/__tests__/**"],output:{file:{enabled:true,path:"project-metadata.json"},...t.supabase&&{database:{enabled:true,provider:"supabase",supabase:{url:`\${${t.supabase.urlEnvName}}`,serviceRoleKey:`\${${t.supabase.serviceRoleKeyEnvName}}`,tableName:t.supabase.tableName,fields:{projectId:"project_id",metadata:"metadata",createdAt:"created_at",updatedAt:"updated_at"}}}}},koreanKeywords:{},verbose:false};return await m__namespace.writeFile(a,JSON.stringify(o,null,2)),a}async function Y(e){let s=["vite.config.ts","vite.config.js","vite.config.mts","vite.config.mjs"];for(let t of s){let a=f__namespace.join(e,t);try{let o=await m__namespace.readFile(a,"utf-8");if(o.includes("metadatafy"))return !0;let n=`import metadatafy from 'metadatafy/vite';
17
+ `;return o.includes("from 'vite'")?o=o.replace(/^(import .+ from ['"]vite['"];?\n)/m,`$1${n}`):o=n+o,o.includes("plugins:")?o=o.replace(/plugins:\s*\[/,`plugins: [
18
+ metadatafy(),`):o.includes("defineConfig(")&&(o=o.replace(/defineConfig\(\{/,`defineConfig({
19
+ plugins: [metadatafy()],`)),await m__namespace.writeFile(a,o),!0}catch{}}return false}async function q(e){let s=["next.config.ts","next.config.mjs","next.config.js"];for(let t of s){let a=f__namespace.join(e,t);try{let o=await m__namespace.readFile(a,"utf-8");if(o.includes("metadatafy")||o.includes("withMetadatafy"))return !0;let n=t.endsWith(".ts");return o=(t.endsWith(".mjs")||n?`import { withMetadatafy } from 'metadatafy/next';
18
20
  `:`const { withMetadatafy } = require('metadatafy/next');
19
- `)+s,s.includes("export default")?(s=s.replace(/export default\s+({[\s\S]*?});?\s*$/m,"export default withMetadatafy($1);"),s=s.replace(/export default\s+(\w+);?\s*$/m,"export default withMetadatafy($1);")):s.includes("module.exports")&&(s=s.replace(/module\.exports\s*=\s*({[\s\S]*?});?\s*$/m,"module.exports = withMetadatafy($1);"),s=s.replace(/module\.exports\s*=\s*(\w+);?\s*$/m,"module.exports = withMetadatafy($1);")),await b__namespace.writeFile(o,s),!0}catch{}}return false}function H(e){switch(e){case "yarn":return "yarn add -D metadatafy";case "pnpm":return "pnpm add -D metadatafy";default:return "npm install -D metadatafy"}}var X=___namespace.createInterface({input:process.stdin,output:process.stdout});function f(e){return new Promise(a=>{X.question(e,a);})}function Z(e){return new Promise(a=>{process.stdout.write(e);let t=process.stdin,o=t.isRaw;t.isTTY&&t.setRawMode(true);let s="",n=c=>{let r=c.toString("utf8");switch(r){case `
20
- `:case "\r":case "":t.isTTY&&t.setRawMode(o),t.removeListener("data",n),process.stdout.write(`
21
- `),a(s);break;case "":process.exit();break;case "\x7F":s.length>0&&(s=s.slice(0,-1),process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(e+"*".repeat(s.length)));break;default:s+=r,process.stdout.write("*");break}};t.on("data",n),t.resume();})}function ie(){X.close();}async function ce(){return console.log(`
22
- \u{1F4E6} \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uD504\uB85C\uBC14\uC774\uB354\uB97C \uC120\uD0DD\uD558\uC138\uC694:`),console.log(" 1) Supabase"),console.log(" 2) Custom API (\uC9C1\uC811 \uC124\uC815)"),console.log(" (Firebase, PlanetScale \uB4F1\uC740 \uCD94\uD6C4 \uC9C0\uC6D0 \uC608\uC815)"),((await f(`
21
+ `)+o,o.includes("export default")?(o=o.replace(/export default\s+({[\s\S]*?});?\s*$/m,"export default withMetadatafy($1);"),o=o.replace(/export default\s+(\w+);?\s*$/m,"export default withMetadatafy($1);")):o.includes("module.exports")&&(o=o.replace(/module\.exports\s*=\s*({[\s\S]*?});?\s*$/m,"module.exports = withMetadatafy($1);"),o=o.replace(/module\.exports\s*=\s*(\w+);?\s*$/m,"module.exports = withMetadatafy($1);")),await m__namespace.writeFile(a,o),!0}catch{}}return false}function H(e){switch(e){case "yarn":return "yarn add -D metadatafy";case "pnpm":return "pnpm add -D metadatafy";default:return "npm install -D metadatafy"}}var X=___namespace.createInterface({input:process.stdin,output:process.stdout});function g(e){return new Promise(s=>{X.question(e,s);})}function Z(e){return new Promise(s=>{process.stdout.write(e);let t=process.stdin,a=t.isRaw;t.isTTY&&t.setRawMode(true);let o="",n=i=>{let r=i.toString("utf8");switch(r){case `
22
+ `:case "\r":case "":t.isTTY&&t.setRawMode(a),t.removeListener("data",n),process.stdout.write(`
23
+ `),s(o);break;case "":process.exit();break;case "\x7F":o.length>0&&(o=o.slice(0,-1),process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(e+"*".repeat(o.length)));break;default:o+=r,process.stdout.write("*");break}};t.on("data",n),t.resume();})}function ie(){X.close();}async function ce(){return console.log(`
24
+ \u{1F4E6} \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uD504\uB85C\uBC14\uC774\uB354\uB97C \uC120\uD0DD\uD558\uC138\uC694:`),console.log(" 1) Supabase"),console.log(" 2) Custom API (\uC9C1\uC811 \uC124\uC815)"),console.log(" (Firebase, PlanetScale \uB4F1\uC740 \uCD94\uD6C4 \uC9C0\uC6D0 \uC608\uC815)"),((await g(`
23
25
  \uC120\uD0DD [1]: `)).trim()||"1")==="2"?"custom":"supabase"}async function le(){return console.log(`
24
- \u{1F510} \uC778\uC99D \uC815\uBCF4 \uC800\uC7A5 \uBC29\uC2DD\uC744 \uC120\uD0DD\uD558\uC138\uC694:`),console.log(" 1) \uD658\uACBD\uBCC0\uC218 \uCC38\uC870 \uC0AC\uC6A9 (\uAD8C\uC7A5) - ${SUPABASE_URL} \uD615\uC2DD\uC73C\uB85C \uC800\uC7A5"),console.log(" 2) \uC9C1\uC811 \uAC12 \uC800\uC7A5 (\uBE44\uAD8C\uC7A5) - \uC2E4\uC81C \uAC12\uC744 config\uC5D0 \uC800\uC7A5"),(await f(`
26
+ \u{1F510} \uC778\uC99D \uC815\uBCF4 \uC800\uC7A5 \uBC29\uC2DD\uC744 \uC120\uD0DD\uD558\uC138\uC694:`),console.log(" 1) \uD658\uACBD\uBCC0\uC218 \uCC38\uC870 \uC0AC\uC6A9 (\uAD8C\uC7A5) - ${SUPABASE_URL} \uD615\uC2DD\uC73C\uB85C \uC800\uC7A5"),console.log(" 2) \uC9C1\uC811 \uAC12 \uC800\uC7A5 (\uBE44\uAD8C\uC7A5) - \uC2E4\uC81C \uAC12\uC744 config\uC5D0 \uC800\uC7A5"),(await g(`
25
27
  \uC120\uD0DD [1]: `)).trim()!=="2"}async function pe(e){console.log(`
26
28
  \u{1F527} Supabase \uC124\uC815
27
29
  `),console.log("Supabase \uB300\uC2DC\uBCF4\uB4DC\uC5D0\uC11C \uB2E4\uC74C \uC815\uBCF4\uB97C \uD655\uC778\uD558\uC138\uC694:"),console.log(`Settings > API > Project URL, service_role key
28
- `);let a,t,o,s;if(e){let $=await f("Supabase URL \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_URL]: "),u=await f("Supabase service role key \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_SERVICE_ROLE_KEY]: ");o=`\${${$.trim()||"SUPABASE_URL"}}`,s=`\${${u.trim()||"SUPABASE_SERVICE_ROLE_KEY"}}`,console.log(`
29
- \uC5F0\uACB0 \uD14C\uC2A4\uD2B8\uB97C \uC704\uD574 \uC2E4\uC81C \uAC12\uC744 \uC785\uB825\uD574\uC8FC\uC138\uC694 (\uC800\uC7A5\uB418\uC9C0 \uC54A\uC74C):`),a=await f("Supabase URL: "),t=await Z("Supabase service role key: ");}else a=await f("Supabase URL (\uC608: https://xxx.supabase.co): "),t=await Z("Supabase service role key: "),o=a.trim(),s=t;if(!a.trim()||!t)throw new Error("Supabase URL\uACFC service role key\uB294 \uD544\uC218\uC785\uB2C8\uB2E4.");let c=(await f(`
30
+ `);let s,t,a,o;if(e){let j=await g("Supabase URL \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_URL]: "),v=await g("Supabase service role key \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_SERVICE_ROLE_KEY]: ");a=`\${${j.trim()||"SUPABASE_URL"}}`,o=`\${${v.trim()||"SUPABASE_SERVICE_ROLE_KEY"}}`,console.log(`
31
+ \uC5F0\uACB0 \uD14C\uC2A4\uD2B8\uB97C \uC704\uD574 \uC2E4\uC81C \uAC12\uC744 \uC785\uB825\uD574\uC8FC\uC138\uC694 (\uC800\uC7A5\uB418\uC9C0 \uC54A\uC74C):`),s=await g("Supabase URL: "),t=await Z("Supabase service role key: ");}else s=await g("Supabase URL (\uC608: https://xxx.supabase.co): "),t=await Z("Supabase service role key: "),a=s.trim(),o=t;if(!s.trim()||!t)throw new Error("Supabase URL\uACFC service role key\uB294 \uD544\uC218\uC785\uB2C8\uB2E4.");let i=(await g(`
30
32
  \uD14C\uC774\uBE14 \uC774\uB984 [project_metadata]: `)).trim()||"project_metadata";console.log(`
31
33
  \u{1F4DD} \uD544\uB4DC \uB9E4\uD551 \uC124\uC815`),console.log(`\uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC800\uC7A5\uD560 \uCEEC\uB7FC \uC774\uB984\uC744 \uC785\uB825\uD558\uC138\uC694.
32
- `);let r=await f("\uD504\uB85C\uC81D\uD2B8 ID \uD544\uB4DC [project_id]: "),g=await f("\uBA54\uD0C0\uB370\uC774\uD130 JSON \uD544\uB4DC [metadata]: "),i=await f('\uC0DD\uC131 \uC2DC\uAC04 \uD544\uB4DC (\uBE48\uCE78=created_at, "none"=\uC0AC\uC6A9\uC548\uD568) [created_at]: '),p=await f('\uC5C5\uB370\uC774\uD2B8 \uC2DC\uAC04 \uD544\uB4DC (\uBE48\uCE78=updated_at, "none"=\uC0AC\uC6A9\uC548\uD568) [updated_at]: ');return {config:{enabled:true,provider:"supabase",supabase:{url:o,serviceRoleKey:s,tableName:c,fields:{projectId:r.trim()||"project_id",metadata:g.trim()||"metadata",...i.trim().toLowerCase()!=="none"&&{createdAt:i.trim()||"created_at"},...p.trim().toLowerCase()!=="none"&&{updatedAt:p.trim()||"updated_at"}}}},actualValues:{url:a.trim(),serviceRoleKey:t}}}async function ue(e,a){if(console.log(`
33
- \u{1F50C} \uC5F0\uACB0 \uD14C\uC2A4\uD2B8 \uC911...`),e.provider!=="supabase"||!e.supabase)return true;let t={provider:"supabase",enabled:true,url:a.url,serviceRoleKey:a.serviceRoleKey,tableName:e.supabase.tableName,fields:{projectId:e.supabase.fields.projectId,metadata:e.supabase.fields.metadata,createdAt:e.supabase.fields.createdAt,updatedAt:e.supabase.fields.updatedAt}};try{return await(await chunkXR3EVOXW_cjs.a(t)).testConnection()?(console.log("\u2705 \uC5F0\uACB0 \uC131\uACF5!"),!0):(console.log("\u274C \uC5F0\uACB0 \uC2E4\uD328. \uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694."),!1)}catch(o){return console.log(`\u274C \uC5F0\uACB0 \uC624\uB958: ${o instanceof Error?o.message:o}`),false}}async function de(e,a){let t=m__namespace.join(e,"metadata.config.json"),o={};try{let n=await b__namespace.readFile(t,"utf-8");o=JSON.parse(n);}catch{o={projectId:m__namespace.basename(e),include:["src/**/*.{ts,tsx}"],exclude:["**/node_modules/**","**/*.test.{ts,tsx}"],output:{}};}let s=o.output||{};return s.database=a,o.output=s,await b__namespace.writeFile(t,JSON.stringify(o,null,2)),t}function ge(e){if(!e.supabase)return;let{tableName:a,fields:t}=e.supabase;console.log(`
34
+ `);let r=await g("\uD504\uB85C\uC81D\uD2B8 ID \uD544\uB4DC [project_id]: "),u=await g("\uBA54\uD0C0\uB370\uC774\uD130 JSON \uD544\uB4DC [metadata]: "),c=await g('\uC0DD\uC131 \uC2DC\uAC04 \uD544\uB4DC (\uBE48\uCE78=created_at, "none"=\uC0AC\uC6A9\uC548\uD568) [created_at]: '),l=await g('\uC5C5\uB370\uC774\uD2B8 \uC2DC\uAC04 \uD544\uB4DC (\uBE48\uCE78=updated_at, "none"=\uC0AC\uC6A9\uC548\uD568) [updated_at]: ');return {config:{enabled:true,provider:"supabase",supabase:{url:a,serviceRoleKey:o,tableName:i,fields:{projectId:r.trim()||"project_id",metadata:u.trim()||"metadata",...c.trim().toLowerCase()!=="none"&&{createdAt:c.trim()||"created_at"},...l.trim().toLowerCase()!=="none"&&{updatedAt:l.trim()||"updated_at"}}}},actualValues:{url:s.trim(),serviceRoleKey:t}}}async function ue(e,s){if(console.log(`
35
+ \u{1F50C} \uC5F0\uACB0 \uD14C\uC2A4\uD2B8 \uC911...`),e.provider!=="supabase"||!e.supabase)return true;let t={provider:"supabase",enabled:true,url:s.url,serviceRoleKey:s.serviceRoleKey,tableName:e.supabase.tableName,fields:{projectId:e.supabase.fields.projectId,metadata:e.supabase.fields.metadata,createdAt:e.supabase.fields.createdAt,updatedAt:e.supabase.fields.updatedAt}};try{return await(await chunkXR3EVOXW_cjs.a(t)).testConnection()?(console.log("\u2705 \uC5F0\uACB0 \uC131\uACF5!"),!0):(console.log("\u274C \uC5F0\uACB0 \uC2E4\uD328. \uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694."),!1)}catch(a){return console.log(`\u274C \uC5F0\uACB0 \uC624\uB958: ${a instanceof Error?a.message:a}`),false}}async function de(e,s){let t=f__namespace.join(e,"metadata.config.json"),a={};try{let n=await m__namespace.readFile(t,"utf-8");a=JSON.parse(n);}catch{a={projectId:f__namespace.basename(e),include:["src/**/*.{ts,tsx}"],exclude:["**/node_modules/**","**/*.test.{ts,tsx}"],output:{}};}let o=a.output||{};return o.database=s,a.output=o,await m__namespace.writeFile(t,JSON.stringify(a,null,2)),t}function ge(e){if(!e.supabase)return;let{tableName:s,fields:t}=e.supabase;console.log(`
34
36
  \u{1F4CB} Supabase\uC5D0\uC11C \uB2E4\uC74C SQL\uB85C \uD14C\uC774\uBE14\uC744 \uC0DD\uC131\uD558\uC138\uC694:
35
- `),console.log("```sql"),console.log(`CREATE TABLE ${a} (`),console.log(" id UUID DEFAULT gen_random_uuid() PRIMARY KEY,"),console.log(` ${t.projectId} TEXT UNIQUE NOT NULL,`),console.log(` ${t.metadata} JSONB NOT NULL,`),t.createdAt&&console.log(` ${t.createdAt} TIMESTAMPTZ DEFAULT NOW(),`),t.updatedAt&&console.log(` ${t.updatedAt} TIMESTAMPTZ DEFAULT NOW()`),console.log(");"),console.log(""),console.log("-- RLS \uC815\uCC45 (\uD544\uC694\uC2DC)"),console.log(`ALTER TABLE ${a} ENABLE ROW LEVEL SECURITY;`),console.log("```\n");}function fe(e){if(e.provider!=="supabase"||!e.supabase)return;let{url:a,serviceRoleKey:t}=e.supabase;if(a.startsWith("${")||t.startsWith("${")){if(console.log(`\u{1F510} .env \uD30C\uC77C\uC5D0 \uB2E4\uC74C \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD558\uC138\uC694:
36
- `),a.startsWith("${")){let o=a.slice(2,-1);console.log(`${o}=https://your-project.supabase.co`);}if(t.startsWith("${")){let o=t.slice(2,-1);console.log(`${o}=your-service-role-key`);}console.log(`
37
+ `),console.log("```sql"),console.log(`CREATE TABLE ${s} (`),console.log(" id UUID DEFAULT gen_random_uuid() PRIMARY KEY,"),console.log(` ${t.projectId} TEXT UNIQUE NOT NULL,`),console.log(` ${t.metadata} JSONB NOT NULL,`),t.createdAt&&console.log(` ${t.createdAt} TIMESTAMPTZ DEFAULT NOW(),`),t.updatedAt&&console.log(` ${t.updatedAt} TIMESTAMPTZ DEFAULT NOW()`),console.log(");"),console.log(""),console.log("-- RLS \uC815\uCC45 (\uD544\uC694\uC2DC)"),console.log(`ALTER TABLE ${s} ENABLE ROW LEVEL SECURITY;`),console.log("```\n");}function fe(e){if(e.provider!=="supabase"||!e.supabase)return;let{url:s,serviceRoleKey:t}=e.supabase;if(s.startsWith("${")||t.startsWith("${")){if(console.log(`\u{1F510} .env \uD30C\uC77C\uC5D0 \uB2E4\uC74C \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD558\uC138\uC694:
38
+ `),s.startsWith("${")){let a=s.slice(2,-1);console.log(`${a}=https://your-project.supabase.co`);}if(t.startsWith("${")){let a=t.slice(2,-1);console.log(`${a}=your-service-role-key`);}console.log(`
37
39
  \u{1F4A1} CI/CD \uD658\uACBD\uC5D0\uC11C\uB294 \uD574\uB2F9 \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD574\uC8FC\uC138\uC694.`),console.log(" GitHub Actions: Settings > Secrets and variables > Actions"),console.log(` Vercel: Project Settings > Environment Variables
38
- `);}}async function T(){let e=process.cwd();console.log(`
40
+ `);}}async function I(){let e=process.cwd();console.log(`
39
41
  \u{1F5C4}\uFE0F metadatafy \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC124\uC815
40
42
  `),console.log("\uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC800\uC7A5\uD569\uB2C8\uB2E4."),console.log("\uC124\uC815\uC740 metadata.config.json\uC5D0 \uC800\uC7A5\uB429\uB2C8\uB2E4.");try{if(await ce()!=="supabase"){console.log(`
41
43
  \uD604\uC7AC Supabase\uB9CC \uC778\uD130\uB799\uD2F0\uBE0C \uC124\uC815\uC744 \uC9C0\uC6D0\uD569\uB2C8\uB2E4.`),console.log(`metadata.config.json\uC758 output.database\uB97C \uC9C1\uC811 \uC791\uC131\uD574\uC8FC\uC138\uC694.
42
- `);return}let t=await le(),{config:o,actualValues:s}=await pe(t);if(!await ue(o,s)&&(await f(`
43
- \uACC4\uC18D \uC9C4\uD589\uD560\uAE4C\uC694? [y/N]: `)).toLowerCase()!=="y"){console.log("\uC124\uC815\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.");return}let c=await de(e,o);console.log(`
44
- \u2705 \uC124\uC815 \uC800\uC7A5\uB428: ${m__namespace.relative(e,c)}`),ge(o),fe(o),console.log("\u{1F389} \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC124\uC815\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4!"),console.log(`
44
+ `);return}let t=await le(),{config:a,actualValues:o}=await pe(t);if(!await ue(a,o)&&(await g(`
45
+ \uACC4\uC18D \uC9C4\uD589\uD560\uAE4C\uC694? [y/N]: `)).toLowerCase()!=="y"){console.log("\uC124\uC815\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.");return}let i=await de(e,a);console.log(`
46
+ \u2705 \uC124\uC815 \uC800\uC7A5\uB428: ${f__namespace.relative(e,i)}`),ge(a),fe(a),console.log("\u{1F389} \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC124\uC815\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4!"),console.log(`
45
47
  \u{1F4A1} \uC0AC\uC6A9\uBC95:`),console.log(" npx metadatafy analyze # \uBD84\uC11D + DB \uC5C5\uB85C\uB4DC"),console.log("");}finally{ie();}}var me="1.3.1",G=`
46
48
  metadatafy - \uD504\uB85C\uC81D\uD2B8 \uBA54\uD0C0\uB370\uC774\uD130 \uCD94\uCD9C \uB3C4\uAD6C
47
49
 
@@ -85,31 +87,31 @@ Options:
85
87
  -c, --config <path> \uC124\uC815 \uD30C\uC77C \uACBD\uB85C
86
88
  --verbose \uC0C1\uC138 \uB85C\uADF8 \uCD9C\uB825
87
89
  -h, --help \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC
88
- `;async function he(){let e=process.argv.slice(2);(e.length===0||e[0]==="-h"||e[0]==="--help")&&(console.log(G),process.exit(0)),(e[0]==="-v"||e[0]==="--version")&&(console.log(me),process.exit(0));let a=e[0];switch(a){case "analyze":await we(e.slice(1));break;case "upload":await Pe(e.slice(1));break;case "init":await je();break;case "database-init":await T();break;default:console.error(`Unknown command: ${a}`),console.log(G),process.exit(1);}}async function we(e){let{values:a}=util.parseArgs({args:e,options:{"project-id":{type:"string",short:"p"},output:{type:"string",short:"o"},config:{type:"string",short:"c"},upload:{type:"boolean"},"no-upload":{type:"boolean"},verbose:{type:"boolean"},help:{type:"boolean",short:"h"}}});a.help&&(console.log(ye),process.exit(0));let t=process.cwd(),o=a["project-id"]||m__namespace.basename(t),s=a.output||"project-metadata.json",n=a.verbose||false,c={};if(a.config)try{let p=await b__namespace.readFile(a.config,"utf-8");c=JSON.parse(p);}catch{console.error(`Failed to load config file: ${a.config}`),process.exit(1);}else {let p=m__namespace.join(t,"metadata.config.json");try{let l=await b__namespace.readFile(p,"utf-8");c=JSON.parse(l),n&&console.log(`Loaded config from ${p}`);}catch{}}let r=chunkGHNW3BJ2_cjs.d({...c,projectId:o,verbose:n,output:{file:{enabled:true,path:s},...c.output}});console.log(`
89
- \u{1F4E6} Analyzing project: ${o}`),console.log(`\u{1F4C1} Root directory: ${t}
90
- `);let g=new chunkGHNW3BJ2_cjs.y(r),i=new chunkGHNW3BJ2_cjs.z(r);try{let p=Date.now(),l=await g.analyze(t),$=Date.now()-p,u=m__namespace.resolve(t,s);if(await i.write(l,u),r.output.api?.enabled&&r.output.api.endpoint)try{new URL(r.output.api.endpoint),await new chunkGHNW3BJ2_cjs.A(r).send(l),console.log(`\u2601\uFE0F Sent to API: ${r.output.api.endpoint}`);}catch{n&&console.log(`\u26A0\uFE0F Invalid API endpoint, skipping: ${r.output.api.endpoint}`);}a.upload||!a["no-upload"]&&c.output?.database?.enabled?await ve(c,l,n):n&&console.log("\u2139\uFE0F DB upload skipped (use --upload to enable)"),console.log(`\u2705 Analysis completed in ${$}ms
91
- `),console.log("\u{1F4CA} Results:"),console.log(` Total files: ${l.stats.totalFiles}`),console.log(` - Routes: ${l.stats.byType.route}`),console.log(` - Components: ${l.stats.byType.component}`),console.log(` - Hooks: ${l.stats.byType.hook}`),console.log(` - Services: ${l.stats.byType.service}`),console.log(` - APIs: ${l.stats.byType.api}`),console.log(` - Tables: ${l.stats.byType.table}`),console.log(` - Utilities: ${l.stats.byType.utility}`),console.log(`
92
- \u{1F4C4} Output: ${u}`),l.stats.parseErrors.length>0&&(console.log(`
93
- \u26A0\uFE0F Parse errors (${l.stats.parseErrors.length}):`),l.stats.parseErrors.slice(0,5).forEach(R=>{console.log(` - ${R}`);}),l.stats.parseErrors.length>5&&console.log(` ... and ${l.stats.parseErrors.length-5} more`)),console.log("");}catch(p){console.error("\u274C Analysis failed:",p),process.exit(1);}}async function Pe(e){let{values:a}=util.parseArgs({args:e,options:{input:{type:"string",short:"i"},config:{type:"string",short:"c"},verbose:{type:"boolean"},help:{type:"boolean",short:"h"}}});a.help&&(console.log(be),process.exit(0));let t=process.cwd(),o=a.input||"project-metadata.json",s=a.verbose||false,n={};if(a.config)try{let i=await b__namespace.readFile(a.config,"utf-8");n=JSON.parse(i);}catch{console.error(`Failed to load config file: ${a.config}`),process.exit(1);}else {let i=m__namespace.join(t,"metadata.config.json");try{let p=await b__namespace.readFile(i,"utf-8");n=JSON.parse(p),s&&console.log(`Loaded config from ${i}`);}catch{console.error("\u274C metadata.config.json \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."),console.log(" npx metadatafy init \uC73C\uB85C \uC124\uC815\uC744 \uBA3C\uC800 \uC0DD\uC131\uD558\uC138\uC694."),process.exit(1);}}let c=m__namespace.resolve(t,o),r;try{let i=await b__namespace.readFile(c,"utf-8");r=JSON.parse(i);}catch{console.error(`\u274C \uBA54\uD0C0\uB370\uC774\uD130 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${c}`),console.log(" npx metadatafy analyze \uB85C \uBA3C\uC800 \uBD84\uC11D\uC744 \uC2E4\uD589\uD558\uC138\uC694."),process.exit(1);}console.log(`
94
- \u{1F4E4} Uploading metadata from: ${c}`);let g=await te(t,n);g||(console.error("\u274C \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."),console.log(" npx metadatafy database-init \uC73C\uB85C \uC124\uC815\uC744 \uCD94\uAC00\uD558\uC138\uC694."),process.exit(1));try{let p=await(await chunkXR3EVOXW_cjs.a(g)).upload(r);p.success?console.log(`
95
- \u2705 ${p.message} (${g.provider})`):(console.error(`
96
- \u274C Upload failed: ${p.error}`),process.exit(1));}catch(i){console.error(`
97
- \u274C Upload error: ${i instanceof Error?i.message:i}`),process.exit(1);}}async function je(){let e=process.cwd(),a=m__namespace.basename(e);console.log(`
90
+ `;async function he(){let e=process.argv.slice(2);(e.length===0||e[0]==="-h"||e[0]==="--help")&&(console.log(G),process.exit(0)),(e[0]==="-v"||e[0]==="--version")&&(console.log(me),process.exit(0));let s=e[0];switch(s){case "analyze":await we(e.slice(1));break;case "upload":await Pe(e.slice(1));break;case "init":await je();break;case "database-init":await I();break;default:console.error(`Unknown command: ${s}`),console.log(G),process.exit(1);}}async function we(e){let{values:s}=util.parseArgs({args:e,options:{"project-id":{type:"string",short:"p"},output:{type:"string",short:"o"},config:{type:"string",short:"c"},upload:{type:"boolean"},"no-upload":{type:"boolean"},verbose:{type:"boolean"},help:{type:"boolean",short:"h"}}});s.help&&(console.log(ye),process.exit(0));let t=process.cwd();chunkZAACVJBX_cjs.b(t,s.verbose);let a=s["project-id"]||f__namespace.basename(t),o=s.output||"project-metadata.json",n=s.verbose||false,i={};if(s.config)try{let l=await m__namespace.readFile(s.config,"utf-8");i=JSON.parse(l);}catch{console.error(`Failed to load config file: ${s.config}`),process.exit(1);}else {let l=f__namespace.join(t,"metadata.config.json");try{let p=await m__namespace.readFile(l,"utf-8");i=JSON.parse(p),n&&console.log(`Loaded config from ${l}`);}catch{}}let r=chunkRLSFEATG_cjs.d({...i,projectId:a,verbose:n,output:{file:{enabled:true,path:o},...i.output}});console.log(`
91
+ \u{1F4E6} Analyzing project: ${a}`),console.log(`\u{1F4C1} Root directory: ${t}
92
+ `);let u=new chunkRLSFEATG_cjs.y(r),c=new chunkRLSFEATG_cjs.z(r);try{let l=Date.now(),p=await u.analyze(t),j=Date.now()-l,v=f__namespace.resolve(t,o);if(await c.write(p,v),r.output.api?.enabled&&r.output.api.endpoint)try{new URL(r.output.api.endpoint),await new chunkRLSFEATG_cjs.A(r).send(p),console.log(`\u2601\uFE0F Sent to API: ${r.output.api.endpoint}`);}catch{n&&console.log(`\u26A0\uFE0F Invalid API endpoint, skipping: ${r.output.api.endpoint}`);}s.upload||!s["no-upload"]&&i.output?.database?.enabled?await ve(i,p,n):n&&console.log("\u2139\uFE0F DB upload skipped (use --upload to enable)"),console.log(`\u2705 Analysis completed in ${j}ms
93
+ `),console.log("\u{1F4CA} Results:"),console.log(` Total files: ${p.stats.totalFiles}`),console.log(` - Routes: ${p.stats.byType.route}`),console.log(` - Components: ${p.stats.byType.component}`),console.log(` - Hooks: ${p.stats.byType.hook}`),console.log(` - Services: ${p.stats.byType.service}`),console.log(` - APIs: ${p.stats.byType.api}`),console.log(` - Tables: ${p.stats.byType.table}`),console.log(` - Utilities: ${p.stats.byType.utility}`),console.log(`
94
+ \u{1F4C4} Output: ${v}`),p.stats.parseErrors.length>0&&(console.log(`
95
+ \u26A0\uFE0F Parse errors (${p.stats.parseErrors.length}):`),p.stats.parseErrors.slice(0,5).forEach(h=>{console.log(` - ${h}`);}),p.stats.parseErrors.length>5&&console.log(` ... and ${p.stats.parseErrors.length-5} more`)),console.log("");}catch(l){console.error("\u274C Analysis failed:",l),process.exit(1);}}async function Pe(e){let{values:s}=util.parseArgs({args:e,options:{input:{type:"string",short:"i"},config:{type:"string",short:"c"},verbose:{type:"boolean"},help:{type:"boolean",short:"h"}}});s.help&&(console.log(be),process.exit(0));let t=process.cwd();chunkZAACVJBX_cjs.b(t,s.verbose);let a=s.input||"project-metadata.json",o=s.verbose||false,n={};if(s.config)try{let c=await m__namespace.readFile(s.config,"utf-8");n=JSON.parse(c);}catch{console.error(`Failed to load config file: ${s.config}`),process.exit(1);}else {let c=f__namespace.join(t,"metadata.config.json");try{let l=await m__namespace.readFile(c,"utf-8");n=JSON.parse(l),o&&console.log(`Loaded config from ${c}`);}catch{console.error("\u274C metadata.config.json \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."),console.log(" npx metadatafy init \uC73C\uB85C \uC124\uC815\uC744 \uBA3C\uC800 \uC0DD\uC131\uD558\uC138\uC694."),process.exit(1);}}let i=f__namespace.resolve(t,a),r;try{let c=await m__namespace.readFile(i,"utf-8");r=JSON.parse(c);}catch{console.error(`\u274C \uBA54\uD0C0\uB370\uC774\uD130 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${i}`),console.log(" npx metadatafy analyze \uB85C \uBA3C\uC800 \uBD84\uC11D\uC744 \uC2E4\uD589\uD558\uC138\uC694."),process.exit(1);}console.log(`
96
+ \u{1F4E4} Uploading metadata from: ${i}`);let u=await te(t,n);u||(console.error("\u274C \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."),console.log(" npx metadatafy database-init \uC73C\uB85C \uC124\uC815\uC744 \uCD94\uAC00\uD558\uC138\uC694."),process.exit(1));try{let l=await(await chunkXR3EVOXW_cjs.a(u)).upload(r);l.success?console.log(`
97
+ \u2705 ${l.message} (${u.provider})`):(console.error(`
98
+ \u274C Upload failed: ${l.error}`),process.exit(1));}catch(c){console.error(`
99
+ \u274C Upload error: ${c instanceof Error?c.message:c}`),process.exit(1);}}async function je(){let e=process.cwd(),s=f__namespace.basename(e);console.log(`
98
100
  \u{1F680} metadatafy \uC124\uC815 \uB9C8\uBC95\uC0AC
99
- `),console.log(`\uD504\uB85C\uC81D\uD2B8: ${a}`),console.log(`\uACBD\uB85C: ${e}`),console.log(`
100
- \u{1F50D} \uD504\uB85C\uC81D\uD2B8 \uBD84\uC11D \uC911...`);let t=await C(e);console.log(`
101
- \u2705 \uAC10\uC9C0\uB41C \uC815\uBCF4:`),console.log(` \uD504\uB85C\uC81D\uD2B8 \uD0C0\uC785: ${D(t.type)}`),console.log(` \uD328\uD0A4\uC9C0 \uB9E4\uB2C8\uC800: ${t.packageManager}`),console.log(` TypeScript: ${t.hasTypescript?"\uC608":"\uC544\uB2C8\uC624"}`),t.existingFolders.length>0&&console.log(` \uC8FC\uC694 \uD3F4\uB354: ${t.existingFolders.slice(0,5).join(", ")}`);try{let o=await F(t.type),s=await M(t.packageManager),n=!1;o!=="node"&&o!=="unknown"&&(n=await B(o));let c=await K(),r=null;await V()&&(r=await J());let i={projectType:o,packageManager:s,projectInfo:t,addBuildIntegration:n,apiEndpoint:c,supabase:r},p=m__namespace.join(e,"metadata.config.json"),l=!0;try{await b__namespace.access(p),console.log(`
102
- \u26A0\uFE0F metadata.config.json \uD30C\uC77C\uC774 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.`),l=await W("\uB36E\uC5B4\uC4F8\uAE4C\uC694?",!1);}catch{}if(console.log(`
101
+ `),console.log(`\uD504\uB85C\uC81D\uD2B8: ${s}`),console.log(`\uACBD\uB85C: ${e}`);let{loadEnvFiles:t}=await import('./env-loader-CJAL6PKN.cjs'),{variables:a}=t(e);console.log(`
102
+ \u{1F50D} \uD504\uB85C\uC81D\uD2B8 \uBD84\uC11D \uC911...`);let o=await D(e);console.log(`
103
+ \u2705 \uAC10\uC9C0\uB41C \uC815\uBCF4:`),console.log(` \uD504\uB85C\uC81D\uD2B8 \uD0C0\uC785: ${O(o.type)}`),console.log(` \uD328\uD0A4\uC9C0 \uB9E4\uB2C8\uC800: ${o.packageManager}`),console.log(` TypeScript: ${o.hasTypescript?"\uC608":"\uC544\uB2C8\uC624"}`),o.existingFolders.length>0&&console.log(` \uC8FC\uC694 \uD3F4\uB354: ${o.existingFolders.slice(0,5).join(", ")}`);try{let n=await M(o.type),i=await B(o.packageManager),r=!1;n!=="node"&&n!=="unknown"&&(r=await K(n));let u=null;await J()&&(u=await V(a));let l={projectType:n,packageManager:i,projectInfo:o,addBuildIntegration:r,supabase:u},p=f__namespace.join(e,"metadata.config.json"),j=!0;try{await m__namespace.access(p),console.log(`
104
+ \u26A0\uFE0F metadata.config.json \uD30C\uC77C\uC774 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.`),j=await W("\uB36E\uC5B4\uC4F8\uAE4C\uC694?",!1);}catch{}if(console.log(`
103
105
  \u{1F4DD} \uC124\uC815 \uC801\uC6A9 \uC911...
104
- `),l){let u=await z(e,a,i);console.log(`\u2705 \uC124\uC815 \uD30C\uC77C \uC0DD\uC131: ${m__namespace.relative(e,u)}`);}if(n){let u=!1;if(o==="vite"||o==="cra"?u=await Y(e):o.startsWith("nextjs")&&(u=await q(e)),u){let h=o.startsWith("nextjs")?"next.config":"vite.config";console.log(`\u2705 ${h} \uD30C\uC77C\uC5D0 \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\uB428`);}else console.log("\u26A0\uFE0F \uBE4C\uB4DC \uC124\uC815 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC218\uB3D9\uC73C\uB85C \uCD94\uAC00\uD574\uC8FC\uC138\uC694.");}console.log(`
106
+ `),j){let y=await z(e,s,l);console.log(`\u2705 \uC124\uC815 \uD30C\uC77C \uC0DD\uC131: ${f__namespace.relative(e,y)}`);}if(r){let y=!1;if(n==="vite"||n==="cra"?y=await Y(e):n.startsWith("nextjs")&&(y=await q(e)),y){let h=n.startsWith("nextjs")?"next.config":"vite.config";console.log(`\u2705 ${h} \uD30C\uC77C\uC5D0 \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\uB428`);}else console.log("\u26A0\uFE0F \uBE4C\uB4DC \uC124\uC815 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC218\uB3D9\uC73C\uB85C \uCD94\uAC00\uD574\uC8FC\uC138\uC694.");}console.log(`
105
107
  \u{1F389} \uC124\uC815\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4!
106
- `);let $=m__namespace.join(e,"package.json");try{let u=await b__namespace.readFile($,"utf-8"),h=JSON.parse(u);({...h.dependencies,...h.devDependencies}).metadatafy||(console.log(`\u{1F4E6} \uB2E4\uC74C \uBA85\uB839\uC5B4\uB85C \uD328\uD0A4\uC9C0\uB97C \uC124\uCE58\uD558\uC138\uC694:
107
- `),console.log(` ${H(s)}
108
- `));}catch{}if(n?console.log("\u{1F527} \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uAC00 \uC0DD\uC131\uB429\uB2C8\uB2E4."):(console.log(`\u{1F4A1} \uC218\uB3D9 \uBD84\uC11D \uBA85\uB839\uC5B4:
108
+ `);let v=f__namespace.join(e,"package.json");try{let y=await m__namespace.readFile(v,"utf-8"),h=JSON.parse(y);({...h.dependencies,...h.devDependencies}).metadatafy||(console.log(`\u{1F4E6} \uB2E4\uC74C \uBA85\uB839\uC5B4\uB85C \uD328\uD0A4\uC9C0\uB97C \uC124\uCE58\uD558\uC138\uC694:
109
+ `),console.log(` ${H(i)}
110
+ `));}catch{}r?console.log("\u{1F527} \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uAC00 \uC0DD\uC131\uB429\uB2C8\uB2E4."):(console.log(`\u{1F4A1} \uC218\uB3D9 \uBD84\uC11D \uBA85\uB839\uC5B4:
109
111
  `),console.log(` npx metadatafy analyze
110
- `)),r){console.log("\u{1F5C4}\uFE0F Supabase \uC5F0\uB3D9\uC774 \uC124\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4."),console.log(` \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD574\uC8FC\uC138\uC694:
111
- `);let u=r.url.slice(2,-1),h=r.serviceRoleKey.slice(2,-1);console.log(` ${u}=https://your-project.supabase.co`),console.log(` ${h}=your-service-role-key
112
- `),console.log(`\u{1F4CB} Supabase\uC5D0\uC11C \uD14C\uC774\uBE14\uC744 \uC0DD\uC131\uD558\uC138\uC694:
113
- `),console.log(` CREATE TABLE ${r.tableName} (`),console.log(" id UUID DEFAULT gen_random_uuid() PRIMARY KEY,"),console.log(" project_id TEXT UNIQUE NOT NULL,"),console.log(" metadata JSONB NOT NULL,"),console.log(" created_at TIMESTAMPTZ DEFAULT NOW(),"),console.log(" updated_at TIMESTAMPTZ DEFAULT NOW()"),console.log(` );
114
- `);}}finally{O();}}function E(e){if(!e||typeof e!="string")return e;if(e.startsWith("${")&&e.endsWith("}")){let a=e.slice(2,-1);return process.env[a]||""}return e}async function te(e,a){let t=a.output?.database;if(!t||!t.enabled)return null;if(t.provider==="supabase"&&t.supabase){let{supabase:o}=t,s=E(o.url),n=E(o.serviceRoleKey);return !s||!n?(console.log("\u26A0\uFE0F Supabase \uD658\uACBD\uBCC0\uC218\uAC00 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."),o.url.startsWith("${")&&console.log(` ${o.url.slice(2,-1)}\uC744(\uB97C) \uC124\uC815\uD574\uC8FC\uC138\uC694.`),o.serviceRoleKey.startsWith("${")&&console.log(` ${o.serviceRoleKey.slice(2,-1)}\uC744(\uB97C) \uC124\uC815\uD574\uC8FC\uC138\uC694.`),null):{provider:"supabase",enabled:true,url:s,serviceRoleKey:n,tableName:o.tableName,fields:{projectId:o.fields.projectId,metadata:o.fields.metadata,createdAt:o.fields.createdAt,updatedAt:o.fields.updatedAt}}}if(t.provider==="custom"&&t.custom){let{custom:o}=t,s={};if(o.headers)for(let[n,c]of Object.entries(o.headers))s[n]=E(c);return {provider:"custom",enabled:true,endpoint:E(o.endpoint),method:o.method,headers:s}}return null}async function ve(e,a,t){let o=await te(process.cwd(),e);if(o){t&&console.log(`
115
- \u{1F5C4}\uFE0F Uploading to ${o.provider}...`);try{let n=await(await chunkXR3EVOXW_cjs.a(o)).upload(a);n.success?console.log(`\u{1F5C4}\uFE0F ${n.message} (${o.provider})`):console.log(`\u26A0\uFE0F Database upload failed: ${n.error}`);}catch(s){console.log(`\u26A0\uFE0F Database upload error: ${s instanceof Error?s.message:s}`);}}}he().catch(e=>{console.error("Fatal error:",e),process.exit(1);});
112
+ `)),u&&(console.log(`
113
+ \u{1F5C4}\uFE0F Supabase \uC5F0\uB3D9\uC774 \uC124\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.`),console.log(` \uD658\uACBD\uBCC0\uC218: \${${u.urlEnvName}}, \${${u.serviceRoleKeyEnvName}}`),console.log(`
114
+ \u{1F4CB} Supabase\uC5D0\uC11C \uD14C\uC774\uBE14\uC744 \uC0DD\uC131\uD558\uC138\uC694:
115
+ `),console.log(` CREATE TABLE ${u.tableName} (`),console.log(" id UUID DEFAULT gen_random_uuid() PRIMARY KEY,"),console.log(" project_id TEXT UNIQUE NOT NULL,"),console.log(" metadata JSONB NOT NULL,"),console.log(" created_at TIMESTAMPTZ DEFAULT NOW(),"),console.log(" updated_at TIMESTAMPTZ DEFAULT NOW()"),console.log(` );
116
+ `));}finally{F();}}function T(e){if(!e||typeof e!="string")return e;if(e.startsWith("${")&&e.endsWith("}")){let s=e.slice(2,-1);return process.env[s]||""}return e}async function te(e,s){let t=s.output?.database;if(!t||!t.enabled)return null;if(t.provider==="supabase"&&t.supabase){let{supabase:a}=t,o=T(a.url),n=T(a.serviceRoleKey);return !o||!n?(console.log("\u26A0\uFE0F Supabase \uD658\uACBD\uBCC0\uC218\uAC00 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."),a.url.startsWith("${")&&console.log(` ${a.url.slice(2,-1)}\uC744(\uB97C) \uC124\uC815\uD574\uC8FC\uC138\uC694.`),a.serviceRoleKey.startsWith("${")&&console.log(` ${a.serviceRoleKey.slice(2,-1)}\uC744(\uB97C) \uC124\uC815\uD574\uC8FC\uC138\uC694.`),null):{provider:"supabase",enabled:true,url:o,serviceRoleKey:n,tableName:a.tableName,fields:{projectId:a.fields.projectId,metadata:a.fields.metadata,createdAt:a.fields.createdAt,updatedAt:a.fields.updatedAt}}}if(t.provider==="custom"&&t.custom){let{custom:a}=t,o={};if(a.headers)for(let[n,i]of Object.entries(a.headers))o[n]=T(i);return {provider:"custom",enabled:true,endpoint:T(a.endpoint),method:a.method,headers:o}}return null}async function ve(e,s,t){let a=await te(process.cwd(),e);if(a){t&&console.log(`
117
+ \u{1F5C4}\uFE0F Uploading to ${a.provider}...`);try{let n=await(await chunkXR3EVOXW_cjs.a(a)).upload(s);n.success?console.log(`\u{1F5C4}\uFE0F ${n.message} (${a.provider})`):console.log(`\u26A0\uFE0F Database upload failed: ${n.error}`);}catch(o){console.log(`\u26A0\uFE0F Database upload error: ${o instanceof Error?o.message:o}`);}}}he().catch(e=>{console.error("Fatal error:",e),process.exit(1);});
package/dist/cli.js CHANGED
@@ -1,47 +1,49 @@
1
1
  #!/usr/bin/env node
2
- import {a}from'./chunk-ESZLTJIF.js';import {d,y as y$1,z as z$1,A}from'./chunk-SEPU4O45.js';import {parseArgs}from'util';import*as m from'path';import*as b from'fs/promises';import*as _ from'readline';async function oe(e){let a=[{file:"pnpm-lock.yaml",manager:"pnpm"},{file:"yarn.lock",manager:"yarn"},{file:"package-lock.json",manager:"npm"}];for(let{file:t,manager:o}of a)try{return await b.access(m.join(e,t)),o}catch{}return "npm"}async function ae(e){let a={};try{let o=await b.readFile(m.join(e,"package.json"),"utf-8");a=JSON.parse(o);}catch{return "unknown"}let t={...a.dependencies||{},...a.devDependencies||{}};return t.next?await v(m.join(e,"app"))||await v(m.join(e,"src","app"))?"nextjs-app":"nextjs-pages":t.vite?"vite":t["react-scripts"]?"cra":t.express||t.fastify||t.koa?"node":"unknown"}async function C(e){let[a,t]=await Promise.all([ae(e),oe(e)]),o=await se(m.join(e,"tsconfig.json")),s=await v(m.join(e,"src")),n=["app","pages","components","hooks","services","lib","utils","api","src/app","src/pages","src/components","src/hooks","src/services","src/lib","src/utils"],c=[];for(let i of n)await v(m.join(e,i))&&c.push(i);let r=await v(m.join(e,"prisma")),g=await v(m.join(e,"supabase"));return {type:a,packageManager:t,hasTypescript:o,hasSrc:s,existingFolders:c,hasPrisma:r,hasSupabase:g}}async function se(e){try{return (await b.stat(e)).isFile()}catch{return false}}async function v(e){try{return (await b.stat(e)).isDirectory()}catch{return false}}function D(e){return {"nextjs-app":"Next.js (App Router)","nextjs-pages":"Next.js (Pages Router)",vite:"Vite + React",cra:"Create React App",node:"Node.js Backend",unknown:"Unknown"}[e]}var S=null;function ne(){return S||(S=_.createInterface({input:process.stdin,output:process.stdout,terminal:false})),S}function y(e){return new Promise(a=>{process.stdout.write(e),ne().once("line",t=>{a(t);});})}function O(){S&&(S.close(),S=null);}async function F(e){let a=[{key:"1",type:"nextjs-app",label:"Next.js (App Router)"},{key:"2",type:"nextjs-pages",label:"Next.js (Pages Router)"},{key:"3",type:"vite",label:"Vite + React"},{key:"4",type:"cra",label:"Create React App"},{key:"5",type:"node",label:"Node.js Backend"}],t=a.findIndex(r=>r.type===e),o=t>=0?a[t].key:"1";console.log(`
3
- \u{1F4E6} \uD504\uB85C\uC81D\uD2B8 \uD0C0\uC785\uC744 \uC120\uD0DD\uD558\uC138\uC694:`),a.forEach(r=>{let i=r.type===e?" (\uAC10\uC9C0\uB428)":"";console.log(` ${r.key}) ${r.label}${i}`);});let n=(await y(`
4
- \uC120\uD0DD [${o}]: `)).trim()||o;return a.find(r=>r.key===n)?.type||e}async function M(e){let a=[{key:"1",manager:"npm"},{key:"2",manager:"yarn"},{key:"3",manager:"pnpm"}],t=a.findIndex(r=>r.manager===e),o=t>=0?a[t].key:"1";console.log(`
5
- \u{1F4E6} \uD328\uD0A4\uC9C0 \uB9E4\uB2C8\uC800\uB97C \uC120\uD0DD\uD558\uC138\uC694:`),a.forEach(r=>{let i=r.manager===e?" (\uAC10\uC9C0\uB428)":"";console.log(` ${r.key}) ${r.manager}${i}`);});let n=(await y(`
6
- \uC120\uD0DD [${o}]: `)).trim()||o;return a.find(r=>r.key===n)?.manager||e}async function B(e){if(e==="node"||e==="unknown")return false;let a=e.startsWith("nextjs")?"next.config":"vite.config";return console.log(`
7
- \u{1F527} ${a} \uD30C\uC77C\uC5D0 metadatafy \uD50C\uB7EC\uADF8\uC778\uC744 \uC790\uB3D9\uC73C\uB85C \uCD94\uAC00\uD560\uAE4C\uC694?`),console.log(" \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uAC00 \uC0DD\uC131\uB429\uB2C8\uB2E4."),(await y(`
8
- \uCD94\uAC00\uD560\uAE4C\uC694? [Y/n]: `)).trim().toLowerCase()!=="n"}async function K(){console.log(`
9
- \u2601\uFE0F API \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC804\uC1A1\uD560\uAE4C\uC694?`),console.log(" \uBE48\uCE78\uC73C\uB85C \uB450\uBA74 \uD30C\uC77C\uB9CC \uC0DD\uC131\uB429\uB2C8\uB2E4.");let a=(await y(`
10
- API URL (\uC120\uD0DD\uC0AC\uD56D): `)).trim();if(!a)return null;try{return new URL(a),a}catch{return console.log("\u26A0\uFE0F \uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 URL\uC785\uB2C8\uB2E4. API \uC804\uC1A1\uC744 \uAC74\uB108\uB701\uB2C8\uB2E4."),null}}async function W(e,a=true){let s=(await y(`${e} ${a?"[Y/n]":"[y/N]"}: `)).trim().toLowerCase();return s===""?a:s==="y"||s==="yes"}async function V(){return console.log(`
11
- \u{1F5C4}\uFE0F Supabase\uC5D0 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC790\uB3D9 \uC800\uC7A5\uD560\uAE4C\uC694?`),console.log(" \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC5C5\uB85C\uB4DC\uB429\uB2C8\uB2E4."),(await y(`
12
- Supabase \uC5F0\uB3D9 \uC124\uC815? [y/N]: `)).trim().toLowerCase()==="y"}async function J(){console.log(`
13
- \u{1F527} Supabase \uC124\uC815`),console.log(`Settings > API\uC5D0\uC11C \uD655\uC778\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.
14
- `),console.log("\u{1F4A1} \uD658\uACBD\uBCC0\uC218 \uC774\uB984\uC744 \uC785\uB825\uD558\uBA74 ${VAR} \uD615\uC2DD\uC73C\uB85C \uC800\uC7A5\uB429\uB2C8\uB2E4."),console.log(" \uC608: SUPABASE_URL \u2192 ${SUPABASE_URL}\n");let e=await y("Supabase URL \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_URL]: "),a=await y("Service Role Key \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_SERVICE_ROLE_KEY]: "),t=await y("\uD14C\uC774\uBE14 \uC774\uB984 [project_metadata]: "),o=e.trim()||"SUPABASE_URL",s=a.trim()||"SUPABASE_SERVICE_ROLE_KEY",n=t.trim()||"project_metadata";return {url:`\${${o}}`,serviceRoleKey:`\${${s}}`,tableName:n}}function re(e){let{projectType:a,projectInfo:t}=e,o=[],s=t.hasTypescript?"{ts,tsx}":"{js,jsx}";switch(a){case "nextjs-app":t.hasSrc?o.push(`src/app/**/*.${s}`):o.push(`app/**/*.${s}`),o.push(`components/**/*.${s}`),o.push(`hooks/**/*.${s}`),o.push(`lib/**/*.${s}`);break;case "nextjs-pages":t.hasSrc?o.push(`src/pages/**/*.${s}`):o.push(`pages/**/*.${s}`),o.push(`components/**/*.${s}`),o.push(`hooks/**/*.${s}`),o.push(`lib/**/*.${s}`);break;case "vite":case "cra":o.push(`src/**/*.${s}`);break;case "node":o.push(`src/**/*.${t.hasTypescript?"ts":"js"}`),o.push(`routes/**/*.${t.hasTypescript?"ts":"js"}`),o.push(`controllers/**/*.${t.hasTypescript?"ts":"js"}`);break;default:o.push(`src/**/*.${s}`);}return t.hasPrisma&&o.push("prisma/migrations/**/*.sql"),t.hasSupabase&&o.push("supabase/migrations/*.sql"),o}async function z(e,a,t){let o=m.join(e,"metadata.config.json"),s={projectId:a,include:re(t),exclude:["**/node_modules/**","**/.next/**","**/dist/**","**/build/**","**/*.test.{ts,tsx,js,jsx}","**/*.spec.{ts,tsx,js,jsx}","**/__tests__/**"],output:{file:{enabled:true,path:"project-metadata.json"},api:{enabled:!!t.apiEndpoint,endpoint:t.apiEndpoint||""},...t.supabase&&{database:{enabled:true,provider:"supabase",supabase:{url:t.supabase.url,serviceRoleKey:t.supabase.serviceRoleKey,tableName:t.supabase.tableName,fields:{projectId:"project_id",metadata:"metadata",createdAt:"created_at",updatedAt:"updated_at"}}}}},koreanKeywords:{},verbose:false};return await b.writeFile(o,JSON.stringify(s,null,2)),o}async function Y(e){let a=["vite.config.ts","vite.config.js","vite.config.mts","vite.config.mjs"];for(let t of a){let o=m.join(e,t);try{let s=await b.readFile(o,"utf-8");if(s.includes("metadatafy"))return !0;let n=`import metadatafy from 'metadatafy/vite';
15
- `;return s.includes("from 'vite'")?s=s.replace(/^(import .+ from ['"]vite['"];?\n)/m,`$1${n}`):s=n+s,s.includes("plugins:")?s=s.replace(/plugins:\s*\[/,`plugins: [
16
- metadatafy(),`):s.includes("defineConfig(")&&(s=s.replace(/defineConfig\(\{/,`defineConfig({
17
- plugins: [metadatafy()],`)),await b.writeFile(o,s),!0}catch{}}return false}async function q(e){let a=["next.config.ts","next.config.mjs","next.config.js"];for(let t of a){let o=m.join(e,t);try{let s=await b.readFile(o,"utf-8");if(s.includes("metadatafy")||s.includes("withMetadatafy"))return !0;let n=t.endsWith(".ts");return s=(t.endsWith(".mjs")||n?`import { withMetadatafy } from 'metadatafy/next';
2
+ import {a}from'./chunk-ESZLTJIF.js';import {d,y,z as z$1,A}from'./chunk-6MX4TMZZ.js';import {b as b$1}from'./chunk-BJMCLX3M.js';import {parseArgs}from'util';import*as f from'path';import*as m from'fs/promises';import*as _ from'readline';async function oe(e){let s=[{file:"pnpm-lock.yaml",manager:"pnpm"},{file:"yarn.lock",manager:"yarn"},{file:"package-lock.json",manager:"npm"}];for(let{file:t,manager:a}of s)try{return await m.access(f.join(e,t)),a}catch{}return "npm"}async function ae(e){let s={};try{let a=await m.readFile(f.join(e,"package.json"),"utf-8");s=JSON.parse(a);}catch{return "unknown"}let t={...s.dependencies||{},...s.devDependencies||{}};return t.next?await S(f.join(e,"app"))||await S(f.join(e,"src","app"))?"nextjs-app":"nextjs-pages":t.vite?"vite":t["react-scripts"]?"cra":t.express||t.fastify||t.koa?"node":"unknown"}async function D(e){let[s,t]=await Promise.all([ae(e),oe(e)]),a=await se(f.join(e,"tsconfig.json")),o=await S(f.join(e,"src")),n=["app","pages","components","hooks","services","lib","utils","api","src/app","src/pages","src/components","src/hooks","src/services","src/lib","src/utils"],i=[];for(let c of n)await S(f.join(e,c))&&i.push(c);let r=await S(f.join(e,"prisma")),u=await S(f.join(e,"supabase"));return {type:s,packageManager:t,hasTypescript:a,hasSrc:o,existingFolders:i,hasPrisma:r,hasSupabase:u}}async function se(e){try{return (await m.stat(e)).isFile()}catch{return false}}async function S(e){try{return (await m.stat(e)).isDirectory()}catch{return false}}function O(e){return {"nextjs-app":"Next.js (App Router)","nextjs-pages":"Next.js (Pages Router)",vite:"Vite + React",cra:"Create React App",node:"Node.js Backend",unknown:"Unknown"}[e]}var x=null;function ne(){return x||(x=_.createInterface({input:process.stdin,output:process.stdout,terminal:false})),x}function b(e){return new Promise(s=>{process.stdout.write(e),ne().once("line",t=>{s(t);});})}function F(){x&&(x.close(),x=null);}async function M(e){let s=[{key:"1",type:"nextjs-app",label:"Next.js (App Router)"},{key:"2",type:"nextjs-pages",label:"Next.js (Pages Router)"},{key:"3",type:"vite",label:"Vite + React"},{key:"4",type:"cra",label:"Create React App"},{key:"5",type:"node",label:"Node.js Backend"}],t=s.findIndex(r=>r.type===e),a=t>=0?s[t].key:"1";console.log(`
3
+ \u{1F4E6} \uD504\uB85C\uC81D\uD2B8 \uD0C0\uC785\uC744 \uC120\uD0DD\uD558\uC138\uC694:`),s.forEach(r=>{let c=r.type===e?" (\uAC10\uC9C0\uB428)":"";console.log(` ${r.key}) ${r.label}${c}`);});let n=(await b(`
4
+ \uC120\uD0DD [${a}]: `)).trim()||a;return s.find(r=>r.key===n)?.type||e}async function B(e){let s=[{key:"1",manager:"npm"},{key:"2",manager:"yarn"},{key:"3",manager:"pnpm"}],t=s.findIndex(r=>r.manager===e),a=t>=0?s[t].key:"1";console.log(`
5
+ \u{1F4E6} \uD328\uD0A4\uC9C0 \uB9E4\uB2C8\uC800\uB97C \uC120\uD0DD\uD558\uC138\uC694:`),s.forEach(r=>{let c=r.manager===e?" (\uAC10\uC9C0\uB428)":"";console.log(` ${r.key}) ${r.manager}${c}`);});let n=(await b(`
6
+ \uC120\uD0DD [${a}]: `)).trim()||a;return s.find(r=>r.key===n)?.manager||e}async function K(e){if(e==="node"||e==="unknown")return false;let s=e.startsWith("nextjs")?"next.config":"vite.config";return console.log(`
7
+ \u{1F527} ${s} \uD30C\uC77C\uC5D0 metadatafy \uD50C\uB7EC\uADF8\uC778\uC744 \uC790\uB3D9\uC73C\uB85C \uCD94\uAC00\uD560\uAE4C\uC694?`),console.log(" \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uAC00 \uC0DD\uC131\uB429\uB2C8\uB2E4."),(await b(`
8
+ \uCD94\uAC00\uD560\uAE4C\uC694? [Y/n]: `)).trim().toLowerCase()!=="n"}async function W(e,s=true){let o=(await b(`${e} ${s?"[Y/n]":"[y/N]"}: `)).trim().toLowerCase();return o===""?s:o==="y"||o==="yes"}async function J(){return console.log(`
9
+ \u{1F5C4}\uFE0F Supabase\uC5D0 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC790\uB3D9 \uC800\uC7A5\uD560\uAE4C\uC694?`),console.log(" \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC5C5\uB85C\uB4DC\uB429\uB2C8\uB2E4."),(await b(`
10
+ Supabase \uC5F0\uB3D9 \uC124\uC815? [y/N]: `)).trim().toLowerCase()==="y"}async function V(e={}){console.log(`
11
+ \u{1F527} Supabase \uC124\uC815`),console.log(`\uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C \uC0AC\uC6A9 \uC911\uC778 \uD658\uACBD\uBCC0\uC218 \uC774\uB984\uC744 \uC785\uB825\uD558\uC138\uC694.
12
+ `);let s=Object.keys(e).filter(l=>l.toLowerCase().includes("supabase"));s.length>0&&(console.log("\u{1F4CB} \uAC10\uC9C0\uB41C Supabase \uAD00\uB828 \uD658\uACBD\uBCC0\uC218:"),s.forEach(l=>console.log(` - ${l}`)),console.log(""));let t=await b("Supabase URL \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_URL]: "),a=await b("Service Role Key \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_SERVICE_ROLE_KEY]: "),o=t.trim()||"SUPABASE_URL",n=a.trim()||"SUPABASE_SERVICE_ROLE_KEY",i=!!e[o],r=!!e[n];if(i&&r)console.log(`
13
+ \u2705 .env \uD30C\uC77C\uC5D0\uC11C \uD658\uACBD\uBCC0\uC218\uB97C \uCC3E\uC558\uC2B5\uB2C8\uB2E4:`),console.log(` ${o}: ${e[o].substring(0,30)}...`),console.log(` ${n}: ****${e[n].slice(-8)}`);else {let l=[];i||l.push(o),r||l.push(n),console.log(`
14
+ \u26A0\uFE0F .env \uD30C\uC77C\uC5D0 \uB2E4\uC74C \uD658\uACBD\uBCC0\uC218\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4:`),l.forEach(p=>console.log(` - ${p}`)),console.log(`
15
+ \uB098\uC911\uC5D0 .env \uD30C\uC77C\uC5D0 \uCD94\uAC00\uD574\uC8FC\uC138\uC694.`);}let c=(await b(`
16
+ \uD14C\uC774\uBE14 \uC774\uB984 [project_metadata]: `)).trim()||"project_metadata";return {urlEnvName:o,serviceRoleKeyEnvName:n,tableName:c}}function re(e){let{projectType:s,projectInfo:t}=e,a=[],o=t.hasTypescript?"{ts,tsx}":"{js,jsx}";switch(s){case "nextjs-app":t.hasSrc?a.push(`src/app/**/*.${o}`):a.push(`app/**/*.${o}`),a.push(`components/**/*.${o}`),a.push(`hooks/**/*.${o}`),a.push(`lib/**/*.${o}`);break;case "nextjs-pages":t.hasSrc?a.push(`src/pages/**/*.${o}`):a.push(`pages/**/*.${o}`),a.push(`components/**/*.${o}`),a.push(`hooks/**/*.${o}`),a.push(`lib/**/*.${o}`);break;case "vite":case "cra":a.push(`src/**/*.${o}`);break;case "node":a.push(`src/**/*.${t.hasTypescript?"ts":"js"}`),a.push(`routes/**/*.${t.hasTypescript?"ts":"js"}`),a.push(`controllers/**/*.${t.hasTypescript?"ts":"js"}`);break;default:a.push(`src/**/*.${o}`);}return t.hasPrisma&&a.push("prisma/migrations/**/*.sql"),t.hasSupabase&&a.push("supabase/migrations/*.sql"),a}async function z(e,s,t){let a=f.join(e,"metadata.config.json"),o={projectId:s,include:re(t),exclude:["**/node_modules/**","**/.next/**","**/dist/**","**/build/**","**/*.test.{ts,tsx,js,jsx}","**/*.spec.{ts,tsx,js,jsx}","**/__tests__/**"],output:{file:{enabled:true,path:"project-metadata.json"},...t.supabase&&{database:{enabled:true,provider:"supabase",supabase:{url:`\${${t.supabase.urlEnvName}}`,serviceRoleKey:`\${${t.supabase.serviceRoleKeyEnvName}}`,tableName:t.supabase.tableName,fields:{projectId:"project_id",metadata:"metadata",createdAt:"created_at",updatedAt:"updated_at"}}}}},koreanKeywords:{},verbose:false};return await m.writeFile(a,JSON.stringify(o,null,2)),a}async function Y(e){let s=["vite.config.ts","vite.config.js","vite.config.mts","vite.config.mjs"];for(let t of s){let a=f.join(e,t);try{let o=await m.readFile(a,"utf-8");if(o.includes("metadatafy"))return !0;let n=`import metadatafy from 'metadatafy/vite';
17
+ `;return o.includes("from 'vite'")?o=o.replace(/^(import .+ from ['"]vite['"];?\n)/m,`$1${n}`):o=n+o,o.includes("plugins:")?o=o.replace(/plugins:\s*\[/,`plugins: [
18
+ metadatafy(),`):o.includes("defineConfig(")&&(o=o.replace(/defineConfig\(\{/,`defineConfig({
19
+ plugins: [metadatafy()],`)),await m.writeFile(a,o),!0}catch{}}return false}async function q(e){let s=["next.config.ts","next.config.mjs","next.config.js"];for(let t of s){let a=f.join(e,t);try{let o=await m.readFile(a,"utf-8");if(o.includes("metadatafy")||o.includes("withMetadatafy"))return !0;let n=t.endsWith(".ts");return o=(t.endsWith(".mjs")||n?`import { withMetadatafy } from 'metadatafy/next';
18
20
  `:`const { withMetadatafy } = require('metadatafy/next');
19
- `)+s,s.includes("export default")?(s=s.replace(/export default\s+({[\s\S]*?});?\s*$/m,"export default withMetadatafy($1);"),s=s.replace(/export default\s+(\w+);?\s*$/m,"export default withMetadatafy($1);")):s.includes("module.exports")&&(s=s.replace(/module\.exports\s*=\s*({[\s\S]*?});?\s*$/m,"module.exports = withMetadatafy($1);"),s=s.replace(/module\.exports\s*=\s*(\w+);?\s*$/m,"module.exports = withMetadatafy($1);")),await b.writeFile(o,s),!0}catch{}}return false}function H(e){switch(e){case "yarn":return "yarn add -D metadatafy";case "pnpm":return "pnpm add -D metadatafy";default:return "npm install -D metadatafy"}}var X=_.createInterface({input:process.stdin,output:process.stdout});function f(e){return new Promise(a=>{X.question(e,a);})}function Z(e){return new Promise(a=>{process.stdout.write(e);let t=process.stdin,o=t.isRaw;t.isTTY&&t.setRawMode(true);let s="",n=c=>{let r=c.toString("utf8");switch(r){case `
20
- `:case "\r":case "":t.isTTY&&t.setRawMode(o),t.removeListener("data",n),process.stdout.write(`
21
- `),a(s);break;case "":process.exit();break;case "\x7F":s.length>0&&(s=s.slice(0,-1),process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(e+"*".repeat(s.length)));break;default:s+=r,process.stdout.write("*");break}};t.on("data",n),t.resume();})}function ie(){X.close();}async function ce(){return console.log(`
22
- \u{1F4E6} \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uD504\uB85C\uBC14\uC774\uB354\uB97C \uC120\uD0DD\uD558\uC138\uC694:`),console.log(" 1) Supabase"),console.log(" 2) Custom API (\uC9C1\uC811 \uC124\uC815)"),console.log(" (Firebase, PlanetScale \uB4F1\uC740 \uCD94\uD6C4 \uC9C0\uC6D0 \uC608\uC815)"),((await f(`
21
+ `)+o,o.includes("export default")?(o=o.replace(/export default\s+({[\s\S]*?});?\s*$/m,"export default withMetadatafy($1);"),o=o.replace(/export default\s+(\w+);?\s*$/m,"export default withMetadatafy($1);")):o.includes("module.exports")&&(o=o.replace(/module\.exports\s*=\s*({[\s\S]*?});?\s*$/m,"module.exports = withMetadatafy($1);"),o=o.replace(/module\.exports\s*=\s*(\w+);?\s*$/m,"module.exports = withMetadatafy($1);")),await m.writeFile(a,o),!0}catch{}}return false}function H(e){switch(e){case "yarn":return "yarn add -D metadatafy";case "pnpm":return "pnpm add -D metadatafy";default:return "npm install -D metadatafy"}}var X=_.createInterface({input:process.stdin,output:process.stdout});function g(e){return new Promise(s=>{X.question(e,s);})}function Z(e){return new Promise(s=>{process.stdout.write(e);let t=process.stdin,a=t.isRaw;t.isTTY&&t.setRawMode(true);let o="",n=i=>{let r=i.toString("utf8");switch(r){case `
22
+ `:case "\r":case "":t.isTTY&&t.setRawMode(a),t.removeListener("data",n),process.stdout.write(`
23
+ `),s(o);break;case "":process.exit();break;case "\x7F":o.length>0&&(o=o.slice(0,-1),process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(e+"*".repeat(o.length)));break;default:o+=r,process.stdout.write("*");break}};t.on("data",n),t.resume();})}function ie(){X.close();}async function ce(){return console.log(`
24
+ \u{1F4E6} \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uD504\uB85C\uBC14\uC774\uB354\uB97C \uC120\uD0DD\uD558\uC138\uC694:`),console.log(" 1) Supabase"),console.log(" 2) Custom API (\uC9C1\uC811 \uC124\uC815)"),console.log(" (Firebase, PlanetScale \uB4F1\uC740 \uCD94\uD6C4 \uC9C0\uC6D0 \uC608\uC815)"),((await g(`
23
25
  \uC120\uD0DD [1]: `)).trim()||"1")==="2"?"custom":"supabase"}async function le(){return console.log(`
24
- \u{1F510} \uC778\uC99D \uC815\uBCF4 \uC800\uC7A5 \uBC29\uC2DD\uC744 \uC120\uD0DD\uD558\uC138\uC694:`),console.log(" 1) \uD658\uACBD\uBCC0\uC218 \uCC38\uC870 \uC0AC\uC6A9 (\uAD8C\uC7A5) - ${SUPABASE_URL} \uD615\uC2DD\uC73C\uB85C \uC800\uC7A5"),console.log(" 2) \uC9C1\uC811 \uAC12 \uC800\uC7A5 (\uBE44\uAD8C\uC7A5) - \uC2E4\uC81C \uAC12\uC744 config\uC5D0 \uC800\uC7A5"),(await f(`
26
+ \u{1F510} \uC778\uC99D \uC815\uBCF4 \uC800\uC7A5 \uBC29\uC2DD\uC744 \uC120\uD0DD\uD558\uC138\uC694:`),console.log(" 1) \uD658\uACBD\uBCC0\uC218 \uCC38\uC870 \uC0AC\uC6A9 (\uAD8C\uC7A5) - ${SUPABASE_URL} \uD615\uC2DD\uC73C\uB85C \uC800\uC7A5"),console.log(" 2) \uC9C1\uC811 \uAC12 \uC800\uC7A5 (\uBE44\uAD8C\uC7A5) - \uC2E4\uC81C \uAC12\uC744 config\uC5D0 \uC800\uC7A5"),(await g(`
25
27
  \uC120\uD0DD [1]: `)).trim()!=="2"}async function pe(e){console.log(`
26
28
  \u{1F527} Supabase \uC124\uC815
27
29
  `),console.log("Supabase \uB300\uC2DC\uBCF4\uB4DC\uC5D0\uC11C \uB2E4\uC74C \uC815\uBCF4\uB97C \uD655\uC778\uD558\uC138\uC694:"),console.log(`Settings > API > Project URL, service_role key
28
- `);let a,t,o,s;if(e){let $=await f("Supabase URL \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_URL]: "),u=await f("Supabase service role key \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_SERVICE_ROLE_KEY]: ");o=`\${${$.trim()||"SUPABASE_URL"}}`,s=`\${${u.trim()||"SUPABASE_SERVICE_ROLE_KEY"}}`,console.log(`
29
- \uC5F0\uACB0 \uD14C\uC2A4\uD2B8\uB97C \uC704\uD574 \uC2E4\uC81C \uAC12\uC744 \uC785\uB825\uD574\uC8FC\uC138\uC694 (\uC800\uC7A5\uB418\uC9C0 \uC54A\uC74C):`),a=await f("Supabase URL: "),t=await Z("Supabase service role key: ");}else a=await f("Supabase URL (\uC608: https://xxx.supabase.co): "),t=await Z("Supabase service role key: "),o=a.trim(),s=t;if(!a.trim()||!t)throw new Error("Supabase URL\uACFC service role key\uB294 \uD544\uC218\uC785\uB2C8\uB2E4.");let c=(await f(`
30
+ `);let s,t,a,o;if(e){let j=await g("Supabase URL \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_URL]: "),v=await g("Supabase service role key \uD658\uACBD\uBCC0\uC218 \uC774\uB984 [SUPABASE_SERVICE_ROLE_KEY]: ");a=`\${${j.trim()||"SUPABASE_URL"}}`,o=`\${${v.trim()||"SUPABASE_SERVICE_ROLE_KEY"}}`,console.log(`
31
+ \uC5F0\uACB0 \uD14C\uC2A4\uD2B8\uB97C \uC704\uD574 \uC2E4\uC81C \uAC12\uC744 \uC785\uB825\uD574\uC8FC\uC138\uC694 (\uC800\uC7A5\uB418\uC9C0 \uC54A\uC74C):`),s=await g("Supabase URL: "),t=await Z("Supabase service role key: ");}else s=await g("Supabase URL (\uC608: https://xxx.supabase.co): "),t=await Z("Supabase service role key: "),a=s.trim(),o=t;if(!s.trim()||!t)throw new Error("Supabase URL\uACFC service role key\uB294 \uD544\uC218\uC785\uB2C8\uB2E4.");let i=(await g(`
30
32
  \uD14C\uC774\uBE14 \uC774\uB984 [project_metadata]: `)).trim()||"project_metadata";console.log(`
31
33
  \u{1F4DD} \uD544\uB4DC \uB9E4\uD551 \uC124\uC815`),console.log(`\uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC800\uC7A5\uD560 \uCEEC\uB7FC \uC774\uB984\uC744 \uC785\uB825\uD558\uC138\uC694.
32
- `);let r=await f("\uD504\uB85C\uC81D\uD2B8 ID \uD544\uB4DC [project_id]: "),g=await f("\uBA54\uD0C0\uB370\uC774\uD130 JSON \uD544\uB4DC [metadata]: "),i=await f('\uC0DD\uC131 \uC2DC\uAC04 \uD544\uB4DC (\uBE48\uCE78=created_at, "none"=\uC0AC\uC6A9\uC548\uD568) [created_at]: '),p=await f('\uC5C5\uB370\uC774\uD2B8 \uC2DC\uAC04 \uD544\uB4DC (\uBE48\uCE78=updated_at, "none"=\uC0AC\uC6A9\uC548\uD568) [updated_at]: ');return {config:{enabled:true,provider:"supabase",supabase:{url:o,serviceRoleKey:s,tableName:c,fields:{projectId:r.trim()||"project_id",metadata:g.trim()||"metadata",...i.trim().toLowerCase()!=="none"&&{createdAt:i.trim()||"created_at"},...p.trim().toLowerCase()!=="none"&&{updatedAt:p.trim()||"updated_at"}}}},actualValues:{url:a.trim(),serviceRoleKey:t}}}async function ue(e,a$1){if(console.log(`
33
- \u{1F50C} \uC5F0\uACB0 \uD14C\uC2A4\uD2B8 \uC911...`),e.provider!=="supabase"||!e.supabase)return true;let t={provider:"supabase",enabled:true,url:a$1.url,serviceRoleKey:a$1.serviceRoleKey,tableName:e.supabase.tableName,fields:{projectId:e.supabase.fields.projectId,metadata:e.supabase.fields.metadata,createdAt:e.supabase.fields.createdAt,updatedAt:e.supabase.fields.updatedAt}};try{return await(await a(t)).testConnection()?(console.log("\u2705 \uC5F0\uACB0 \uC131\uACF5!"),!0):(console.log("\u274C \uC5F0\uACB0 \uC2E4\uD328. \uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694."),!1)}catch(o){return console.log(`\u274C \uC5F0\uACB0 \uC624\uB958: ${o instanceof Error?o.message:o}`),false}}async function de(e,a){let t=m.join(e,"metadata.config.json"),o={};try{let n=await b.readFile(t,"utf-8");o=JSON.parse(n);}catch{o={projectId:m.basename(e),include:["src/**/*.{ts,tsx}"],exclude:["**/node_modules/**","**/*.test.{ts,tsx}"],output:{}};}let s=o.output||{};return s.database=a,o.output=s,await b.writeFile(t,JSON.stringify(o,null,2)),t}function ge(e){if(!e.supabase)return;let{tableName:a,fields:t}=e.supabase;console.log(`
34
+ `);let r=await g("\uD504\uB85C\uC81D\uD2B8 ID \uD544\uB4DC [project_id]: "),u=await g("\uBA54\uD0C0\uB370\uC774\uD130 JSON \uD544\uB4DC [metadata]: "),c=await g('\uC0DD\uC131 \uC2DC\uAC04 \uD544\uB4DC (\uBE48\uCE78=created_at, "none"=\uC0AC\uC6A9\uC548\uD568) [created_at]: '),l=await g('\uC5C5\uB370\uC774\uD2B8 \uC2DC\uAC04 \uD544\uB4DC (\uBE48\uCE78=updated_at, "none"=\uC0AC\uC6A9\uC548\uD568) [updated_at]: ');return {config:{enabled:true,provider:"supabase",supabase:{url:a,serviceRoleKey:o,tableName:i,fields:{projectId:r.trim()||"project_id",metadata:u.trim()||"metadata",...c.trim().toLowerCase()!=="none"&&{createdAt:c.trim()||"created_at"},...l.trim().toLowerCase()!=="none"&&{updatedAt:l.trim()||"updated_at"}}}},actualValues:{url:s.trim(),serviceRoleKey:t}}}async function ue(e,s){if(console.log(`
35
+ \u{1F50C} \uC5F0\uACB0 \uD14C\uC2A4\uD2B8 \uC911...`),e.provider!=="supabase"||!e.supabase)return true;let t={provider:"supabase",enabled:true,url:s.url,serviceRoleKey:s.serviceRoleKey,tableName:e.supabase.tableName,fields:{projectId:e.supabase.fields.projectId,metadata:e.supabase.fields.metadata,createdAt:e.supabase.fields.createdAt,updatedAt:e.supabase.fields.updatedAt}};try{return await(await a(t)).testConnection()?(console.log("\u2705 \uC5F0\uACB0 \uC131\uACF5!"),!0):(console.log("\u274C \uC5F0\uACB0 \uC2E4\uD328. \uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694."),!1)}catch(a){return console.log(`\u274C \uC5F0\uACB0 \uC624\uB958: ${a instanceof Error?a.message:a}`),false}}async function de(e,s){let t=f.join(e,"metadata.config.json"),a={};try{let n=await m.readFile(t,"utf-8");a=JSON.parse(n);}catch{a={projectId:f.basename(e),include:["src/**/*.{ts,tsx}"],exclude:["**/node_modules/**","**/*.test.{ts,tsx}"],output:{}};}let o=a.output||{};return o.database=s,a.output=o,await m.writeFile(t,JSON.stringify(a,null,2)),t}function ge(e){if(!e.supabase)return;let{tableName:s,fields:t}=e.supabase;console.log(`
34
36
  \u{1F4CB} Supabase\uC5D0\uC11C \uB2E4\uC74C SQL\uB85C \uD14C\uC774\uBE14\uC744 \uC0DD\uC131\uD558\uC138\uC694:
35
- `),console.log("```sql"),console.log(`CREATE TABLE ${a} (`),console.log(" id UUID DEFAULT gen_random_uuid() PRIMARY KEY,"),console.log(` ${t.projectId} TEXT UNIQUE NOT NULL,`),console.log(` ${t.metadata} JSONB NOT NULL,`),t.createdAt&&console.log(` ${t.createdAt} TIMESTAMPTZ DEFAULT NOW(),`),t.updatedAt&&console.log(` ${t.updatedAt} TIMESTAMPTZ DEFAULT NOW()`),console.log(");"),console.log(""),console.log("-- RLS \uC815\uCC45 (\uD544\uC694\uC2DC)"),console.log(`ALTER TABLE ${a} ENABLE ROW LEVEL SECURITY;`),console.log("```\n");}function fe(e){if(e.provider!=="supabase"||!e.supabase)return;let{url:a,serviceRoleKey:t}=e.supabase;if(a.startsWith("${")||t.startsWith("${")){if(console.log(`\u{1F510} .env \uD30C\uC77C\uC5D0 \uB2E4\uC74C \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD558\uC138\uC694:
36
- `),a.startsWith("${")){let o=a.slice(2,-1);console.log(`${o}=https://your-project.supabase.co`);}if(t.startsWith("${")){let o=t.slice(2,-1);console.log(`${o}=your-service-role-key`);}console.log(`
37
+ `),console.log("```sql"),console.log(`CREATE TABLE ${s} (`),console.log(" id UUID DEFAULT gen_random_uuid() PRIMARY KEY,"),console.log(` ${t.projectId} TEXT UNIQUE NOT NULL,`),console.log(` ${t.metadata} JSONB NOT NULL,`),t.createdAt&&console.log(` ${t.createdAt} TIMESTAMPTZ DEFAULT NOW(),`),t.updatedAt&&console.log(` ${t.updatedAt} TIMESTAMPTZ DEFAULT NOW()`),console.log(");"),console.log(""),console.log("-- RLS \uC815\uCC45 (\uD544\uC694\uC2DC)"),console.log(`ALTER TABLE ${s} ENABLE ROW LEVEL SECURITY;`),console.log("```\n");}function fe(e){if(e.provider!=="supabase"||!e.supabase)return;let{url:s,serviceRoleKey:t}=e.supabase;if(s.startsWith("${")||t.startsWith("${")){if(console.log(`\u{1F510} .env \uD30C\uC77C\uC5D0 \uB2E4\uC74C \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD558\uC138\uC694:
38
+ `),s.startsWith("${")){let a=s.slice(2,-1);console.log(`${a}=https://your-project.supabase.co`);}if(t.startsWith("${")){let a=t.slice(2,-1);console.log(`${a}=your-service-role-key`);}console.log(`
37
39
  \u{1F4A1} CI/CD \uD658\uACBD\uC5D0\uC11C\uB294 \uD574\uB2F9 \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD574\uC8FC\uC138\uC694.`),console.log(" GitHub Actions: Settings > Secrets and variables > Actions"),console.log(` Vercel: Project Settings > Environment Variables
38
- `);}}async function T(){let e=process.cwd();console.log(`
40
+ `);}}async function I(){let e=process.cwd();console.log(`
39
41
  \u{1F5C4}\uFE0F metadatafy \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC124\uC815
40
42
  `),console.log("\uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC800\uC7A5\uD569\uB2C8\uB2E4."),console.log("\uC124\uC815\uC740 metadata.config.json\uC5D0 \uC800\uC7A5\uB429\uB2C8\uB2E4.");try{if(await ce()!=="supabase"){console.log(`
41
43
  \uD604\uC7AC Supabase\uB9CC \uC778\uD130\uB799\uD2F0\uBE0C \uC124\uC815\uC744 \uC9C0\uC6D0\uD569\uB2C8\uB2E4.`),console.log(`metadata.config.json\uC758 output.database\uB97C \uC9C1\uC811 \uC791\uC131\uD574\uC8FC\uC138\uC694.
42
- `);return}let t=await le(),{config:o,actualValues:s}=await pe(t);if(!await ue(o,s)&&(await f(`
43
- \uACC4\uC18D \uC9C4\uD589\uD560\uAE4C\uC694? [y/N]: `)).toLowerCase()!=="y"){console.log("\uC124\uC815\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.");return}let c=await de(e,o);console.log(`
44
- \u2705 \uC124\uC815 \uC800\uC7A5\uB428: ${m.relative(e,c)}`),ge(o),fe(o),console.log("\u{1F389} \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC124\uC815\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4!"),console.log(`
44
+ `);return}let t=await le(),{config:a,actualValues:o}=await pe(t);if(!await ue(a,o)&&(await g(`
45
+ \uACC4\uC18D \uC9C4\uD589\uD560\uAE4C\uC694? [y/N]: `)).toLowerCase()!=="y"){console.log("\uC124\uC815\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.");return}let i=await de(e,a);console.log(`
46
+ \u2705 \uC124\uC815 \uC800\uC7A5\uB428: ${f.relative(e,i)}`),ge(a),fe(a),console.log("\u{1F389} \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC124\uC815\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4!"),console.log(`
45
47
  \u{1F4A1} \uC0AC\uC6A9\uBC95:`),console.log(" npx metadatafy analyze # \uBD84\uC11D + DB \uC5C5\uB85C\uB4DC"),console.log("");}finally{ie();}}var me="1.3.1",G=`
46
48
  metadatafy - \uD504\uB85C\uC81D\uD2B8 \uBA54\uD0C0\uB370\uC774\uD130 \uCD94\uCD9C \uB3C4\uAD6C
47
49
 
@@ -85,31 +87,31 @@ Options:
85
87
  -c, --config <path> \uC124\uC815 \uD30C\uC77C \uACBD\uB85C
86
88
  --verbose \uC0C1\uC138 \uB85C\uADF8 \uCD9C\uB825
87
89
  -h, --help \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC
88
- `;async function he(){let e=process.argv.slice(2);(e.length===0||e[0]==="-h"||e[0]==="--help")&&(console.log(G),process.exit(0)),(e[0]==="-v"||e[0]==="--version")&&(console.log(me),process.exit(0));let a=e[0];switch(a){case "analyze":await we(e.slice(1));break;case "upload":await Pe(e.slice(1));break;case "init":await je();break;case "database-init":await T();break;default:console.error(`Unknown command: ${a}`),console.log(G),process.exit(1);}}async function we(e){let{values:a}=parseArgs({args:e,options:{"project-id":{type:"string",short:"p"},output:{type:"string",short:"o"},config:{type:"string",short:"c"},upload:{type:"boolean"},"no-upload":{type:"boolean"},verbose:{type:"boolean"},help:{type:"boolean",short:"h"}}});a.help&&(console.log(ye),process.exit(0));let t=process.cwd(),o=a["project-id"]||m.basename(t),s=a.output||"project-metadata.json",n=a.verbose||false,c={};if(a.config)try{let p=await b.readFile(a.config,"utf-8");c=JSON.parse(p);}catch{console.error(`Failed to load config file: ${a.config}`),process.exit(1);}else {let p=m.join(t,"metadata.config.json");try{let l=await b.readFile(p,"utf-8");c=JSON.parse(l),n&&console.log(`Loaded config from ${p}`);}catch{}}let r=d({...c,projectId:o,verbose:n,output:{file:{enabled:true,path:s},...c.output}});console.log(`
89
- \u{1F4E6} Analyzing project: ${o}`),console.log(`\u{1F4C1} Root directory: ${t}
90
- `);let g=new y$1(r),i=new z$1(r);try{let p=Date.now(),l=await g.analyze(t),$=Date.now()-p,u=m.resolve(t,s);if(await i.write(l,u),r.output.api?.enabled&&r.output.api.endpoint)try{new URL(r.output.api.endpoint),await new A(r).send(l),console.log(`\u2601\uFE0F Sent to API: ${r.output.api.endpoint}`);}catch{n&&console.log(`\u26A0\uFE0F Invalid API endpoint, skipping: ${r.output.api.endpoint}`);}a.upload||!a["no-upload"]&&c.output?.database?.enabled?await ve(c,l,n):n&&console.log("\u2139\uFE0F DB upload skipped (use --upload to enable)"),console.log(`\u2705 Analysis completed in ${$}ms
91
- `),console.log("\u{1F4CA} Results:"),console.log(` Total files: ${l.stats.totalFiles}`),console.log(` - Routes: ${l.stats.byType.route}`),console.log(` - Components: ${l.stats.byType.component}`),console.log(` - Hooks: ${l.stats.byType.hook}`),console.log(` - Services: ${l.stats.byType.service}`),console.log(` - APIs: ${l.stats.byType.api}`),console.log(` - Tables: ${l.stats.byType.table}`),console.log(` - Utilities: ${l.stats.byType.utility}`),console.log(`
92
- \u{1F4C4} Output: ${u}`),l.stats.parseErrors.length>0&&(console.log(`
93
- \u26A0\uFE0F Parse errors (${l.stats.parseErrors.length}):`),l.stats.parseErrors.slice(0,5).forEach(R=>{console.log(` - ${R}`);}),l.stats.parseErrors.length>5&&console.log(` ... and ${l.stats.parseErrors.length-5} more`)),console.log("");}catch(p){console.error("\u274C Analysis failed:",p),process.exit(1);}}async function Pe(e){let{values:a$1}=parseArgs({args:e,options:{input:{type:"string",short:"i"},config:{type:"string",short:"c"},verbose:{type:"boolean"},help:{type:"boolean",short:"h"}}});a$1.help&&(console.log(be),process.exit(0));let t=process.cwd(),o=a$1.input||"project-metadata.json",s=a$1.verbose||false,n={};if(a$1.config)try{let i=await b.readFile(a$1.config,"utf-8");n=JSON.parse(i);}catch{console.error(`Failed to load config file: ${a$1.config}`),process.exit(1);}else {let i=m.join(t,"metadata.config.json");try{let p=await b.readFile(i,"utf-8");n=JSON.parse(p),s&&console.log(`Loaded config from ${i}`);}catch{console.error("\u274C metadata.config.json \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."),console.log(" npx metadatafy init \uC73C\uB85C \uC124\uC815\uC744 \uBA3C\uC800 \uC0DD\uC131\uD558\uC138\uC694."),process.exit(1);}}let c=m.resolve(t,o),r;try{let i=await b.readFile(c,"utf-8");r=JSON.parse(i);}catch{console.error(`\u274C \uBA54\uD0C0\uB370\uC774\uD130 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${c}`),console.log(" npx metadatafy analyze \uB85C \uBA3C\uC800 \uBD84\uC11D\uC744 \uC2E4\uD589\uD558\uC138\uC694."),process.exit(1);}console.log(`
94
- \u{1F4E4} Uploading metadata from: ${c}`);let g=await te(t,n);g||(console.error("\u274C \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."),console.log(" npx metadatafy database-init \uC73C\uB85C \uC124\uC815\uC744 \uCD94\uAC00\uD558\uC138\uC694."),process.exit(1));try{let p=await(await a(g)).upload(r);p.success?console.log(`
95
- \u2705 ${p.message} (${g.provider})`):(console.error(`
96
- \u274C Upload failed: ${p.error}`),process.exit(1));}catch(i){console.error(`
97
- \u274C Upload error: ${i instanceof Error?i.message:i}`),process.exit(1);}}async function je(){let e=process.cwd(),a=m.basename(e);console.log(`
90
+ `;async function he(){let e=process.argv.slice(2);(e.length===0||e[0]==="-h"||e[0]==="--help")&&(console.log(G),process.exit(0)),(e[0]==="-v"||e[0]==="--version")&&(console.log(me),process.exit(0));let s=e[0];switch(s){case "analyze":await we(e.slice(1));break;case "upload":await Pe(e.slice(1));break;case "init":await je();break;case "database-init":await I();break;default:console.error(`Unknown command: ${s}`),console.log(G),process.exit(1);}}async function we(e){let{values:s}=parseArgs({args:e,options:{"project-id":{type:"string",short:"p"},output:{type:"string",short:"o"},config:{type:"string",short:"c"},upload:{type:"boolean"},"no-upload":{type:"boolean"},verbose:{type:"boolean"},help:{type:"boolean",short:"h"}}});s.help&&(console.log(ye),process.exit(0));let t=process.cwd();b$1(t,s.verbose);let a=s["project-id"]||f.basename(t),o=s.output||"project-metadata.json",n=s.verbose||false,i={};if(s.config)try{let l=await m.readFile(s.config,"utf-8");i=JSON.parse(l);}catch{console.error(`Failed to load config file: ${s.config}`),process.exit(1);}else {let l=f.join(t,"metadata.config.json");try{let p=await m.readFile(l,"utf-8");i=JSON.parse(p),n&&console.log(`Loaded config from ${l}`);}catch{}}let r=d({...i,projectId:a,verbose:n,output:{file:{enabled:true,path:o},...i.output}});console.log(`
91
+ \u{1F4E6} Analyzing project: ${a}`),console.log(`\u{1F4C1} Root directory: ${t}
92
+ `);let u=new y(r),c=new z$1(r);try{let l=Date.now(),p=await u.analyze(t),j=Date.now()-l,v=f.resolve(t,o);if(await c.write(p,v),r.output.api?.enabled&&r.output.api.endpoint)try{new URL(r.output.api.endpoint),await new A(r).send(p),console.log(`\u2601\uFE0F Sent to API: ${r.output.api.endpoint}`);}catch{n&&console.log(`\u26A0\uFE0F Invalid API endpoint, skipping: ${r.output.api.endpoint}`);}s.upload||!s["no-upload"]&&i.output?.database?.enabled?await ve(i,p,n):n&&console.log("\u2139\uFE0F DB upload skipped (use --upload to enable)"),console.log(`\u2705 Analysis completed in ${j}ms
93
+ `),console.log("\u{1F4CA} Results:"),console.log(` Total files: ${p.stats.totalFiles}`),console.log(` - Routes: ${p.stats.byType.route}`),console.log(` - Components: ${p.stats.byType.component}`),console.log(` - Hooks: ${p.stats.byType.hook}`),console.log(` - Services: ${p.stats.byType.service}`),console.log(` - APIs: ${p.stats.byType.api}`),console.log(` - Tables: ${p.stats.byType.table}`),console.log(` - Utilities: ${p.stats.byType.utility}`),console.log(`
94
+ \u{1F4C4} Output: ${v}`),p.stats.parseErrors.length>0&&(console.log(`
95
+ \u26A0\uFE0F Parse errors (${p.stats.parseErrors.length}):`),p.stats.parseErrors.slice(0,5).forEach(h=>{console.log(` - ${h}`);}),p.stats.parseErrors.length>5&&console.log(` ... and ${p.stats.parseErrors.length-5} more`)),console.log("");}catch(l){console.error("\u274C Analysis failed:",l),process.exit(1);}}async function Pe(e){let{values:s}=parseArgs({args:e,options:{input:{type:"string",short:"i"},config:{type:"string",short:"c"},verbose:{type:"boolean"},help:{type:"boolean",short:"h"}}});s.help&&(console.log(be),process.exit(0));let t=process.cwd();b$1(t,s.verbose);let a$1=s.input||"project-metadata.json",o=s.verbose||false,n={};if(s.config)try{let c=await m.readFile(s.config,"utf-8");n=JSON.parse(c);}catch{console.error(`Failed to load config file: ${s.config}`),process.exit(1);}else {let c=f.join(t,"metadata.config.json");try{let l=await m.readFile(c,"utf-8");n=JSON.parse(l),o&&console.log(`Loaded config from ${c}`);}catch{console.error("\u274C metadata.config.json \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."),console.log(" npx metadatafy init \uC73C\uB85C \uC124\uC815\uC744 \uBA3C\uC800 \uC0DD\uC131\uD558\uC138\uC694."),process.exit(1);}}let i=f.resolve(t,a$1),r;try{let c=await m.readFile(i,"utf-8");r=JSON.parse(c);}catch{console.error(`\u274C \uBA54\uD0C0\uB370\uC774\uD130 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${i}`),console.log(" npx metadatafy analyze \uB85C \uBA3C\uC800 \uBD84\uC11D\uC744 \uC2E4\uD589\uD558\uC138\uC694."),process.exit(1);}console.log(`
96
+ \u{1F4E4} Uploading metadata from: ${i}`);let u=await te(t,n);u||(console.error("\u274C \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."),console.log(" npx metadatafy database-init \uC73C\uB85C \uC124\uC815\uC744 \uCD94\uAC00\uD558\uC138\uC694."),process.exit(1));try{let l=await(await a(u)).upload(r);l.success?console.log(`
97
+ \u2705 ${l.message} (${u.provider})`):(console.error(`
98
+ \u274C Upload failed: ${l.error}`),process.exit(1));}catch(c){console.error(`
99
+ \u274C Upload error: ${c instanceof Error?c.message:c}`),process.exit(1);}}async function je(){let e=process.cwd(),s=f.basename(e);console.log(`
98
100
  \u{1F680} metadatafy \uC124\uC815 \uB9C8\uBC95\uC0AC
99
- `),console.log(`\uD504\uB85C\uC81D\uD2B8: ${a}`),console.log(`\uACBD\uB85C: ${e}`),console.log(`
100
- \u{1F50D} \uD504\uB85C\uC81D\uD2B8 \uBD84\uC11D \uC911...`);let t=await C(e);console.log(`
101
- \u2705 \uAC10\uC9C0\uB41C \uC815\uBCF4:`),console.log(` \uD504\uB85C\uC81D\uD2B8 \uD0C0\uC785: ${D(t.type)}`),console.log(` \uD328\uD0A4\uC9C0 \uB9E4\uB2C8\uC800: ${t.packageManager}`),console.log(` TypeScript: ${t.hasTypescript?"\uC608":"\uC544\uB2C8\uC624"}`),t.existingFolders.length>0&&console.log(` \uC8FC\uC694 \uD3F4\uB354: ${t.existingFolders.slice(0,5).join(", ")}`);try{let o=await F(t.type),s=await M(t.packageManager),n=!1;o!=="node"&&o!=="unknown"&&(n=await B(o));let c=await K(),r=null;await V()&&(r=await J());let i={projectType:o,packageManager:s,projectInfo:t,addBuildIntegration:n,apiEndpoint:c,supabase:r},p=m.join(e,"metadata.config.json"),l=!0;try{await b.access(p),console.log(`
102
- \u26A0\uFE0F metadata.config.json \uD30C\uC77C\uC774 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.`),l=await W("\uB36E\uC5B4\uC4F8\uAE4C\uC694?",!1);}catch{}if(console.log(`
101
+ `),console.log(`\uD504\uB85C\uC81D\uD2B8: ${s}`),console.log(`\uACBD\uB85C: ${e}`);let{loadEnvFiles:t}=await import('./env-loader-XD5JBEQO.js'),{variables:a}=t(e);console.log(`
102
+ \u{1F50D} \uD504\uB85C\uC81D\uD2B8 \uBD84\uC11D \uC911...`);let o=await D(e);console.log(`
103
+ \u2705 \uAC10\uC9C0\uB41C \uC815\uBCF4:`),console.log(` \uD504\uB85C\uC81D\uD2B8 \uD0C0\uC785: ${O(o.type)}`),console.log(` \uD328\uD0A4\uC9C0 \uB9E4\uB2C8\uC800: ${o.packageManager}`),console.log(` TypeScript: ${o.hasTypescript?"\uC608":"\uC544\uB2C8\uC624"}`),o.existingFolders.length>0&&console.log(` \uC8FC\uC694 \uD3F4\uB354: ${o.existingFolders.slice(0,5).join(", ")}`);try{let n=await M(o.type),i=await B(o.packageManager),r=!1;n!=="node"&&n!=="unknown"&&(r=await K(n));let u=null;await J()&&(u=await V(a));let l={projectType:n,packageManager:i,projectInfo:o,addBuildIntegration:r,supabase:u},p=f.join(e,"metadata.config.json"),j=!0;try{await m.access(p),console.log(`
104
+ \u26A0\uFE0F metadata.config.json \uD30C\uC77C\uC774 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.`),j=await W("\uB36E\uC5B4\uC4F8\uAE4C\uC694?",!1);}catch{}if(console.log(`
103
105
  \u{1F4DD} \uC124\uC815 \uC801\uC6A9 \uC911...
104
- `),l){let u=await z(e,a,i);console.log(`\u2705 \uC124\uC815 \uD30C\uC77C \uC0DD\uC131: ${m.relative(e,u)}`);}if(n){let u=!1;if(o==="vite"||o==="cra"?u=await Y(e):o.startsWith("nextjs")&&(u=await q(e)),u){let h=o.startsWith("nextjs")?"next.config":"vite.config";console.log(`\u2705 ${h} \uD30C\uC77C\uC5D0 \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\uB428`);}else console.log("\u26A0\uFE0F \uBE4C\uB4DC \uC124\uC815 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC218\uB3D9\uC73C\uB85C \uCD94\uAC00\uD574\uC8FC\uC138\uC694.");}console.log(`
106
+ `),j){let y=await z(e,s,l);console.log(`\u2705 \uC124\uC815 \uD30C\uC77C \uC0DD\uC131: ${f.relative(e,y)}`);}if(r){let y=!1;if(n==="vite"||n==="cra"?y=await Y(e):n.startsWith("nextjs")&&(y=await q(e)),y){let h=n.startsWith("nextjs")?"next.config":"vite.config";console.log(`\u2705 ${h} \uD30C\uC77C\uC5D0 \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\uB428`);}else console.log("\u26A0\uFE0F \uBE4C\uB4DC \uC124\uC815 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC218\uB3D9\uC73C\uB85C \uCD94\uAC00\uD574\uC8FC\uC138\uC694.");}console.log(`
105
107
  \u{1F389} \uC124\uC815\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4!
106
- `);let $=m.join(e,"package.json");try{let u=await b.readFile($,"utf-8"),h=JSON.parse(u);({...h.dependencies,...h.devDependencies}).metadatafy||(console.log(`\u{1F4E6} \uB2E4\uC74C \uBA85\uB839\uC5B4\uB85C \uD328\uD0A4\uC9C0\uB97C \uC124\uCE58\uD558\uC138\uC694:
107
- `),console.log(` ${H(s)}
108
- `));}catch{}if(n?console.log("\u{1F527} \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uAC00 \uC0DD\uC131\uB429\uB2C8\uB2E4."):(console.log(`\u{1F4A1} \uC218\uB3D9 \uBD84\uC11D \uBA85\uB839\uC5B4:
108
+ `);let v=f.join(e,"package.json");try{let y=await m.readFile(v,"utf-8"),h=JSON.parse(y);({...h.dependencies,...h.devDependencies}).metadatafy||(console.log(`\u{1F4E6} \uB2E4\uC74C \uBA85\uB839\uC5B4\uB85C \uD328\uD0A4\uC9C0\uB97C \uC124\uCE58\uD558\uC138\uC694:
109
+ `),console.log(` ${H(i)}
110
+ `));}catch{}r?console.log("\u{1F527} \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uAC00 \uC0DD\uC131\uB429\uB2C8\uB2E4."):(console.log(`\u{1F4A1} \uC218\uB3D9 \uBD84\uC11D \uBA85\uB839\uC5B4:
109
111
  `),console.log(` npx metadatafy analyze
110
- `)),r){console.log("\u{1F5C4}\uFE0F Supabase \uC5F0\uB3D9\uC774 \uC124\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4."),console.log(` \uD658\uACBD\uBCC0\uC218\uB97C \uC124\uC815\uD574\uC8FC\uC138\uC694:
111
- `);let u=r.url.slice(2,-1),h=r.serviceRoleKey.slice(2,-1);console.log(` ${u}=https://your-project.supabase.co`),console.log(` ${h}=your-service-role-key
112
- `),console.log(`\u{1F4CB} Supabase\uC5D0\uC11C \uD14C\uC774\uBE14\uC744 \uC0DD\uC131\uD558\uC138\uC694:
113
- `),console.log(` CREATE TABLE ${r.tableName} (`),console.log(" id UUID DEFAULT gen_random_uuid() PRIMARY KEY,"),console.log(" project_id TEXT UNIQUE NOT NULL,"),console.log(" metadata JSONB NOT NULL,"),console.log(" created_at TIMESTAMPTZ DEFAULT NOW(),"),console.log(" updated_at TIMESTAMPTZ DEFAULT NOW()"),console.log(` );
114
- `);}}finally{O();}}function E(e){if(!e||typeof e!="string")return e;if(e.startsWith("${")&&e.endsWith("}")){let a=e.slice(2,-1);return process.env[a]||""}return e}async function te(e,a){let t=a.output?.database;if(!t||!t.enabled)return null;if(t.provider==="supabase"&&t.supabase){let{supabase:o}=t,s=E(o.url),n=E(o.serviceRoleKey);return !s||!n?(console.log("\u26A0\uFE0F Supabase \uD658\uACBD\uBCC0\uC218\uAC00 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."),o.url.startsWith("${")&&console.log(` ${o.url.slice(2,-1)}\uC744(\uB97C) \uC124\uC815\uD574\uC8FC\uC138\uC694.`),o.serviceRoleKey.startsWith("${")&&console.log(` ${o.serviceRoleKey.slice(2,-1)}\uC744(\uB97C) \uC124\uC815\uD574\uC8FC\uC138\uC694.`),null):{provider:"supabase",enabled:true,url:s,serviceRoleKey:n,tableName:o.tableName,fields:{projectId:o.fields.projectId,metadata:o.fields.metadata,createdAt:o.fields.createdAt,updatedAt:o.fields.updatedAt}}}if(t.provider==="custom"&&t.custom){let{custom:o}=t,s={};if(o.headers)for(let[n,c]of Object.entries(o.headers))s[n]=E(c);return {provider:"custom",enabled:true,endpoint:E(o.endpoint),method:o.method,headers:s}}return null}async function ve(e,a$1,t){let o=await te(process.cwd(),e);if(o){t&&console.log(`
115
- \u{1F5C4}\uFE0F Uploading to ${o.provider}...`);try{let n=await(await a(o)).upload(a$1);n.success?console.log(`\u{1F5C4}\uFE0F ${n.message} (${o.provider})`):console.log(`\u26A0\uFE0F Database upload failed: ${n.error}`);}catch(s){console.log(`\u26A0\uFE0F Database upload error: ${s instanceof Error?s.message:s}`);}}}he().catch(e=>{console.error("Fatal error:",e),process.exit(1);});
112
+ `)),u&&(console.log(`
113
+ \u{1F5C4}\uFE0F Supabase \uC5F0\uB3D9\uC774 \uC124\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.`),console.log(` \uD658\uACBD\uBCC0\uC218: \${${u.urlEnvName}}, \${${u.serviceRoleKeyEnvName}}`),console.log(`
114
+ \u{1F4CB} Supabase\uC5D0\uC11C \uD14C\uC774\uBE14\uC744 \uC0DD\uC131\uD558\uC138\uC694:
115
+ `),console.log(` CREATE TABLE ${u.tableName} (`),console.log(" id UUID DEFAULT gen_random_uuid() PRIMARY KEY,"),console.log(" project_id TEXT UNIQUE NOT NULL,"),console.log(" metadata JSONB NOT NULL,"),console.log(" created_at TIMESTAMPTZ DEFAULT NOW(),"),console.log(" updated_at TIMESTAMPTZ DEFAULT NOW()"),console.log(` );
116
+ `));}finally{F();}}function T(e){if(!e||typeof e!="string")return e;if(e.startsWith("${")&&e.endsWith("}")){let s=e.slice(2,-1);return process.env[s]||""}return e}async function te(e,s){let t=s.output?.database;if(!t||!t.enabled)return null;if(t.provider==="supabase"&&t.supabase){let{supabase:a}=t,o=T(a.url),n=T(a.serviceRoleKey);return !o||!n?(console.log("\u26A0\uFE0F Supabase \uD658\uACBD\uBCC0\uC218\uAC00 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."),a.url.startsWith("${")&&console.log(` ${a.url.slice(2,-1)}\uC744(\uB97C) \uC124\uC815\uD574\uC8FC\uC138\uC694.`),a.serviceRoleKey.startsWith("${")&&console.log(` ${a.serviceRoleKey.slice(2,-1)}\uC744(\uB97C) \uC124\uC815\uD574\uC8FC\uC138\uC694.`),null):{provider:"supabase",enabled:true,url:o,serviceRoleKey:n,tableName:a.tableName,fields:{projectId:a.fields.projectId,metadata:a.fields.metadata,createdAt:a.fields.createdAt,updatedAt:a.fields.updatedAt}}}if(t.provider==="custom"&&t.custom){let{custom:a}=t,o={};if(a.headers)for(let[n,i]of Object.entries(a.headers))o[n]=T(i);return {provider:"custom",enabled:true,endpoint:T(a.endpoint),method:a.method,headers:o}}return null}async function ve(e,s,t){let a$1=await te(process.cwd(),e);if(a$1){t&&console.log(`
117
+ \u{1F5C4}\uFE0F Uploading to ${a$1.provider}...`);try{let n=await(await a(a$1)).upload(s);n.success?console.log(`\u{1F5C4}\uFE0F ${n.message} (${a$1.provider})`):console.log(`\u26A0\uFE0F Database upload failed: ${n.error}`);}catch(o){console.log(`\u26A0\uFE0F Database upload error: ${o instanceof Error?o.message:o}`);}}}he().catch(e=>{console.error("Fatal error:",e),process.exit(1);});
@@ -0,0 +1 @@
1
+ 'use strict';var chunkZAACVJBX_cjs=require('./chunk-ZAACVJBX.cjs');Object.defineProperty(exports,"loadEnvFiles",{enumerable:true,get:function(){return chunkZAACVJBX_cjs.a}});Object.defineProperty(exports,"loadEnvWithLog",{enumerable:true,get:function(){return chunkZAACVJBX_cjs.b}});
@@ -0,0 +1 @@
1
+ export{a as loadEnvFiles,b as loadEnvWithLog}from'./chunk-BJMCLX3M.js';
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- 'use strict';var chunkGHNW3BJ2_cjs=require('./chunk-GHNW3BJ2.cjs');Object.defineProperty(exports,"ApiSender",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.A}});Object.defineProperty(exports,"CallGraphBuilder",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.w}});Object.defineProperty(exports,"DEFAULT_EXCLUDE_PATTERNS",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.c}});Object.defineProperty(exports,"DEFAULT_FILE_TYPE_MAPPING",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.a}});Object.defineProperty(exports,"DEFAULT_INCLUDE_PATTERNS",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.b}});Object.defineProperty(exports,"DependencyResolver",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.v}});Object.defineProperty(exports,"ExportExtractor",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.i}});Object.defineProperty(exports,"FileWriter",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.z}});Object.defineProperty(exports,"ImportExtractor",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.h}});Object.defineProperty(exports,"KOREAN_KEYWORD_MAP",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.r}});Object.defineProperty(exports,"KeywordExtractor",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.u}});Object.defineProperty(exports,"ProjectAnalyzer",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.y}});Object.defineProperty(exports,"PropsExtractor",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.j}});Object.defineProperty(exports,"SQLParser",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.g}});Object.defineProperty(exports,"SupabaseApiSender",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.B}});Object.defineProperty(exports,"TypeScriptParser",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.f}});Object.defineProperty(exports,"createDefaultConfig",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.d}});Object.defineProperty(exports,"extendKoreanMap",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.t}});Object.defineProperty(exports,"extractAcronyms",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.p}});Object.defineProperty(exports,"findKoreanKeywords",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.s}});Object.defineProperty(exports,"generateId",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.x}});Object.defineProperty(exports,"splitCamelCase",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.k}});Object.defineProperty(exports,"splitIntoWords",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.o}});Object.defineProperty(exports,"splitKebabCase",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.n}});Object.defineProperty(exports,"splitPascalCase",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.l}});Object.defineProperty(exports,"splitSnakeCase",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.m}});Object.defineProperty(exports,"toAllCases",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.q}});Object.defineProperty(exports,"validateConfig",{enumerable:true,get:function(){return chunkGHNW3BJ2_cjs.e}});
1
+ 'use strict';var chunkRLSFEATG_cjs=require('./chunk-RLSFEATG.cjs');Object.defineProperty(exports,"ApiSender",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.A}});Object.defineProperty(exports,"CallGraphBuilder",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.w}});Object.defineProperty(exports,"DEFAULT_EXCLUDE_PATTERNS",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.c}});Object.defineProperty(exports,"DEFAULT_FILE_TYPE_MAPPING",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.a}});Object.defineProperty(exports,"DEFAULT_INCLUDE_PATTERNS",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.b}});Object.defineProperty(exports,"DependencyResolver",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.v}});Object.defineProperty(exports,"ExportExtractor",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.i}});Object.defineProperty(exports,"FileWriter",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.z}});Object.defineProperty(exports,"ImportExtractor",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.h}});Object.defineProperty(exports,"KOREAN_KEYWORD_MAP",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.r}});Object.defineProperty(exports,"KeywordExtractor",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.u}});Object.defineProperty(exports,"ProjectAnalyzer",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.y}});Object.defineProperty(exports,"PropsExtractor",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.j}});Object.defineProperty(exports,"SQLParser",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.g}});Object.defineProperty(exports,"SupabaseApiSender",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.B}});Object.defineProperty(exports,"TypeScriptParser",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.f}});Object.defineProperty(exports,"createDefaultConfig",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.d}});Object.defineProperty(exports,"extendKoreanMap",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.t}});Object.defineProperty(exports,"extractAcronyms",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.p}});Object.defineProperty(exports,"findKoreanKeywords",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.s}});Object.defineProperty(exports,"generateId",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.x}});Object.defineProperty(exports,"splitCamelCase",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.k}});Object.defineProperty(exports,"splitIntoWords",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.o}});Object.defineProperty(exports,"splitKebabCase",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.n}});Object.defineProperty(exports,"splitPascalCase",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.l}});Object.defineProperty(exports,"splitSnakeCase",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.m}});Object.defineProperty(exports,"toAllCases",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.q}});Object.defineProperty(exports,"validateConfig",{enumerable:true,get:function(){return chunkRLSFEATG_cjs.e}});
package/dist/index.d.cts CHANGED
@@ -4,6 +4,7 @@ import ts from 'typescript';
4
4
 
5
5
  /**
6
6
  * 기본 파일 타입 매핑 (glob 패턴 -> FileType)
7
+ * @deprecated 폴더 기반 자동 감지를 사용하세요. 이 매핑은 하위 호환성을 위해 유지됩니다.
7
8
  */
8
9
  declare const DEFAULT_FILE_TYPE_MAPPING: Record<string, FileType>;
9
10
  /**
@@ -35,6 +36,7 @@ declare class ProjectAnalyzer {
35
36
  private propsExtractor;
36
37
  private keywordExtractor;
37
38
  private callGraphBuilder;
39
+ private codePatternDetector;
38
40
  constructor(config: PluginConfig);
39
41
  /**
40
42
  * 프로젝트 분석 실행
@@ -49,7 +51,16 @@ declare class ProjectAnalyzer {
49
51
  */
50
52
  private parseFile;
51
53
  /**
52
- * 파일 타입 결정
54
+ * 파일 타입 결정 (확실한 패턴만 처리, 나머지는 코드 분석에 위임)
55
+ *
56
+ * 감지 우선순위:
57
+ * 1. SQL 마이그레이션 파일
58
+ * 2. Next.js 특수 파일 (page.tsx, layout.tsx, route.ts)
59
+ * 3. 경로 세그먼트 (/api/)
60
+ * 4. 사용자 정의 glob 패턴
61
+ * 5. pages 폴더 (Next.js Pages Router)
62
+ *
63
+ * 나머지는 코드 패턴 분석으로 처리 (parseFile에서 수행)
53
64
  */
54
65
  private determineFileType;
55
66
  /**
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ import ts from 'typescript';
4
4
 
5
5
  /**
6
6
  * 기본 파일 타입 매핑 (glob 패턴 -> FileType)
7
+ * @deprecated 폴더 기반 자동 감지를 사용하세요. 이 매핑은 하위 호환성을 위해 유지됩니다.
7
8
  */
8
9
  declare const DEFAULT_FILE_TYPE_MAPPING: Record<string, FileType>;
9
10
  /**
@@ -35,6 +36,7 @@ declare class ProjectAnalyzer {
35
36
  private propsExtractor;
36
37
  private keywordExtractor;
37
38
  private callGraphBuilder;
39
+ private codePatternDetector;
38
40
  constructor(config: PluginConfig);
39
41
  /**
40
42
  * 프로젝트 분석 실행
@@ -49,7 +51,16 @@ declare class ProjectAnalyzer {
49
51
  */
50
52
  private parseFile;
51
53
  /**
52
- * 파일 타입 결정
54
+ * 파일 타입 결정 (확실한 패턴만 처리, 나머지는 코드 분석에 위임)
55
+ *
56
+ * 감지 우선순위:
57
+ * 1. SQL 마이그레이션 파일
58
+ * 2. Next.js 특수 파일 (page.tsx, layout.tsx, route.ts)
59
+ * 3. 경로 세그먼트 (/api/)
60
+ * 4. 사용자 정의 glob 패턴
61
+ * 5. pages 폴더 (Next.js Pages Router)
62
+ *
63
+ * 나머지는 코드 패턴 분석으로 처리 (parseFile에서 수행)
53
64
  */
54
65
  private determineFileType;
55
66
  /**
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- export{A as ApiSender,w as CallGraphBuilder,c as DEFAULT_EXCLUDE_PATTERNS,a as DEFAULT_FILE_TYPE_MAPPING,b as DEFAULT_INCLUDE_PATTERNS,v as DependencyResolver,i as ExportExtractor,z as FileWriter,h as ImportExtractor,r as KOREAN_KEYWORD_MAP,u as KeywordExtractor,y as ProjectAnalyzer,j as PropsExtractor,g as SQLParser,B as SupabaseApiSender,f as TypeScriptParser,d as createDefaultConfig,t as extendKoreanMap,p as extractAcronyms,s as findKoreanKeywords,x as generateId,k as splitCamelCase,o as splitIntoWords,n as splitKebabCase,l as splitPascalCase,m as splitSnakeCase,q as toAllCases,e as validateConfig}from'./chunk-SEPU4O45.js';
1
+ export{A as ApiSender,w as CallGraphBuilder,c as DEFAULT_EXCLUDE_PATTERNS,a as DEFAULT_FILE_TYPE_MAPPING,b as DEFAULT_INCLUDE_PATTERNS,v as DependencyResolver,i as ExportExtractor,z as FileWriter,h as ImportExtractor,r as KOREAN_KEYWORD_MAP,u as KeywordExtractor,y as ProjectAnalyzer,j as PropsExtractor,g as SQLParser,B as SupabaseApiSender,f as TypeScriptParser,d as createDefaultConfig,t as extendKoreanMap,p as extractAcronyms,s as findKoreanKeywords,x as generateId,k as splitCamelCase,o as splitIntoWords,n as splitKebabCase,l as splitPascalCase,m as splitSnakeCase,q as toAllCases,e as validateConfig}from'./chunk-6MX4TMZZ.js';
package/dist/next.cjs CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var chunkXR3EVOXW_cjs=require('./chunk-XR3EVOXW.cjs'),chunkGHNW3BJ2_cjs=require('./chunk-GHNW3BJ2.cjs'),u=require('path'),v=require('fs/promises');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var u__namespace=/*#__PURE__*/_interopNamespace(u);var v__namespace=/*#__PURE__*/_interopNamespace(v);async function f(a,t,e){let i=new chunkGHNW3BJ2_cjs.y(a),n=new chunkGHNW3BJ2_cjs.z(a),l=a.output.api?.enabled?new chunkGHNW3BJ2_cjs.A(a):null;a.verbose&&console.log("[metadata-plugin] Starting analysis...");let r=await i.analyze(t);if(a.output.file?.enabled){let s=u__namespace.resolve(t,a.output.file.path);await n.write(r,s),a.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${s}`);}if(l&&(await l.send(r),a.verbose&&console.log("[metadata-plugin] Sent metadata to API")),e?.url&&e?.serviceRoleKey)try{let s={provider:"supabase",enabled:!0,url:e.url,serviceRoleKey:e.serviceRoleKey,tableName:e.tableName,fields:{projectId:e.fields?.projectId||"project_id",metadata:e.fields?.metadata||"metadata",createdAt:e.fields?.createdAt||"created_at",updatedAt:e.fields?.updatedAt||"updated_at"}},p=await(await chunkXR3EVOXW_cjs.a(s)).upload(r);a.verbose&&(p.success?console.log(`[metadata-plugin] ${p.message} (Supabase)`):console.log(`[metadata-plugin] Supabase upload failed: ${p.error}`));}catch(s){console.error("[metadata-plugin] Supabase upload error:",s);}}function A(a={}){let t=chunkGHNW3BJ2_cjs.d(a),e=a.supabase,i=chunkGHNW3BJ2_cjs.e(t);if(i.length>0)throw new Error(`[metadata-plugin] Invalid config:
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var chunkXR3EVOXW_cjs=require('./chunk-XR3EVOXW.cjs'),chunkRLSFEATG_cjs=require('./chunk-RLSFEATG.cjs'),u=require('path'),v=require('fs/promises');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var u__namespace=/*#__PURE__*/_interopNamespace(u);var v__namespace=/*#__PURE__*/_interopNamespace(v);async function f(a,t,e){let i=new chunkRLSFEATG_cjs.y(a),n=new chunkRLSFEATG_cjs.z(a),l=a.output.api?.enabled?new chunkRLSFEATG_cjs.A(a):null;a.verbose&&console.log("[metadata-plugin] Starting analysis...");let r=await i.analyze(t);if(a.output.file?.enabled){let s=u__namespace.resolve(t,a.output.file.path);await n.write(r,s),a.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${s}`);}if(l&&(await l.send(r),a.verbose&&console.log("[metadata-plugin] Sent metadata to API")),e?.url&&e?.serviceRoleKey)try{let s={provider:"supabase",enabled:!0,url:e.url,serviceRoleKey:e.serviceRoleKey,tableName:e.tableName,fields:{projectId:e.fields?.projectId||"project_id",metadata:e.fields?.metadata||"metadata",createdAt:e.fields?.createdAt||"created_at",updatedAt:e.fields?.updatedAt||"updated_at"}},p=await(await chunkXR3EVOXW_cjs.a(s)).upload(r);a.verbose&&(p.success?console.log(`[metadata-plugin] ${p.message} (Supabase)`):console.log(`[metadata-plugin] Supabase upload failed: ${p.error}`));}catch(s){console.error("[metadata-plugin] Supabase upload error:",s);}}function A(a={}){let t=chunkRLSFEATG_cjs.d(a),e=a.supabase,i=chunkRLSFEATG_cjs.e(t);if(i.length>0)throw new Error(`[metadata-plugin] Invalid config:
2
2
  ${i.join(`
3
3
  `)}`);return {name:"metadata-adapter",async onBuildComplete({projectDir:n}){t.verbose&&console.log("[metadata-plugin] Build completed, running analysis..."),await f(t,n,e),t.verbose&&console.log("[metadata-plugin] Analysis completed");}}}async function N(a,t={}){let e=u__namespace.join(a,".metadata-adapter.js"),i=`
4
4
  // Auto-generated by metadatafy
@@ -7,6 +7,6 @@ ${i.join(`
7
7
  const { createMetadataAdapter } = require('metadatafy/next');
8
8
 
9
9
  module.exports = createMetadataAdapter(${JSON.stringify(t,null,2)});
10
- `;return await v__namespace.writeFile(e,i.trim()),e}function x(a={}){let t=chunkGHNW3BJ2_cjs.d(a),e=a.runOn||"build",i=a.supabase,n=chunkGHNW3BJ2_cjs.e(t);if(n.length>0)throw new Error(`[metadata-plugin] Invalid config:
10
+ `;return await v__namespace.writeFile(e,i.trim()),e}function x(a={}){let t=chunkRLSFEATG_cjs.d(a),e=a.runOn||"build",i=a.supabase,n=chunkRLSFEATG_cjs.e(t);if(n.length>0)throw new Error(`[metadata-plugin] Invalid config:
11
11
  ${n.join(`
12
12
  `)}`);let l=false;return r=>{let s=r.compiler?.runAfterProductionCompile;return {...r,compiler:{...r.compiler,async runAfterProductionCompile(o){s&&await s(o),!(e!=="build"&&e!=="both")&&(l=true,t.verbose&&console.log("[metadata-plugin] runAfterProductionCompile triggered"),await f(t,o.projectDir,i),t.verbose&&console.log("[metadata-plugin] Analysis completed"));}},webpack(o,p){let{dev:g,isServer:P}=p;return !P||l||(e==="both"||e==="build"&&!g||e==="dev"&&g)&&(o.plugins=o.plugins||[],o.plugins.push(new m(t,i))),typeof r.webpack=="function"?r.webpack(o,p):o}}}}var m=class{constructor(t,e){this.hasRun=false;this.config=t,this.supabaseOptions=e;}apply(t){let e="MetadataWebpackPlugin";t.hooks.beforeCompile.tapAsync(e,async(i,n)=>{if(this.hasRun)return n();this.hasRun=true;try{await f(this.config,t.context,this.supabaseOptions),n();}catch(l){n(l);}}),t.hooks.watchRun.tap(e,()=>{});}};exports.createMetadataAdapter=A;exports.default=x;exports.generateAdapterFile=N;exports.withMetadata=x;
package/dist/next.js CHANGED
@@ -1,4 +1,4 @@
1
- import {a}from'./chunk-ESZLTJIF.js';import {d,e,y,z,A as A$1}from'./chunk-SEPU4O45.js';import*as u from'path';import*as v from'fs/promises';async function f(a$1,t,e){let i=new y(a$1),n=new z(a$1),l=a$1.output.api?.enabled?new A$1(a$1):null;a$1.verbose&&console.log("[metadata-plugin] Starting analysis...");let r=await i.analyze(t);if(a$1.output.file?.enabled){let s=u.resolve(t,a$1.output.file.path);await n.write(r,s),a$1.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${s}`);}if(l&&(await l.send(r),a$1.verbose&&console.log("[metadata-plugin] Sent metadata to API")),e?.url&&e?.serviceRoleKey)try{let s={provider:"supabase",enabled:!0,url:e.url,serviceRoleKey:e.serviceRoleKey,tableName:e.tableName,fields:{projectId:e.fields?.projectId||"project_id",metadata:e.fields?.metadata||"metadata",createdAt:e.fields?.createdAt||"created_at",updatedAt:e.fields?.updatedAt||"updated_at"}},p=await(await a(s)).upload(r);a$1.verbose&&(p.success?console.log(`[metadata-plugin] ${p.message} (Supabase)`):console.log(`[metadata-plugin] Supabase upload failed: ${p.error}`));}catch(s){console.error("[metadata-plugin] Supabase upload error:",s);}}function A(a={}){let t=d(a),e$1=a.supabase,i=e(t);if(i.length>0)throw new Error(`[metadata-plugin] Invalid config:
1
+ import {a}from'./chunk-ESZLTJIF.js';import {d,e,y,z,A as A$1}from'./chunk-6MX4TMZZ.js';import*as u from'path';import*as v from'fs/promises';async function f(a$1,t,e){let i=new y(a$1),n=new z(a$1),l=a$1.output.api?.enabled?new A$1(a$1):null;a$1.verbose&&console.log("[metadata-plugin] Starting analysis...");let r=await i.analyze(t);if(a$1.output.file?.enabled){let s=u.resolve(t,a$1.output.file.path);await n.write(r,s),a$1.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${s}`);}if(l&&(await l.send(r),a$1.verbose&&console.log("[metadata-plugin] Sent metadata to API")),e?.url&&e?.serviceRoleKey)try{let s={provider:"supabase",enabled:!0,url:e.url,serviceRoleKey:e.serviceRoleKey,tableName:e.tableName,fields:{projectId:e.fields?.projectId||"project_id",metadata:e.fields?.metadata||"metadata",createdAt:e.fields?.createdAt||"created_at",updatedAt:e.fields?.updatedAt||"updated_at"}},p=await(await a(s)).upload(r);a$1.verbose&&(p.success?console.log(`[metadata-plugin] ${p.message} (Supabase)`):console.log(`[metadata-plugin] Supabase upload failed: ${p.error}`));}catch(s){console.error("[metadata-plugin] Supabase upload error:",s);}}function A(a={}){let t=d(a),e$1=a.supabase,i=e(t);if(i.length>0)throw new Error(`[metadata-plugin] Invalid config:
2
2
  ${i.join(`
3
3
  `)}`);return {name:"metadata-adapter",async onBuildComplete({projectDir:n}){t.verbose&&console.log("[metadata-plugin] Build completed, running analysis..."),await f(t,n,e$1),t.verbose&&console.log("[metadata-plugin] Analysis completed");}}}async function N(a,t={}){let e=u.join(a,".metadata-adapter.js"),i=`
4
4
  // Auto-generated by metadatafy
package/dist/vite.cjs CHANGED
@@ -1,3 +1,3 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var chunkXR3EVOXW_cjs=require('./chunk-XR3EVOXW.cjs'),chunkGHNW3BJ2_cjs=require('./chunk-GHNW3BJ2.cjs'),v=require('path');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var v__namespace=/*#__PURE__*/_interopNamespace(v);async function P(e,l,t){let s=new chunkGHNW3BJ2_cjs.y(e),n=new chunkGHNW3BJ2_cjs.z(e),o=e.output.api?.enabled?new chunkGHNW3BJ2_cjs.A(e):null;e.verbose&&console.log("[metadata-plugin] Starting analysis...");let a=await s.analyze(l);if(e.output.file?.enabled){let r=v__namespace.resolve(l,e.output.file.path);await n.write(a,r),e.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${r}`);}if(o&&(await o.send(a),e.verbose&&console.log("[metadata-plugin] Sent metadata to API")),t?.url&&t?.serviceRoleKey)try{let r={provider:"supabase",enabled:!0,url:t.url,serviceRoleKey:t.serviceRoleKey,tableName:t.tableName,fields:{projectId:t.fields?.projectId||"project_id",metadata:t.fields?.metadata||"metadata",createdAt:t.fields?.createdAt||"created_at",updatedAt:t.fields?.updatedAt||"updated_at"}},i=await(await chunkXR3EVOXW_cjs.a(r)).upload(a);e.verbose&&(i.success?console.log(`[metadata-plugin] ${i.message} (Supabase)`):console.log(`[metadata-plugin] Supabase upload failed: ${i.error}`));}catch(r){console.error("[metadata-plugin] Supabase upload error:",r);}return a}function b(e={}){let l=chunkGHNW3BJ2_cjs.d(e),t=e.runOn||"build",s=e.emitStatsFile!==false,n=e.supabase,o,a=null,r=false;return {name:"vite-metadata-plugin",enforce:"post",configResolved(d){o=d;let i=chunkGHNW3BJ2_cjs.e(l);if(i.length>0)throw new Error(`[metadata-plugin] Invalid config:
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var chunkXR3EVOXW_cjs=require('./chunk-XR3EVOXW.cjs'),chunkRLSFEATG_cjs=require('./chunk-RLSFEATG.cjs'),v=require('path');function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var v__namespace=/*#__PURE__*/_interopNamespace(v);async function P(e,l,t){let s=new chunkRLSFEATG_cjs.y(e),n=new chunkRLSFEATG_cjs.z(e),o=e.output.api?.enabled?new chunkRLSFEATG_cjs.A(e):null;e.verbose&&console.log("[metadata-plugin] Starting analysis...");let a=await s.analyze(l);if(e.output.file?.enabled){let r=v__namespace.resolve(l,e.output.file.path);await n.write(a,r),e.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${r}`);}if(o&&(await o.send(a),e.verbose&&console.log("[metadata-plugin] Sent metadata to API")),t?.url&&t?.serviceRoleKey)try{let r={provider:"supabase",enabled:!0,url:t.url,serviceRoleKey:t.serviceRoleKey,tableName:t.tableName,fields:{projectId:t.fields?.projectId||"project_id",metadata:t.fields?.metadata||"metadata",createdAt:t.fields?.createdAt||"created_at",updatedAt:t.fields?.updatedAt||"updated_at"}},i=await(await chunkXR3EVOXW_cjs.a(r)).upload(a);e.verbose&&(i.success?console.log(`[metadata-plugin] ${i.message} (Supabase)`):console.log(`[metadata-plugin] Supabase upload failed: ${i.error}`));}catch(r){console.error("[metadata-plugin] Supabase upload error:",r);}return a}function b(e={}){let l=chunkRLSFEATG_cjs.d(e),t=e.runOn||"build",s=e.emitStatsFile!==false,n=e.supabase,o,a=null,r=false;return {name:"vite-metadata-plugin",enforce:"post",configResolved(d){o=d;let i=chunkRLSFEATG_cjs.e(l);if(i.length>0)throw new Error(`[metadata-plugin] Invalid config:
2
2
  ${i.join(`
3
3
  `)}`)},async buildStart(){if(r||!(t==="both"||t==="build"&&o.command==="build"||t==="serve"&&o.command==="serve"))return;r=true;let i=o.root;try{a=await P(l,i,n);}catch(u){if(console.error("[metadata-plugin] Analysis failed:",u),o.command==="build")throw u}},generateBundle(){!a||!s||this.emitFile({type:"asset",fileName:"metadata-stats.json",source:JSON.stringify(a.stats,null,2)});},closeBundle(){l.verbose&&a&&console.log(`[metadata-plugin] Build complete. Analyzed ${a.stats.totalFiles} files.`),r=false,a=null;}}}exports.default=b;exports.metadataPlugin=b;
package/dist/vite.js CHANGED
@@ -1,3 +1,3 @@
1
- import {a}from'./chunk-ESZLTJIF.js';import {d,e,y,z,A}from'./chunk-SEPU4O45.js';import*as v from'path';async function P(e,l,t){let s=new y(e),n=new z(e),o=e.output.api?.enabled?new A(e):null;e.verbose&&console.log("[metadata-plugin] Starting analysis...");let a$1=await s.analyze(l);if(e.output.file?.enabled){let r=v.resolve(l,e.output.file.path);await n.write(a$1,r),e.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${r}`);}if(o&&(await o.send(a$1),e.verbose&&console.log("[metadata-plugin] Sent metadata to API")),t?.url&&t?.serviceRoleKey)try{let r={provider:"supabase",enabled:!0,url:t.url,serviceRoleKey:t.serviceRoleKey,tableName:t.tableName,fields:{projectId:t.fields?.projectId||"project_id",metadata:t.fields?.metadata||"metadata",createdAt:t.fields?.createdAt||"created_at",updatedAt:t.fields?.updatedAt||"updated_at"}},i=await(await a(r)).upload(a$1);e.verbose&&(i.success?console.log(`[metadata-plugin] ${i.message} (Supabase)`):console.log(`[metadata-plugin] Supabase upload failed: ${i.error}`));}catch(r){console.error("[metadata-plugin] Supabase upload error:",r);}return a$1}function b(e$1={}){let l=d(e$1),t=e$1.runOn||"build",s=e$1.emitStatsFile!==false,n=e$1.supabase,o,a=null,r=false;return {name:"vite-metadata-plugin",enforce:"post",configResolved(d){o=d;let i=e(l);if(i.length>0)throw new Error(`[metadata-plugin] Invalid config:
1
+ import {a}from'./chunk-ESZLTJIF.js';import {d,e,y,z,A}from'./chunk-6MX4TMZZ.js';import*as v from'path';async function P(e,l,t){let s=new y(e),n=new z(e),o=e.output.api?.enabled?new A(e):null;e.verbose&&console.log("[metadata-plugin] Starting analysis...");let a$1=await s.analyze(l);if(e.output.file?.enabled){let r=v.resolve(l,e.output.file.path);await n.write(a$1,r),e.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${r}`);}if(o&&(await o.send(a$1),e.verbose&&console.log("[metadata-plugin] Sent metadata to API")),t?.url&&t?.serviceRoleKey)try{let r={provider:"supabase",enabled:!0,url:t.url,serviceRoleKey:t.serviceRoleKey,tableName:t.tableName,fields:{projectId:t.fields?.projectId||"project_id",metadata:t.fields?.metadata||"metadata",createdAt:t.fields?.createdAt||"created_at",updatedAt:t.fields?.updatedAt||"updated_at"}},i=await(await a(r)).upload(a$1);e.verbose&&(i.success?console.log(`[metadata-plugin] ${i.message} (Supabase)`):console.log(`[metadata-plugin] Supabase upload failed: ${i.error}`));}catch(r){console.error("[metadata-plugin] Supabase upload error:",r);}return a$1}function b(e$1={}){let l=d(e$1),t=e$1.runOn||"build",s=e$1.emitStatsFile!==false,n=e$1.supabase,o,a=null,r=false;return {name:"vite-metadata-plugin",enforce:"post",configResolved(d){o=d;let i=e(l);if(i.length>0)throw new Error(`[metadata-plugin] Invalid config:
2
2
  ${i.join(`
3
3
  `)}`)},async buildStart(){if(r||!(t==="both"||t==="build"&&o.command==="build"||t==="serve"&&o.command==="serve"))return;r=true;let i=o.root;try{a=await P(l,i,n);}catch(u){if(console.error("[metadata-plugin] Analysis failed:",u),o.command==="build")throw u}},generateBundle(){!a||!s||this.emitFile({type:"asset",fileName:"metadata-stats.json",source:JSON.stringify(a.stats,null,2)});},closeBundle(){l.verbose&&a&&console.log(`[metadata-plugin] Build complete. Analyzed ${a.stats.totalFiles} files.`),r=false,a=null;}}}export{b as default,b as metadataPlugin};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "metadatafy",
3
- "version": "1.3.1",
3
+ "version": "1.4.0",
4
4
  "description": "Build plugin for extracting project metadata for ticket analysis system",
5
5
  "type": "module",
6
6
  "exports": {
@@ -48,6 +48,7 @@
48
48
  }
49
49
  },
50
50
  "dependencies": {
51
+ "dotenv": "^17.2.3",
51
52
  "glob": "^10.0.0",
52
53
  "typescript": "^5.0.0"
53
54
  },
@@ -1,2 +0,0 @@
1
- 'use strict';var p=require('typescript'),d=require('path'),g=require('fs'),L=require('crypto'),glob=require('glob'),F=require('fs/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var p__default=/*#__PURE__*/_interopDefault(p);var d__namespace=/*#__PURE__*/_interopNamespace(d);var g__namespace=/*#__PURE__*/_interopNamespace(g);var L__namespace=/*#__PURE__*/_interopNamespace(L);var F__namespace=/*#__PURE__*/_interopNamespace(F);var q={"app/**/page.tsx":"route","app/**/page.ts":"route","app/**/layout.tsx":"route","app/**/layout.ts":"route","app/**/route.tsx":"api","app/**/route.ts":"api","app/api/**/*.ts":"api","app/api/**/*.tsx":"api","pages/**/*.tsx":"route","pages/**/*.ts":"route","pages/api/**/*.ts":"api","components/**/*.tsx":"component","components/**/*.ts":"component","src/components/**/*.tsx":"component","src/components/**/*.ts":"component","hooks/**/*.ts":"hook","hooks/**/*.tsx":"hook","src/hooks/**/*.ts":"hook","src/hooks/**/*.tsx":"hook","services/**/*.ts":"service","src/services/**/*.ts":"service","lib/**/*.ts":"utility","src/lib/**/*.ts":"utility","utils/**/*.ts":"utility","src/utils/**/*.ts":"utility","supabase/migrations/*.sql":"table","prisma/migrations/**/*.sql":"table"},G=["app/**/*.{ts,tsx}","pages/**/*.{ts,tsx}","components/**/*.{ts,tsx}","hooks/**/*.{ts,tsx}","services/**/*.ts","lib/**/*.ts","utils/**/*.ts","src/**/*.{ts,tsx}","supabase/migrations/*.sql"],z=["**/node_modules/**","**/.next/**","**/dist/**","**/*.test.{ts,tsx}","**/*.spec.{ts,tsx}","**/__tests__/**","**/*.d.ts","**/coverage/**"];function H(n={}){return {projectId:n.projectId||"default",include:n.include||G,exclude:n.exclude||z,fileTypeMapping:{...q,...n.fileTypeMapping},output:{file:{enabled:true,path:"project-metadata.json",...n.output?.file},api:{enabled:false,endpoint:"",...n.output?.api}},koreanKeywords:n.koreanKeywords,mode:n.mode||"production",verbose:n.verbose||false}}function Z(n){let t=[];return n.projectId||t.push("projectId is required"),n.output.api?.enabled&&!n.output.api.endpoint&&t.push("API endpoint is required when api output is enabled"),n.include.length===0&&t.push("At least one include pattern is required"),t}function D(n){let t=n.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"{{GLOBSTAR}}").replace(/\*/g,"[^/]*").replace(/{{GLOBSTAR}}/g,".*").replace(/\{([^}]+)\}/g,(e,s)=>`(${s.split(",").map(i=>i.trim()).join("|")})`);return new RegExp(`^${t}$`)}var x=class{constructor(){this.compilerOptions={target:p__default.default.ScriptTarget.ESNext,module:p__default.default.ModuleKind.ESNext,jsx:p__default.default.JsxEmit.React,esModuleInterop:true,allowSyntheticDefaultImports:true,strict:false};}parse(t,e){return p__default.default.createSourceFile(e,t,this.compilerOptions.target,true,this.getScriptKind(e))}getScriptKind(t){let e=t.toLowerCase();return e.endsWith(".tsx")?p__default.default.ScriptKind.TSX:e.endsWith(".ts")?p__default.default.ScriptKind.TS:e.endsWith(".jsx")?p__default.default.ScriptKind.JSX:e.endsWith(".js")?p__default.default.ScriptKind.JS:p__default.default.ScriptKind.Unknown}traverse(t,e){e(t)!==false&&p__default.default.forEachChild(t,r=>this.traverse(r,e));}findNodes(t,e){let s=[];return this.traverse(t,r=>{e(r)&&s.push(r);}),s}getNodeText(t,e){return t.getText(e)}getJSDocComment(t){let e=p__default.default.getJSDocCommentsAndTags(t);if(e.length!==0)return e.filter(p__default.default.isJSDoc).map(s=>s.comment).filter(Boolean).join(`
2
- `)}};new x;var y=class{parse(t,e){let s=this.extractTables(t),r=s[0]?.name||this.extractNameFromPath(e);return {path:e,type:"table",name:r,imports:[],exports:s.map(i=>({name:i.name,isDefault:false,isTypeOnly:false,kind:"variable"})),metadata:{tableName:r,columns:s[0]?.columns||[]}}}extractTables(t){let e=[],s=/CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?["']?(\w+)["']?\s*\(([\s\S]*?)\);/gi,r;for(;(r=s.exec(t))!==null;){let o=r[1],a=r[2],l=this.parseColumns(a);e.push({name:o,columns:l});}let i=/ALTER\s+TABLE\s+["']?(\w+)["']?\s+ADD\s+(?:COLUMN\s+)?["']?(\w+)["']?\s+(\w+)/gi;for(;(r=i.exec(t))!==null;){let o=r[1],a=r[2],l=r[3],u=e.find(f=>f.name===o);u||(u={name:o,columns:[]},e.push(u)),u.columns.push({name:a,type:l,nullable:true,isPrimaryKey:false,isForeignKey:false});}return e}parseColumns(t){let e=[],s=t.split(",").map(r=>r.trim()).filter(r=>r&&!r.toUpperCase().startsWith("CONSTRAINT")&&!r.toUpperCase().startsWith("PRIMARY KEY")&&!r.toUpperCase().startsWith("FOREIGN KEY")&&!r.toUpperCase().startsWith("UNIQUE")&&!r.toUpperCase().startsWith("CHECK"));for(let r of s){let i=this.parseColumnDefinition(r);i&&e.push(i);}return e}parseColumnDefinition(t){let e=t.match(/^["']?(\w+)["']?\s+(\w+(?:\([^)]+\))?)/i);if(!e)return null;let[,s,r]=e,i=t.toUpperCase();return {name:s,type:r.toUpperCase(),nullable:!i.includes("NOT NULL"),isPrimaryKey:i.includes("PRIMARY KEY"),isForeignKey:i.includes("REFERENCES"),references:this.extractReference(t)}}extractReference(t){let e=t.match(/REFERENCES\s+["']?(\w+)["']?\s*\(["']?(\w+)["']?\)/i);if(e)return {table:e[1],column:e[2]}}extractNameFromPath(t){let e=d__namespace.basename(t),s=e.match(/create_(\w+)_table/i);return s?s[1]:e.replace(".sql","")}};var v=class{extract(t){let e=[];return p__default.default.forEachChild(t,s=>{if(p__default.default.isImportDeclaration(s)){let r=this.parseImportDeclaration(s);r&&e.push(r);}}),e}parseImportDeclaration(t){let e=t.moduleSpecifier;if(!p__default.default.isStringLiteral(e))return null;let s=e.text,r=[],i=false,o=t.importClause?.isTypeOnly||false,a=t.importClause;if(!a)return {source:s,specifiers:[],isDefault:false,isTypeOnly:false};a.name&&(r.push(a.name.text),i=true);let l=a.namedBindings;if(l){if(p__default.default.isNamespaceImport(l))r.push(`* as ${l.name.text}`);else if(p__default.default.isNamedImports(l))for(let u of l.elements){let f=u.name.text,T=u.propertyName?.text;T?r.push(`${T} as ${f}`):r.push(f);}}return {source:s,specifiers:r,isDefault:i,isTypeOnly:o}}};var w=class{extract(t){let e=[];return p__default.default.forEachChild(t,s=>{let r=this.extractFromNode(s,t);e.push(...r);}),e}extractFromNode(t,e){let s=[];if(p__default.default.isFunctionDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name?.text||"anonymous",isDefault:this.hasDefaultModifier(t),isTypeOnly:false,kind:"function"}),p__default.default.isClassDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name?.text||"anonymous",isDefault:this.hasDefaultModifier(t),isTypeOnly:false,kind:"class"}),p__default.default.isVariableStatement(t)&&this.hasExportModifier(t))for(let r of t.declarationList.declarations)p__default.default.isIdentifier(r.name)&&s.push({name:r.name.text,isDefault:false,isTypeOnly:false,kind:"variable"});if(p__default.default.isTypeAliasDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name.text,isDefault:false,isTypeOnly:true,kind:"type"}),p__default.default.isInterfaceDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name.text,isDefault:false,isTypeOnly:true,kind:"interface"}),p__default.default.isExportAssignment(t)&&!t.isExportEquals){let r=this.getExportDefaultName(t,e);s.push({name:r,isDefault:true,isTypeOnly:false,kind:"variable"});}if(p__default.default.isExportDeclaration(t)){let r=t.exportClause;if(r&&p__default.default.isNamedExports(r))for(let i of r.elements)s.push({name:i.name.text,isDefault:false,isTypeOnly:t.isTypeOnly,kind:"variable"});}return s}hasExportModifier(t){return (p__default.default.canHaveModifiers(t)?p__default.default.getModifiers(t):void 0)?.some(s=>s.kind===p__default.default.SyntaxKind.ExportKeyword)||false}hasDefaultModifier(t){return (p__default.default.canHaveModifiers(t)?p__default.default.getModifiers(t):void 0)?.some(s=>s.kind===p__default.default.SyntaxKind.DefaultKeyword)||false}getExportDefaultName(t,e){let s=t.expression;if(p__default.default.isIdentifier(s))return s.text;if(p__default.default.isArrowFunction(s)||p__default.default.isFunctionExpression(s))return "default";if(p__default.default.isCallExpression(s)&&p__default.default.isIdentifier(s.expression)){let r=s.arguments[0];if(r&&p__default.default.isIdentifier(r))return r.text}return "default"}};var C=class{extract(t){let e=[],s=this.findPropsType(t);s&&e.push(...this.extractFromTypeNode(s,t));let r=this.findComponentFunction(t);return r&&e.push(...this.extractFromFunctionParams(r,t)),this.deduplicateProps(e)}findPropsType(t){let e;return p__default.default.forEachChild(t,s=>{p__default.default.isInterfaceDeclaration(s)&&s.name.text.endsWith("Props")&&(e=s),p__default.default.isTypeAliasDeclaration(s)&&s.name.text.endsWith("Props")&&(e=s.type);}),e}findComponentFunction(t){let e;return p__default.default.forEachChild(t,s=>{if(p__default.default.isFunctionDeclaration(s)&&this.isExported(s)&&(e=s),p__default.default.isVariableStatement(s)&&this.isExported(s))for(let r of s.declarationList.declarations)r.initializer&&(p__default.default.isArrowFunction(r.initializer)||p__default.default.isFunctionExpression(r.initializer))&&(e=r.initializer);}),e}extractFromTypeNode(t,e){let s=[];if(p__default.default.isInterfaceDeclaration(t)){for(let r of t.members){let i=this.extractMemberProp(r,e);i&&s.push(i);}return s}if(p__default.default.isTypeLiteralNode(t))for(let r of t.members){let i=this.extractMemberProp(r,e);i&&s.push(i);}if(p__default.default.isIntersectionTypeNode(t))for(let r of t.types)s.push(...this.extractFromTypeNode(r,e));return s}extractMemberProp(t,e){if(!p__default.default.isPropertySignature(t))return null;let s=t.name;if(!p__default.default.isIdentifier(s)&&!p__default.default.isStringLiteral(s))return null;let r=(p__default.default.isIdentifier(s),s.text),i=!t.questionToken,o=t.type?t.type.getText(e):"any";return {name:r,type:o,required:i}}extractFromFunctionParams(t,e){let s=[],r=t.parameters[0];if(!r)return s;if(p__default.default.isObjectBindingPattern(r.name))for(let i of r.name.elements)p__default.default.isBindingElement(i)&&p__default.default.isIdentifier(i.name)&&s.push({name:i.name.text,type:"unknown",required:!i.initializer,defaultValue:i.initializer?.getText(e)});return s}isExported(t){return (p__default.default.canHaveModifiers(t)?p__default.default.getModifiers(t):void 0)?.some(s=>s.kind===p__default.default.SyntaxKind.ExportKeyword)||false}deduplicateProps(t){let e=new Set;return t.filter(s=>e.has(s.name)?false:(e.add(s.name),true))}};function N(n){return n.replace(/([a-z])([A-Z])/g,"$1 $2").split(" ").filter(Boolean)}function A(n){return n.replace(/([A-Z])([A-Z][a-z])/g,"$1 $2").replace(/([a-z])([A-Z])/g,"$1 $2").split(" ").filter(Boolean)}function M(n){return n.split("_").filter(Boolean)}function ft(n){return n.split("-").filter(Boolean)}function J(n){let t=new Set,e=n.split(/[-_]/);for(let s of e)N(s).forEach(i=>t.add(i.toLowerCase()));return [...t]}function K(n){let t=[],e=n.match(/[A-Z]{2,}/g);return e&&t.push(...e),t}function mt(n){let t=J(n);return {camel:t.map((e,s)=>s===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(""),pascal:t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(""),snake:t.map(e=>e.toLowerCase()).join("_"),kebab:t.map(e=>e.toLowerCase()).join("-")}}var I={create:["\uC0DD\uC131","\uB9CC\uB4E4\uAE30","\uCD94\uAC00"],read:["\uC77D\uAE30","\uC870\uD68C"],update:["\uC218\uC815","\uC5C5\uB370\uC774\uD2B8","\uBCC0\uACBD"],delete:["\uC0AD\uC81C","\uC81C\uAC70"],list:["\uBAA9\uB85D","\uB9AC\uC2A4\uD2B8"],search:["\uAC80\uC0C9","\uCC3E\uAE30"],filter:["\uD544\uD130","\uD544\uD130\uB9C1"],sort:["\uC815\uB82C"],submit:["\uC81C\uCD9C","\uC804\uC1A1"],cancel:["\uCDE8\uC18C"],confirm:["\uD655\uC778"],save:["\uC800\uC7A5"],load:["\uB85C\uB4DC","\uBD88\uB7EC\uC624\uAE30"],fetch:["\uAC00\uC838\uC624\uAE30","\uBD88\uB7EC\uC624\uAE30"],button:["\uBC84\uD2BC"],modal:["\uBAA8\uB2EC","\uD31D\uC5C5"],dialog:["\uB2E4\uC774\uC5BC\uB85C\uADF8","\uB300\uD654\uC0C1\uC790"],form:["\uD3FC","\uC591\uC2DD"],input:["\uC785\uB825","\uC778\uD48B"],select:["\uC120\uD0DD","\uC140\uB809\uD2B8","\uB4DC\uB86D\uB2E4\uC6B4"],checkbox:["\uCCB4\uD06C\uBC15\uC2A4","\uCCB4\uD06C"],table:["\uD14C\uC774\uBE14","\uD45C"],card:["\uCE74\uB4DC"],tab:["\uD0ED"],menu:["\uBA54\uB274"],header:["\uD5E4\uB354","\uBA38\uB9AC\uAE00"],footer:["\uD478\uD130","\uBC14\uB2E5\uAE00"],sidebar:["\uC0AC\uC774\uB4DC\uBC14"],navbar:["\uB124\uBE44\uAC8C\uC774\uC158","\uB124\uBE44\uBC14"],auth:["\uC778\uC99D","\uB85C\uADF8\uC778"],login:["\uB85C\uADF8\uC778"],logout:["\uB85C\uADF8\uC544\uC6C3"],register:["\uD68C\uC6D0\uAC00\uC785","\uAC00\uC785"],signup:["\uD68C\uC6D0\uAC00\uC785","\uAC00\uC785"],user:["\uC0AC\uC6A9\uC790","\uC720\uC800","\uD68C\uC6D0"],profile:["\uD504\uB85C\uD544"],password:["\uBE44\uBC00\uBC88\uD638","\uC554\uD638"],permission:["\uAD8C\uD55C"],attendance:["\uCD9C\uC11D","\uCD9C\uACB0"],check:["\uCCB4\uD06C","\uD655\uC778"],schedule:["\uC2A4\uCF00\uC904","\uC77C\uC815"],calendar:["\uCE98\uB9B0\uB354","\uB2EC\uB825"],notification:["\uC54C\uB9BC","\uD1B5\uC9C0"],message:["\uBA54\uC2DC\uC9C0","\uC54C\uB9BC"],setting:["\uC124\uC815"],settings:["\uC124\uC815"],payment:["\uACB0\uC81C","\uC9C0\uBD88"],order:["\uC8FC\uBB38"],product:["\uC0C1\uD488","\uC81C\uD488"],cart:["\uC7A5\uBC14\uAD6C\uB2C8"],checkout:["\uACB0\uC81C","\uCCB4\uD06C\uC544\uC6C3"],invoice:["\uC1A1\uC7A5","\uCCAD\uAD6C\uC11C"],report:["\uB9AC\uD3EC\uD2B8","\uBCF4\uACE0\uC11C"],dashboard:["\uB300\uC2DC\uBCF4\uB4DC"],analytics:["\uBD84\uC11D","\uD1B5\uACC4"],statistics:["\uD1B5\uACC4"],status:["\uC0C1\uD0DC"],pending:["\uB300\uAE30\uC911","\uB300\uAE30"],active:["\uD65C\uC131","\uD65C\uC131\uD654"],inactive:["\uBE44\uD65C\uC131","\uBE44\uD65C\uC131\uD654"],completed:["\uC644\uB8CC"],error:["\uC5D0\uB7EC","\uC624\uB958"],success:["\uC131\uACF5"],loading:["\uB85C\uB529","\uB85C\uB4DC\uC911"],date:["\uB0A0\uC9DC"],time:["\uC2DC\uAC04"],image:["\uC774\uBBF8\uC9C0","\uC0AC\uC9C4"],file:["\uD30C\uC77C"],upload:["\uC5C5\uB85C\uB4DC","\uC62C\uB9AC\uAE30"],download:["\uB2E4\uC6B4\uB85C\uB4DC","\uB0B4\uB824\uBC1B\uAE30"],export:["\uB0B4\uBCF4\uB0B4\uAE30","\uC775\uC2A4\uD3EC\uD2B8"],import:["\uAC00\uC838\uC624\uAE30","\uC784\uD3EC\uD2B8"],api:["API","\uC5D0\uC774\uD53C\uC544\uC774"],service:["\uC11C\uBE44\uC2A4"],hook:["\uD6C5"],component:["\uCEF4\uD3EC\uB10C\uD2B8"],page:["\uD398\uC774\uC9C0"],route:["\uB77C\uC6B0\uD2B8","\uACBD\uB85C"]};function O(n){let t=n.toLowerCase();if(I[t])return I[t];let e=[];for(let[s,r]of Object.entries(I))(t.includes(s)||s.includes(t))&&e.push(...r);return [...new Set(e)]}function ht(n){return {...I,...n}}var b=class{constructor(t){this.customKoreanMap=t||{};}extract(t,e,s=[],r=[]){let i=new Set;this.extractFromName(t,i),this.extractFromPath(e,i);for(let a of s)this.extractFromName(a,i);for(let a of r)this.extractFromName(a,i);let o=[...i];for(let a of o)this.findKorean(a).forEach(u=>i.add(u));return [...i].filter(a=>a.length>1)}extractFromName(t,e){e.add(t.toLowerCase()),N(t).forEach(a=>e.add(a.toLowerCase())),A(t).forEach(a=>e.add(a.toLowerCase())),M(t).forEach(a=>e.add(a.toLowerCase())),K(t).forEach(a=>e.add(a.toLowerCase()));}extractFromPath(t,e){let s=new Set(["src","app","components","hooks","services","lib","utils","pages","api"]),r=t.replace(/\.[^/.]+$/,"").split("/").filter(i=>!s.has(i));for(let i of r)this.extractFromName(i,e);}findKorean(t){let e=this.customKoreanMap[t.toLowerCase()];return e||O(t)}};var P=class{constructor(t={},e=[".ts",".tsx",".js",".jsx"]){this.aliasMap=new Map(Object.entries(t)),this.extensions=e;}resolve(t,e,s){if(this.isExternalPackage(t))return null;let r=this.resolveAlias(t),i;if(r.startsWith("./")||r.startsWith("../")){let a=d__namespace.dirname(d__namespace.resolve(s,e));i=d__namespace.resolve(a,r);}else if(r!==t)i=d__namespace.resolve(s,r);else return null;let o=this.resolveWithExtensions(i);return o?d__namespace.relative(s,o):null}isExternalPackage(t){if(t.startsWith("./")||t.startsWith("../"))return false;for(let e of this.aliasMap.keys())if(t.startsWith(e))return false;return true}resolveAlias(t){for(let[e,s]of this.aliasMap.entries()){if(t===e)return s;if(t.startsWith(e+"/"))return t.replace(e,s)}return t}resolveWithExtensions(t){if(g__namespace.existsSync(t))try{let e=g__namespace.statSync(t);if(e.isFile())return t;if(e.isDirectory())return this.findIndexFile(t)}catch{}for(let e of this.extensions){let s=t+e;if(g__namespace.existsSync(s))return s}return this.findIndexFile(t)}findIndexFile(t){for(let e of this.extensions){let s=d__namespace.join(t,`index${e}`);if(g__namespace.existsSync(s))return s}return null}};var S=class{constructor(t){let e={"@":"src","@/":"src/","~":"src","~/":"src/"};this.resolver=new P({...e,...t});}build(t,e){let s=new Map,r=new Set(t.map(i=>i.path));for(let i of t){let o=this.resolveCalls(i,e,r);s.set(i.path,{calls:o,calledBy:[]});}for(let[i,o]of s.entries())for(let a of o.calls){let l=s.get(a);l&&l.calledBy.push(i);}return s}resolveCalls(t,e,s){let r=[];for(let i of t.imports){if(i.isTypeOnly)continue;let o=this.resolver.resolve(i.source,t.path,e);o&&s.has(o)&&r.push(o);}return [...new Set(r)]}};function j(n,t){let e=`${n}:${t}`;return L__namespace.createHash("sha256").update(e).digest("hex").slice(0,16)}var $=class{constructor(t){this.config=t,this.tsParser=new x,this.sqlParser=new y,this.importExtractor=new v,this.exportExtractor=new w,this.propsExtractor=new C,this.keywordExtractor=new b(t.koreanKeywords),this.callGraphBuilder=new S;}async analyze(t){let e=Date.now(),s=[],r=await this.collectFiles(t);this.config.verbose&&console.log(`[metadata-plugin] Found ${r.length} files to analyze`);let i=[];for(let u of r)try{let f=await this.parseFile(u,t);f&&i.push(f);}catch(f){let T=f instanceof Error?f.message:"Unknown error";s.push(`${u}: ${T}`);}let o=this.callGraphBuilder.build(i,t),a=i.map(u=>this.createIndexItem(u,o)),l=this.calculateStats(a,s);return this.config.verbose&&(console.log(`[metadata-plugin] Analysis completed in ${Date.now()-e}ms`),console.log(`[metadata-plugin] Processed ${a.length} items`)),{projectId:this.config.projectId,items:a,stats:l,timestamp:new Date().toISOString()}}async collectFiles(t){let e=[];for(let s of this.config.include){let r=await glob.glob(s,{cwd:t,ignore:this.config.exclude,absolute:true});e.push(...r);}return [...new Set(e)]}async parseFile(t,e){let s=d__namespace.relative(e,t),r=this.determineFileType(s);if(!r)return null;let i=await F__namespace.readFile(t,"utf-8");if(d__namespace.extname(t)===".sql")return this.sqlParser.parse(i,s);let a=this.tsParser.parse(i,t),l=this.importExtractor.extract(a),u=this.exportExtractor.extract(a),f=r==="component"?this.propsExtractor.extract(a):void 0;return {path:s,type:r,name:this.extractName(s,u),imports:l,exports:u,props:f}}determineFileType(t){let e=Object.entries(this.config.fileTypeMapping).sort(([s],[r])=>r.length-s.length);for(let[s,r]of e)if(D(s).test(t))return r;return null}extractName(t,e){let s=e.find(i=>i.isDefault);if(s&&s.name!=="default")return s.name;let r=d__namespace.basename(t,d__namespace.extname(t));if(["index","page","layout","route"].includes(r)){let i=d__namespace.dirname(t),o=d__namespace.basename(i);return o!=="."?o:r}return r}createIndexItem(t,e){let s=e.get(t.path)||{calls:[],calledBy:[]},r=this.keywordExtractor.extract(t.name,t.path,t.exports.map(o=>o.name),t.props?.map(o=>o.name)),i=this.buildSearchText(t,r);return {id:j(this.config.projectId,t.path),projectId:this.config.projectId,type:t.type,name:t.name,path:t.path,keywords:r,searchText:i,calls:s.calls,calledBy:s.calledBy,metadata:{exports:t.exports.map(o=>o.name),props:t.props?.map(o=>o.name),...t.metadata}}}buildSearchText(t,e){return [t.name,t.path,...e,...t.exports.map(r=>r.name),...t.props?.map(r=>r.name)||[]].join(" ").toLowerCase()}calculateStats(t,e){let s={route:0,component:0,hook:0,service:0,api:0,table:0,utility:0};for(let r of t)s[r.type]++;return {totalFiles:t.length,byType:s,parseErrors:e}}};var B=class{constructor(t){this.config=t;}async write(t,e){let s=d__namespace.dirname(e);await F__namespace.mkdir(s,{recursive:true});let r=this.formatOutput(t);await F__namespace.writeFile(e,r,"utf-8");}formatOutput(t){let e={version:"1.0.0",projectId:this.config.projectId,generatedAt:t.timestamp,stats:t.stats,items:t.items};return this.config.mode==="production"?JSON.stringify(e):JSON.stringify(e,null,2)}};var k=class{constructor(t,e={}){this.config=t,this.maxRetries=e.maxRetries??3,this.retryDelay=e.retryDelay??1e3;}async send(t){let e=this.config.output.api;if(!e?.enabled||!e.endpoint)return;let s={projectId:this.config.projectId,timestamp:t.timestamp,items:t.items,stats:t.stats},r=null;for(let i=0;i<this.maxRetries;i++)try{await this.sendRequest(e.endpoint,s,e.headers);return}catch(o){r=o instanceof Error?o:new Error(String(o)),this.config.verbose&&console.warn(`[metadata-plugin] API send attempt ${i+1} failed:`,r.message),i<this.maxRetries-1&&await this.delay(this.retryDelay*(i+1));}throw new Error(`Failed to send metadata after ${this.maxRetries} attempts: ${r?.message}`)}async sendRequest(t,e,s){let r=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",...s},body:JSON.stringify(e)});if(!r.ok){let i=await r.text();throw new Error(`API request failed: ${r.status} ${i}`)}}delay(t){return new Promise(e=>setTimeout(e,t))}},W=class extends k{async send(t){let e=this.config.output.api;if(!e?.enabled||!e.endpoint)return;let s=t.items.map(i=>({id:i.id,project_id:i.projectId,type:i.type,name:i.name,path:i.path,keywords:i.keywords,search_text:i.searchText,calls:i.calls,called_by:i.calledBy,metadata:i.metadata,updated_at:t.timestamp})),r=500;for(let i=0;i<s.length;i+=r){let o=s.slice(i,i+r),a=await fetch(e.endpoint,{method:"POST",headers:{"Content-Type":"application/json",Prefer:"resolution=merge-duplicates",...e.headers},body:JSON.stringify(o)});if(!a.ok)throw new Error(`Supabase upsert failed: ${a.status}`)}}};exports.A=k;exports.B=W;exports.a=q;exports.b=G;exports.c=z;exports.d=H;exports.e=Z;exports.f=x;exports.g=y;exports.h=v;exports.i=w;exports.j=C;exports.k=N;exports.l=A;exports.m=M;exports.n=ft;exports.o=J;exports.p=K;exports.q=mt;exports.r=I;exports.s=O;exports.t=ht;exports.u=b;exports.v=P;exports.w=S;exports.x=j;exports.y=$;exports.z=B;
@@ -1,2 +0,0 @@
1
- import p from'typescript';import*as d from'path';import*as g from'fs';import*as L from'crypto';import {glob}from'glob';import*as F from'fs/promises';var q={"app/**/page.tsx":"route","app/**/page.ts":"route","app/**/layout.tsx":"route","app/**/layout.ts":"route","app/**/route.tsx":"api","app/**/route.ts":"api","app/api/**/*.ts":"api","app/api/**/*.tsx":"api","pages/**/*.tsx":"route","pages/**/*.ts":"route","pages/api/**/*.ts":"api","components/**/*.tsx":"component","components/**/*.ts":"component","src/components/**/*.tsx":"component","src/components/**/*.ts":"component","hooks/**/*.ts":"hook","hooks/**/*.tsx":"hook","src/hooks/**/*.ts":"hook","src/hooks/**/*.tsx":"hook","services/**/*.ts":"service","src/services/**/*.ts":"service","lib/**/*.ts":"utility","src/lib/**/*.ts":"utility","utils/**/*.ts":"utility","src/utils/**/*.ts":"utility","supabase/migrations/*.sql":"table","prisma/migrations/**/*.sql":"table"},G=["app/**/*.{ts,tsx}","pages/**/*.{ts,tsx}","components/**/*.{ts,tsx}","hooks/**/*.{ts,tsx}","services/**/*.ts","lib/**/*.ts","utils/**/*.ts","src/**/*.{ts,tsx}","supabase/migrations/*.sql"],z=["**/node_modules/**","**/.next/**","**/dist/**","**/*.test.{ts,tsx}","**/*.spec.{ts,tsx}","**/__tests__/**","**/*.d.ts","**/coverage/**"];function H(n={}){return {projectId:n.projectId||"default",include:n.include||G,exclude:n.exclude||z,fileTypeMapping:{...q,...n.fileTypeMapping},output:{file:{enabled:true,path:"project-metadata.json",...n.output?.file},api:{enabled:false,endpoint:"",...n.output?.api}},koreanKeywords:n.koreanKeywords,mode:n.mode||"production",verbose:n.verbose||false}}function Z(n){let t=[];return n.projectId||t.push("projectId is required"),n.output.api?.enabled&&!n.output.api.endpoint&&t.push("API endpoint is required when api output is enabled"),n.include.length===0&&t.push("At least one include pattern is required"),t}function D(n){let t=n.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"{{GLOBSTAR}}").replace(/\*/g,"[^/]*").replace(/{{GLOBSTAR}}/g,".*").replace(/\{([^}]+)\}/g,(e,s)=>`(${s.split(",").map(i=>i.trim()).join("|")})`);return new RegExp(`^${t}$`)}var x=class{constructor(){this.compilerOptions={target:p.ScriptTarget.ESNext,module:p.ModuleKind.ESNext,jsx:p.JsxEmit.React,esModuleInterop:true,allowSyntheticDefaultImports:true,strict:false};}parse(t,e){return p.createSourceFile(e,t,this.compilerOptions.target,true,this.getScriptKind(e))}getScriptKind(t){let e=t.toLowerCase();return e.endsWith(".tsx")?p.ScriptKind.TSX:e.endsWith(".ts")?p.ScriptKind.TS:e.endsWith(".jsx")?p.ScriptKind.JSX:e.endsWith(".js")?p.ScriptKind.JS:p.ScriptKind.Unknown}traverse(t,e){e(t)!==false&&p.forEachChild(t,r=>this.traverse(r,e));}findNodes(t,e){let s=[];return this.traverse(t,r=>{e(r)&&s.push(r);}),s}getNodeText(t,e){return t.getText(e)}getJSDocComment(t){let e=p.getJSDocCommentsAndTags(t);if(e.length!==0)return e.filter(p.isJSDoc).map(s=>s.comment).filter(Boolean).join(`
2
- `)}};new x;var y=class{parse(t,e){let s=this.extractTables(t),r=s[0]?.name||this.extractNameFromPath(e);return {path:e,type:"table",name:r,imports:[],exports:s.map(i=>({name:i.name,isDefault:false,isTypeOnly:false,kind:"variable"})),metadata:{tableName:r,columns:s[0]?.columns||[]}}}extractTables(t){let e=[],s=/CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?["']?(\w+)["']?\s*\(([\s\S]*?)\);/gi,r;for(;(r=s.exec(t))!==null;){let o=r[1],a=r[2],l=this.parseColumns(a);e.push({name:o,columns:l});}let i=/ALTER\s+TABLE\s+["']?(\w+)["']?\s+ADD\s+(?:COLUMN\s+)?["']?(\w+)["']?\s+(\w+)/gi;for(;(r=i.exec(t))!==null;){let o=r[1],a=r[2],l=r[3],u=e.find(f=>f.name===o);u||(u={name:o,columns:[]},e.push(u)),u.columns.push({name:a,type:l,nullable:true,isPrimaryKey:false,isForeignKey:false});}return e}parseColumns(t){let e=[],s=t.split(",").map(r=>r.trim()).filter(r=>r&&!r.toUpperCase().startsWith("CONSTRAINT")&&!r.toUpperCase().startsWith("PRIMARY KEY")&&!r.toUpperCase().startsWith("FOREIGN KEY")&&!r.toUpperCase().startsWith("UNIQUE")&&!r.toUpperCase().startsWith("CHECK"));for(let r of s){let i=this.parseColumnDefinition(r);i&&e.push(i);}return e}parseColumnDefinition(t){let e=t.match(/^["']?(\w+)["']?\s+(\w+(?:\([^)]+\))?)/i);if(!e)return null;let[,s,r]=e,i=t.toUpperCase();return {name:s,type:r.toUpperCase(),nullable:!i.includes("NOT NULL"),isPrimaryKey:i.includes("PRIMARY KEY"),isForeignKey:i.includes("REFERENCES"),references:this.extractReference(t)}}extractReference(t){let e=t.match(/REFERENCES\s+["']?(\w+)["']?\s*\(["']?(\w+)["']?\)/i);if(e)return {table:e[1],column:e[2]}}extractNameFromPath(t){let e=d.basename(t),s=e.match(/create_(\w+)_table/i);return s?s[1]:e.replace(".sql","")}};var v=class{extract(t){let e=[];return p.forEachChild(t,s=>{if(p.isImportDeclaration(s)){let r=this.parseImportDeclaration(s);r&&e.push(r);}}),e}parseImportDeclaration(t){let e=t.moduleSpecifier;if(!p.isStringLiteral(e))return null;let s=e.text,r=[],i=false,o=t.importClause?.isTypeOnly||false,a=t.importClause;if(!a)return {source:s,specifiers:[],isDefault:false,isTypeOnly:false};a.name&&(r.push(a.name.text),i=true);let l=a.namedBindings;if(l){if(p.isNamespaceImport(l))r.push(`* as ${l.name.text}`);else if(p.isNamedImports(l))for(let u of l.elements){let f=u.name.text,T=u.propertyName?.text;T?r.push(`${T} as ${f}`):r.push(f);}}return {source:s,specifiers:r,isDefault:i,isTypeOnly:o}}};var w=class{extract(t){let e=[];return p.forEachChild(t,s=>{let r=this.extractFromNode(s,t);e.push(...r);}),e}extractFromNode(t,e){let s=[];if(p.isFunctionDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name?.text||"anonymous",isDefault:this.hasDefaultModifier(t),isTypeOnly:false,kind:"function"}),p.isClassDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name?.text||"anonymous",isDefault:this.hasDefaultModifier(t),isTypeOnly:false,kind:"class"}),p.isVariableStatement(t)&&this.hasExportModifier(t))for(let r of t.declarationList.declarations)p.isIdentifier(r.name)&&s.push({name:r.name.text,isDefault:false,isTypeOnly:false,kind:"variable"});if(p.isTypeAliasDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name.text,isDefault:false,isTypeOnly:true,kind:"type"}),p.isInterfaceDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name.text,isDefault:false,isTypeOnly:true,kind:"interface"}),p.isExportAssignment(t)&&!t.isExportEquals){let r=this.getExportDefaultName(t,e);s.push({name:r,isDefault:true,isTypeOnly:false,kind:"variable"});}if(p.isExportDeclaration(t)){let r=t.exportClause;if(r&&p.isNamedExports(r))for(let i of r.elements)s.push({name:i.name.text,isDefault:false,isTypeOnly:t.isTypeOnly,kind:"variable"});}return s}hasExportModifier(t){return (p.canHaveModifiers(t)?p.getModifiers(t):void 0)?.some(s=>s.kind===p.SyntaxKind.ExportKeyword)||false}hasDefaultModifier(t){return (p.canHaveModifiers(t)?p.getModifiers(t):void 0)?.some(s=>s.kind===p.SyntaxKind.DefaultKeyword)||false}getExportDefaultName(t,e){let s=t.expression;if(p.isIdentifier(s))return s.text;if(p.isArrowFunction(s)||p.isFunctionExpression(s))return "default";if(p.isCallExpression(s)&&p.isIdentifier(s.expression)){let r=s.arguments[0];if(r&&p.isIdentifier(r))return r.text}return "default"}};var C=class{extract(t){let e=[],s=this.findPropsType(t);s&&e.push(...this.extractFromTypeNode(s,t));let r=this.findComponentFunction(t);return r&&e.push(...this.extractFromFunctionParams(r,t)),this.deduplicateProps(e)}findPropsType(t){let e;return p.forEachChild(t,s=>{p.isInterfaceDeclaration(s)&&s.name.text.endsWith("Props")&&(e=s),p.isTypeAliasDeclaration(s)&&s.name.text.endsWith("Props")&&(e=s.type);}),e}findComponentFunction(t){let e;return p.forEachChild(t,s=>{if(p.isFunctionDeclaration(s)&&this.isExported(s)&&(e=s),p.isVariableStatement(s)&&this.isExported(s))for(let r of s.declarationList.declarations)r.initializer&&(p.isArrowFunction(r.initializer)||p.isFunctionExpression(r.initializer))&&(e=r.initializer);}),e}extractFromTypeNode(t,e){let s=[];if(p.isInterfaceDeclaration(t)){for(let r of t.members){let i=this.extractMemberProp(r,e);i&&s.push(i);}return s}if(p.isTypeLiteralNode(t))for(let r of t.members){let i=this.extractMemberProp(r,e);i&&s.push(i);}if(p.isIntersectionTypeNode(t))for(let r of t.types)s.push(...this.extractFromTypeNode(r,e));return s}extractMemberProp(t,e){if(!p.isPropertySignature(t))return null;let s=t.name;if(!p.isIdentifier(s)&&!p.isStringLiteral(s))return null;let r=(p.isIdentifier(s),s.text),i=!t.questionToken,o=t.type?t.type.getText(e):"any";return {name:r,type:o,required:i}}extractFromFunctionParams(t,e){let s=[],r=t.parameters[0];if(!r)return s;if(p.isObjectBindingPattern(r.name))for(let i of r.name.elements)p.isBindingElement(i)&&p.isIdentifier(i.name)&&s.push({name:i.name.text,type:"unknown",required:!i.initializer,defaultValue:i.initializer?.getText(e)});return s}isExported(t){return (p.canHaveModifiers(t)?p.getModifiers(t):void 0)?.some(s=>s.kind===p.SyntaxKind.ExportKeyword)||false}deduplicateProps(t){let e=new Set;return t.filter(s=>e.has(s.name)?false:(e.add(s.name),true))}};function N(n){return n.replace(/([a-z])([A-Z])/g,"$1 $2").split(" ").filter(Boolean)}function A(n){return n.replace(/([A-Z])([A-Z][a-z])/g,"$1 $2").replace(/([a-z])([A-Z])/g,"$1 $2").split(" ").filter(Boolean)}function M(n){return n.split("_").filter(Boolean)}function ft(n){return n.split("-").filter(Boolean)}function J(n){let t=new Set,e=n.split(/[-_]/);for(let s of e)N(s).forEach(i=>t.add(i.toLowerCase()));return [...t]}function K(n){let t=[],e=n.match(/[A-Z]{2,}/g);return e&&t.push(...e),t}function mt(n){let t=J(n);return {camel:t.map((e,s)=>s===0?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(""),pascal:t.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(""),snake:t.map(e=>e.toLowerCase()).join("_"),kebab:t.map(e=>e.toLowerCase()).join("-")}}var I={create:["\uC0DD\uC131","\uB9CC\uB4E4\uAE30","\uCD94\uAC00"],read:["\uC77D\uAE30","\uC870\uD68C"],update:["\uC218\uC815","\uC5C5\uB370\uC774\uD2B8","\uBCC0\uACBD"],delete:["\uC0AD\uC81C","\uC81C\uAC70"],list:["\uBAA9\uB85D","\uB9AC\uC2A4\uD2B8"],search:["\uAC80\uC0C9","\uCC3E\uAE30"],filter:["\uD544\uD130","\uD544\uD130\uB9C1"],sort:["\uC815\uB82C"],submit:["\uC81C\uCD9C","\uC804\uC1A1"],cancel:["\uCDE8\uC18C"],confirm:["\uD655\uC778"],save:["\uC800\uC7A5"],load:["\uB85C\uB4DC","\uBD88\uB7EC\uC624\uAE30"],fetch:["\uAC00\uC838\uC624\uAE30","\uBD88\uB7EC\uC624\uAE30"],button:["\uBC84\uD2BC"],modal:["\uBAA8\uB2EC","\uD31D\uC5C5"],dialog:["\uB2E4\uC774\uC5BC\uB85C\uADF8","\uB300\uD654\uC0C1\uC790"],form:["\uD3FC","\uC591\uC2DD"],input:["\uC785\uB825","\uC778\uD48B"],select:["\uC120\uD0DD","\uC140\uB809\uD2B8","\uB4DC\uB86D\uB2E4\uC6B4"],checkbox:["\uCCB4\uD06C\uBC15\uC2A4","\uCCB4\uD06C"],table:["\uD14C\uC774\uBE14","\uD45C"],card:["\uCE74\uB4DC"],tab:["\uD0ED"],menu:["\uBA54\uB274"],header:["\uD5E4\uB354","\uBA38\uB9AC\uAE00"],footer:["\uD478\uD130","\uBC14\uB2E5\uAE00"],sidebar:["\uC0AC\uC774\uB4DC\uBC14"],navbar:["\uB124\uBE44\uAC8C\uC774\uC158","\uB124\uBE44\uBC14"],auth:["\uC778\uC99D","\uB85C\uADF8\uC778"],login:["\uB85C\uADF8\uC778"],logout:["\uB85C\uADF8\uC544\uC6C3"],register:["\uD68C\uC6D0\uAC00\uC785","\uAC00\uC785"],signup:["\uD68C\uC6D0\uAC00\uC785","\uAC00\uC785"],user:["\uC0AC\uC6A9\uC790","\uC720\uC800","\uD68C\uC6D0"],profile:["\uD504\uB85C\uD544"],password:["\uBE44\uBC00\uBC88\uD638","\uC554\uD638"],permission:["\uAD8C\uD55C"],attendance:["\uCD9C\uC11D","\uCD9C\uACB0"],check:["\uCCB4\uD06C","\uD655\uC778"],schedule:["\uC2A4\uCF00\uC904","\uC77C\uC815"],calendar:["\uCE98\uB9B0\uB354","\uB2EC\uB825"],notification:["\uC54C\uB9BC","\uD1B5\uC9C0"],message:["\uBA54\uC2DC\uC9C0","\uC54C\uB9BC"],setting:["\uC124\uC815"],settings:["\uC124\uC815"],payment:["\uACB0\uC81C","\uC9C0\uBD88"],order:["\uC8FC\uBB38"],product:["\uC0C1\uD488","\uC81C\uD488"],cart:["\uC7A5\uBC14\uAD6C\uB2C8"],checkout:["\uACB0\uC81C","\uCCB4\uD06C\uC544\uC6C3"],invoice:["\uC1A1\uC7A5","\uCCAD\uAD6C\uC11C"],report:["\uB9AC\uD3EC\uD2B8","\uBCF4\uACE0\uC11C"],dashboard:["\uB300\uC2DC\uBCF4\uB4DC"],analytics:["\uBD84\uC11D","\uD1B5\uACC4"],statistics:["\uD1B5\uACC4"],status:["\uC0C1\uD0DC"],pending:["\uB300\uAE30\uC911","\uB300\uAE30"],active:["\uD65C\uC131","\uD65C\uC131\uD654"],inactive:["\uBE44\uD65C\uC131","\uBE44\uD65C\uC131\uD654"],completed:["\uC644\uB8CC"],error:["\uC5D0\uB7EC","\uC624\uB958"],success:["\uC131\uACF5"],loading:["\uB85C\uB529","\uB85C\uB4DC\uC911"],date:["\uB0A0\uC9DC"],time:["\uC2DC\uAC04"],image:["\uC774\uBBF8\uC9C0","\uC0AC\uC9C4"],file:["\uD30C\uC77C"],upload:["\uC5C5\uB85C\uB4DC","\uC62C\uB9AC\uAE30"],download:["\uB2E4\uC6B4\uB85C\uB4DC","\uB0B4\uB824\uBC1B\uAE30"],export:["\uB0B4\uBCF4\uB0B4\uAE30","\uC775\uC2A4\uD3EC\uD2B8"],import:["\uAC00\uC838\uC624\uAE30","\uC784\uD3EC\uD2B8"],api:["API","\uC5D0\uC774\uD53C\uC544\uC774"],service:["\uC11C\uBE44\uC2A4"],hook:["\uD6C5"],component:["\uCEF4\uD3EC\uB10C\uD2B8"],page:["\uD398\uC774\uC9C0"],route:["\uB77C\uC6B0\uD2B8","\uACBD\uB85C"]};function O(n){let t=n.toLowerCase();if(I[t])return I[t];let e=[];for(let[s,r]of Object.entries(I))(t.includes(s)||s.includes(t))&&e.push(...r);return [...new Set(e)]}function ht(n){return {...I,...n}}var b=class{constructor(t){this.customKoreanMap=t||{};}extract(t,e,s=[],r=[]){let i=new Set;this.extractFromName(t,i),this.extractFromPath(e,i);for(let a of s)this.extractFromName(a,i);for(let a of r)this.extractFromName(a,i);let o=[...i];for(let a of o)this.findKorean(a).forEach(u=>i.add(u));return [...i].filter(a=>a.length>1)}extractFromName(t,e){e.add(t.toLowerCase()),N(t).forEach(a=>e.add(a.toLowerCase())),A(t).forEach(a=>e.add(a.toLowerCase())),M(t).forEach(a=>e.add(a.toLowerCase())),K(t).forEach(a=>e.add(a.toLowerCase()));}extractFromPath(t,e){let s=new Set(["src","app","components","hooks","services","lib","utils","pages","api"]),r=t.replace(/\.[^/.]+$/,"").split("/").filter(i=>!s.has(i));for(let i of r)this.extractFromName(i,e);}findKorean(t){let e=this.customKoreanMap[t.toLowerCase()];return e||O(t)}};var P=class{constructor(t={},e=[".ts",".tsx",".js",".jsx"]){this.aliasMap=new Map(Object.entries(t)),this.extensions=e;}resolve(t,e,s){if(this.isExternalPackage(t))return null;let r=this.resolveAlias(t),i;if(r.startsWith("./")||r.startsWith("../")){let a=d.dirname(d.resolve(s,e));i=d.resolve(a,r);}else if(r!==t)i=d.resolve(s,r);else return null;let o=this.resolveWithExtensions(i);return o?d.relative(s,o):null}isExternalPackage(t){if(t.startsWith("./")||t.startsWith("../"))return false;for(let e of this.aliasMap.keys())if(t.startsWith(e))return false;return true}resolveAlias(t){for(let[e,s]of this.aliasMap.entries()){if(t===e)return s;if(t.startsWith(e+"/"))return t.replace(e,s)}return t}resolveWithExtensions(t){if(g.existsSync(t))try{let e=g.statSync(t);if(e.isFile())return t;if(e.isDirectory())return this.findIndexFile(t)}catch{}for(let e of this.extensions){let s=t+e;if(g.existsSync(s))return s}return this.findIndexFile(t)}findIndexFile(t){for(let e of this.extensions){let s=d.join(t,`index${e}`);if(g.existsSync(s))return s}return null}};var S=class{constructor(t){let e={"@":"src","@/":"src/","~":"src","~/":"src/"};this.resolver=new P({...e,...t});}build(t,e){let s=new Map,r=new Set(t.map(i=>i.path));for(let i of t){let o=this.resolveCalls(i,e,r);s.set(i.path,{calls:o,calledBy:[]});}for(let[i,o]of s.entries())for(let a of o.calls){let l=s.get(a);l&&l.calledBy.push(i);}return s}resolveCalls(t,e,s){let r=[];for(let i of t.imports){if(i.isTypeOnly)continue;let o=this.resolver.resolve(i.source,t.path,e);o&&s.has(o)&&r.push(o);}return [...new Set(r)]}};function j(n,t){let e=`${n}:${t}`;return L.createHash("sha256").update(e).digest("hex").slice(0,16)}var $=class{constructor(t){this.config=t,this.tsParser=new x,this.sqlParser=new y,this.importExtractor=new v,this.exportExtractor=new w,this.propsExtractor=new C,this.keywordExtractor=new b(t.koreanKeywords),this.callGraphBuilder=new S;}async analyze(t){let e=Date.now(),s=[],r=await this.collectFiles(t);this.config.verbose&&console.log(`[metadata-plugin] Found ${r.length} files to analyze`);let i=[];for(let u of r)try{let f=await this.parseFile(u,t);f&&i.push(f);}catch(f){let T=f instanceof Error?f.message:"Unknown error";s.push(`${u}: ${T}`);}let o=this.callGraphBuilder.build(i,t),a=i.map(u=>this.createIndexItem(u,o)),l=this.calculateStats(a,s);return this.config.verbose&&(console.log(`[metadata-plugin] Analysis completed in ${Date.now()-e}ms`),console.log(`[metadata-plugin] Processed ${a.length} items`)),{projectId:this.config.projectId,items:a,stats:l,timestamp:new Date().toISOString()}}async collectFiles(t){let e=[];for(let s of this.config.include){let r=await glob(s,{cwd:t,ignore:this.config.exclude,absolute:true});e.push(...r);}return [...new Set(e)]}async parseFile(t,e){let s=d.relative(e,t),r=this.determineFileType(s);if(!r)return null;let i=await F.readFile(t,"utf-8");if(d.extname(t)===".sql")return this.sqlParser.parse(i,s);let a=this.tsParser.parse(i,t),l=this.importExtractor.extract(a),u=this.exportExtractor.extract(a),f=r==="component"?this.propsExtractor.extract(a):void 0;return {path:s,type:r,name:this.extractName(s,u),imports:l,exports:u,props:f}}determineFileType(t){let e=Object.entries(this.config.fileTypeMapping).sort(([s],[r])=>r.length-s.length);for(let[s,r]of e)if(D(s).test(t))return r;return null}extractName(t,e){let s=e.find(i=>i.isDefault);if(s&&s.name!=="default")return s.name;let r=d.basename(t,d.extname(t));if(["index","page","layout","route"].includes(r)){let i=d.dirname(t),o=d.basename(i);return o!=="."?o:r}return r}createIndexItem(t,e){let s=e.get(t.path)||{calls:[],calledBy:[]},r=this.keywordExtractor.extract(t.name,t.path,t.exports.map(o=>o.name),t.props?.map(o=>o.name)),i=this.buildSearchText(t,r);return {id:j(this.config.projectId,t.path),projectId:this.config.projectId,type:t.type,name:t.name,path:t.path,keywords:r,searchText:i,calls:s.calls,calledBy:s.calledBy,metadata:{exports:t.exports.map(o=>o.name),props:t.props?.map(o=>o.name),...t.metadata}}}buildSearchText(t,e){return [t.name,t.path,...e,...t.exports.map(r=>r.name),...t.props?.map(r=>r.name)||[]].join(" ").toLowerCase()}calculateStats(t,e){let s={route:0,component:0,hook:0,service:0,api:0,table:0,utility:0};for(let r of t)s[r.type]++;return {totalFiles:t.length,byType:s,parseErrors:e}}};var B=class{constructor(t){this.config=t;}async write(t,e){let s=d.dirname(e);await F.mkdir(s,{recursive:true});let r=this.formatOutput(t);await F.writeFile(e,r,"utf-8");}formatOutput(t){let e={version:"1.0.0",projectId:this.config.projectId,generatedAt:t.timestamp,stats:t.stats,items:t.items};return this.config.mode==="production"?JSON.stringify(e):JSON.stringify(e,null,2)}};var k=class{constructor(t,e={}){this.config=t,this.maxRetries=e.maxRetries??3,this.retryDelay=e.retryDelay??1e3;}async send(t){let e=this.config.output.api;if(!e?.enabled||!e.endpoint)return;let s={projectId:this.config.projectId,timestamp:t.timestamp,items:t.items,stats:t.stats},r=null;for(let i=0;i<this.maxRetries;i++)try{await this.sendRequest(e.endpoint,s,e.headers);return}catch(o){r=o instanceof Error?o:new Error(String(o)),this.config.verbose&&console.warn(`[metadata-plugin] API send attempt ${i+1} failed:`,r.message),i<this.maxRetries-1&&await this.delay(this.retryDelay*(i+1));}throw new Error(`Failed to send metadata after ${this.maxRetries} attempts: ${r?.message}`)}async sendRequest(t,e,s){let r=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json",...s},body:JSON.stringify(e)});if(!r.ok){let i=await r.text();throw new Error(`API request failed: ${r.status} ${i}`)}}delay(t){return new Promise(e=>setTimeout(e,t))}},W=class extends k{async send(t){let e=this.config.output.api;if(!e?.enabled||!e.endpoint)return;let s=t.items.map(i=>({id:i.id,project_id:i.projectId,type:i.type,name:i.name,path:i.path,keywords:i.keywords,search_text:i.searchText,calls:i.calls,called_by:i.calledBy,metadata:i.metadata,updated_at:t.timestamp})),r=500;for(let i=0;i<s.length;i+=r){let o=s.slice(i,i+r),a=await fetch(e.endpoint,{method:"POST",headers:{"Content-Type":"application/json",Prefer:"resolution=merge-duplicates",...e.headers},body:JSON.stringify(o)});if(!a.ok)throw new Error(`Supabase upsert failed: ${a.status}`)}}};export{k as A,W as B,q as a,G as b,z as c,H as d,Z as e,x as f,y as g,v as h,w as i,C as j,N as k,A as l,M as m,ft as n,J as o,K as p,mt as q,I as r,O as s,ht as t,b as u,P as v,S as w,j as x,$ as y,B as z};