metadatafy 1.0.3 → 1.1.1

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/README.md CHANGED
@@ -81,6 +81,48 @@ export default defineConfig({
81
81
 
82
82
  ### Next.js Plugin
83
83
 
84
+ #### Next.js 16+ (Turbopack) - Recommended
85
+
86
+ Next.js 16부터 Turbopack이 기본 번들러입니다. Turbopack은 Webpack 플러그인을 지원하지 않으므로, Build Adapter 방식을 사용합니다.
87
+
88
+ Since Next.js 16, Turbopack is the default bundler. Since Turbopack doesn't support Webpack plugins, use the Build Adapter approach.
89
+
90
+ **Step 1: Create adapter file / 어댑터 파일 생성**
91
+
92
+ ```javascript
93
+ // metadata-adapter.js
94
+ const { createMetadataAdapter } = require('metadatafy/next');
95
+
96
+ module.exports = createMetadataAdapter({
97
+ projectId: 'my-project',
98
+ verbose: true,
99
+ output: {
100
+ file: { enabled: true, path: 'project-metadata.json' },
101
+ },
102
+ });
103
+ ```
104
+
105
+ **Step 2: Configure next.config / next.config 설정**
106
+
107
+ ```typescript
108
+ // next.config.ts
109
+ import type { NextConfig } from 'next';
110
+
111
+ const nextConfig: NextConfig = {
112
+ experimental: {
113
+ adapterPath: require.resolve('./metadata-adapter.js'),
114
+ },
115
+ };
116
+
117
+ export default nextConfig;
118
+ ```
119
+
120
+ #### Next.js 15 or Earlier (Webpack)
121
+
122
+ For Next.js 15 or earlier, or when using `--webpack` flag:
123
+
124
+ Next.js 15 이하 또는 `--webpack` 플래그 사용 시:
125
+
84
126
  ```javascript
85
127
  // next.config.js
86
128
  const { withMetadata } = require('metadatafy/next');
@@ -95,6 +137,20 @@ module.exports = withMetadata({
95
137
  })(nextConfig);
96
138
  ```
97
139
 
140
+ #### Alternative: CLI with npm scripts / 대안: npm 스크립트와 CLI
141
+
142
+ Works with any Next.js version / 모든 Next.js 버전에서 동작:
143
+
144
+ ```json
145
+ {
146
+ "scripts": {
147
+ "build": "next build",
148
+ "build:with-metadata": "next build && metadatafy analyze",
149
+ "metadata": "metadatafy analyze"
150
+ }
151
+ }
152
+ ```
153
+
98
154
  ## Configuration / 설정
99
155
 
100
156
  Create `metadata.config.json` in your project root:
@@ -236,4 +292,4 @@ Issues and pull requests are welcome!
236
292
 
237
293
  이슈와 풀 리퀘스트를 환영합니다!
238
294
 
239
- GitHub: https://github.com/rungchan2/get-metadata
295
+ GitHub: https://github.com/rungchan2/metadatafy
package/dist/cli.cjs CHANGED
@@ -1,5 +1,18 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var chunkBT3J264A_cjs=require('./chunk-BT3J264A.cjs'),util=require('util'),a=require('path'),r=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 a__namespace=/*#__PURE__*/_interopNamespace(a);var r__namespace=/*#__PURE__*/_interopNamespace(r);var v="1.0.1",b=`
2
+ 'use strict';var chunkBT3J264A_cjs=require('./chunk-BT3J264A.cjs'),util=require('util'),g=require('path'),m=require('fs/promises'),S=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 g__namespace=/*#__PURE__*/_interopNamespace(g);var m__namespace=/*#__PURE__*/_interopNamespace(m);var S__namespace=/*#__PURE__*/_interopNamespace(S);async function _(e){let a=[{file:"pnpm-lock.yaml",manager:"pnpm"},{file:"yarn.lock",manager:"yarn"},{file:"package-lock.json",manager:"npm"}];for(let{file:o,manager:n}of a)try{return await m__namespace.access(g__namespace.join(e,o)),n}catch{}return "npm"}async function B(e){let a={};try{let n=await m__namespace.readFile(g__namespace.join(e,"package.json"),"utf-8");a=JSON.parse(n);}catch{return "unknown"}let o={...a.dependencies||{},...a.devDependencies||{}};return o.next?await h(g__namespace.join(e,"app"))||await h(g__namespace.join(e,"src","app"))?"nextjs-app":"nextjs-pages":o.vite?"vite":o["react-scripts"]?"cra":o.express||o.fastify||o.koa?"node":"unknown"}async function I(e){let[a,o]=await Promise.all([B(e),_(e)]),n=await U(g__namespace.join(e,"tsconfig.json")),t=await h(g__namespace.join(e,"src")),i=["app","pages","components","hooks","services","lib","utils","api","src/app","src/pages","src/components","src/hooks","src/services","src/lib","src/utils"],c=[];for(let p of i)await h(g__namespace.join(e,p))&&c.push(p);let s=await h(g__namespace.join(e,"prisma")),u=await h(g__namespace.join(e,"supabase"));return {type:a,packageManager:o,hasTypescript:n,hasSrc:t,existingFolders:c,hasPrisma:s,hasSupabase:u}}async function U(e){try{return (await m__namespace.stat(e)).isFile()}catch{return false}}async function h(e){try{return (await m__namespace.stat(e)).isDirectory()}catch{return false}}function M(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 F=S__namespace.createInterface({input:process.stdin,output:process.stdout});function w(e){return new Promise(a=>{F.question(e,a);})}function C(){F.close();}async function E(e){let a=[{key:"1",type:"nextjs-app",label:"Next.js (App Router)"},{key:"2",type:"nextjs-pages",label:"Next.js (Pages Router)"},{key:"3",type:"vite",label:"Vite + React"},{key:"4",type:"cra",label:"Create React App"},{key:"5",type:"node",label:"Node.js Backend"}],o=a.findIndex(s=>s.type===e),n=o>=0?a[o].key:"1";console.log(`
3
+ \u{1F4E6} \uD504\uB85C\uC81D\uD2B8 \uD0C0\uC785\uC744 \uC120\uD0DD\uD558\uC138\uC694:`),a.forEach(s=>{let p=s.type===e?" (\uAC10\uC9C0\uB428)":"";console.log(` ${s.key}) ${s.label}${p}`);});let i=(await w(`
4
+ \uC120\uD0DD [${n}]: `)).trim()||n;return a.find(s=>s.key===i)?.type||e}async function A(e){let a=[{key:"1",manager:"npm"},{key:"2",manager:"yarn"},{key:"3",manager:"pnpm"}],o=a.findIndex(s=>s.manager===e),n=o>=0?a[o].key:"1";console.log(`
5
+ \u{1F4E6} \uD328\uD0A4\uC9C0 \uB9E4\uB2C8\uC800\uB97C \uC120\uD0DD\uD558\uC138\uC694:`),a.forEach(s=>{let p=s.manager===e?" (\uAC10\uC9C0\uB428)":"";console.log(` ${s.key}) ${s.manager}${p}`);});let i=(await w(`
6
+ \uC120\uD0DD [${n}]: `)).trim()||n;return a.find(s=>s.key===i)?.manager||e}async function N(e){if(e==="node"||e==="unknown")return false;let a=e.startsWith("nextjs")?"next.config":"vite.config";return console.log(`
7
+ \u{1F527} ${a} \uD30C\uC77C\uC5D0 metadatafy \uD50C\uB7EC\uADF8\uC778\uC744 \uC790\uB3D9\uC73C\uB85C \uCD94\uAC00\uD560\uAE4C\uC694?`),console.log(" \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uAC00 \uC0DD\uC131\uB429\uB2C8\uB2E4."),(await w(`
8
+ \uCD94\uAC00\uD560\uAE4C\uC694? [Y/n]: `)).trim().toLowerCase()!=="n"}async function R(){return console.log(`
9
+ \u2601\uFE0F API \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC804\uC1A1\uD560\uAE4C\uC694?`),console.log(" \uBE48\uCE78\uC73C\uB85C \uB450\uBA74 \uD30C\uC77C\uB9CC \uC0DD\uC131\uB429\uB2C8\uB2E4."),(await w(`
10
+ API URL (\uC120\uD0DD\uC0AC\uD56D): `)).trim()||null}async function O(e,a=true){let t=(await w(`${e} ${a?"[Y/n]":"[y/N]"}: `)).trim().toLowerCase();return t===""?a:t==="y"||t==="yes"}function q(e){let{projectType:a,projectInfo:o}=e,n=[],t=o.hasTypescript?"{ts,tsx}":"{js,jsx}";switch(a){case "nextjs-app":o.hasSrc?n.push(`src/app/**/*.${t}`):n.push(`app/**/*.${t}`),n.push(`components/**/*.${t}`),n.push(`hooks/**/*.${t}`),n.push(`lib/**/*.${t}`);break;case "nextjs-pages":o.hasSrc?n.push(`src/pages/**/*.${t}`):n.push(`pages/**/*.${t}`),n.push(`components/**/*.${t}`),n.push(`hooks/**/*.${t}`),n.push(`lib/**/*.${t}`);break;case "vite":case "cra":n.push(`src/**/*.${t}`);break;case "node":n.push(`src/**/*.${o.hasTypescript?"ts":"js"}`),n.push(`routes/**/*.${o.hasTypescript?"ts":"js"}`),n.push(`controllers/**/*.${o.hasTypescript?"ts":"js"}`);break;default:n.push(`src/**/*.${t}`);}return o.hasPrisma&&n.push("prisma/migrations/**/*.sql"),o.hasSupabase&&n.push("supabase/migrations/*.sql"),n}async function D(e,a,o){let n=g__namespace.join(e,"metadata.config.json"),t={projectId:a,include:q(o),exclude:["**/node_modules/**","**/.next/**","**/dist/**","**/build/**","**/*.test.{ts,tsx,js,jsx}","**/*.spec.{ts,tsx,js,jsx}","**/__tests__/**"],output:{file:{enabled:true,path:"project-metadata.json"},api:{enabled:!!o.apiEndpoint,endpoint:o.apiEndpoint||""}},koreanKeywords:{},verbose:false};return await m__namespace.writeFile(n,JSON.stringify(t,null,2)),n}async function z(e){let a=["vite.config.ts","vite.config.js","vite.config.mts","vite.config.mjs"];for(let o of a){let n=g__namespace.join(e,o);try{let t=await m__namespace.readFile(n,"utf-8");if(t.includes("metadatafy"))return !0;let i=`import metadatafy from 'metadatafy/vite';
11
+ `;return t.includes("from 'vite'")?t=t.replace(/^(import .+ from ['"]vite['"];?\n)/m,`$1${i}`):t=i+t,t.includes("plugins:")?t=t.replace(/plugins:\s*\[/,`plugins: [
12
+ metadatafy(),`):t.includes("defineConfig(")&&(t=t.replace(/defineConfig\(\{/,`defineConfig({
13
+ plugins: [metadatafy()],`)),await m__namespace.writeFile(n,t),!0}catch{}}return false}async function J(e){let a=["next.config.ts","next.config.mjs","next.config.js"];for(let o of a){let n=g__namespace.join(e,o);try{let t=await m__namespace.readFile(n,"utf-8");if(t.includes("metadatafy")||t.includes("withMetadatafy"))return !0;let i=o.endsWith(".ts");return t=(o.endsWith(".mjs")||i?`import { withMetadatafy } from 'metadatafy/next';
14
+ `:`const { withMetadatafy } = require('metadatafy/next');
15
+ `)+t,t.includes("export default")?(t=t.replace(/export default\s+({[\s\S]*?});?\s*$/m,"export default withMetadatafy($1);"),t=t.replace(/export default\s+(\w+);?\s*$/m,"export default withMetadatafy($1);")):t.includes("module.exports")&&(t=t.replace(/module\.exports\s*=\s*({[\s\S]*?});?\s*$/m,"module.exports = withMetadatafy($1);"),t=t.replace(/module\.exports\s*=\s*(\w+);?\s*$/m,"module.exports = withMetadatafy($1);")),await m__namespace.writeFile(n,t),!0}catch{}}return false}function L(e){switch(e){case "yarn":return "yarn add -D metadatafy";case "pnpm":return "pnpm add -D metadatafy";default:return "npm install -D metadatafy"}}var H="1.0.3",W=`
3
16
  metadatafy - \uD504\uB85C\uC81D\uD2B8 \uBA54\uD0C0\uB370\uC774\uD130 \uCD94\uCD9C \uB3C4\uAD6C
4
17
 
5
18
  Usage:
@@ -7,17 +20,17 @@ Usage:
7
20
 
8
21
  Commands:
9
22
  analyze \uD504\uB85C\uC81D\uD2B8\uB97C \uBD84\uC11D\uD558\uACE0 \uBA54\uD0C0\uB370\uC774\uD130 \uC0DD\uC131
10
- init \uC124\uC815 \uD30C\uC77C \uC0DD\uC131
23
+ init \uC778\uD130\uB799\uD2F0\uBE0C \uC124\uC815 \uBC0F \uBE4C\uB4DC \uB3C4\uAD6C \uC5F0\uB3D9
11
24
 
12
25
  Options:
13
26
  -h, --help \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC
14
27
  -v, --version \uBC84\uC804 \uD45C\uC2DC
15
28
 
16
29
  Examples:
30
+ metadatafy init
17
31
  metadatafy analyze
18
32
  metadatafy analyze --project-id my-project --output ./metadata.json
19
- metadatafy init
20
- `,P=`
33
+ `,K=`
21
34
  Usage: metadatafy analyze [options]
22
35
 
23
36
  Options:
@@ -26,9 +39,22 @@ Options:
26
39
  -c, --config <path> \uC124\uC815 \uD30C\uC77C \uACBD\uB85C
27
40
  --verbose \uC0C1\uC138 \uB85C\uADF8 \uCD9C\uB825
28
41
  -h, --help \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC
29
- `;async function E(){let e=process.argv.slice(2);(e.length===0||e[0]==="-h"||e[0]==="--help")&&(console.log(b),process.exit(0)),(e[0]==="-v"||e[0]==="--version")&&(console.log(v),process.exit(0));let t=e[0];switch(t){case "analyze":await T(e.slice(1));break;case "init":await A();break;default:console.error(`Unknown command: ${t}`),console.log(b),process.exit(1);}}async function T(e){let{values:t}=util.parseArgs({args:e,options:{"project-id":{type:"string",short:"p"},output:{type:"string",short:"o"},config:{type:"string",short:"c"},verbose:{type:"boolean"},help:{type:"boolean",short:"h"}}});t.help&&(console.log(P),process.exit(0));let n=process.cwd(),l=t["project-id"]||a__namespace.basename(n),p=t.output||"project-metadata.json",f=t.verbose||false,c={};if(t.config)try{let s=await r__namespace.readFile(t.config,"utf-8");c=JSON.parse(s);}catch{console.error(`Failed to load config file: ${t.config}`),process.exit(1);}else {let s=a__namespace.join(n,"metadata.config.json");try{let o=await r__namespace.readFile(s,"utf-8");c=JSON.parse(o),f&&console.log(`Loaded config from ${s}`);}catch{}}let i=chunkBT3J264A_cjs.d({...c,projectId:l,verbose:f,output:{file:{enabled:true,path:p},...c.output}});console.log(`
30
- \u{1F4E6} Analyzing project: ${l}`),console.log(`\u{1F4C1} Root directory: ${n}
31
- `);let w=new chunkBT3J264A_cjs.y(i),$=new chunkBT3J264A_cjs.z(i);try{let s=Date.now(),o=await w.analyze(n),j=Date.now()-s,g=a__namespace.resolve(n,p);await $.write(o,g),i.output.api?.enabled&&i.output.api.endpoint&&(await new chunkBT3J264A_cjs.A(i).send(o),console.log(`\u2601\uFE0F Sent to API: ${i.output.api.endpoint}`)),console.log(`\u2705 Analysis completed in ${j}ms
32
- `),console.log("\u{1F4CA} Results:"),console.log(` Total files: ${o.stats.totalFiles}`),console.log(` - Routes: ${o.stats.byType.route}`),console.log(` - Components: ${o.stats.byType.component}`),console.log(` - Hooks: ${o.stats.byType.hook}`),console.log(` - Services: ${o.stats.byType.service}`),console.log(` - APIs: ${o.stats.byType.api}`),console.log(` - Tables: ${o.stats.byType.table}`),console.log(` - Utilities: ${o.stats.byType.utility}`),console.log(`
33
- \u{1F4C4} Output: ${g}`),o.stats.parseErrors.length>0&&(console.log(`
34
- \u26A0\uFE0F Parse errors (${o.stats.parseErrors.length}):`),o.stats.parseErrors.slice(0,5).forEach(d=>{console.log(` - ${d}`);}),o.stats.parseErrors.length>5&&console.log(` ... and ${o.stats.parseErrors.length-5} more`)),console.log("");}catch(s){console.error("\u274C Analysis failed:",s),process.exit(1);}}async function A(){let e=process.cwd(),t=a__namespace.join(e,"metadata.config.json");try{await r__namespace.access(t),console.log(`\u26A0\uFE0F Config file already exists: ${t}`),process.exit(1);}catch{}let n={projectId:a__namespace.basename(e),include:["app/**/*.{ts,tsx}","pages/**/*.{ts,tsx}","components/**/*.{ts,tsx}","hooks/**/*.{ts,tsx}","services/**/*.ts","lib/**/*.ts","src/**/*.{ts,tsx}"],exclude:["**/node_modules/**","**/.next/**","**/dist/**","**/*.test.{ts,tsx}","**/*.spec.{ts,tsx}"],output:{file:{enabled:true,path:"project-metadata.json"},api:{enabled:false,endpoint:""}},koreanKeywords:{},verbose:false};await r__namespace.writeFile(t,JSON.stringify(n,null,2)),console.log(`\u2705 Created config file: ${t}`);}E().catch(e=>{console.error("Fatal error:",e),process.exit(1);});
42
+ `;async function Y(){let e=process.argv.slice(2);(e.length===0||e[0]==="-h"||e[0]==="--help")&&(console.log(W),process.exit(0)),(e[0]==="-v"||e[0]==="--version")&&(console.log(H),process.exit(0));let a=e[0];switch(a){case "analyze":await X(e.slice(1));break;case "init":await Z();break;default:console.error(`Unknown command: ${a}`),console.log(W),process.exit(1);}}async function X(e){let{values:a}=util.parseArgs({args:e,options:{"project-id":{type:"string",short:"p"},output:{type:"string",short:"o"},config:{type:"string",short:"c"},verbose:{type:"boolean"},help:{type:"boolean",short:"h"}}});a.help&&(console.log(K),process.exit(0));let o=process.cwd(),n=a["project-id"]||g__namespace.basename(o),t=a.output||"project-metadata.json",i=a.verbose||false,c={};if(a.config)try{let l=await m__namespace.readFile(a.config,"utf-8");c=JSON.parse(l);}catch{console.error(`Failed to load config file: ${a.config}`),process.exit(1);}else {let l=g__namespace.join(o,"metadata.config.json");try{let r=await m__namespace.readFile(l,"utf-8");c=JSON.parse(r),i&&console.log(`Loaded config from ${l}`);}catch{}}let s=chunkBT3J264A_cjs.d({...c,projectId:n,verbose:i,output:{file:{enabled:true,path:t},...c.output}});console.log(`
43
+ \u{1F4E6} Analyzing project: ${n}`),console.log(`\u{1F4C1} Root directory: ${o}
44
+ `);let u=new chunkBT3J264A_cjs.y(s),p=new chunkBT3J264A_cjs.z(s);try{let l=Date.now(),r=await u.analyze(o),y=Date.now()-l,x=g__namespace.resolve(o,t);await p.write(r,x),s.output.api?.enabled&&s.output.api.endpoint&&(await new chunkBT3J264A_cjs.A(s).send(r),console.log(`\u2601\uFE0F Sent to API: ${s.output.api.endpoint}`)),console.log(`\u2705 Analysis completed in ${y}ms
45
+ `),console.log("\u{1F4CA} Results:"),console.log(` Total files: ${r.stats.totalFiles}`),console.log(` - Routes: ${r.stats.byType.route}`),console.log(` - Components: ${r.stats.byType.component}`),console.log(` - Hooks: ${r.stats.byType.hook}`),console.log(` - Services: ${r.stats.byType.service}`),console.log(` - APIs: ${r.stats.byType.api}`),console.log(` - Tables: ${r.stats.byType.table}`),console.log(` - Utilities: ${r.stats.byType.utility}`),console.log(`
46
+ \u{1F4C4} Output: ${x}`),r.stats.parseErrors.length>0&&(console.log(`
47
+ \u26A0\uFE0F Parse errors (${r.stats.parseErrors.length}):`),r.stats.parseErrors.slice(0,5).forEach(k=>{console.log(` - ${k}`);}),r.stats.parseErrors.length>5&&console.log(` ... and ${r.stats.parseErrors.length-5} more`)),console.log("");}catch(l){console.error("\u274C Analysis failed:",l),process.exit(1);}}async function Z(){let e=process.cwd(),a=g__namespace.basename(e);console.log(`
48
+ \u{1F680} metadatafy \uC124\uC815 \uB9C8\uBC95\uC0AC
49
+ `),console.log(`\uD504\uB85C\uC81D\uD2B8: ${a}`),console.log(`\uACBD\uB85C: ${e}`),console.log(`
50
+ \u{1F50D} \uD504\uB85C\uC81D\uD2B8 \uBD84\uC11D \uC911...`);let o=await I(e);console.log(`
51
+ \u2705 \uAC10\uC9C0\uB41C \uC815\uBCF4:`),console.log(` \uD504\uB85C\uC81D\uD2B8 \uD0C0\uC785: ${M(o.type)}`),console.log(` \uD328\uD0A4\uC9C0 \uB9E4\uB2C8\uC800: ${o.packageManager}`),console.log(` TypeScript: ${o.hasTypescript?"\uC608":"\uC544\uB2C8\uC624"}`),o.existingFolders.length>0&&console.log(` \uC8FC\uC694 \uD3F4\uB354: ${o.existingFolders.slice(0,5).join(", ")}`);try{let n=await E(o.type),t=await A(o.packageManager),i=!1;n!=="node"&&n!=="unknown"&&(i=await N(n));let c=await R(),s={projectType:n,packageManager:t,projectInfo:o,addBuildIntegration:i,apiEndpoint:c},u=g__namespace.join(e,"metadata.config.json"),p=!0;try{await m__namespace.access(u),console.log(`
52
+ \u26A0\uFE0F metadata.config.json \uD30C\uC77C\uC774 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.`),p=await O("\uB36E\uC5B4\uC4F8\uAE4C\uC694?",!1);}catch{}if(console.log(`
53
+ \u{1F4DD} \uC124\uC815 \uC801\uC6A9 \uC911...
54
+ `),p){let r=await D(e,a,s);console.log(`\u2705 \uC124\uC815 \uD30C\uC77C \uC0DD\uC131: ${g__namespace.relative(e,r)}`);}if(i){let r=!1;if(n==="vite"||n==="cra"?r=await z(e):n.startsWith("nextjs")&&(r=await J(e)),r){let y=n.startsWith("nextjs")?"next.config":"vite.config";console.log(`\u2705 ${y} \uD30C\uC77C\uC5D0 \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\uB428`);}else console.log("\u26A0\uFE0F \uBE4C\uB4DC \uC124\uC815 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC218\uB3D9\uC73C\uB85C \uCD94\uAC00\uD574\uC8FC\uC138\uC694.");}console.log(`
55
+ \u{1F389} \uC124\uC815\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4!
56
+ `);let l=g__namespace.join(e,"package.json");try{let r=await m__namespace.readFile(l,"utf-8"),y=JSON.parse(r);({...y.dependencies,...y.devDependencies}).metadatafy||(console.log(`\u{1F4E6} \uB2E4\uC74C \uBA85\uB839\uC5B4\uB85C \uD328\uD0A4\uC9C0\uB97C \uC124\uCE58\uD558\uC138\uC694:
57
+ `),console.log(` ${L(t)}
58
+ `));}catch{}i?console.log("\u{1F527} \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uAC00 \uC0DD\uC131\uB429\uB2C8\uB2E4."):(console.log(`\u{1F4A1} \uC218\uB3D9 \uBD84\uC11D \uBA85\uB839\uC5B4:
59
+ `),console.log(` npx metadatafy analyze
60
+ `));}finally{C();}}Y().catch(e=>{console.error("Fatal error:",e),process.exit(1);});
package/dist/cli.js CHANGED
@@ -1,5 +1,18 @@
1
1
  #!/usr/bin/env node
2
- import {d,y,z,A as A$1}from'./chunk-WUEHYY36.js';import {parseArgs}from'util';import*as a from'path';import*as r from'fs/promises';var v="1.0.1",b=`
2
+ import {d,y,z as z$1,A as A$1}from'./chunk-WUEHYY36.js';import {parseArgs}from'util';import*as g from'path';import*as m from'fs/promises';import*as S from'readline';async function _(e){let a=[{file:"pnpm-lock.yaml",manager:"pnpm"},{file:"yarn.lock",manager:"yarn"},{file:"package-lock.json",manager:"npm"}];for(let{file:o,manager:n}of a)try{return await m.access(g.join(e,o)),n}catch{}return "npm"}async function B(e){let a={};try{let n=await m.readFile(g.join(e,"package.json"),"utf-8");a=JSON.parse(n);}catch{return "unknown"}let o={...a.dependencies||{},...a.devDependencies||{}};return o.next?await h(g.join(e,"app"))||await h(g.join(e,"src","app"))?"nextjs-app":"nextjs-pages":o.vite?"vite":o["react-scripts"]?"cra":o.express||o.fastify||o.koa?"node":"unknown"}async function I(e){let[a,o]=await Promise.all([B(e),_(e)]),n=await U(g.join(e,"tsconfig.json")),t=await h(g.join(e,"src")),i=["app","pages","components","hooks","services","lib","utils","api","src/app","src/pages","src/components","src/hooks","src/services","src/lib","src/utils"],c=[];for(let p of i)await h(g.join(e,p))&&c.push(p);let s=await h(g.join(e,"prisma")),u=await h(g.join(e,"supabase"));return {type:a,packageManager:o,hasTypescript:n,hasSrc:t,existingFolders:c,hasPrisma:s,hasSupabase:u}}async function U(e){try{return (await m.stat(e)).isFile()}catch{return false}}async function h(e){try{return (await m.stat(e)).isDirectory()}catch{return false}}function M(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 F=S.createInterface({input:process.stdin,output:process.stdout});function w(e){return new Promise(a=>{F.question(e,a);})}function C(){F.close();}async function E(e){let a=[{key:"1",type:"nextjs-app",label:"Next.js (App Router)"},{key:"2",type:"nextjs-pages",label:"Next.js (Pages Router)"},{key:"3",type:"vite",label:"Vite + React"},{key:"4",type:"cra",label:"Create React App"},{key:"5",type:"node",label:"Node.js Backend"}],o=a.findIndex(s=>s.type===e),n=o>=0?a[o].key:"1";console.log(`
3
+ \u{1F4E6} \uD504\uB85C\uC81D\uD2B8 \uD0C0\uC785\uC744 \uC120\uD0DD\uD558\uC138\uC694:`),a.forEach(s=>{let p=s.type===e?" (\uAC10\uC9C0\uB428)":"";console.log(` ${s.key}) ${s.label}${p}`);});let i=(await w(`
4
+ \uC120\uD0DD [${n}]: `)).trim()||n;return a.find(s=>s.key===i)?.type||e}async function A(e){let a=[{key:"1",manager:"npm"},{key:"2",manager:"yarn"},{key:"3",manager:"pnpm"}],o=a.findIndex(s=>s.manager===e),n=o>=0?a[o].key:"1";console.log(`
5
+ \u{1F4E6} \uD328\uD0A4\uC9C0 \uB9E4\uB2C8\uC800\uB97C \uC120\uD0DD\uD558\uC138\uC694:`),a.forEach(s=>{let p=s.manager===e?" (\uAC10\uC9C0\uB428)":"";console.log(` ${s.key}) ${s.manager}${p}`);});let i=(await w(`
6
+ \uC120\uD0DD [${n}]: `)).trim()||n;return a.find(s=>s.key===i)?.manager||e}async function N(e){if(e==="node"||e==="unknown")return false;let a=e.startsWith("nextjs")?"next.config":"vite.config";return console.log(`
7
+ \u{1F527} ${a} \uD30C\uC77C\uC5D0 metadatafy \uD50C\uB7EC\uADF8\uC778\uC744 \uC790\uB3D9\uC73C\uB85C \uCD94\uAC00\uD560\uAE4C\uC694?`),console.log(" \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uAC00 \uC0DD\uC131\uB429\uB2C8\uB2E4."),(await w(`
8
+ \uCD94\uAC00\uD560\uAE4C\uC694? [Y/n]: `)).trim().toLowerCase()!=="n"}async function R(){return console.log(`
9
+ \u2601\uFE0F API \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC804\uC1A1\uD560\uAE4C\uC694?`),console.log(" \uBE48\uCE78\uC73C\uB85C \uB450\uBA74 \uD30C\uC77C\uB9CC \uC0DD\uC131\uB429\uB2C8\uB2E4."),(await w(`
10
+ API URL (\uC120\uD0DD\uC0AC\uD56D): `)).trim()||null}async function O(e,a=true){let t=(await w(`${e} ${a?"[Y/n]":"[y/N]"}: `)).trim().toLowerCase();return t===""?a:t==="y"||t==="yes"}function q(e){let{projectType:a,projectInfo:o}=e,n=[],t=o.hasTypescript?"{ts,tsx}":"{js,jsx}";switch(a){case "nextjs-app":o.hasSrc?n.push(`src/app/**/*.${t}`):n.push(`app/**/*.${t}`),n.push(`components/**/*.${t}`),n.push(`hooks/**/*.${t}`),n.push(`lib/**/*.${t}`);break;case "nextjs-pages":o.hasSrc?n.push(`src/pages/**/*.${t}`):n.push(`pages/**/*.${t}`),n.push(`components/**/*.${t}`),n.push(`hooks/**/*.${t}`),n.push(`lib/**/*.${t}`);break;case "vite":case "cra":n.push(`src/**/*.${t}`);break;case "node":n.push(`src/**/*.${o.hasTypescript?"ts":"js"}`),n.push(`routes/**/*.${o.hasTypescript?"ts":"js"}`),n.push(`controllers/**/*.${o.hasTypescript?"ts":"js"}`);break;default:n.push(`src/**/*.${t}`);}return o.hasPrisma&&n.push("prisma/migrations/**/*.sql"),o.hasSupabase&&n.push("supabase/migrations/*.sql"),n}async function D(e,a,o){let n=g.join(e,"metadata.config.json"),t={projectId:a,include:q(o),exclude:["**/node_modules/**","**/.next/**","**/dist/**","**/build/**","**/*.test.{ts,tsx,js,jsx}","**/*.spec.{ts,tsx,js,jsx}","**/__tests__/**"],output:{file:{enabled:true,path:"project-metadata.json"},api:{enabled:!!o.apiEndpoint,endpoint:o.apiEndpoint||""}},koreanKeywords:{},verbose:false};return await m.writeFile(n,JSON.stringify(t,null,2)),n}async function z(e){let a=["vite.config.ts","vite.config.js","vite.config.mts","vite.config.mjs"];for(let o of a){let n=g.join(e,o);try{let t=await m.readFile(n,"utf-8");if(t.includes("metadatafy"))return !0;let i=`import metadatafy from 'metadatafy/vite';
11
+ `;return t.includes("from 'vite'")?t=t.replace(/^(import .+ from ['"]vite['"];?\n)/m,`$1${i}`):t=i+t,t.includes("plugins:")?t=t.replace(/plugins:\s*\[/,`plugins: [
12
+ metadatafy(),`):t.includes("defineConfig(")&&(t=t.replace(/defineConfig\(\{/,`defineConfig({
13
+ plugins: [metadatafy()],`)),await m.writeFile(n,t),!0}catch{}}return false}async function J(e){let a=["next.config.ts","next.config.mjs","next.config.js"];for(let o of a){let n=g.join(e,o);try{let t=await m.readFile(n,"utf-8");if(t.includes("metadatafy")||t.includes("withMetadatafy"))return !0;let i=o.endsWith(".ts");return t=(o.endsWith(".mjs")||i?`import { withMetadatafy } from 'metadatafy/next';
14
+ `:`const { withMetadatafy } = require('metadatafy/next');
15
+ `)+t,t.includes("export default")?(t=t.replace(/export default\s+({[\s\S]*?});?\s*$/m,"export default withMetadatafy($1);"),t=t.replace(/export default\s+(\w+);?\s*$/m,"export default withMetadatafy($1);")):t.includes("module.exports")&&(t=t.replace(/module\.exports\s*=\s*({[\s\S]*?});?\s*$/m,"module.exports = withMetadatafy($1);"),t=t.replace(/module\.exports\s*=\s*(\w+);?\s*$/m,"module.exports = withMetadatafy($1);")),await m.writeFile(n,t),!0}catch{}}return false}function L(e){switch(e){case "yarn":return "yarn add -D metadatafy";case "pnpm":return "pnpm add -D metadatafy";default:return "npm install -D metadatafy"}}var H="1.0.3",W=`
3
16
  metadatafy - \uD504\uB85C\uC81D\uD2B8 \uBA54\uD0C0\uB370\uC774\uD130 \uCD94\uCD9C \uB3C4\uAD6C
4
17
 
5
18
  Usage:
@@ -7,17 +20,17 @@ Usage:
7
20
 
8
21
  Commands:
9
22
  analyze \uD504\uB85C\uC81D\uD2B8\uB97C \uBD84\uC11D\uD558\uACE0 \uBA54\uD0C0\uB370\uC774\uD130 \uC0DD\uC131
10
- init \uC124\uC815 \uD30C\uC77C \uC0DD\uC131
23
+ init \uC778\uD130\uB799\uD2F0\uBE0C \uC124\uC815 \uBC0F \uBE4C\uB4DC \uB3C4\uAD6C \uC5F0\uB3D9
11
24
 
12
25
  Options:
13
26
  -h, --help \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC
14
27
  -v, --version \uBC84\uC804 \uD45C\uC2DC
15
28
 
16
29
  Examples:
30
+ metadatafy init
17
31
  metadatafy analyze
18
32
  metadatafy analyze --project-id my-project --output ./metadata.json
19
- metadatafy init
20
- `,P=`
33
+ `,K=`
21
34
  Usage: metadatafy analyze [options]
22
35
 
23
36
  Options:
@@ -26,9 +39,22 @@ Options:
26
39
  -c, --config <path> \uC124\uC815 \uD30C\uC77C \uACBD\uB85C
27
40
  --verbose \uC0C1\uC138 \uB85C\uADF8 \uCD9C\uB825
28
41
  -h, --help \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC
29
- `;async function E(){let e=process.argv.slice(2);(e.length===0||e[0]==="-h"||e[0]==="--help")&&(console.log(b),process.exit(0)),(e[0]==="-v"||e[0]==="--version")&&(console.log(v),process.exit(0));let t=e[0];switch(t){case "analyze":await T(e.slice(1));break;case "init":await A();break;default:console.error(`Unknown command: ${t}`),console.log(b),process.exit(1);}}async function T(e){let{values:t}=parseArgs({args:e,options:{"project-id":{type:"string",short:"p"},output:{type:"string",short:"o"},config:{type:"string",short:"c"},verbose:{type:"boolean"},help:{type:"boolean",short:"h"}}});t.help&&(console.log(P),process.exit(0));let n=process.cwd(),l=t["project-id"]||a.basename(n),p=t.output||"project-metadata.json",f=t.verbose||false,c={};if(t.config)try{let s=await r.readFile(t.config,"utf-8");c=JSON.parse(s);}catch{console.error(`Failed to load config file: ${t.config}`),process.exit(1);}else {let s=a.join(n,"metadata.config.json");try{let o=await r.readFile(s,"utf-8");c=JSON.parse(o),f&&console.log(`Loaded config from ${s}`);}catch{}}let i=d({...c,projectId:l,verbose:f,output:{file:{enabled:true,path:p},...c.output}});console.log(`
30
- \u{1F4E6} Analyzing project: ${l}`),console.log(`\u{1F4C1} Root directory: ${n}
31
- `);let w=new y(i),$=new z(i);try{let s=Date.now(),o=await w.analyze(n),j=Date.now()-s,g=a.resolve(n,p);await $.write(o,g),i.output.api?.enabled&&i.output.api.endpoint&&(await new A$1(i).send(o),console.log(`\u2601\uFE0F Sent to API: ${i.output.api.endpoint}`)),console.log(`\u2705 Analysis completed in ${j}ms
32
- `),console.log("\u{1F4CA} Results:"),console.log(` Total files: ${o.stats.totalFiles}`),console.log(` - Routes: ${o.stats.byType.route}`),console.log(` - Components: ${o.stats.byType.component}`),console.log(` - Hooks: ${o.stats.byType.hook}`),console.log(` - Services: ${o.stats.byType.service}`),console.log(` - APIs: ${o.stats.byType.api}`),console.log(` - Tables: ${o.stats.byType.table}`),console.log(` - Utilities: ${o.stats.byType.utility}`),console.log(`
33
- \u{1F4C4} Output: ${g}`),o.stats.parseErrors.length>0&&(console.log(`
34
- \u26A0\uFE0F Parse errors (${o.stats.parseErrors.length}):`),o.stats.parseErrors.slice(0,5).forEach(d=>{console.log(` - ${d}`);}),o.stats.parseErrors.length>5&&console.log(` ... and ${o.stats.parseErrors.length-5} more`)),console.log("");}catch(s){console.error("\u274C Analysis failed:",s),process.exit(1);}}async function A(){let e=process.cwd(),t=a.join(e,"metadata.config.json");try{await r.access(t),console.log(`\u26A0\uFE0F Config file already exists: ${t}`),process.exit(1);}catch{}let n={projectId:a.basename(e),include:["app/**/*.{ts,tsx}","pages/**/*.{ts,tsx}","components/**/*.{ts,tsx}","hooks/**/*.{ts,tsx}","services/**/*.ts","lib/**/*.ts","src/**/*.{ts,tsx}"],exclude:["**/node_modules/**","**/.next/**","**/dist/**","**/*.test.{ts,tsx}","**/*.spec.{ts,tsx}"],output:{file:{enabled:true,path:"project-metadata.json"},api:{enabled:false,endpoint:""}},koreanKeywords:{},verbose:false};await r.writeFile(t,JSON.stringify(n,null,2)),console.log(`\u2705 Created config file: ${t}`);}E().catch(e=>{console.error("Fatal error:",e),process.exit(1);});
42
+ `;async function Y(){let e=process.argv.slice(2);(e.length===0||e[0]==="-h"||e[0]==="--help")&&(console.log(W),process.exit(0)),(e[0]==="-v"||e[0]==="--version")&&(console.log(H),process.exit(0));let a=e[0];switch(a){case "analyze":await X(e.slice(1));break;case "init":await Z();break;default:console.error(`Unknown command: ${a}`),console.log(W),process.exit(1);}}async function X(e){let{values:a}=parseArgs({args:e,options:{"project-id":{type:"string",short:"p"},output:{type:"string",short:"o"},config:{type:"string",short:"c"},verbose:{type:"boolean"},help:{type:"boolean",short:"h"}}});a.help&&(console.log(K),process.exit(0));let o=process.cwd(),n=a["project-id"]||g.basename(o),t=a.output||"project-metadata.json",i=a.verbose||false,c={};if(a.config)try{let l=await m.readFile(a.config,"utf-8");c=JSON.parse(l);}catch{console.error(`Failed to load config file: ${a.config}`),process.exit(1);}else {let l=g.join(o,"metadata.config.json");try{let r=await m.readFile(l,"utf-8");c=JSON.parse(r),i&&console.log(`Loaded config from ${l}`);}catch{}}let s=d({...c,projectId:n,verbose:i,output:{file:{enabled:true,path:t},...c.output}});console.log(`
43
+ \u{1F4E6} Analyzing project: ${n}`),console.log(`\u{1F4C1} Root directory: ${o}
44
+ `);let u=new y(s),p=new z$1(s);try{let l=Date.now(),r=await u.analyze(o),y=Date.now()-l,x=g.resolve(o,t);await p.write(r,x),s.output.api?.enabled&&s.output.api.endpoint&&(await new A$1(s).send(r),console.log(`\u2601\uFE0F Sent to API: ${s.output.api.endpoint}`)),console.log(`\u2705 Analysis completed in ${y}ms
45
+ `),console.log("\u{1F4CA} Results:"),console.log(` Total files: ${r.stats.totalFiles}`),console.log(` - Routes: ${r.stats.byType.route}`),console.log(` - Components: ${r.stats.byType.component}`),console.log(` - Hooks: ${r.stats.byType.hook}`),console.log(` - Services: ${r.stats.byType.service}`),console.log(` - APIs: ${r.stats.byType.api}`),console.log(` - Tables: ${r.stats.byType.table}`),console.log(` - Utilities: ${r.stats.byType.utility}`),console.log(`
46
+ \u{1F4C4} Output: ${x}`),r.stats.parseErrors.length>0&&(console.log(`
47
+ \u26A0\uFE0F Parse errors (${r.stats.parseErrors.length}):`),r.stats.parseErrors.slice(0,5).forEach(k=>{console.log(` - ${k}`);}),r.stats.parseErrors.length>5&&console.log(` ... and ${r.stats.parseErrors.length-5} more`)),console.log("");}catch(l){console.error("\u274C Analysis failed:",l),process.exit(1);}}async function Z(){let e=process.cwd(),a=g.basename(e);console.log(`
48
+ \u{1F680} metadatafy \uC124\uC815 \uB9C8\uBC95\uC0AC
49
+ `),console.log(`\uD504\uB85C\uC81D\uD2B8: ${a}`),console.log(`\uACBD\uB85C: ${e}`),console.log(`
50
+ \u{1F50D} \uD504\uB85C\uC81D\uD2B8 \uBD84\uC11D \uC911...`);let o=await I(e);console.log(`
51
+ \u2705 \uAC10\uC9C0\uB41C \uC815\uBCF4:`),console.log(` \uD504\uB85C\uC81D\uD2B8 \uD0C0\uC785: ${M(o.type)}`),console.log(` \uD328\uD0A4\uC9C0 \uB9E4\uB2C8\uC800: ${o.packageManager}`),console.log(` TypeScript: ${o.hasTypescript?"\uC608":"\uC544\uB2C8\uC624"}`),o.existingFolders.length>0&&console.log(` \uC8FC\uC694 \uD3F4\uB354: ${o.existingFolders.slice(0,5).join(", ")}`);try{let n=await E(o.type),t=await A(o.packageManager),i=!1;n!=="node"&&n!=="unknown"&&(i=await N(n));let c=await R(),s={projectType:n,packageManager:t,projectInfo:o,addBuildIntegration:i,apiEndpoint:c},u=g.join(e,"metadata.config.json"),p=!0;try{await m.access(u),console.log(`
52
+ \u26A0\uFE0F metadata.config.json \uD30C\uC77C\uC774 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.`),p=await O("\uB36E\uC5B4\uC4F8\uAE4C\uC694?",!1);}catch{}if(console.log(`
53
+ \u{1F4DD} \uC124\uC815 \uC801\uC6A9 \uC911...
54
+ `),p){let r=await D(e,a,s);console.log(`\u2705 \uC124\uC815 \uD30C\uC77C \uC0DD\uC131: ${g.relative(e,r)}`);}if(i){let r=!1;if(n==="vite"||n==="cra"?r=await z(e):n.startsWith("nextjs")&&(r=await J(e)),r){let y=n.startsWith("nextjs")?"next.config":"vite.config";console.log(`\u2705 ${y} \uD30C\uC77C\uC5D0 \uD50C\uB7EC\uADF8\uC778 \uCD94\uAC00\uB428`);}else console.log("\u26A0\uFE0F \uBE4C\uB4DC \uC124\uC815 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC218\uB3D9\uC73C\uB85C \uCD94\uAC00\uD574\uC8FC\uC138\uC694.");}console.log(`
55
+ \u{1F389} \uC124\uC815\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4!
56
+ `);let l=g.join(e,"package.json");try{let r=await m.readFile(l,"utf-8"),y=JSON.parse(r);({...y.dependencies,...y.devDependencies}).metadatafy||(console.log(`\u{1F4E6} \uB2E4\uC74C \uBA85\uB839\uC5B4\uB85C \uD328\uD0A4\uC9C0\uB97C \uC124\uCE58\uD558\uC138\uC694:
57
+ `),console.log(` ${L(t)}
58
+ `));}catch{}i?console.log("\u{1F527} \uBE4C\uB4DC \uC2DC \uC790\uB3D9\uC73C\uB85C \uBA54\uD0C0\uB370\uC774\uD130\uAC00 \uC0DD\uC131\uB429\uB2C8\uB2E4."):(console.log(`\u{1F4A1} \uC218\uB3D9 \uBD84\uC11D \uBA85\uB839\uC5B4:
59
+ `),console.log(` npx metadatafy analyze
60
+ `));}finally{C();}}Y().catch(e=>{console.error("Fatal error:",e),process.exit(1);});
package/dist/next.cjs CHANGED
@@ -1,3 +1,12 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var chunkBT3J264A_cjs=require('./chunk-BT3J264A.cjs'),h=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 h__namespace=/*#__PURE__*/_interopNamespace(h);function m(r={}){let n=chunkBT3J264A_cjs.d(r),i=r.runOn||"build",a=chunkBT3J264A_cjs.e(n);if(a.length>0)throw new Error(`[metadata-plugin] Invalid config:
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var chunkBT3J264A_cjs=require('./chunk-BT3J264A.cjs'),s=require('path'),g=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 s__namespace=/*#__PURE__*/_interopNamespace(s);var g__namespace=/*#__PURE__*/_interopNamespace(g);async function h(e,t){let a=new chunkBT3J264A_cjs.y(e),o=new chunkBT3J264A_cjs.z(e),n=e.output.api?.enabled?new chunkBT3J264A_cjs.A(e):null;e.verbose&&console.log("[metadata-plugin] Starting analysis...");let r=await a.analyze(t);if(e.output.file?.enabled){let i=s__namespace.resolve(t,e.output.file.path);await o.write(r,i),e.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${i}`);}n&&(await n.send(r),e.verbose&&console.log("[metadata-plugin] Sent metadata to API"));}function x(e={}){let t=chunkBT3J264A_cjs.d(e),a=chunkBT3J264A_cjs.e(t);if(a.length>0)throw new Error(`[metadata-plugin] Invalid config:
2
2
  ${a.join(`
3
- `)}`);return t=>({...t,webpack(e,o){let{dev:p,isServer:d}=o;return d&&(i==="both"||i==="build"&&!p||i==="dev"&&p)&&(e.plugins=e.plugins||[],e.plugins.push(new s(n))),typeof t.webpack=="function"?t.webpack(e,o):e}})}var s=class{constructor(n){this.hasRun=false;this.config=n;}apply(n){let i="MetadataWebpackPlugin";n.hooks.beforeCompile.tapAsync(i,async(a,t)=>{if(this.hasRun)return t();this.hasRun=true;try{await this.runAnalysis(n.context),t();}catch(e){t(e);}}),n.hooks.watchRun.tap(i,()=>{});}async runAnalysis(n){let i=new chunkBT3J264A_cjs.y(this.config),a=new chunkBT3J264A_cjs.z(this.config),t=this.config.output.api?.enabled?new chunkBT3J264A_cjs.A(this.config):null;this.config.verbose&&console.log("[metadata-plugin] Starting analysis...");let e=await i.analyze(n);if(this.config.output.file?.enabled){let o=h__namespace.resolve(n,this.config.output.file.path);await a.write(e,o),this.config.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${o}`);}t&&(await t.send(e),this.config.verbose&&console.log("[metadata-plugin] Sent metadata to API"));}};exports.default=m;exports.withMetadata=m;
3
+ `)}`);return {name:"metadata-adapter",async onBuildComplete({projectDir:o}){t.verbose&&console.log("[metadata-plugin] Build completed, running analysis..."),await h(t,o),t.verbose&&console.log("[metadata-plugin] Analysis completed");}}}async function b(e,t={}){let a=s__namespace.join(e,".metadata-adapter.js"),o=`
4
+ // Auto-generated by metadatafy
5
+ // This adapter enables metadata extraction with Turbopack (Next.js 16+)
6
+
7
+ const { createMetadataAdapter } = require('metadatafy/next');
8
+
9
+ module.exports = createMetadataAdapter(${JSON.stringify(t,null,2)});
10
+ `;return await g__namespace.writeFile(a,o.trim()),a}function w(e={}){let t=chunkBT3J264A_cjs.d(e),a=e.runOn||"build",o=chunkBT3J264A_cjs.e(t);if(o.length>0)throw new Error(`[metadata-plugin] Invalid config:
11
+ ${o.join(`
12
+ `)}`);return n=>({...n,webpack(r,i){let{dev:d,isServer:y}=i;return y&&(a==="both"||a==="build"&&!d||a==="dev"&&d)&&(r.plugins=r.plugins||[],r.plugins.push(new l(t))),typeof n.webpack=="function"?n.webpack(r,i):r}})}var l=class{constructor(t){this.hasRun=false;this.config=t;}apply(t){let a="MetadataWebpackPlugin";t.hooks.beforeCompile.tapAsync(a,async(o,n)=>{if(this.hasRun)return n();this.hasRun=true;try{await h(this.config,t.context),n();}catch(r){n(r);}}),t.hooks.watchRun.tap(a,()=>{});}};exports.createMetadataAdapter=x;exports.default=w;exports.generateAdapterFile=b;exports.withMetadata=w;
package/dist/next.d.cts CHANGED
@@ -11,9 +11,32 @@ interface NextPluginOptions extends Partial<PluginConfig> {
11
11
  */
12
12
  runOn?: 'build' | 'dev' | 'both';
13
13
  }
14
+ /**
15
+ * Next.js 16+ Build Adapter 생성
16
+ * Turbopack 환경에서도 동작하는 빌드 어댑터
17
+ */
18
+ declare function createMetadataAdapter(options?: NextPluginOptions): {
19
+ name: string;
20
+ onBuildComplete({ projectDir, }: {
21
+ routes: unknown;
22
+ outputs: unknown;
23
+ projectDir: string;
24
+ repoRoot: string;
25
+ distDir: string;
26
+ config: NextConfig;
27
+ nextVersion: string;
28
+ }): Promise<void>;
29
+ };
30
+ /**
31
+ * Next.js 16+ 어댑터 파일 생성 헬퍼
32
+ * Turbopack 지원을 위해 어댑터 파일을 자동 생성
33
+ */
34
+ declare function generateAdapterFile(projectDir: string, options?: NextPluginOptions): Promise<string>;
14
35
  /**
15
36
  * Next.js 설정을 확장하는 함수
37
+ * Next.js 16+ Turbopack: experimental.adapterPath 사용
38
+ * Next.js 15- Webpack: webpack 플러그인 사용
16
39
  */
17
40
  declare function withMetadata(options?: NextPluginOptions): (nextConfig: NextConfig) => NextConfig;
18
41
 
19
- export { type NextPluginOptions, PluginConfig, withMetadata as default, withMetadata };
42
+ export { type NextPluginOptions, PluginConfig, createMetadataAdapter, withMetadata as default, generateAdapterFile, withMetadata };
package/dist/next.d.ts CHANGED
@@ -11,9 +11,32 @@ interface NextPluginOptions extends Partial<PluginConfig> {
11
11
  */
12
12
  runOn?: 'build' | 'dev' | 'both';
13
13
  }
14
+ /**
15
+ * Next.js 16+ Build Adapter 생성
16
+ * Turbopack 환경에서도 동작하는 빌드 어댑터
17
+ */
18
+ declare function createMetadataAdapter(options?: NextPluginOptions): {
19
+ name: string;
20
+ onBuildComplete({ projectDir, }: {
21
+ routes: unknown;
22
+ outputs: unknown;
23
+ projectDir: string;
24
+ repoRoot: string;
25
+ distDir: string;
26
+ config: NextConfig;
27
+ nextVersion: string;
28
+ }): Promise<void>;
29
+ };
30
+ /**
31
+ * Next.js 16+ 어댑터 파일 생성 헬퍼
32
+ * Turbopack 지원을 위해 어댑터 파일을 자동 생성
33
+ */
34
+ declare function generateAdapterFile(projectDir: string, options?: NextPluginOptions): Promise<string>;
14
35
  /**
15
36
  * Next.js 설정을 확장하는 함수
37
+ * Next.js 16+ Turbopack: experimental.adapterPath 사용
38
+ * Next.js 15- Webpack: webpack 플러그인 사용
16
39
  */
17
40
  declare function withMetadata(options?: NextPluginOptions): (nextConfig: NextConfig) => NextConfig;
18
41
 
19
- export { type NextPluginOptions, PluginConfig, withMetadata as default, withMetadata };
42
+ export { type NextPluginOptions, PluginConfig, createMetadataAdapter, withMetadata as default, generateAdapterFile, withMetadata };
package/dist/next.js CHANGED
@@ -1,3 +1,12 @@
1
- import {d,e,y,z,A}from'./chunk-WUEHYY36.js';import*as h from'path';function m(r={}){let n=d(r),i=r.runOn||"build",a=e(n);if(a.length>0)throw new Error(`[metadata-plugin] Invalid config:
1
+ import {d,e,y,z,A}from'./chunk-WUEHYY36.js';import*as s from'path';import*as g from'fs/promises';async function h(e,t){let a=new y(e),o=new z(e),n=e.output.api?.enabled?new A(e):null;e.verbose&&console.log("[metadata-plugin] Starting analysis...");let r=await a.analyze(t);if(e.output.file?.enabled){let i=s.resolve(t,e.output.file.path);await o.write(r,i),e.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${i}`);}n&&(await n.send(r),e.verbose&&console.log("[metadata-plugin] Sent metadata to API"));}function x(e$1={}){let t=d(e$1),a=e(t);if(a.length>0)throw new Error(`[metadata-plugin] Invalid config:
2
2
  ${a.join(`
3
- `)}`);return t=>({...t,webpack(e,o){let{dev:p,isServer:d}=o;return d&&(i==="both"||i==="build"&&!p||i==="dev"&&p)&&(e.plugins=e.plugins||[],e.plugins.push(new s(n))),typeof t.webpack=="function"?t.webpack(e,o):e}})}var s=class{constructor(n){this.hasRun=false;this.config=n;}apply(n){let i="MetadataWebpackPlugin";n.hooks.beforeCompile.tapAsync(i,async(a,t)=>{if(this.hasRun)return t();this.hasRun=true;try{await this.runAnalysis(n.context),t();}catch(e){t(e);}}),n.hooks.watchRun.tap(i,()=>{});}async runAnalysis(n){let i=new y(this.config),a=new z(this.config),t=this.config.output.api?.enabled?new A(this.config):null;this.config.verbose&&console.log("[metadata-plugin] Starting analysis...");let e=await i.analyze(n);if(this.config.output.file?.enabled){let o=h.resolve(n,this.config.output.file.path);await a.write(e,o),this.config.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${o}`);}t&&(await t.send(e),this.config.verbose&&console.log("[metadata-plugin] Sent metadata to API"));}};export{m as default,m as withMetadata};
3
+ `)}`);return {name:"metadata-adapter",async onBuildComplete({projectDir:o}){t.verbose&&console.log("[metadata-plugin] Build completed, running analysis..."),await h(t,o),t.verbose&&console.log("[metadata-plugin] Analysis completed");}}}async function b(e,t={}){let a=s.join(e,".metadata-adapter.js"),o=`
4
+ // Auto-generated by metadatafy
5
+ // This adapter enables metadata extraction with Turbopack (Next.js 16+)
6
+
7
+ const { createMetadataAdapter } = require('metadatafy/next');
8
+
9
+ module.exports = createMetadataAdapter(${JSON.stringify(t,null,2)});
10
+ `;return await g.writeFile(a,o.trim()),a}function w(e$1={}){let t=d(e$1),a=e$1.runOn||"build",o=e(t);if(o.length>0)throw new Error(`[metadata-plugin] Invalid config:
11
+ ${o.join(`
12
+ `)}`);return n=>({...n,webpack(r,i){let{dev:d,isServer:y}=i;return y&&(a==="both"||a==="build"&&!d||a==="dev"&&d)&&(r.plugins=r.plugins||[],r.plugins.push(new l(t))),typeof n.webpack=="function"?n.webpack(r,i):r}})}var l=class{constructor(t){this.hasRun=false;this.config=t;}apply(t){let a="MetadataWebpackPlugin";t.hooks.beforeCompile.tapAsync(a,async(o,n)=>{if(this.hasRun)return n();this.hasRun=true;try{await h(this.config,t.context),n();}catch(r){n(r);}}),t.hooks.watchRun.tap(a,()=>{});}};export{x as createMetadataAdapter,w as default,b as generateAdapterFile,w as withMetadata};
package/dist/vite.cjs CHANGED
@@ -1,3 +1,3 @@
1
- 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var chunkBT3J264A_cjs=require('./chunk-BT3J264A.cjs'),g=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 g__namespace=/*#__PURE__*/_interopNamespace(g);function c(r={}){let t=chunkBT3J264A_cjs.d(r),a=r.runOn||"build",e,n=null,y=new chunkBT3J264A_cjs.y(t),v=new chunkBT3J264A_cjs.z(t),l=t.output.api?.enabled?new chunkBT3J264A_cjs.A(t):null;return {name:"vite-metadata-plugin",configResolved(s){e=s;let o=chunkBT3J264A_cjs.e(t);if(o.length>0)throw new Error(`[metadata-plugin] Invalid config:
2
- ${o.join(`
3
- `)}`)},async buildStart(){if(!(a==="both"||a==="build"&&e.command==="build"||a==="serve"&&e.command==="serve"))return;let o=e.root;t.verbose&&console.log("[metadata-plugin] Starting analysis...");try{if(n=await y.analyze(o),t.output.file?.enabled){let i=g__namespace.resolve(o,t.output.file.path);await v.write(n,i),t.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${i}`);}l&&(await l.send(n),t.verbose&&console.log("[metadata-plugin] Sent metadata to API"));}catch(i){if(console.error("[metadata-plugin] Analysis failed:",i),e.command==="build")throw i}},generateBundle(){n&&this.emitFile({type:"asset",fileName:"metadata-stats.json",source:JSON.stringify(n.stats,null,2)});}}}exports.default=c;exports.metadataPlugin=c;
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var chunkBT3J264A_cjs=require('./chunk-BT3J264A.cjs'),g=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 g__namespace=/*#__PURE__*/_interopNamespace(g);async function v(t,n){let i=new chunkBT3J264A_cjs.y(t),r=new chunkBT3J264A_cjs.z(t),a=t.output.api?.enabled?new chunkBT3J264A_cjs.A(t):null;t.verbose&&console.log("[metadata-plugin] Starting analysis...");let e=await i.analyze(n);if(t.output.file?.enabled){let o=g__namespace.resolve(n,t.output.file.path);await r.write(e,o),t.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${o}`);}return a&&(await a.send(e),t.verbose&&console.log("[metadata-plugin] Sent metadata to API")),e}function y(t={}){let n=chunkBT3J264A_cjs.d(t),i=t.runOn||"build",r=t.emitStatsFile!==false,a,e=null,o=false;return {name:"vite-metadata-plugin",enforce:"post",configResolved(s){a=s;let l=chunkBT3J264A_cjs.e(n);if(l.length>0)throw new Error(`[metadata-plugin] Invalid config:
2
+ ${l.join(`
3
+ `)}`)},async buildStart(){if(o||!(i==="both"||i==="build"&&a.command==="build"||i==="serve"&&a.command==="serve"))return;o=true;let l=a.root;try{e=await v(n,l);}catch(u){if(console.error("[metadata-plugin] Analysis failed:",u),a.command==="build")throw u}},generateBundle(){!e||!r||this.emitFile({type:"asset",fileName:"metadata-stats.json",source:JSON.stringify(e.stats,null,2)});},closeBundle(){n.verbose&&e&&console.log(`[metadata-plugin] Build complete. Analyzed ${e.stats.totalFiles} files.`),o=false,e=null;}}}exports.default=y;exports.metadataPlugin=y;
package/dist/vite.d.cts CHANGED
@@ -10,9 +10,18 @@ interface VitePluginOptions extends Partial<PluginConfig> {
10
10
  * - 'both': 둘 다
11
11
  */
12
12
  runOn?: 'build' | 'serve' | 'both';
13
+ /**
14
+ * 빌드 결과에 통계 파일 포함 여부
15
+ * 기본값: true
16
+ */
17
+ emitStatsFile?: boolean;
13
18
  }
14
19
  /**
15
20
  * Vite 메타데이터 플러그인
21
+ *
22
+ * Vite 4/5/6/7 호환
23
+ * - 표준 Rollup 훅 사용 (configResolved, buildStart, closeBundle)
24
+ * - Vite 7+ Environment API 대비 (client 환경에서만 실행)
16
25
  */
17
26
  declare function metadataPlugin(options?: VitePluginOptions): Plugin;
18
27
 
package/dist/vite.d.ts CHANGED
@@ -10,9 +10,18 @@ interface VitePluginOptions extends Partial<PluginConfig> {
10
10
  * - 'both': 둘 다
11
11
  */
12
12
  runOn?: 'build' | 'serve' | 'both';
13
+ /**
14
+ * 빌드 결과에 통계 파일 포함 여부
15
+ * 기본값: true
16
+ */
17
+ emitStatsFile?: boolean;
13
18
  }
14
19
  /**
15
20
  * Vite 메타데이터 플러그인
21
+ *
22
+ * Vite 4/5/6/7 호환
23
+ * - 표준 Rollup 훅 사용 (configResolved, buildStart, closeBundle)
24
+ * - Vite 7+ Environment API 대비 (client 환경에서만 실행)
16
25
  */
17
26
  declare function metadataPlugin(options?: VitePluginOptions): Plugin;
18
27
 
package/dist/vite.js CHANGED
@@ -1,3 +1,3 @@
1
- import {d,y,z,A,e}from'./chunk-WUEHYY36.js';import*as g from'path';function c(r={}){let t=d(r),a=r.runOn||"build",e$1,n=null,y$1=new y(t),v=new z(t),l=t.output.api?.enabled?new A(t):null;return {name:"vite-metadata-plugin",configResolved(s){e$1=s;let o=e(t);if(o.length>0)throw new Error(`[metadata-plugin] Invalid config:
2
- ${o.join(`
3
- `)}`)},async buildStart(){if(!(a==="both"||a==="build"&&e$1.command==="build"||a==="serve"&&e$1.command==="serve"))return;let o=e$1.root;t.verbose&&console.log("[metadata-plugin] Starting analysis...");try{if(n=await y$1.analyze(o),t.output.file?.enabled){let i=g.resolve(o,t.output.file.path);await v.write(n,i),t.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${i}`);}l&&(await l.send(n),t.verbose&&console.log("[metadata-plugin] Sent metadata to API"));}catch(i){if(console.error("[metadata-plugin] Analysis failed:",i),e$1.command==="build")throw i}},generateBundle(){n&&this.emitFile({type:"asset",fileName:"metadata-stats.json",source:JSON.stringify(n.stats,null,2)});}}}export{c as default,c as metadataPlugin};
1
+ import {d,e,y as y$1,z,A}from'./chunk-WUEHYY36.js';import*as g from'path';async function v(t,n){let i=new y$1(t),r=new z(t),a=t.output.api?.enabled?new A(t):null;t.verbose&&console.log("[metadata-plugin] Starting analysis...");let e=await i.analyze(n);if(t.output.file?.enabled){let o=g.resolve(n,t.output.file.path);await r.write(e,o),t.verbose&&console.log(`[metadata-plugin] Wrote metadata to ${o}`);}return a&&(await a.send(e),t.verbose&&console.log("[metadata-plugin] Sent metadata to API")),e}function y(t={}){let n=d(t),i=t.runOn||"build",r=t.emitStatsFile!==false,a,e$1=null,o=false;return {name:"vite-metadata-plugin",enforce:"post",configResolved(s){a=s;let l=e(n);if(l.length>0)throw new Error(`[metadata-plugin] Invalid config:
2
+ ${l.join(`
3
+ `)}`)},async buildStart(){if(o||!(i==="both"||i==="build"&&a.command==="build"||i==="serve"&&a.command==="serve"))return;o=true;let l=a.root;try{e$1=await v(n,l);}catch(u){if(console.error("[metadata-plugin] Analysis failed:",u),a.command==="build")throw u}},generateBundle(){!e$1||!r||this.emitFile({type:"asset",fileName:"metadata-stats.json",source:JSON.stringify(e$1.stats,null,2)});},closeBundle(){n.verbose&&e$1&&console.log(`[metadata-plugin] Build complete. Analyzed ${e$1.stats.totalFiles} files.`),o=false,e$1=null;}}}export{y as default,y as metadataPlugin};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "metadatafy",
3
- "version": "1.0.3",
3
+ "version": "1.1.1",
4
4
  "description": "Build plugin for extracting project metadata for ticket analysis system",
5
5
  "type": "module",
6
6
  "exports": {