@reframejs/cli 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +10 -10
- package/dist/framer-source-export.js +2 -2
- package/package.json +2 -2
|
@@ -673,7 +673,7 @@ export default function App() {
|
|
|
673
673
|
The JSX and CSS are editable source reconstructed from the Framer node model. 'meta/framer-map.json' retains the original node IDs, while 'meta/interactions.json' records variants, responsive breakpoints, gestures, links, and component controls. 'meta/original-framer-code/' preserves any source code exposed by Framer.
|
|
674
674
|
`}function UR(e,{localAssetUrls:t=[]}={}){let A=YDt(e),r=JDt(e,A),i=Ihe(r),n=RDt(r),s=new Set(t),a=r.map(g=>({root:g,name:v_(g)})),o=new Map;for(let{root:g,name:p}of a)o.set(KR(g),p),o.set(uA(g,"componentName"),p),o.set(uA(g,"name"),p);let l=qDt(i,n,s,o),u=new Map;for(let{root:g,name:p}of a)u.set(`${$a(p)}.jsx`,zDt(g,p,l,o,i));u.set("styles.css",WDt(r,i,n,s));let c={schemaVersion:2,generatedAt:new Date().toISOString(),source:"Selected Framer component",components:a.map(({root:g,name:p})=>({id:g.id,name:p})),nodes:i.records,assets:n.map(g=>({...g,local:s.has(g.url)})),interactions:VDt(r,i),codeFiles:(e.codeFiles??[]).map(({id:g,name:p,path:I,exports:d})=>({id:g,name:p,path:I,exports:d})),warnings:e.warnings??[]};u.set("meta/framer-map.json",`${JSON.stringify(c,null,2)}
|
|
675
675
|
`),u.set("meta/interactions.json",`${JSON.stringify(c.interactions,null,2)}
|
|
676
|
-
`),u.set("README.md",ZDt(A));for(let g of e.codeFiles??[]){let p=g.path||g.name||g.id,I=p.includes(".")?p.slice(p.lastIndexOf(".")):".tsx",d=I?p.slice(0,-I.length):p;u.set(`meta/original-framer-code/${$a(d,g.id)}${I}`,g.content??"")}return{files:u,assets:n,components:a,manifest:c}}async function XDt(e,t){try{return await sR.format(e,{parser:t,singleQuote:!0,trailingComma:"all",printWidth:100})}catch{return e}}async function $Dt(e,t,A){let r=new Set;return await Promise.all(e.map(async i=>{try{let n=await fetch(i.url,{redirect:"follow"});if(!n.ok)throw new Error(`HTTP ${n.status}`);let s=vF.join(t,i.path);await i2.mkdir(vF.dirname(s),{recursive:!0}),await i2.writeFile(s,Buffer.from(await n.arrayBuffer())),r.add(i.url)}catch(n){A.push(`asset ${i.url}: ${n.message}`)}})),r}function e2t(e){return e.endsWith(".jsx")?"babel":e.endsWith(".css")?"css":null}async function Dhe(e,t,{downloadAssets:A=!0}={}){await i2.mkdir(t,{recursive:!0});let r=[...e.warnings??[]],i=UR(e),n=A?await $Dt(i.assets,t,r):new Set,s=UR({...e,warnings:r},{localAssetUrls:n});for(let[a,o]of s.files){let l=vF.join(t,a);await i2.mkdir(vF.dirname(l),{recursive:!0});let u=e2t(a),c=u?await XDt(o,u):o;await i2.writeFile(l,c,"utf8")}return{outputDir:t,components:s.components.length,assets:s.assets.length,downloadedAssets:n.size,warnings:r,files:[...s.files.keys()]}}var tme=uQ(qF(),1),w7=uQ(IY(),1),S7=uQ(rm(),1),es=uQ(Er(),1);import Tn from"node:fs/promises";import ni from"node:path";import IeA from"node:crypto";import{bundle as deA}from"unframer/dist/exporter";function heA(e,t){let A=$a(e,"component"),r=A,i=2;for(;t.has(r);)r=`${A}-${i++}`;return t.add(r),r}function X_e(e){let t=new Set,A=(e.components??[]).filter(r=>r?.type==="ComponentNode").map(r=>{let i=r.attributes?.componentName||r.attributes?.name||r.id||"Component",n=(r.children??[]).filter(s=>s?.attributes?.isVariant||s?.type==="FrameNode").map(s=>({id:s.id||null,name:s.attributes?.name||null,width:s.attributes?.width||null,isPrimary:!!s.attributes?.isPrimaryVariant,isBreakpoint:!!s.attributes?.isBreakpoint,inheritsFromId:s.attributes?.inheritsFromId||null}));return{id:r.id||null,name:i,slug:heA(i,t),componentIdentifier:r.attributes?.componentIdentifier||null,moduleUrl:r.attributes?.insertURL||null,variants:n}});return{schemaVersion:1,exporter:"reframe",generatedAt:new Date().toISOString(),project:{id:e.project?.id||null,name:e.project?.name||null,apiVersion1Id:e.project?.apiVersion1Id||null},components:A}}var BeA=w7.default.default??w7.default,EeA=S7.default.default??S7.default,k7={base:0,sm:320,md:768,lg:960,xl:1200,"2xl":1536};function Ame(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let t=Number.parseFloat(e);return Number.isFinite(t)?t:null}return e&&typeof e=="object"?Ame(e.value):null}function feA(e){let t=String(e.name||"").toLowerCase(),A=Ame(e.width);return t.includes("mobile")||t.includes("phone")?0:t.includes("tablet")?k7.md:t.includes("desktop")||t.includes("wide")?k7.lg:A}function _eA(e){return(e.variants??[]).map(t=>({variant:t,width:feA(t)})).filter(({variant:t,width:A})=>t.id&&A!==null).map(({variant:t,width:A})=>({componentName:e.slug,width:A,variantId:t.id}))}function pT(e){return e?.selectionOnly||e?.components?.some(t=>t?.attributes)?X_e(e):e}function CT(e,t){let A=e?.components??[];if(!t&&A.length===1)return A[0];let r=String(t??"").toLowerCase();return A.find(i=>[i.id,i.slug,i.name,i.componentIdentifier].filter(Boolean).some(n=>String(n).toLowerCase()===r))}async function $_e(e,t){try{await Tn.rm(t,{force:!0}),await Tn.rename(e,t)}catch(A){if(A.code!=="ENOENT")throw A}}async function meA(e){let t=ni.join(e,"node_modules"),A=ni.resolve(import.meta.dirname,"..","node_modules");try{return await Tn.lstat(t),null}catch(r){if(r.code!=="ENOENT")throw r}return await Tn.symlink(A,t,process.platform==="win32"?"junction":"dir"),t}async function QeA(e){e&&await Tn.rm(e,{recursive:!0,force:!0})}async function yeA(e){let t=process.stdout.write,A=process.stderr.write;process.stdout.write=()=>!0,process.stderr.write=()=>!0;try{return await e()}finally{process.stdout.write=t,process.stderr.write=A}}var DeA=new Set([".avif",".gif",".jpeg",".jpg",".m4v",".mp4",".ogg",".otf",".png",".svg",".ttf",".wasm",".webm",".webp",".woff",".woff2"]),weA=new Map([["image/avif",".avif"],["image/gif",".gif"],["image/jpeg",".jpg"],["image/png",".png"],["image/svg+xml",".svg"],["image/webp",".webp"],["font/otf",".otf"],["font/ttf",".ttf"],["font/woff",".woff"],["font/woff2",".woff2"],["video/mp4",".mp4"],["video/webm",".webm"]]),rme=/https?:\/\/[^\s"'`<>\\)]+/g;function ime(e){return e.replace(/[;,]+$/,"")}function SeA(e){try{let t=new URL(e);if(!/^https?:$/.test(t.protocol))return!1;let A=t.pathname.toLowerCase(),r=ni.posix.extname(A);return DeA.has(r)?!0:A.includes("/images/")||A.includes("/assets/")}catch{return!1}}function eme(e){return new Set([...e.matchAll(rme)].map(t=>ime(t[0])).filter(SeA))}function keA(e,t=""){let A="";try{A=ni.posix.extname(new URL(e).pathname).toLowerCase()}catch{}return[".woff",".woff2",".ttf",".otf"].includes(A)?"fonts":[".mp4",".webm",".m4v",".ogg"].includes(A)?"video":t.startsWith("font/")?"fonts":t.startsWith("video/")?"video":"images"}function beA(e,t=""){let A=new URL(e),r=decodeURIComponent(ni.posix.basename(A.pathname)),i=ni.posix.extname(r).toLowerCase();i||(i=weA.get(t.split(";")[0])||"");let n=i?r.slice(0,-i.length):r;return`${$a(n,"asset")}${i}`}function xeA(e){return es.memberExpression(es.newExpression(es.identifier("URL"),[es.stringLiteral(e.replaceAll("\\","/")),es.memberExpression(es.metaProperty(es.identifier("import"),es.identifier("meta")),es.identifier("url"))]),es.identifier("href"))}function FeA(e,t){let A=[...e.matchAll(rme)].map(n=>({start:n.index,end:n.index+n[0].length,url:ime(n[0])})).filter(n=>t.has(n.url));if(A.length===0)return null;let r=[],i=0;for(let n of A)n.start>i&&r.push(es.stringLiteral(e.slice(i,n.start))),r.push(xeA(t.get(n.url))),i=n.end;return i<e.length&&r.push(es.stringLiteral(e.slice(i))),r.reduce((n,s)=>n?es.binaryExpression("+",n,s):s,null)}function NeA(e,t){let A=(0,tme.parse)(e,{sourceType:"module",plugins:["jsx","importMeta","topLevelAwait","classProperties","optionalChaining"]});return EeA(A,{StringLiteral(r){let i=FeA(r.node.value,t);i&&r.replaceWith(i)}}),BeA(A,{comments:!0,compact:!1,retainLines:!1}).code+`
|
|
676
|
+
`),u.set("README.md",ZDt(A));for(let g of e.codeFiles??[]){let p=g.path||g.name||g.id,I=p.includes(".")?p.slice(p.lastIndexOf(".")):".tsx",d=I?p.slice(0,-I.length):p;u.set(`meta/original-framer-code/${$a(d,g.id)}${I}`,g.content??"")}return{files:u,assets:n,components:a,manifest:c}}async function XDt(e,t){try{return await sR.format(e,{parser:t,singleQuote:!0,trailingComma:"all",printWidth:100})}catch{return e}}async function $Dt(e,t,A){let r=new Set;return await Promise.all(e.map(async i=>{try{let n=await fetch(i.url,{redirect:"follow"});if(!n.ok)throw new Error(`HTTP ${n.status}`);let s=vF.join(t,i.path);await i2.mkdir(vF.dirname(s),{recursive:!0}),await i2.writeFile(s,Buffer.from(await n.arrayBuffer())),r.add(i.url)}catch(n){A.push(`asset ${i.url}: ${n.message}`)}})),r}function e2t(e){return e.endsWith(".jsx")?"babel":e.endsWith(".css")?"css":null}async function Dhe(e,t,{downloadAssets:A=!0}={}){await i2.mkdir(t,{recursive:!0});let r=[...e.warnings??[]],i=UR(e),n=A?await $Dt(i.assets,t,r):new Set,s=UR({...e,warnings:r},{localAssetUrls:n});for(let[a,o]of s.files){let l=vF.join(t,a);await i2.mkdir(vF.dirname(l),{recursive:!0});let u=e2t(a),c=u?await XDt(o,u):o;await i2.writeFile(l,c,"utf8")}return{outputDir:t,components:s.components.length,assets:s.assets.length,downloadedAssets:n.size,warnings:r,files:[...s.files.keys()]}}var tme=uQ(qF(),1),w7=uQ(IY(),1),S7=uQ(rm(),1),es=uQ(Er(),1);import Tn from"node:fs/promises";import ni from"node:path";import IeA from"node:crypto";import{bundle as deA}from"@reframejs/unframer/dist/exporter";function heA(e,t){let A=$a(e,"component"),r=A,i=2;for(;t.has(r);)r=`${A}-${i++}`;return t.add(r),r}function X_e(e){let t=new Set,A=(e.components??[]).filter(r=>r?.type==="ComponentNode").map(r=>{let i=r.attributes?.componentName||r.attributes?.name||r.id||"Component",n=(r.children??[]).filter(s=>s?.attributes?.isVariant||s?.type==="FrameNode").map(s=>({id:s.id||null,name:s.attributes?.name||null,width:s.attributes?.width||null,isPrimary:!!s.attributes?.isPrimaryVariant,isBreakpoint:!!s.attributes?.isBreakpoint,inheritsFromId:s.attributes?.inheritsFromId||null}));return{id:r.id||null,name:i,slug:heA(i,t),componentIdentifier:r.attributes?.componentIdentifier||null,moduleUrl:r.attributes?.insertURL||null,variants:n}});return{schemaVersion:1,exporter:"reframe",generatedAt:new Date().toISOString(),project:{id:e.project?.id||null,name:e.project?.name||null,apiVersion1Id:e.project?.apiVersion1Id||null},components:A}}var BeA=w7.default.default??w7.default,EeA=S7.default.default??S7.default,k7={base:0,sm:320,md:768,lg:960,xl:1200,"2xl":1536};function Ame(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"){let t=Number.parseFloat(e);return Number.isFinite(t)?t:null}return e&&typeof e=="object"?Ame(e.value):null}function feA(e){let t=String(e.name||"").toLowerCase(),A=Ame(e.width);return t.includes("mobile")||t.includes("phone")?0:t.includes("tablet")?k7.md:t.includes("desktop")||t.includes("wide")?k7.lg:A}function _eA(e){return(e.variants??[]).map(t=>({variant:t,width:feA(t)})).filter(({variant:t,width:A})=>t.id&&A!==null).map(({variant:t,width:A})=>({componentName:e.slug,width:A,variantId:t.id}))}function pT(e){return e?.selectionOnly||e?.components?.some(t=>t?.attributes)?X_e(e):e}function CT(e,t){let A=e?.components??[];if(!t&&A.length===1)return A[0];let r=String(t??"").toLowerCase();return A.find(i=>[i.id,i.slug,i.name,i.componentIdentifier].filter(Boolean).some(n=>String(n).toLowerCase()===r))}async function $_e(e,t){try{await Tn.rm(t,{force:!0}),await Tn.rename(e,t)}catch(A){if(A.code!=="ENOENT")throw A}}async function meA(e){let t=ni.join(e,"node_modules"),A=ni.resolve(import.meta.dirname,"..","node_modules");try{return await Tn.lstat(t),null}catch(r){if(r.code!=="ENOENT")throw r}return await Tn.symlink(A,t,process.platform==="win32"?"junction":"dir"),t}async function QeA(e){e&&await Tn.rm(e,{recursive:!0,force:!0})}async function yeA(e){let t=process.stdout.write,A=process.stderr.write;process.stdout.write=()=>!0,process.stderr.write=()=>!0;try{return await e()}finally{process.stdout.write=t,process.stderr.write=A}}var DeA=new Set([".avif",".gif",".jpeg",".jpg",".m4v",".mp4",".ogg",".otf",".png",".svg",".ttf",".wasm",".webm",".webp",".woff",".woff2"]),weA=new Map([["image/avif",".avif"],["image/gif",".gif"],["image/jpeg",".jpg"],["image/png",".png"],["image/svg+xml",".svg"],["image/webp",".webp"],["font/otf",".otf"],["font/ttf",".ttf"],["font/woff",".woff"],["font/woff2",".woff2"],["video/mp4",".mp4"],["video/webm",".webm"]]),rme=/https?:\/\/[^\s"'`<>\\)]+/g;function ime(e){return e.replace(/[;,]+$/,"")}function SeA(e){try{let t=new URL(e);if(!/^https?:$/.test(t.protocol))return!1;let A=t.pathname.toLowerCase(),r=ni.posix.extname(A);return DeA.has(r)?!0:A.includes("/images/")||A.includes("/assets/")}catch{return!1}}function eme(e){return new Set([...e.matchAll(rme)].map(t=>ime(t[0])).filter(SeA))}function keA(e,t=""){let A="";try{A=ni.posix.extname(new URL(e).pathname).toLowerCase()}catch{}return[".woff",".woff2",".ttf",".otf"].includes(A)?"fonts":[".mp4",".webm",".m4v",".ogg"].includes(A)?"video":t.startsWith("font/")?"fonts":t.startsWith("video/")?"video":"images"}function beA(e,t=""){let A=new URL(e),r=decodeURIComponent(ni.posix.basename(A.pathname)),i=ni.posix.extname(r).toLowerCase();i||(i=weA.get(t.split(";")[0])||"");let n=i?r.slice(0,-i.length):r;return`${$a(n,"asset")}${i}`}function xeA(e){return es.memberExpression(es.newExpression(es.identifier("URL"),[es.stringLiteral(e.replaceAll("\\","/")),es.memberExpression(es.metaProperty(es.identifier("import"),es.identifier("meta")),es.identifier("url"))]),es.identifier("href"))}function FeA(e,t){let A=[...e.matchAll(rme)].map(n=>({start:n.index,end:n.index+n[0].length,url:ime(n[0])})).filter(n=>t.has(n.url));if(A.length===0)return null;let r=[],i=0;for(let n of A)n.start>i&&r.push(es.stringLiteral(e.slice(i,n.start))),r.push(xeA(t.get(n.url))),i=n.end;return i<e.length&&r.push(es.stringLiteral(e.slice(i))),r.reduce((n,s)=>n?es.binaryExpression("+",n,s):s,null)}function NeA(e,t){let A=(0,tme.parse)(e,{sourceType:"module",plugins:["jsx","importMeta","topLevelAwait","classProperties","optionalChaining"]});return EeA(A,{StringLiteral(r){let i=FeA(r.node.value,t);i&&r.replaceWith(i)}}),BeA(A,{comments:!0,compact:!1,retainLines:!1}).code+`
|
|
677
677
|
`}function TeA(e){let t=e.toLowerCase();return t.startsWith("is")||t.startsWith("has")||t.startsWith("show")||t.startsWith("hide")||t.startsWith("enable")||t.startsWith("disable")||t.startsWith("use")||t.startsWith("newtab")||t.includes("visible")||t.includes("autoplay")||t.includes("loop")||t.includes("muted")?"boolean":t.includes("border")?"FramerBorderValue":t.includes("color")||t.includes("opacity")||t.includes("radius")||t.includes("width")||t.includes("height")||t.includes("size")||t.includes("duration")||t.includes("delay")||t.includes("gap")||t.includes("padding")?t.includes("color")?"string":"number":t.includes("title")||t.includes("description")||t.includes("subtitle")||t.includes("label")||t.endsWith("text")||t==="name"?"string":t.includes("link")||t.includes("url")?"FramerLinkValue":t.includes("image")?"FramerImageValue | string":t.includes("icon")?"ReactNode":"unknown"}function veA(e){let t=[...e.matchAll(/var getProps\w*\s*=\s*\(\{([\s\S]*?)\}\)\s*=>\s*\{([\s\S]*?)\n\};/g)],A=t.find(i=>/\bvariant\s*:\s*humanReadableVariantMap/.test(i[2]))||t.at(-1);if(!A)return[];let r=new Map;for(let i of A[2].matchAll(/\b[A-Za-z_$][\w$]*\s*:\s*([A-Za-z_$][\w$]*)\s*\?\?\s*props\.[A-Za-z_$][\w$]*/g)){let n=i[1];n!=="variant"&&n!=="width"&&n!=="height"&&r.set(n,TeA(n))}return[...r.entries()]}function MeA(e){let t=[...(e.variants??[]).flatMap(r=>[r.id,r.name])].filter(Boolean),A=[...new Set(t.map(String))];return A.length?A.map(r=>JSON.stringify(r)).join(" | "):"string"}function nme(e,t=""){let A=String(e.name).replaceAll("*/","*\\u002F"),r=String(t||"").replaceAll("*/","*\\u002F").trim(),i=r?` * Usage and prop documentation: ${r}
|
|
678
678
|
`:` * See the Reframe documentation for usage and styling guidance.
|
|
679
679
|
`;return`/**
|
|
@@ -762,7 +762,7 @@ export default ${r};
|
|
|
762
762
|
`}async function sme(e){let t=[];try{t=await Tn.readdir(e,{withFileTypes:!0})}catch{return[]}let A=[];for(let r of t){let i=ni.join(e,r.name);r.isDirectory()?A.push(...await sme(i)):A.push(i)}return A}async function PeA(e){try{return JSON.parse(await Tn.readFile(e,"utf8"))}catch{return{}}}async function GeA(e,t){let A=(await sme(t)).filter(g=>/\.(?:tsx?|jsx?|css)$/i.test(g)),r=ni.join(e,"styles.css");await Tn.stat(r).catch(()=>null)&&A.push(r);let i=new Map;for(let g of A)i.set(g,await Tn.readFile(g,"utf8"));let n=new Set([...i.values()].flatMap(g=>[...eme(g)])),s=ni.join(e,"meta","assets.json"),a=await PeA(s),o=new Map,l=[],u=new Set(Object.values(a));await Promise.all([...n].map(async g=>{let p=a[g];if(p&&await Tn.stat(ni.join(e,p)).catch(()=>null)){o.set(g,p);return}try{let I=await fetch(g,{signal:AbortSignal.timeout(3e4)});if(!I.ok)throw new Error(`HTTP ${I.status}`);let d=I.headers.get("content-type")||"",B=keA(g,d),f=beA(g,d),_=ni.posix.join("assets",B,f);if(u.has(_)){let S=ni.posix.extname(f),D=S?f.slice(0,-S.length):f,Q=IeA.createHash("sha1").update(g).digest("hex").slice(0,8);f=`${D}-${Q}${S}`,_=ni.posix.join("assets",B,f)}u.add(_);let m=ni.join(e,..._.split("/"));await Tn.mkdir(ni.dirname(m),{recursive:!0}),await Tn.writeFile(m,new Uint8Array(await I.arrayBuffer())),o.set(g,_)}catch(I){l.push(`asset ${g}: ${I.message}`)}}));let c={...a};for(let[g,p]of o)c[g]=p;await Tn.mkdir(ni.dirname(s),{recursive:!0}),await Tn.writeFile(s,`${JSON.stringify(c,null,2)}
|
|
763
763
|
`,"utf8");for(let[g,p]of i){let I=p;/\.css$/i.test(g)?I=[...o].reduce((d,[B,f])=>{let _=ni.posix.relative(ni.dirname(g).replaceAll("\\","/"),ni.join(e,f).replaceAll("\\","/")),m=_.startsWith(".")?_:`./${_}`;return d.split(B).join(m)},I):[...eme(I)].some(d=>o.has(d))&&(I=NeA(I,new Map([...o].map(([d,B])=>[d,ni.posix.relative(ni.dirname(g).replaceAll("\\","/"),ni.join(e,B).replaceAll("\\","/"))])))),I!==p&&await Tn.writeFile(g,I,"utf8")}return{assets:o.size,warnings:l}}async function ame(e,t,{component:A,quiet:r=!1,docsUrl:i=""}={}){let n=pT(e),s=CT(n,A);if(!s)throw new Error(`Component ${A||"(none)"} was not found in the component catalog.`);if(!s.moduleUrl)throw new Error(`${s.name} does not expose a generated module URL. Use the canvas fallback export for this component.`);let a=ni.resolve(t),o=ni.join(a,"components");await Tn.mkdir(o,{recursive:!0});let l={projectId:n.project?.id||"",fullFramerProjectId:n.project?.id||"",projectName:n.project?.name||"",components:{[s.slug]:s.moduleUrl},componentBreakpoints:_eA(s),breakpoints:k7,tokens:[],locales:[],framerWebPages:[],externalPackages:[],allExternal:!0,jsx:!0},u=await meA(a),c,g;try{let B=()=>deA({config:l,cwd:o,watch:!1,metafile:!1});({result:c,buildContext:g}=await(r?yeA(B):B()))}finally{await g?.dispose?.(),await QeA(u)}let p=ni.join(o,`${s.slug}.jsx`),I=await Tn.readFile(p,"utf8");await Tn.writeFile(p,`${nme(s,i)}
|
|
764
764
|
${I}`,"utf8"),await Tn.writeFile(ni.join(o,`${s.slug}.tsx`),LeA(s,I,i),"utf8"),await $_e(ni.join(o,"styles.css"),ni.join(a,"styles.css")),await $_e(ni.join(o,"tokens.css"),ni.join(a,"tokens.css")),await Tn.mkdir(ni.join(a,"meta"),{recursive:!0}),await Tn.writeFile(ni.join(a,"meta","component-catalog.json"),`${JSON.stringify(n,null,2)}
|
|
765
|
-
`,"utf8");let d=await GeA(a,o);return{outputDir:a,component:s,result:c,...d}}var ome=UeA(ReA),YeA=new Set(["create-app","sync","module","serve"]);function b7(e){if(!e)throw new z7("snapshot or manifest path is required");return e}async function x7(e){let t=Di.resolve(e);return JSON.parse(await Jn.readFile(t,"utf8"))}function lme(e=[]){if(e.length!==0){console.log(`Warnings: ${e.length}`);for(let t of e.slice(0,12))console.log(` - ${t}`)}}async function JeA(e,t){let A=await x7(e);if(A.schemaVersion!==1)throw new Error(`Unsupported snapshot schema: ${A.schemaVersion??"missing"}`);if(!A.selectionOnly||!Array.isArray(A.selection))throw new Error("This snapshot contains a full project. Use the component module workflow or select a component in Framer and export a new selection snapshot.");let r=await Dhe(A,Di.resolve(t.out),{downloadAssets:t.downloadAssets});console.log(`Canvas fallback export complete: ${r.outputDir}`),console.log(`Components: ${r.components}; assets: ${r.assets} (${r.downloadedAssets} downloaded)`),lme(r.warnings)}function qeA(){return{private:!0,version:"0.0.0",type:"module",scripts:{dev:"vite",typecheck:"tsc --noEmit",build:"tsc --noEmit && vite build",preview:"vite preview"},dependencies:{react:"^19.0.0","react-dom":"^19.0.0",unframer:"
|
|
765
|
+
`,"utf8");let d=await GeA(a,o);return{outputDir:a,component:s,result:c,...d}}var ome=UeA(ReA),YeA=new Set(["create-app","sync","module","serve"]);function b7(e){if(!e)throw new z7("snapshot or manifest path is required");return e}async function x7(e){let t=Di.resolve(e);return JSON.parse(await Jn.readFile(t,"utf8"))}function lme(e=[]){if(e.length!==0){console.log(`Warnings: ${e.length}`);for(let t of e.slice(0,12))console.log(` - ${t}`)}}async function JeA(e,t){let A=await x7(e);if(A.schemaVersion!==1)throw new Error(`Unsupported snapshot schema: ${A.schemaVersion??"missing"}`);if(!A.selectionOnly||!Array.isArray(A.selection))throw new Error("This snapshot contains a full project. Use the component module workflow or select a component in Framer and export a new selection snapshot.");let r=await Dhe(A,Di.resolve(t.out),{downloadAssets:t.downloadAssets});console.log(`Canvas fallback export complete: ${r.outputDir}`),console.log(`Components: ${r.components}; assets: ${r.assets} (${r.downloadedAssets} downloaded)`),lme(r.warnings)}function qeA(){return{private:!0,version:"0.0.0",type:"module",scripts:{dev:"vite",typecheck:"tsc --noEmit",build:"tsc --noEmit && vite build",preview:"vite preview"},dependencies:{react:"^19.0.0","react-dom":"^19.0.0",unframer:"npm:@reframejs/unframer@4.2.0-reframe.0"},devDependencies:{"@vitejs/plugin-react":"^5.0.0","@types/react":"^19.0.0","@types/react-dom":"^19.0.0",typescript:"^5.9.3",vite:"^7.3.6"}}}async function OeA(e){let t=Di.join(e,"package.json"),A=qeA(),r={};try{r=JSON.parse(await Jn.readFile(t,"utf8"))}catch{}let i={...A,...r,type:"module",scripts:{...r.scripts,...A.scripts},dependencies:{...A.dependencies,...r.dependencies},devDependencies:{...A.devDependencies,...r.devDependencies}};await Jn.writeFile(t,`${JSON.stringify(i,null,2)}
|
|
766
766
|
`,"utf8")}async function HeA(e,t){try{await Jn.readFile(e,"utf8")===t&&await Jn.rm(e)}catch{}}async function Ld(e,t){try{await Jn.access(e)}catch{await Jn.mkdir(Di.dirname(e),{recursive:!0}),await Jn.writeFile(e,t,"utf8")}}async function jeA(e,t){await Jn.mkdir(e,{recursive:!0}),await OeA(e),await Ld(Di.join(e,".gitignore"),`node_modules/
|
|
767
767
|
dist/
|
|
768
768
|
`),await HeA(Di.join(e,"vite.config.js"),`import { defineConfig } from 'vite';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reframejs/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Export selected Framer components into readable, AI-friendly React and CSS source.",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"prettier": "^3.6.2",
|
|
57
57
|
"react": "^19.2.0",
|
|
58
58
|
"react-dom": "^19.2.0",
|
|
59
|
-
"unframer": "
|
|
59
|
+
"@reframejs/unframer": "4.2.0-reframe.0"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"javascript-obfuscator": "^4.1.1",
|