metadatafy 1.4.0 → 1.4.3
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.
- package/dist/{chunk-ESZLTJIF.js → chunk-7VGYPCY7.js} +1 -1
- package/dist/chunk-OPGCPTPY.cjs +2 -0
- package/dist/chunk-UIDEH2GS.js +2 -0
- package/dist/{chunk-XR3EVOXW.cjs → chunk-W2STEULD.cjs} +1 -1
- package/dist/cli.cjs +7 -7
- package/dist/cli.js +2 -2
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.js +1 -1
- package/dist/next.cjs +4 -4
- package/dist/next.d.cts +12 -2
- package/dist/next.d.ts +12 -2
- package/dist/next.js +3 -3
- package/dist/supabase-ODLVMAF6.cjs +1 -0
- package/dist/supabase-QJ4W7OH5.js +1 -0
- package/dist/vite.cjs +1 -1
- package/dist/vite.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-6MX4TMZZ.js +0 -2
- package/dist/chunk-RLSFEATG.cjs +0 -2
- package/dist/supabase-HWODZTEI.cjs +0 -1
- package/dist/supabase-TGVJDKHE.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
async function a(e){switch(e.provider){case "supabase":let{SupabaseProvider:r}=await import('./supabase-
|
|
1
|
+
async function a(e){switch(e.provider){case "supabase":let{SupabaseProvider:r}=await import('./supabase-QJ4W7OH5.js');return new r(e);case "custom":let{CustomApiProvider:t}=await import('./custom-api-MPVFDKPU.js');return new t(e);default:throw new Error(`Unknown provider: ${e.provider}`)}}export{a};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var u=require('typescript'),g=require('path'),T=require('fs'),H=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 u__default=/*#__PURE__*/_interopDefault(u);var g__namespace=/*#__PURE__*/_interopNamespace(g);var T__namespace=/*#__PURE__*/_interopNamespace(T);var H__namespace=/*#__PURE__*/_interopNamespace(H);var k__namespace=/*#__PURE__*/_interopNamespace(k);var L={components:"component",component:"component",ui:"component",widgets:"component",widget:"component",elements:"component",hooks:"hook",hook:"hook",composables:"hook",services:"service",service:"service",api:"service",utils:"utility",util:"utility",utilities:"utility",utility:"utility",lib:"utility",libs:"utility",helpers:"utility",helper:"utility",common:"utility",shared:"utility"},$={"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"},K={"/api/":"api"},O=["supabase/migrations","prisma/migrations","migrations","db/migrations","database/migrations"];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","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"},tt=["app/**/*.{ts,tsx}","pages/**/*.{ts,tsx}","components/**/*.{ts,tsx}","hooks/**/*.{ts,tsx}","services/**/*.ts","lib/**/*.ts","utils/**/*.ts","src/**/*.{ts,tsx}","supabase/migrations/*.sql"],et=["**/node_modules/**","**/.next/**","**/dist/**","**/*.test.{ts,tsx}","**/*.spec.{ts,tsx}","**/__tests__/**","**/*.d.ts","**/coverage/**"];function it(f={}){return {projectId:f.projectId||"default",include:f.include||tt,exclude:f.exclude||et,fileTypeMapping:{...Q,...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 nt(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 _(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:u__default.default.ScriptTarget.ESNext,module:u__default.default.ModuleKind.ESNext,jsx:u__default.default.JsxEmit.React,esModuleInterop:true,allowSyntheticDefaultImports:true,strict:false};}parse(t,e){return u__default.default.createSourceFile(e,t,this.compilerOptions.target,true,this.getScriptKind(e))}getScriptKind(t){let e=t.toLowerCase();return e.endsWith(".tsx")?u__default.default.ScriptKind.TSX:e.endsWith(".ts")?u__default.default.ScriptKind.TS:e.endsWith(".jsx")?u__default.default.ScriptKind.JSX:e.endsWith(".js")?u__default.default.ScriptKind.JS:u__default.default.ScriptKind.Unknown}traverse(t,e){e(t)!==false&&u__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=u__default.default.getJSDocCommentsAndTags(t);if(e.length!==0)return e.filter(u__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],a=this.parseColumns(o);e.push({name:n,columns:a});}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],a=r[3],p=e.find(l=>l.name===n);p||(p={name:n,columns:[]},e.push(p)),p.columns.push({name:o,type:a,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 I=class{extract(t){let e=[];return u__default.default.forEachChild(t,s=>{if(u__default.default.isImportDeclaration(s)){let r=this.parseImportDeclaration(s);r&&e.push(r);}}),e}parseImportDeclaration(t){let e=t.moduleSpecifier;if(!u__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 a=o.namedBindings;if(a){if(u__default.default.isNamespaceImport(a))r.push(`* as ${a.name.text}`);else if(u__default.default.isNamedImports(a))for(let p of a.elements){let l=p.name.text,c=p.propertyName?.text;c?r.push(`${c} as ${l}`):r.push(l);}}return {source:s,specifiers:r,isDefault:i,isTypeOnly:n}}};var w=class{extract(t){let e=[];return u__default.default.forEachChild(t,s=>{let r=this.extractFromNode(s,t);e.push(...r);}),e}extractFromNode(t,e){let s=[];if(u__default.default.isFunctionDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name?.text||"anonymous",isDefault:this.hasDefaultModifier(t),isTypeOnly:false,kind:"function"}),u__default.default.isClassDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name?.text||"anonymous",isDefault:this.hasDefaultModifier(t),isTypeOnly:false,kind:"class"}),u__default.default.isVariableStatement(t)&&this.hasExportModifier(t))for(let r of t.declarationList.declarations)u__default.default.isIdentifier(r.name)&&s.push({name:r.name.text,isDefault:false,isTypeOnly:false,kind:"variable"});if(u__default.default.isTypeAliasDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name.text,isDefault:false,isTypeOnly:true,kind:"type"}),u__default.default.isInterfaceDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name.text,isDefault:false,isTypeOnly:true,kind:"interface"}),u__default.default.isExportAssignment(t)&&!t.isExportEquals){let r=this.getExportDefaultName(t,e);s.push({name:r,isDefault:true,isTypeOnly:false,kind:"variable"});}if(u__default.default.isExportDeclaration(t)){let r=t.exportClause;if(r&&u__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 (u__default.default.canHaveModifiers(t)?u__default.default.getModifiers(t):void 0)?.some(s=>s.kind===u__default.default.SyntaxKind.ExportKeyword)||false}hasDefaultModifier(t){return (u__default.default.canHaveModifiers(t)?u__default.default.getModifiers(t):void 0)?.some(s=>s.kind===u__default.default.SyntaxKind.DefaultKeyword)||false}getExportDefaultName(t,e){let s=t.expression;if(u__default.default.isIdentifier(s))return s.text;if(u__default.default.isArrowFunction(s)||u__default.default.isFunctionExpression(s))return "default";if(u__default.default.isCallExpression(s)&&u__default.default.isIdentifier(s.expression)){let r=s.arguments[0];if(r&&u__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 u__default.default.forEachChild(t,s=>{u__default.default.isInterfaceDeclaration(s)&&s.name.text.endsWith("Props")&&(e=s),u__default.default.isTypeAliasDeclaration(s)&&s.name.text.endsWith("Props")&&(e=s.type);}),e}findComponentFunction(t){let e;return u__default.default.forEachChild(t,s=>{if(u__default.default.isFunctionDeclaration(s)&&this.isExported(s)&&(e=s),u__default.default.isVariableStatement(s)&&this.isExported(s))for(let r of s.declarationList.declarations)r.initializer&&(u__default.default.isArrowFunction(r.initializer)||u__default.default.isFunctionExpression(r.initializer))&&(e=r.initializer);}),e}extractFromTypeNode(t,e){let s=[];if(u__default.default.isInterfaceDeclaration(t)){for(let r of t.members){let i=this.extractMemberProp(r,e);i&&s.push(i);}return s}if(u__default.default.isTypeLiteralNode(t))for(let r of t.members){let i=this.extractMemberProp(r,e);i&&s.push(i);}if(u__default.default.isIntersectionTypeNode(t))for(let r of t.types)s.push(...this.extractFromTypeNode(r,e));return s}extractMemberProp(t,e){if(!u__default.default.isPropertySignature(t))return null;let s=t.name;if(!u__default.default.isIdentifier(s)&&!u__default.default.isStringLiteral(s))return null;let r=(u__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(u__default.default.isObjectBindingPattern(r.name))for(let i of r.name.elements)u__default.default.isBindingElement(i)&&u__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 (u__default.default.canHaveModifiers(t)?u__default.default.getModifiers(t):void 0)?.some(s=>s.kind===u__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 B(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 U(f){return f.split("_").filter(Boolean)}function Tt(f){return f.split("-").filter(Boolean)}function st(f){let t=new Set,e=f.split(/[-_]/);for(let s of e)M(s).forEach(i=>t.add(i.toLowerCase()));return [...t]}function G(f){let t=[],e=f.match(/[A-Z]{2,}/g);return e&&t.push(...e),t}function Ct(f){let t=st(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 St(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())),B(t).forEach(o=>e.add(o.toLowerCase())),U(t).forEach(o=>e.add(o.toLowerCase())),G(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(T__namespace.existsSync(t))try{let e=T__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(T__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(T__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 a=s.get(o);a&&a.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 z(f,t){let e=`${f}:${t}`;return H__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((a,p)=>p.confidence-a.confidence)[0]}detectHook(t){let e=[],s=0,r=new Set,n=l=>{if(u__default.default.isFunctionDeclaration(l)&&l.name){let c=l.name.text;c.startsWith("use")&&c.length>3&&c[3]===c[3].toUpperCase()&&(e.push(`\uD568\uC218 '${c}'\uAC00 use\uB85C \uC2DC\uC791 (Hook \uB124\uC774\uBC0D \uCEE8\uBCA4\uC158)`),s+=.4);}if(u__default.default.isVariableDeclaration(l)&&l.name&&u__default.default.isIdentifier(l.name)){let c=l.name.text;c.startsWith("use")&&c.length>3&&c[3]===c[3].toUpperCase()&&(e.push(`\uD568\uC218 '${c}'\uAC00 use\uB85C \uC2DC\uC791 (Hook \uB124\uC774\uBC0D \uCEE8\uBCA4\uC158)`),s+=.4);}if(u__default.default.isCallExpression(l)&&u__default.default.isIdentifier(l.expression)){let c=l.expression.text;c.startsWith("use")&&c.length>3&&r.add(c);}u__default.default.forEachChild(l,n);};n(t);let o=["useState","useEffect","useCallback","useMemo","useRef","useContext","useReducer"],a=o.filter(l=>r.has(l));a.length>0&&(e.push(`React Hook \uC0AC\uC6A9: ${a.join(", ")}`),s+=.2*Math.min(a.length,3));let p=Array.from(r).filter(l=>!o.includes(l));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=a=>{if((u__default.default.isJsxElement(a)||u__default.default.isJsxSelfClosingElement(a)||u__default.default.isJsxFragment(a))&&(n++,r=true),u__default.default.isFunctionDeclaration(a)||u__default.default.isArrowFunction(a)||u__default.default.isFunctionExpression(a)){let p=a.parameters;if(p.length>0){let l=p[0];if(l.name){let c=l.name.getText(t);(c==="props"||c.startsWith("{"))&&(i=true);}}}u__default.default.forEachChild(a,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=a=>{if(u__default.default.isFunctionDeclaration(a)&&a.name){let p=a.name.text;["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"].includes(p)&&u__default.default.getModifiers(a)?.some(h=>h.kind===u__default.default.SyntaxKind.ExportKeyword)&&r.add(p);}if(u__default.default.isVariableStatement(a)&&u__default.default.getModifiers(a)?.some(c=>c.kind===u__default.default.SyntaxKind.ExportKeyword)){for(let c of a.declarationList.declarations)if(u__default.default.isIdentifier(c.name)){let h=c.name.text;["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"].includes(h)&&r.add(h);}}if(u__default.default.isImportDeclaration(a)){let p=a.moduleSpecifier;if(u__default.default.isStringLiteral(p)&&p.text==="next/server"){let c=a.importClause;if(c?.namedBindings&&u__default.default.isNamedImports(c.namedBindings))for(let h of c.namedBindings.elements){let P=h.name.text;P==="NextRequest"&&(i=true),P==="NextResponse"&&(n=true);}}}u__default.default.forEachChild(a,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,a=p=>{if(u__default.default.isCallExpression(p)&&u__default.default.isIdentifier(p.expression)&&p.expression.text==="fetch"&&r++,u__default.default.isCallExpression(p)){let l=p.expression;u__default.default.isPropertyAccessExpression(l)&&u__default.default.isIdentifier(l.expression)&&l.expression.text==="axios"&&i++,u__default.default.isIdentifier(l)&&l.text==="axios"&&i++;}if((u__default.default.isFunctionDeclaration(p)||u__default.default.isArrowFunction(p)||u__default.default.isMethodDeclaration(p))&&u__default.default.getModifiers(p)?.some(c=>c.kind===u__default.default.SyntaxKind.AsyncKeyword)&&n++,u__default.default.isClassDeclaration(p)&&p.name){let l=p.name.text;(l.toLowerCase().includes("service")||l.toLowerCase().includes("api")||l.toLowerCase().includes("client"))&&(e.push(`\uC11C\uBE44\uC2A4 \uD074\uB798\uC2A4: ${l}`),s+=.5);}u__default.default.forEachChild(p,a);};return a(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=[],a=c=>{if(u__default.default.isImportDeclaration(c)){let h=c.moduleSpecifier;if(u__default.default.isStringLiteral(h)){let P=h.text;(P==="react"||P.startsWith("react/"))&&(i=true);}}if((u__default.default.isJsxElement(c)||u__default.default.isJsxSelfClosingElement(c))&&(n=true),u__default.default.isFunctionDeclaration(c)&&c.name&&u__default.default.getModifiers(c)?.some(E=>E.kind===u__default.default.SyntaxKind.ExportKeyword)&&(r++,o.push(c.name.text)),u__default.default.isVariableStatement(c)&&u__default.default.getModifiers(c)?.some(E=>E.kind===u__default.default.SyntaxKind.ExportKeyword))for(let E of c.declarationList.declarations)E.initializer&&(u__default.default.isArrowFunction(E.initializer)||u__default.default.isFunctionExpression(E.initializer))&&u__default.default.isIdentifier(E.name)&&(r++,o.push(E.name.text));u__default.default.forEachChild(c,a);};if(a(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"],l=o.filter(c=>p.some(h=>c.toLowerCase().startsWith(h)));return l.length>0&&(e.push(`\uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\uBA85 \uD328\uD134: ${l.slice(0,3).join(", ")}`),s+=.2),s<.3?null:{type:"utility",confidence:Math.min(s,1),reasons:e}}};var J=class{constructor(t){this.config=t,this.tsParser=new C,this.sqlParser=new v,this.importExtractor=new I,this.exportExtractor=new w,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 l=await this.parseFile(p,t);l&&i.push(l);}catch(l){let c=l instanceof Error?l.message:"Unknown error";s.push(`${p}: ${c}`);}let n=this.callGraphBuilder.build(i,t),o=i.map(p=>this.createIndexItem(p,n)),a=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:a,timestamp:new Date().toISOString()}}async collectFiles(t){let e=[],s=this.expandIncludePatterns(this.config.include);for(let r of s){let i=await glob.glob(r,{cwd:t,ignore:this.config.exclude,absolute:true});e.push(...i);}return [...new Set(e)]}expandIncludePatterns(t){let e=[];for(let s of t){if(e.push(s),s.startsWith("**/")||s.startsWith("/")||s.startsWith("src/"))continue;let r=s.split("/")[0];r&&!r.includes("*")&&e.push(`**/${s}`);}return 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 c=this.codePatternDetector.detect(n);c&&c.confidence>=.4&&(o=c.type,this.config.verbose&&(console.log(`[metadata-plugin] \uCF54\uB4DC \uBD84\uC11D\uC73C\uB85C \uAC10\uC9C0: ${s} \u2192 ${o} (${(c.confidence*100).toFixed(0)}%)`),c.reasons.forEach(h=>console.log(` - ${h}`))));}if(!o)return null;let a=this.importExtractor.extract(n),p=this.exportExtractor.extract(n),l=o==="component"?this.propsExtractor.extract(n):void 0;return {path:s,type:o,name:this.extractName(s,p),imports:a,exports:p,props:l}}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 a of O)if(e.includes(a))return "table";return null}let n=$[s];if(n)return n;for(let[a,p]of Object.entries(K))if(e.includes(a))return p;for(let a=i.length-2;a>=0;a--){let p=i[a].toLowerCase(),l=L[p];if(l)return l}let o=Object.entries(this.config.fileTypeMapping).sort(([a],[p])=>p.length-a.length);for(let[a,p]of o)if(_(a).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:z(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 Z=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))}},X=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=X;exports.a=Q;exports.b=tt;exports.c=et;exports.d=it;exports.e=nt;exports.f=C;exports.g=v;exports.h=I;exports.i=w;exports.j=b;exports.k=M;exports.l=B;exports.m=U;exports.n=Tt;exports.o=st;exports.p=G;exports.q=Ct;exports.r=R;exports.s=q;exports.t=St;exports.u=F;exports.v=A;exports.w=D;exports.x=z;exports.y=J;exports.z=Z;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import u from'typescript';import*as g from'path';import*as T from'fs';import*as H from'crypto';import {glob}from'glob';import*as k from'fs/promises';var L={components:"component",component:"component",ui:"component",widgets:"component",widget:"component",elements:"component",hooks:"hook",hook:"hook",composables:"hook",services:"service",service:"service",api:"service",utils:"utility",util:"utility",utilities:"utility",utility:"utility",lib:"utility",libs:"utility",helpers:"utility",helper:"utility",common:"utility",shared:"utility"},$={"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"},K={"/api/":"api"},O=["supabase/migrations","prisma/migrations","migrations","db/migrations","database/migrations"];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","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"},tt=["app/**/*.{ts,tsx}","pages/**/*.{ts,tsx}","components/**/*.{ts,tsx}","hooks/**/*.{ts,tsx}","services/**/*.ts","lib/**/*.ts","utils/**/*.ts","src/**/*.{ts,tsx}","supabase/migrations/*.sql"],et=["**/node_modules/**","**/.next/**","**/dist/**","**/*.test.{ts,tsx}","**/*.spec.{ts,tsx}","**/__tests__/**","**/*.d.ts","**/coverage/**"];function it(f={}){return {projectId:f.projectId||"default",include:f.include||tt,exclude:f.exclude||et,fileTypeMapping:{...Q,...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 nt(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 _(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:u.ScriptTarget.ESNext,module:u.ModuleKind.ESNext,jsx:u.JsxEmit.React,esModuleInterop:true,allowSyntheticDefaultImports:true,strict:false};}parse(t,e){return u.createSourceFile(e,t,this.compilerOptions.target,true,this.getScriptKind(e))}getScriptKind(t){let e=t.toLowerCase();return e.endsWith(".tsx")?u.ScriptKind.TSX:e.endsWith(".ts")?u.ScriptKind.TS:e.endsWith(".jsx")?u.ScriptKind.JSX:e.endsWith(".js")?u.ScriptKind.JS:u.ScriptKind.Unknown}traverse(t,e){e(t)!==false&&u.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=u.getJSDocCommentsAndTags(t);if(e.length!==0)return e.filter(u.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],a=this.parseColumns(o);e.push({name:n,columns:a});}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],a=r[3],p=e.find(l=>l.name===n);p||(p={name:n,columns:[]},e.push(p)),p.columns.push({name:o,type:a,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 I=class{extract(t){let e=[];return u.forEachChild(t,s=>{if(u.isImportDeclaration(s)){let r=this.parseImportDeclaration(s);r&&e.push(r);}}),e}parseImportDeclaration(t){let e=t.moduleSpecifier;if(!u.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 a=o.namedBindings;if(a){if(u.isNamespaceImport(a))r.push(`* as ${a.name.text}`);else if(u.isNamedImports(a))for(let p of a.elements){let l=p.name.text,c=p.propertyName?.text;c?r.push(`${c} as ${l}`):r.push(l);}}return {source:s,specifiers:r,isDefault:i,isTypeOnly:n}}};var w=class{extract(t){let e=[];return u.forEachChild(t,s=>{let r=this.extractFromNode(s,t);e.push(...r);}),e}extractFromNode(t,e){let s=[];if(u.isFunctionDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name?.text||"anonymous",isDefault:this.hasDefaultModifier(t),isTypeOnly:false,kind:"function"}),u.isClassDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name?.text||"anonymous",isDefault:this.hasDefaultModifier(t),isTypeOnly:false,kind:"class"}),u.isVariableStatement(t)&&this.hasExportModifier(t))for(let r of t.declarationList.declarations)u.isIdentifier(r.name)&&s.push({name:r.name.text,isDefault:false,isTypeOnly:false,kind:"variable"});if(u.isTypeAliasDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name.text,isDefault:false,isTypeOnly:true,kind:"type"}),u.isInterfaceDeclaration(t)&&this.hasExportModifier(t)&&s.push({name:t.name.text,isDefault:false,isTypeOnly:true,kind:"interface"}),u.isExportAssignment(t)&&!t.isExportEquals){let r=this.getExportDefaultName(t,e);s.push({name:r,isDefault:true,isTypeOnly:false,kind:"variable"});}if(u.isExportDeclaration(t)){let r=t.exportClause;if(r&&u.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 (u.canHaveModifiers(t)?u.getModifiers(t):void 0)?.some(s=>s.kind===u.SyntaxKind.ExportKeyword)||false}hasDefaultModifier(t){return (u.canHaveModifiers(t)?u.getModifiers(t):void 0)?.some(s=>s.kind===u.SyntaxKind.DefaultKeyword)||false}getExportDefaultName(t,e){let s=t.expression;if(u.isIdentifier(s))return s.text;if(u.isArrowFunction(s)||u.isFunctionExpression(s))return "default";if(u.isCallExpression(s)&&u.isIdentifier(s.expression)){let r=s.arguments[0];if(r&&u.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 u.forEachChild(t,s=>{u.isInterfaceDeclaration(s)&&s.name.text.endsWith("Props")&&(e=s),u.isTypeAliasDeclaration(s)&&s.name.text.endsWith("Props")&&(e=s.type);}),e}findComponentFunction(t){let e;return u.forEachChild(t,s=>{if(u.isFunctionDeclaration(s)&&this.isExported(s)&&(e=s),u.isVariableStatement(s)&&this.isExported(s))for(let r of s.declarationList.declarations)r.initializer&&(u.isArrowFunction(r.initializer)||u.isFunctionExpression(r.initializer))&&(e=r.initializer);}),e}extractFromTypeNode(t,e){let s=[];if(u.isInterfaceDeclaration(t)){for(let r of t.members){let i=this.extractMemberProp(r,e);i&&s.push(i);}return s}if(u.isTypeLiteralNode(t))for(let r of t.members){let i=this.extractMemberProp(r,e);i&&s.push(i);}if(u.isIntersectionTypeNode(t))for(let r of t.types)s.push(...this.extractFromTypeNode(r,e));return s}extractMemberProp(t,e){if(!u.isPropertySignature(t))return null;let s=t.name;if(!u.isIdentifier(s)&&!u.isStringLiteral(s))return null;let r=(u.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(u.isObjectBindingPattern(r.name))for(let i of r.name.elements)u.isBindingElement(i)&&u.isIdentifier(i.name)&&s.push({name:i.name.text,type:"unknown",required:!i.initializer,defaultValue:i.initializer?.getText(e)});return s}isExported(t){return (u.canHaveModifiers(t)?u.getModifiers(t):void 0)?.some(s=>s.kind===u.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 B(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 U(f){return f.split("_").filter(Boolean)}function Tt(f){return f.split("-").filter(Boolean)}function st(f){let t=new Set,e=f.split(/[-_]/);for(let s of e)M(s).forEach(i=>t.add(i.toLowerCase()));return [...t]}function G(f){let t=[],e=f.match(/[A-Z]{2,}/g);return e&&t.push(...e),t}function Ct(f){let t=st(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 St(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())),B(t).forEach(o=>e.add(o.toLowerCase())),U(t).forEach(o=>e.add(o.toLowerCase())),G(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(T.existsSync(t))try{let e=T.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(T.existsSync(s))return s}return this.findIndexFile(t)}findIndexFile(t){for(let e of this.extensions){let s=g.join(t,`index${e}`);if(T.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 a=s.get(o);a&&a.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 z(f,t){let e=`${f}:${t}`;return H.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((a,p)=>p.confidence-a.confidence)[0]}detectHook(t){let e=[],s=0,r=new Set,n=l=>{if(u.isFunctionDeclaration(l)&&l.name){let c=l.name.text;c.startsWith("use")&&c.length>3&&c[3]===c[3].toUpperCase()&&(e.push(`\uD568\uC218 '${c}'\uAC00 use\uB85C \uC2DC\uC791 (Hook \uB124\uC774\uBC0D \uCEE8\uBCA4\uC158)`),s+=.4);}if(u.isVariableDeclaration(l)&&l.name&&u.isIdentifier(l.name)){let c=l.name.text;c.startsWith("use")&&c.length>3&&c[3]===c[3].toUpperCase()&&(e.push(`\uD568\uC218 '${c}'\uAC00 use\uB85C \uC2DC\uC791 (Hook \uB124\uC774\uBC0D \uCEE8\uBCA4\uC158)`),s+=.4);}if(u.isCallExpression(l)&&u.isIdentifier(l.expression)){let c=l.expression.text;c.startsWith("use")&&c.length>3&&r.add(c);}u.forEachChild(l,n);};n(t);let o=["useState","useEffect","useCallback","useMemo","useRef","useContext","useReducer"],a=o.filter(l=>r.has(l));a.length>0&&(e.push(`React Hook \uC0AC\uC6A9: ${a.join(", ")}`),s+=.2*Math.min(a.length,3));let p=Array.from(r).filter(l=>!o.includes(l));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=a=>{if((u.isJsxElement(a)||u.isJsxSelfClosingElement(a)||u.isJsxFragment(a))&&(n++,r=true),u.isFunctionDeclaration(a)||u.isArrowFunction(a)||u.isFunctionExpression(a)){let p=a.parameters;if(p.length>0){let l=p[0];if(l.name){let c=l.name.getText(t);(c==="props"||c.startsWith("{"))&&(i=true);}}}u.forEachChild(a,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=a=>{if(u.isFunctionDeclaration(a)&&a.name){let p=a.name.text;["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"].includes(p)&&u.getModifiers(a)?.some(h=>h.kind===u.SyntaxKind.ExportKeyword)&&r.add(p);}if(u.isVariableStatement(a)&&u.getModifiers(a)?.some(c=>c.kind===u.SyntaxKind.ExportKeyword)){for(let c of a.declarationList.declarations)if(u.isIdentifier(c.name)){let h=c.name.text;["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"].includes(h)&&r.add(h);}}if(u.isImportDeclaration(a)){let p=a.moduleSpecifier;if(u.isStringLiteral(p)&&p.text==="next/server"){let c=a.importClause;if(c?.namedBindings&&u.isNamedImports(c.namedBindings))for(let h of c.namedBindings.elements){let P=h.name.text;P==="NextRequest"&&(i=true),P==="NextResponse"&&(n=true);}}}u.forEachChild(a,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,a=p=>{if(u.isCallExpression(p)&&u.isIdentifier(p.expression)&&p.expression.text==="fetch"&&r++,u.isCallExpression(p)){let l=p.expression;u.isPropertyAccessExpression(l)&&u.isIdentifier(l.expression)&&l.expression.text==="axios"&&i++,u.isIdentifier(l)&&l.text==="axios"&&i++;}if((u.isFunctionDeclaration(p)||u.isArrowFunction(p)||u.isMethodDeclaration(p))&&u.getModifiers(p)?.some(c=>c.kind===u.SyntaxKind.AsyncKeyword)&&n++,u.isClassDeclaration(p)&&p.name){let l=p.name.text;(l.toLowerCase().includes("service")||l.toLowerCase().includes("api")||l.toLowerCase().includes("client"))&&(e.push(`\uC11C\uBE44\uC2A4 \uD074\uB798\uC2A4: ${l}`),s+=.5);}u.forEachChild(p,a);};return a(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=[],a=c=>{if(u.isImportDeclaration(c)){let h=c.moduleSpecifier;if(u.isStringLiteral(h)){let P=h.text;(P==="react"||P.startsWith("react/"))&&(i=true);}}if((u.isJsxElement(c)||u.isJsxSelfClosingElement(c))&&(n=true),u.isFunctionDeclaration(c)&&c.name&&u.getModifiers(c)?.some(E=>E.kind===u.SyntaxKind.ExportKeyword)&&(r++,o.push(c.name.text)),u.isVariableStatement(c)&&u.getModifiers(c)?.some(E=>E.kind===u.SyntaxKind.ExportKeyword))for(let E of c.declarationList.declarations)E.initializer&&(u.isArrowFunction(E.initializer)||u.isFunctionExpression(E.initializer))&&u.isIdentifier(E.name)&&(r++,o.push(E.name.text));u.forEachChild(c,a);};if(a(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"],l=o.filter(c=>p.some(h=>c.toLowerCase().startsWith(h)));return l.length>0&&(e.push(`\uC720\uD2F8\uB9AC\uD2F0 \uD568\uC218\uBA85 \uD328\uD134: ${l.slice(0,3).join(", ")}`),s+=.2),s<.3?null:{type:"utility",confidence:Math.min(s,1),reasons:e}}};var J=class{constructor(t){this.config=t,this.tsParser=new C,this.sqlParser=new v,this.importExtractor=new I,this.exportExtractor=new w,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 l=await this.parseFile(p,t);l&&i.push(l);}catch(l){let c=l instanceof Error?l.message:"Unknown error";s.push(`${p}: ${c}`);}let n=this.callGraphBuilder.build(i,t),o=i.map(p=>this.createIndexItem(p,n)),a=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:a,timestamp:new Date().toISOString()}}async collectFiles(t){let e=[],s=this.expandIncludePatterns(this.config.include);for(let r of s){let i=await glob(r,{cwd:t,ignore:this.config.exclude,absolute:true});e.push(...i);}return [...new Set(e)]}expandIncludePatterns(t){let e=[];for(let s of t){if(e.push(s),s.startsWith("**/")||s.startsWith("/")||s.startsWith("src/"))continue;let r=s.split("/")[0];r&&!r.includes("*")&&e.push(`**/${s}`);}return 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 c=this.codePatternDetector.detect(n);c&&c.confidence>=.4&&(o=c.type,this.config.verbose&&(console.log(`[metadata-plugin] \uCF54\uB4DC \uBD84\uC11D\uC73C\uB85C \uAC10\uC9C0: ${s} \u2192 ${o} (${(c.confidence*100).toFixed(0)}%)`),c.reasons.forEach(h=>console.log(` - ${h}`))));}if(!o)return null;let a=this.importExtractor.extract(n),p=this.exportExtractor.extract(n),l=o==="component"?this.propsExtractor.extract(n):void 0;return {path:s,type:o,name:this.extractName(s,p),imports:a,exports:p,props:l}}determineFileType(t){let e=t.replace(/\\/g,"/"),s=g.basename(e),r=g.extname(s),i=e.split("/");if(r===".sql"){for(let a of O)if(e.includes(a))return "table";return null}let n=$[s];if(n)return n;for(let[a,p]of Object.entries(K))if(e.includes(a))return p;for(let a=i.length-2;a>=0;a--){let p=i[a].toLowerCase(),l=L[p];if(l)return l}let o=Object.entries(this.config.fileTypeMapping).sort(([a],[p])=>p.length-a.length);for(let[a,p]of o)if(_(a).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:z(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 Z=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))}},X=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,X as B,Q as a,tt as b,et as c,it as d,nt as e,C as f,v as g,I as h,w as i,b as j,M as k,B as l,U as m,Tt as n,st as o,G as p,Ct as q,R as r,q as s,St as t,F as u,A as v,D as w,z as x,J as y,Z as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';async function a(e){switch(e.provider){case "supabase":let{SupabaseProvider:r}=await import('./supabase-
|
|
1
|
+
'use strict';async function a(e){switch(e.provider){case "supabase":let{SupabaseProvider:r}=await import('./supabase-ODLVMAF6.cjs');return new r(e);case "custom":let{CustomApiProvider:t}=await import('./custom-api-THEHQ4IR.cjs');return new t(e);default:throw new Error(`Unknown provider: ${e.provider}`)}}exports.a=a;
|
package/dist/cli.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';var
|
|
2
|
+
'use strict';var chunkW2STEULD_cjs=require('./chunk-W2STEULD.cjs'),chunkOPGCPTPY_cjs=require('./chunk-OPGCPTPY.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
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
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
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(`
|
|
@@ -18,7 +18,7 @@ Supabase \uC5F0\uB3D9 \uC124\uC815? [y/N]: `)).trim().toLowerCase()==="y"}async
|
|
|
18
18
|
metadatafy(),`):o.includes("defineConfig(")&&(o=o.replace(/defineConfig\(\{/,`defineConfig({
|
|
19
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';
|
|
20
20
|
`:`const { withMetadatafy } = require('metadatafy/next');
|
|
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 `
|
|
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
22
|
`:case "\r":case "":t.isTTY&&t.setRawMode(a),t.removeListener("data",n),process.stdout.write(`
|
|
23
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
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(`
|
|
@@ -32,7 +32,7 @@ Supabase \uC5F0\uB3D9 \uC124\uC815? [y/N]: `)).trim().toLowerCase()==="y"}async
|
|
|
32
32
|
\uD14C\uC774\uBE14 \uC774\uB984 [project_metadata]: `)).trim()||"project_metadata";console.log(`
|
|
33
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.
|
|
34
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
|
|
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 chunkW2STEULD_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(`
|
|
36
36
|
\u{1F4CB} Supabase\uC5D0\uC11C \uB2E4\uC74C SQL\uB85C \uD14C\uC774\uBE14\uC744 \uC0DD\uC131\uD558\uC138\uC694:
|
|
37
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
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(`
|
|
@@ -87,13 +87,13 @@ Options:
|
|
|
87
87
|
-c, --config <path> \uC124\uC815 \uD30C\uC77C \uACBD\uB85C
|
|
88
88
|
--verbose \uC0C1\uC138 \uB85C\uADF8 \uCD9C\uB825
|
|
89
89
|
-h, --help \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC
|
|
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=
|
|
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=chunkOPGCPTPY_cjs.d({...i,projectId:a,verbose:n,output:{file:{enabled:true,path:o},...i.output}});console.log(`
|
|
91
91
|
\u{1F4E6} Analyzing project: ${a}`),console.log(`\u{1F4C1} Root directory: ${t}
|
|
92
|
-
`);let u=new
|
|
92
|
+
`);let u=new chunkOPGCPTPY_cjs.y(r),c=new chunkOPGCPTPY_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 chunkOPGCPTPY_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
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
94
|
\u{1F4C4} Output: ${v}`),p.stats.parseErrors.length>0&&(console.log(`
|
|
95
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
|
|
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 chunkW2STEULD_cjs.a(u)).upload(r);l.success?console.log(`
|
|
97
97
|
\u2705 ${l.message} (${u.provider})`):(console.error(`
|
|
98
98
|
\u274C Upload failed: ${l.error}`),process.exit(1));}catch(c){console.error(`
|
|
99
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(`
|
|
@@ -114,4 +114,4 @@ Options:
|
|
|
114
114
|
\u{1F4CB} Supabase\uC5D0\uC11C \uD14C\uC774\uBE14\uC744 \uC0DD\uC131\uD558\uC138\uC694:
|
|
115
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
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
|
|
117
|
+
\u{1F5C4}\uFE0F Uploading to ${a.provider}...`);try{let n=await(await chunkW2STEULD_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,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {a}from'./chunk-
|
|
2
|
+
import {a}from'./chunk-7VGYPCY7.js';import {d,y,z as z$1,A}from'./chunk-UIDEH2GS.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
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
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
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(`
|
|
@@ -18,7 +18,7 @@ Supabase \uC5F0\uB3D9 \uC124\uC815? [y/N]: `)).trim().toLowerCase()==="y"}async
|
|
|
18
18
|
metadatafy(),`):o.includes("defineConfig(")&&(o=o.replace(/defineConfig\(\{/,`defineConfig({
|
|
19
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';
|
|
20
20
|
`:`const { withMetadatafy } = require('metadatafy/next');
|
|
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 `
|
|
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
22
|
`:case "\r":case "":t.isTTY&&t.setRawMode(a),t.removeListener("data",n),process.stdout.write(`
|
|
23
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
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(`
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var
|
|
1
|
+
'use strict';var chunkOPGCPTPY_cjs=require('./chunk-OPGCPTPY.cjs');Object.defineProperty(exports,"ApiSender",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.A}});Object.defineProperty(exports,"CallGraphBuilder",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.w}});Object.defineProperty(exports,"DEFAULT_EXCLUDE_PATTERNS",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.c}});Object.defineProperty(exports,"DEFAULT_FILE_TYPE_MAPPING",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.a}});Object.defineProperty(exports,"DEFAULT_INCLUDE_PATTERNS",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.b}});Object.defineProperty(exports,"DependencyResolver",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.v}});Object.defineProperty(exports,"ExportExtractor",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.i}});Object.defineProperty(exports,"FileWriter",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.z}});Object.defineProperty(exports,"ImportExtractor",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.h}});Object.defineProperty(exports,"KOREAN_KEYWORD_MAP",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.r}});Object.defineProperty(exports,"KeywordExtractor",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.u}});Object.defineProperty(exports,"ProjectAnalyzer",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.y}});Object.defineProperty(exports,"PropsExtractor",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.j}});Object.defineProperty(exports,"SQLParser",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.g}});Object.defineProperty(exports,"SupabaseApiSender",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.B}});Object.defineProperty(exports,"TypeScriptParser",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.f}});Object.defineProperty(exports,"createDefaultConfig",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.d}});Object.defineProperty(exports,"extendKoreanMap",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.t}});Object.defineProperty(exports,"extractAcronyms",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.p}});Object.defineProperty(exports,"findKoreanKeywords",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.s}});Object.defineProperty(exports,"generateId",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.x}});Object.defineProperty(exports,"splitCamelCase",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.k}});Object.defineProperty(exports,"splitIntoWords",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.o}});Object.defineProperty(exports,"splitKebabCase",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.n}});Object.defineProperty(exports,"splitPascalCase",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.l}});Object.defineProperty(exports,"splitSnakeCase",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.m}});Object.defineProperty(exports,"toAllCases",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.q}});Object.defineProperty(exports,"validateConfig",{enumerable:true,get:function(){return chunkOPGCPTPY_cjs.e}});
|
package/dist/index.d.cts
CHANGED
|
@@ -46,19 +46,25 @@ declare class ProjectAnalyzer {
|
|
|
46
46
|
* 대상 파일 수집
|
|
47
47
|
*/
|
|
48
48
|
private collectFiles;
|
|
49
|
+
/**
|
|
50
|
+
* include 패턴 확장
|
|
51
|
+
* 예: hooks/** → [hooks/**, ** /hooks/**] (src/hooks 등도 매칭되도록)
|
|
52
|
+
*/
|
|
53
|
+
private expandIncludePatterns;
|
|
49
54
|
/**
|
|
50
55
|
* 단일 파일 파싱
|
|
51
56
|
*/
|
|
52
57
|
private parseFile;
|
|
53
58
|
/**
|
|
54
|
-
* 파일 타입 결정 (
|
|
59
|
+
* 파일 타입 결정 (경로 기반 + 폴더명 기반 감지)
|
|
55
60
|
*
|
|
56
61
|
* 감지 우선순위:
|
|
57
62
|
* 1. SQL 마이그레이션 파일
|
|
58
63
|
* 2. Next.js 특수 파일 (page.tsx, layout.tsx, route.ts)
|
|
59
64
|
* 3. 경로 세그먼트 (/api/)
|
|
60
|
-
* 4.
|
|
61
|
-
* 5.
|
|
65
|
+
* 4. 폴더 이름 기반 (components/, hooks/, utils/, lib/ 등)
|
|
66
|
+
* 5. 사용자 정의 glob 패턴
|
|
67
|
+
* 6. pages 폴더 (Next.js Pages Router)
|
|
62
68
|
*
|
|
63
69
|
* 나머지는 코드 패턴 분석으로 처리 (parseFile에서 수행)
|
|
64
70
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -46,19 +46,25 @@ declare class ProjectAnalyzer {
|
|
|
46
46
|
* 대상 파일 수집
|
|
47
47
|
*/
|
|
48
48
|
private collectFiles;
|
|
49
|
+
/**
|
|
50
|
+
* include 패턴 확장
|
|
51
|
+
* 예: hooks/** → [hooks/**, ** /hooks/**] (src/hooks 등도 매칭되도록)
|
|
52
|
+
*/
|
|
53
|
+
private expandIncludePatterns;
|
|
49
54
|
/**
|
|
50
55
|
* 단일 파일 파싱
|
|
51
56
|
*/
|
|
52
57
|
private parseFile;
|
|
53
58
|
/**
|
|
54
|
-
* 파일 타입 결정 (
|
|
59
|
+
* 파일 타입 결정 (경로 기반 + 폴더명 기반 감지)
|
|
55
60
|
*
|
|
56
61
|
* 감지 우선순위:
|
|
57
62
|
* 1. SQL 마이그레이션 파일
|
|
58
63
|
* 2. Next.js 특수 파일 (page.tsx, layout.tsx, route.ts)
|
|
59
64
|
* 3. 경로 세그먼트 (/api/)
|
|
60
|
-
* 4.
|
|
61
|
-
* 5.
|
|
65
|
+
* 4. 폴더 이름 기반 (components/, hooks/, utils/, lib/ 등)
|
|
66
|
+
* 5. 사용자 정의 glob 패턴
|
|
67
|
+
* 6. pages 폴더 (Next.js Pages Router)
|
|
62
68
|
*
|
|
63
69
|
* 나머지는 코드 패턴 분석으로 처리 (parseFile에서 수행)
|
|
64
70
|
*/
|
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-
|
|
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-UIDEH2GS.js';
|
package/dist/next.cjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var chunkW2STEULD_cjs=require('./chunk-W2STEULD.cjs'),chunkOPGCPTPY_cjs=require('./chunk-OPGCPTPY.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 m(a,t,e){let i=new chunkOPGCPTPY_cjs.y(a),n=new chunkOPGCPTPY_cjs.z(a),l=a.output.api?.enabled?new chunkOPGCPTPY_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 chunkW2STEULD_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=chunkOPGCPTPY_cjs.d(a),e=a.supabase,i=chunkOPGCPTPY_cjs.e(t);if(i.length>0)throw new Error(`[metadata-plugin] Invalid config:
|
|
2
2
|
${i.join(`
|
|
3
|
-
`)}`);return {name:"metadata-adapter",async onBuildComplete({projectDir:n}){t.verbose&&console.log("[metadata-plugin] Build completed, running analysis..."),await
|
|
3
|
+
`)}`);return {name:"metadata-adapter",async onBuildComplete({projectDir:n}){t.verbose&&console.log("[metadata-plugin] Build completed, running analysis..."),await m(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
|
|
5
5
|
// This adapter enables metadata extraction with Turbopack (Next.js 16+)
|
|
6
6
|
|
|
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=
|
|
10
|
+
`;return await v__namespace.writeFile(e,i.trim()),e}function x(a={}){let t=chunkOPGCPTPY_cjs.d(a),e=a.runOn||"build",i=a.supabase,n=chunkOPGCPTPY_cjs.e(t);if(n.length>0)throw new Error(`[metadata-plugin] Invalid config:
|
|
11
11
|
${n.join(`
|
|
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
|
|
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 m(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 f(t,i))),typeof r.webpack=="function"?r.webpack(o,p):o}}}}var f=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 m(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.withMetadatafy=x;
|
package/dist/next.d.cts
CHANGED
|
@@ -60,7 +60,17 @@ declare function generateAdapterFile(projectDir: string, options?: NextPluginOpt
|
|
|
60
60
|
* Next.js 설정을 확장하는 함수
|
|
61
61
|
* Next.js 16+ Turbopack: compiler.runAfterProductionCompile 사용
|
|
62
62
|
* Next.js 15- Webpack: webpack 플러그인 사용 (폴백)
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* // next.config.ts
|
|
66
|
+
* import { withMetadatafy } from 'metadatafy/next';
|
|
67
|
+
*
|
|
68
|
+
* const nextConfig = { ... };
|
|
69
|
+
* export default withMetadatafy()(nextConfig);
|
|
70
|
+
*
|
|
71
|
+
* // 또는 옵션과 함께
|
|
72
|
+
* export default withMetadatafy({ verbose: true })(nextConfig);
|
|
63
73
|
*/
|
|
64
|
-
declare function
|
|
74
|
+
declare function withMetadatafy(options?: NextPluginOptions): (nextConfig: NextConfig) => NextConfig;
|
|
65
75
|
|
|
66
|
-
export { type NextPluginOptions, PluginConfig, createMetadataAdapter,
|
|
76
|
+
export { type NextPluginOptions, PluginConfig, createMetadataAdapter, withMetadatafy as default, generateAdapterFile, withMetadatafy };
|
package/dist/next.d.ts
CHANGED
|
@@ -60,7 +60,17 @@ declare function generateAdapterFile(projectDir: string, options?: NextPluginOpt
|
|
|
60
60
|
* Next.js 설정을 확장하는 함수
|
|
61
61
|
* Next.js 16+ Turbopack: compiler.runAfterProductionCompile 사용
|
|
62
62
|
* Next.js 15- Webpack: webpack 플러그인 사용 (폴백)
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* // next.config.ts
|
|
66
|
+
* import { withMetadatafy } from 'metadatafy/next';
|
|
67
|
+
*
|
|
68
|
+
* const nextConfig = { ... };
|
|
69
|
+
* export default withMetadatafy()(nextConfig);
|
|
70
|
+
*
|
|
71
|
+
* // 또는 옵션과 함께
|
|
72
|
+
* export default withMetadatafy({ verbose: true })(nextConfig);
|
|
63
73
|
*/
|
|
64
|
-
declare function
|
|
74
|
+
declare function withMetadatafy(options?: NextPluginOptions): (nextConfig: NextConfig) => NextConfig;
|
|
65
75
|
|
|
66
|
-
export { type NextPluginOptions, PluginConfig, createMetadataAdapter,
|
|
76
|
+
export { type NextPluginOptions, PluginConfig, createMetadataAdapter, withMetadatafy as default, generateAdapterFile, withMetadatafy };
|
package/dist/next.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {a}from'./chunk-
|
|
1
|
+
import {a}from'./chunk-7VGYPCY7.js';import {d,e,y,z,A as A$1}from'./chunk-UIDEH2GS.js';import*as u from'path';import*as v from'fs/promises';async function m(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
|
-
`)}`);return {name:"metadata-adapter",async onBuildComplete({projectDir:n}){t.verbose&&console.log("[metadata-plugin] Build completed, running analysis..."),await
|
|
3
|
+
`)}`);return {name:"metadata-adapter",async onBuildComplete({projectDir:n}){t.verbose&&console.log("[metadata-plugin] Build completed, running analysis..."),await m(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
|
|
5
5
|
// This adapter enables metadata extraction with Turbopack (Next.js 16+)
|
|
6
6
|
|
|
@@ -9,4 +9,4 @@ const { createMetadataAdapter } = require('metadatafy/next');
|
|
|
9
9
|
module.exports = createMetadataAdapter(${JSON.stringify(t,null,2)});
|
|
10
10
|
`;return await v.writeFile(e,i.trim()),e}function x(a={}){let t=d(a),e$1=a.runOn||"build",i=a.supabase,n=e(t);if(n.length>0)throw new Error(`[metadata-plugin] Invalid config:
|
|
11
11
|
${n.join(`
|
|
12
|
-
`)}`);let l=false;return r=>{let s=r.compiler?.runAfterProductionCompile;return {...r,compiler:{...r.compiler,async runAfterProductionCompile(o){s&&await s(o),!(e$1!=="build"&&e$1!=="both")&&(l=true,t.verbose&&console.log("[metadata-plugin] runAfterProductionCompile triggered"),await
|
|
12
|
+
`)}`);let l=false;return r=>{let s=r.compiler?.runAfterProductionCompile;return {...r,compiler:{...r.compiler,async runAfterProductionCompile(o){s&&await s(o),!(e$1!=="build"&&e$1!=="both")&&(l=true,t.verbose&&console.log("[metadata-plugin] runAfterProductionCompile triggered"),await m(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$1==="both"||e$1==="build"&&!g||e$1==="dev"&&g)&&(o.plugins=o.plugins||[],o.plugins.push(new f(t,i))),typeof r.webpack=="function"?r.webpack(o,p):o}}}}var f=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 m(this.config,t.context,this.supabaseOptions),n();}catch(l){n(l);}}),t.hooks.watchRun.tap(e,()=>{});}};export{A as createMetadataAdapter,x as default,N as generateAdapterFile,x as withMetadatafy};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
'use strict';var i=class{constructor(e){this.name="Supabase";this.config=e;}getRestUrl(e){return `${this.config.url.replace(/\/$/,"")}/rest/v1/${e}`}getHeaders(){return {apikey:this.config.serviceRoleKey,Authorization:`Bearer ${this.config.serviceRoleKey}`,"Content-Type":"application/json"}}async testConnection(){try{let e=await fetch(this.getRestUrl(this.config.tableName),{method:"GET",headers:{...this.getHeaders(),Range:"0-0"}});return e.ok||e.status===416}catch{return false}}async upload(e){let{tableName:a}=this.config;try{if(await this.deleteByProjectId(e.projectId),e.items.length>0){let t=await this.bulkInsertItems(e.items);if(!t.success)return t}return await this.logAnalysis(e),{success:!0,message:`${e.items.length} files uploaded to ${a}`,data:{itemsCount:e.items.length,stats:e.stats}}}catch(t){return {success:false,message:"Failed to upload metadata",error:t instanceof Error?t.message:String(t)}}}async deleteByProjectId(e){let{tableName:a}=this.config,t=await fetch(`${this.getRestUrl(a)}?project_id=eq.${encodeURIComponent(e)}`,{method:"DELETE",headers:this.getHeaders()});if(!t.ok&&t.status!==404){let r=await t.text();throw new Error(`Failed to delete existing data: ${r}`)}}async bulkInsertItems(e){let{tableName:a}=this.config,t=e.map(s=>({id:s.id,project_id:s.projectId,file_type:s.type,name:s.name,path:s.path,keywords:s.keywords,search_text:s.searchText,calls:s.calls,called_by:s.calledBy,metadata:s.metadata})),n=this.chunkArray(t,500);for(let s of n){let o=await fetch(this.getRestUrl(a),{method:"POST",headers:{...this.getHeaders(),Prefer:"return=minimal"},body:JSON.stringify(s)});if(!o.ok)return {success:false,message:"Failed to insert items",error:await o.text()}}return {success:true,message:"Items inserted successfully"}}async logAnalysis(e){let a="code_analysis_log",t={project_id:e.projectId,total_files:e.stats.totalFiles,stats:e.stats.byType,parse_errors:e.stats.parseErrors,analyzed_at:e.timestamp};try{await fetch(this.getRestUrl(a),{method:"POST",headers:{...this.getHeaders(),Prefer:"return=minimal"},body:JSON.stringify(t)});}catch{}}chunkArray(e,a){let t=[];for(let r=0;r<e.length;r+=a)t.push(e.slice(r,r+a));return t}};exports.SupabaseProvider=i;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var i=class{constructor(e){this.name="Supabase";this.config=e;}getRestUrl(e){return `${this.config.url.replace(/\/$/,"")}/rest/v1/${e}`}getHeaders(){return {apikey:this.config.serviceRoleKey,Authorization:`Bearer ${this.config.serviceRoleKey}`,"Content-Type":"application/json"}}async testConnection(){try{let e=await fetch(this.getRestUrl(this.config.tableName),{method:"GET",headers:{...this.getHeaders(),Range:"0-0"}});return e.ok||e.status===416}catch{return false}}async upload(e){let{tableName:a}=this.config;try{if(await this.deleteByProjectId(e.projectId),e.items.length>0){let t=await this.bulkInsertItems(e.items);if(!t.success)return t}return await this.logAnalysis(e),{success:!0,message:`${e.items.length} files uploaded to ${a}`,data:{itemsCount:e.items.length,stats:e.stats}}}catch(t){return {success:false,message:"Failed to upload metadata",error:t instanceof Error?t.message:String(t)}}}async deleteByProjectId(e){let{tableName:a}=this.config,t=await fetch(`${this.getRestUrl(a)}?project_id=eq.${encodeURIComponent(e)}`,{method:"DELETE",headers:this.getHeaders()});if(!t.ok&&t.status!==404){let r=await t.text();throw new Error(`Failed to delete existing data: ${r}`)}}async bulkInsertItems(e){let{tableName:a}=this.config,t=e.map(s=>({id:s.id,project_id:s.projectId,file_type:s.type,name:s.name,path:s.path,keywords:s.keywords,search_text:s.searchText,calls:s.calls,called_by:s.calledBy,metadata:s.metadata})),n=this.chunkArray(t,500);for(let s of n){let o=await fetch(this.getRestUrl(a),{method:"POST",headers:{...this.getHeaders(),Prefer:"return=minimal"},body:JSON.stringify(s)});if(!o.ok)return {success:false,message:"Failed to insert items",error:await o.text()}}return {success:true,message:"Items inserted successfully"}}async logAnalysis(e){let a="code_analysis_log",t={project_id:e.projectId,total_files:e.stats.totalFiles,stats:e.stats.byType,parse_errors:e.stats.parseErrors,analyzed_at:e.timestamp};try{await fetch(this.getRestUrl(a),{method:"POST",headers:{...this.getHeaders(),Prefer:"return=minimal"},body:JSON.stringify(t)});}catch{}}chunkArray(e,a){let t=[];for(let r=0;r<e.length;r+=a)t.push(e.slice(r,r+a));return t}};export{i as SupabaseProvider};
|
package/dist/vite.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var chunkW2STEULD_cjs=require('./chunk-W2STEULD.cjs'),chunkOPGCPTPY_cjs=require('./chunk-OPGCPTPY.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 chunkOPGCPTPY_cjs.y(e),n=new chunkOPGCPTPY_cjs.z(e),o=e.output.api?.enabled?new chunkOPGCPTPY_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 chunkW2STEULD_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=chunkOPGCPTPY_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=chunkOPGCPTPY_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-
|
|
1
|
+
import {a}from'./chunk-7VGYPCY7.js';import {d,e,y,z,A}from'./chunk-UIDEH2GS.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
package/dist/chunk-6MX4TMZZ.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
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};
|
package/dist/chunk-RLSFEATG.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
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;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
'use strict';var i=class{constructor(e){this.name="Supabase";this.config=e;}getRestUrl(e){return `${this.config.url.replace(/\/$/,"")}/rest/v1/${e}`}async testConnection(){try{let e=await fetch(this.getRestUrl(this.config.tableName),{method:"GET",headers:{apikey:this.config.serviceRoleKey,Authorization:`Bearer ${this.config.serviceRoleKey}`,"Content-Type":"application/json",Range:"0-0"}});return e.ok||e.status===416}catch{return false}}async upload(e){let{fields:t,tableName:o}=this.config,s=await this.findByProjectId(e.projectId),a={[t.projectId]:e.projectId,[t.metadata]:e};t.updatedAt&&(a[t.updatedAt]=new Date().toISOString()),!s&&t.createdAt&&(a[t.createdAt]=new Date().toISOString());try{let r;if(s?r=await fetch(`${this.getRestUrl(o)}?${t.projectId}=eq.${e.projectId}`,{method:"PATCH",headers:{apikey:this.config.serviceRoleKey,Authorization:`Bearer ${this.config.serviceRoleKey}`,"Content-Type":"application/json",Prefer:"return=representation"},body:JSON.stringify(a)}):r=await fetch(this.getRestUrl(o),{method:"POST",headers:{apikey:this.config.serviceRoleKey,Authorization:`Bearer ${this.config.serviceRoleKey}`,"Content-Type":"application/json",Prefer:"return=representation"},body:JSON.stringify(a)}),!r.ok){let c=await r.text();return {success:!1,message:`Supabase API error: ${r.status}`,error:c}}let n=await r.json();return {success:!0,message:s?"Metadata updated":"Metadata created",data:n}}catch(r){return {success:false,message:"Failed to upload metadata",error:r instanceof Error?r.message:String(r)}}}async findByProjectId(e){try{let{fields:t,tableName:o}=this.config,s=await fetch(`${this.getRestUrl(o)}?${t.projectId}=eq.${e}&limit=1`,{method:"GET",headers:{apikey:this.config.serviceRoleKey,Authorization:`Bearer ${this.config.serviceRoleKey}`,"Content-Type":"application/json"}});if(!s.ok)return null;let a=await s.json();return Array.isArray(a)&&a.length>0?a[0]:null}catch{return null}}};exports.SupabaseProvider=i;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var i=class{constructor(e){this.name="Supabase";this.config=e;}getRestUrl(e){return `${this.config.url.replace(/\/$/,"")}/rest/v1/${e}`}async testConnection(){try{let e=await fetch(this.getRestUrl(this.config.tableName),{method:"GET",headers:{apikey:this.config.serviceRoleKey,Authorization:`Bearer ${this.config.serviceRoleKey}`,"Content-Type":"application/json",Range:"0-0"}});return e.ok||e.status===416}catch{return false}}async upload(e){let{fields:t,tableName:o}=this.config,s=await this.findByProjectId(e.projectId),a={[t.projectId]:e.projectId,[t.metadata]:e};t.updatedAt&&(a[t.updatedAt]=new Date().toISOString()),!s&&t.createdAt&&(a[t.createdAt]=new Date().toISOString());try{let r;if(s?r=await fetch(`${this.getRestUrl(o)}?${t.projectId}=eq.${e.projectId}`,{method:"PATCH",headers:{apikey:this.config.serviceRoleKey,Authorization:`Bearer ${this.config.serviceRoleKey}`,"Content-Type":"application/json",Prefer:"return=representation"},body:JSON.stringify(a)}):r=await fetch(this.getRestUrl(o),{method:"POST",headers:{apikey:this.config.serviceRoleKey,Authorization:`Bearer ${this.config.serviceRoleKey}`,"Content-Type":"application/json",Prefer:"return=representation"},body:JSON.stringify(a)}),!r.ok){let c=await r.text();return {success:!1,message:`Supabase API error: ${r.status}`,error:c}}let n=await r.json();return {success:!0,message:s?"Metadata updated":"Metadata created",data:n}}catch(r){return {success:false,message:"Failed to upload metadata",error:r instanceof Error?r.message:String(r)}}}async findByProjectId(e){try{let{fields:t,tableName:o}=this.config,s=await fetch(`${this.getRestUrl(o)}?${t.projectId}=eq.${e}&limit=1`,{method:"GET",headers:{apikey:this.config.serviceRoleKey,Authorization:`Bearer ${this.config.serviceRoleKey}`,"Content-Type":"application/json"}});if(!s.ok)return null;let a=await s.json();return Array.isArray(a)&&a.length>0?a[0]:null}catch{return null}}};export{i as SupabaseProvider};
|