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 +57 -1
- package/dist/cli.cjs +36 -10
- package/dist/cli.js +36 -10
- package/dist/next.cjs +11 -2
- package/dist/next.d.cts +24 -1
- package/dist/next.d.ts +24 -1
- package/dist/next.js +11 -2
- package/dist/vite.cjs +3 -3
- package/dist/vite.d.cts +9 -0
- package/dist/vite.d.ts +9 -0
- package/dist/vite.js +3 -3
- package/package.json +1 -1
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/
|
|
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'),
|
|
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 \
|
|
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
|
-
|
|
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
|
|
30
|
-
\u{1F4E6} Analyzing project: ${
|
|
31
|
-
`);let
|
|
32
|
-
`),console.log("\u{1F4CA} Results:"),console.log(` Total files: ${
|
|
33
|
-
\u{1F4C4} Output: ${
|
|
34
|
-
\u26A0\uFE0F Parse errors (${
|
|
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
|
|
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 \
|
|
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
|
-
|
|
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
|
|
30
|
-
\u{1F4E6} Analyzing project: ${
|
|
31
|
-
`);let
|
|
32
|
-
`),console.log("\u{1F4CA} Results:"),console.log(` Total files: ${
|
|
33
|
-
\u{1F4C4} Output: ${
|
|
34
|
-
\u26A0\uFE0F Parse errors (${
|
|
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'),
|
|
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
|
|
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
|
|
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
|
|
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
|
|
2
|
-
${
|
|
3
|
-
`)}`)},async buildStart(){if(
|
|
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
|
|
2
|
-
${
|
|
3
|
-
`)}`)},async buildStart(){if(
|
|
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};
|