smart-registry 0.5.1 → 0.5.4

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
@@ -91,33 +91,9 @@ Manual maintenance of `registry.json` files can lead to errors due to missing de
91
91
 
92
92
  ## Usage
93
93
 
94
- ### Configure Alias
95
-
96
- Add the following alias to your `tsconfig.json` file.
97
-
98
- ```diff
99
- {
100
- "compilerOptions": {
101
- "baseUrl": ".",
102
- + "paths": {
103
- + "@/*": ["./src/*"] or ["./*"]
104
- + }
105
- }
106
- }
107
- ```
108
-
109
94
  ### Automatic Detection
110
95
 
111
- Based on the alias configuration, the following directory structure is assumed. Read more about [directory structure](#directory-structure).
112
-
113
- | Alias | Path | Directory (Required) |
114
- | ----- | --------- | -------------------------- |
115
- | `@/*` | `./src/*` | `src/components` |
116
- | `@/*` | `./*` | `components` or `registry` |
117
-
118
- <br/>
119
-
120
- Then, run the following command:
96
+ If your project contains a `registry`, `components`, or `src/components` directory, `Smart Registry` will automatically detect and generate the necessary registry files. For more details, refer to the [directory structure](#directory-structure) section.
121
97
 
122
98
  ```bash
123
99
  npx smart-registry
package/dist/bin/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- var z=Object.defineProperty,q=Object.defineProperties;var B=Object.getOwnPropertyDescriptors;var D=Object.getOwnPropertySymbols;var T=Object.prototype.hasOwnProperty,U=Object.prototype.propertyIsEnumerable;var _=(r,i,t)=>i in r?z(r,i,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[i]=t,$=(r,i)=>{for(var t in i||(i={}))T.call(i,t)&&_(r,t,i[t]);if(D)for(var t of D(i))U.call(i,t)&&_(r,t,i[t]);return r},P=(r,i)=>q(r,B(i));import j from"node:fs";import S from"node:path";import{parseArgs as K}from"node:util";import J from"node:fs";import Z from"strip-json-comments";var V=async()=>{if(J.existsSync("tsconfig.json")){let r=await J.promises.readFile("tsconfig.json","utf8"),{compilerOptions:i}=JSON.parse(Z(r,{trailingCommas:!0}));if(i.paths){let t=Object.entries(i.paths).reduce((n,[s,[e]])=>(n[s.replace(/\*$/,"")]=e.replace(/^\.\//,"").replace(/\*$/,""),n),{});if(!Object.keys(t).includes("@/"))throw new Error("No alias key '@/' found in tsconfig.json");return t}}throw new Error("No tsconfig.json found")};import v from"node:fs";import k from"node:path";import{glob as G}from"tinyglobby";var F=r=>{if(k.extname(r)!=="")return r;{let t=r.split(/\/|\\/).slice(0,-1).join(k.sep);if(!v.existsSync(t))return"";let n=v.readdirSync(t);n=n.map(e=>t+k.sep+e);let s=n.find(e=>e.startsWith(r+"."));return s=s==null?void 0:s.replace(process.cwd()+k.sep,""),s||""}},C=async({patterns:r=["**",".**"],ignore:i=[]}={})=>{if(r=Array.isArray(r)?r:[r],i=Array.isArray(i)?i:[i],v.existsSync(".gitignore")){let t=(await v.promises.readFile(".gitignore","utf8")).split(`
3
- `).map(n=>n.trim()).filter(n=>n&&!n.startsWith("#")).map(n=>n.replace(/^\//,""));i=i.concat(t)}return await G(r,{ignore:i.filter(t=>!r.includes(t))})};import M from"node:fs";import x from"node:path";import H from"node:path";var d=(r,i={})=>{var n;r=i.aliases?r.replace(i.aliases["@/"],""):r;let t=r.startsWith("registry/")?r.replace(/^registry\//,"").replace(/^(?:([^\/]*)\/)?blocks\//,(s,e)=>`blocks/${e?e+"/":""}`).replace(/^(?:([^\/]*)\/)?components\/ui\//,(s,e)=>`${e?e+"/":""}ui/`).replace(/^(?:([^\/]*)\/)?components\//,(s,e)=>`components/${e?e+"/":""}`).replace(/^(?:([^\/]*)\/)?hooks\//,(s,e)=>`hooks/${e?e+"/":""}`).replace(/^(?:([^\/]*)\/)?lib\//,(s,e)=>`lib/${e?e+"/":""}`).replace(/^(?:([^\/]*)\/)?ui\//,(s,e)=>`components/ui/${e?e+"/":""}`).replace(/\/default\//,"/").replace(/\.\.\//g,"").replace(/\.\//g,""):r.replace(/\/default\//,"/").replace(/\.\.\//g,"").replace(/\.\//g,"");return{type:t.endsWith("page.tsx")?"registry:page":((n=t.match(/^(blocks|components\/ui|components|hooks|lib|utils)/))==null?void 0:n[1].replace("blocks","registry:block").replace("components/ui","registry:ui").replace("components","registry:component").replace("hooks","registry:hook").replace("lib","registry:lib").replace("utils","registry:lib"))||"registry:file",name:t.replace(/^(blocks|components\/ui|components|hooks|lib|utils)\//,"").replace(/\.[^\/.]+$/,""),import:"@/"+t.replace(process.cwd()+H.sep,"").replace(/\.[^/.]+$/,""),target:t,path:r}};var w=(r,i)=>Object.entries(i).sort(([n],[s])=>s.length-n.length).reduce((n,[s,e])=>n.replace(s,e),r),N=async(r,i={})=>{let{aliases:t={},resolved:n=new Set}=i,s={dependencies:[],files:[],content:{}};for(let e of r){if(n.has(e))continue;n.add(e),s.files.push(e),s.content[e]=s.content[e]||await M.promises.readFile(e,"utf8");let a=s.content[e].match(/import\s+[\s\S]+?from\s+['"][^'"]+['"]|import\s+['"][^'"]+['"]|import\s+type\s+[\s\S]+?from\s+['"][^'"]+['"]/g);if(!a)continue;let o=a.map(f=>{var h;return(h=f.match(/['"](.*)['"]/))==null?void 0:h[1]});for(let f of o)if(Object.keys(t).some(c=>f.startsWith(c))){let c=w(f,t);c=F(c),c&&!s.files.includes(c)&&s.files.push(c)}else if(f.startsWith(".")){let c=x.resolve(x.dirname(e),f);c=F(c),c&&!s.files.includes(c)&&s.files.push(c)}else{let c=["fs","path","util"],g=f.split("/").slice(0,2).join("/");g=g.startsWith("@")?g:g.split("/")[0],/^[a-zA-Z0-9@/-]+$/.test(g)&&!c.includes(g)&&!s.dependencies.includes(g)&&s.dependencies.push(g)}}for(let e of s.files){let a=await N([e],{aliases:t,resolved:n});a.dependencies.forEach(o=>{s.dependencies.includes(o)||s.dependencies.push(o)}),a.files.forEach(o=>{s.files.includes(o)||s.files.push(o)}),s.content[e]=a.content[e]||await M.promises.readFile(e,"utf8")}for(let e of s.files)s.content[e]=s.content[e].replace(/import\s+[\s\S]+?from\s+['"][^'"]+['"]|import\s+['"][^'"]+['"]|import\s+type\s+[\s\S]+?from\s+['"][^'"]+['"]/g,a=>{var h,c,g;let o=(h=a.match(/['"](.*)['"]/))==null?void 0:h[1];if(Object.keys(t).some(u=>o.startsWith(u))){let u=w(o,t),y=(c=d(u,{aliases:t}))==null?void 0:c.import;return a.replace(o,y)}else if(o.startsWith(".")){let u=x.resolve(x.dirname(e),o),y=(g=d(u,{aliases:t}))==null?void 0:g.import;return a.replace(o,y)}else return a});return s.dependencies.sort(),s.files.sort((e,a)=>d(e,{aliases:t}).target.localeCompare(d(a,{aliases:t}).target)),s.files.sort((e,a)=>{let o=["registry:file","registry:block","registry:component","registry:ui","registry:hook","registry:lib"],f=d(e,{aliases:t}).type,h=d(a,{aliases:t}).type;return o.indexOf(f)-o.indexOf(h)}),s};var A="smart-registry",W="0.5.0";var O={name:"Neeraj Dalal",email:"admin@nrjdalal.com",url:"https://nrjdalal.com"};var I=`Version:
4
- ${A}@${W}
2
+ var z=Object.defineProperty,q=Object.defineProperties;var B=Object.getOwnPropertyDescriptors;var _=Object.getOwnPropertySymbols;var T=Object.prototype.hasOwnProperty,U=Object.prototype.propertyIsEnumerable;var J=(r,i,t)=>i in r?z(r,i,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[i]=t,$=(r,i)=>{for(var t in i||(i={}))T.call(i,t)&&J(r,t,i[t]);if(_)for(var t of _(i))U.call(i,t)&&J(r,t,i[t]);return r},E=(r,i)=>q(r,B(i));import v from"node:fs";import S from"node:path";import{parseArgs as K}from"node:util";import F from"node:fs";import Z from"strip-json-comments";var C=async()=>{let r={};if(F.existsSync("tsconfig.json")){let t=await F.promises.readFile("tsconfig.json","utf8"),{compilerOptions:n}=JSON.parse(Z(t,{trailingCommas:!0}));if(n.paths){if(r=Object.entries(n.paths).reduce((s,[e,[a]])=>(s[e.replace(/\*$/,"")]=a.replace(/^\.\//,"").replace(/\*$/,""),s),{}),!Object.keys(r).includes("@/"))throw new Error("No alias key '@/' found in compilerOptions.paths!");return r}}let i=["registry","components","src/components"];for(let t of i)if(F.existsSync(t))return r["@/"]=t==="src/components"?"src/":"",r;throw new Error("Could not resolve aliases!")};import j from"node:fs";import k from"node:path";import{glob as G}from"tinyglobby";var R=r=>{if(k.extname(r)!=="")return r;{let t=r.split(/\/|\\/).slice(0,-1).join(k.sep);if(!j.existsSync(t))return"";let n=j.readdirSync(t);n=n.map(e=>t+k.sep+e);let s=n.find(e=>e.startsWith(r+"."));return s=s==null?void 0:s.replace(process.cwd()+k.sep,""),s||""}},V=async({patterns:r=["**",".**"],ignore:i=[]}={})=>{if(r=Array.isArray(r)?r:[r],i=Array.isArray(i)?i:[i],j.existsSync(".gitignore")){let t=(await j.promises.readFile(".gitignore","utf8")).split(`
3
+ `).map(n=>n.trim()).filter(n=>n&&!n.startsWith("#")).map(n=>n.replace(/^\//,""));i=i.concat(t)}return await G(r,{ignore:i.filter(t=>!r.includes(t))})};import M from"node:fs";import x from"node:path";import H from"node:path";var d=(r,i={})=>{var n;r=i.aliases?r.replace(i.aliases["@/"],""):r;let t=r.startsWith("registry/")?r.replace(/^registry\//,"").replace(/^(?:([^\/]*)\/)?blocks\//,(s,e)=>`blocks/${e?e+"/":""}`).replace(/^(?:([^\/]*)\/)?components\/ui\//,(s,e)=>`${e?e+"/":""}ui/`).replace(/^(?:([^\/]*)\/)?components\//,(s,e)=>`components/${e?e+"/":""}`).replace(/^(?:([^\/]*)\/)?hooks\//,(s,e)=>`hooks/${e?e+"/":""}`).replace(/^(?:([^\/]*)\/)?lib\//,(s,e)=>`lib/${e?e+"/":""}`).replace(/^(?:([^\/]*)\/)?ui\//,(s,e)=>`components/ui/${e?e+"/":""}`).replace(/\/default\//,"/").replace(/\.\.\//g,"").replace(/\.\//g,""):r.replace(/\/default\//,"/").replace(/\.\.\//g,"").replace(/\.\//g,"");return{type:t.endsWith("page.tsx")?"registry:page":((n=t.match(/^(blocks|components\/ui|components|hooks|lib|utils)/))==null?void 0:n[1].replace("blocks","registry:block").replace("components/ui","registry:ui").replace("components","registry:component").replace("hooks","registry:hook").replace("lib","registry:lib").replace("utils","registry:lib"))||"registry:file",name:t.replace(/^(blocks|components\/ui|components|hooks|lib|utils)\//,"").replace(/\.[^\/.]+$/,""),import:"@/"+t.replace(process.cwd()+H.sep,"").replace(/\.[^/.]+$/,""),target:t,path:r}};var w=(r,i)=>Object.entries(i).sort(([n],[s])=>s.length-n.length).reduce((n,[s,e])=>n.replace(s,e),r),N=async(r,i={})=>{let{aliases:t={},resolved:n=new Set}=i,s={dependencies:[],files:[],content:{}};for(let e of r){if(n.has(e))continue;n.add(e),s.files.push(e),s.content[e]=s.content[e]||await M.promises.readFile(e,"utf8");let a=s.content[e].match(/import\s+[\s\S]+?from\s+['"][^'"]+['"]|import\s+['"][^'"]+['"]|import\s+type\s+[\s\S]+?from\s+['"][^'"]+['"]/g);if(!a)continue;let o=a.map(f=>{var h;return(h=f.match(/['"](.*)['"]/))==null?void 0:h[1]});for(let f of o)if(Object.keys(t).some(c=>f.startsWith(c))){let c=w(f,t);c=R(c),c&&!s.files.includes(c)&&s.files.push(c)}else if(f.startsWith(".")){let c=x.resolve(x.dirname(e),f);c=R(c),c&&!s.files.includes(c)&&s.files.push(c)}else{let c=["fs","path","util"],g=f.split("/").slice(0,2).join("/");g=g.startsWith("@")?g:g.split("/")[0],/^[a-zA-Z0-9@/-]+$/.test(g)&&!c.includes(g)&&!s.dependencies.includes(g)&&s.dependencies.push(g)}}for(let e of s.files){let a=await N([e],{aliases:t,resolved:n});a.dependencies.forEach(o=>{s.dependencies.includes(o)||s.dependencies.push(o)}),a.files.forEach(o=>{s.files.includes(o)||s.files.push(o)}),s.content[e]=a.content[e]||await M.promises.readFile(e,"utf8")}for(let e of s.files)s.content[e]=s.content[e].replace(/import\s+[\s\S]+?from\s+['"][^'"]+['"]|import\s+['"][^'"]+['"]|import\s+type\s+[\s\S]+?from\s+['"][^'"]+['"]/g,a=>{var h,c,g;let o=(h=a.match(/['"](.*)['"]/))==null?void 0:h[1];if(Object.keys(t).some(u=>o.startsWith(u))){let u=w(o,t),y=(c=d(u,{aliases:t}))==null?void 0:c.import;return a.replace(o,y)}else if(o.startsWith(".")){let u=x.resolve(x.dirname(e),o),y=(g=d(u,{aliases:t}))==null?void 0:g.import;return a.replace(o,y)}else return a});return s.dependencies.sort(),s.files.sort((e,a)=>d(e,{aliases:t}).target.localeCompare(d(a,{aliases:t}).target)),s.files.sort((e,a)=>{let o=["registry:file","registry:block","registry:component","registry:ui","registry:hook","registry:lib"],f=d(e,{aliases:t}).type,h=d(a,{aliases:t}).type;return o.indexOf(f)-o.indexOf(h)}),s};var A="smart-registry",D="0.5.4";var O={name:"Neeraj Dalal",email:"admin@nrjdalal.com",url:"https://nrjdalal.com"};var I=`Version:
4
+ ${A}@${D}
5
5
 
6
6
  Usage:
7
7
  $ ${A} [options]
@@ -13,8 +13,8 @@ Options:
13
13
  -h, --help Display help
14
14
 
15
15
  Author:
16
- ${O.name} <${O.email}> (${O.url})`,L=r=>{try{return K(r)}catch(i){throw new Error(`Error parsing arguments: ${i.message}`)}},Q=async()=>{var r,i,t,n;try{let{positionals:s,values:e}=L({allowPositionals:!0,options:{files:{type:"string",multiple:!0,short:"f"},directories:{type:"string",multiple:!0,short:"d"},help:{type:"boolean",short:"h"},version:{type:"boolean",short:"v"}}});s.length||(e.version&&(console.log(`${A}@${W}`),process.exit(0)),e.help&&(console.log(I),process.exit(0)));let a={files:e.files||[],directories:e.directories||[]},o=await V(),f=await C();if(!a.files.length&&!a.directories.length){let l=["registry","components"].map(p=>o["@/"]+p).find(p=>f.some(b=>b.startsWith(p+"/")));if(l)a.directories.push(l);else throw new Error("Neither registry nor components directory found")}let h=[...a.files.map(l=>w(l,o)),...a.directories.flatMap(l=>f.filter(p=>p.startsWith(w(l,o)+"/")))],c=S.resolve(process.cwd(),"registry.json"),g={};j.existsSync(c)&&(g=JSON.parse(await j.promises.readFile(c,"utf8")));let u=P($({},g),{items:[]}),y=[];for(let l of h)try{let p=await N([l,...((t=(i=(r=g.items)==null?void 0:r.find(m=>m.name===d(l,{aliases:o}).name))==null?void 0:i.files)==null?void 0:t.map(m=>m.path))||[]],{aliases:o}),b=$(P($({$schema:"https://ui.shadcn.com/schema/registry-item.json",name:d(l,{aliases:o}).name,type:d(l,{aliases:o}).type||"registry:file"},p.dependencies.length&&{dependencies:p.dependencies}),{files:p.files.map(m=>({type:d(m,{aliases:o}).type||"registry:file",target:d(m,{aliases:o}).target||m,content:p.content[m],path:m}))}),Object.fromEntries(Object.entries(((n=g.items)==null?void 0:n.find(m=>m.name===d(l,{aliases:o}).name))||{}).filter(([m])=>!["$schema","name","type","files"].includes(m)))),E=S.resolve(process.cwd(),"public/r",b.name+".json");console.log(`- ${l.padEnd(Math.max(...h.map(m=>m.length))+2," ")} ${p.dependencies.length?"\u{1F4E6}"+String(p.dependencies.length).padEnd(2," "):" "} ${p.files.length-1?"\u{1F4C4}"+String(p.files.length).padEnd(2," "):" "} ${E.replace(process.cwd()+"/","")}`),await j.promises.mkdir(S.dirname(E),{recursive:!0}),await j.promises.writeFile(E,JSON.stringify(b,null,2)+`
17
- `),b.files.forEach(m=>delete m.content),u.items.push(b)}catch(p){y.push(l+": "+p.message);continue}u.items.sort((l,p)=>l.name.localeCompare(p.name)),await j.promises.writeFile(S.resolve(process.cwd(),"public/registry.json"),JSON.stringify(u,null,2)+`
16
+ ${O.name} <${O.email}> (${O.url})`,L=r=>{try{return K(r)}catch(i){throw new Error(`Error parsing arguments: ${i.message}`)}},Q=async()=>{var r,i,t,n;try{let{positionals:s,values:e}=L({allowPositionals:!0,options:{files:{type:"string",multiple:!0,short:"f"},directories:{type:"string",multiple:!0,short:"d"},help:{type:"boolean",short:"h"},version:{type:"boolean",short:"v"}}});s.length||(e.version&&(console.log(`${A}@${D}`),process.exit(0)),e.help&&(console.log(I),process.exit(0)));let a={files:e.files||[],directories:e.directories||[]},o=await C(),f=await V();if(!a.files.length&&!a.directories.length){let l=["registry","components"].map(p=>o["@/"]+p).find(p=>f.some(b=>b.startsWith(p+"/")));if(l)a.directories.push(l);else throw new Error("Neither registry nor components directory found")}let h=[...a.files.map(l=>w(l,o)),...a.directories.flatMap(l=>f.filter(p=>p.startsWith(w(l,o)+"/")))],c=S.resolve(process.cwd(),"registry.json"),g={};v.existsSync(c)&&(g=JSON.parse(await v.promises.readFile(c,"utf8")));let u=E($({},g),{items:[]}),y=[];for(let l of h)try{let p=await N([l,...((t=(i=(r=g.items)==null?void 0:r.find(m=>m.name===d(l,{aliases:o}).name))==null?void 0:i.files)==null?void 0:t.map(m=>m.path))||[]],{aliases:o}),b=$(E($({$schema:"https://ui.shadcn.com/schema/registry-item.json",name:d(l,{aliases:o}).name,type:d(l,{aliases:o}).type||"registry:file"},p.dependencies.length&&{dependencies:p.dependencies}),{files:p.files.map(m=>({type:d(m,{aliases:o}).type||"registry:file",target:d(m,{aliases:o}).target||m,content:p.content[m],path:m}))}),Object.fromEntries(Object.entries(((n=g.items)==null?void 0:n.find(m=>m.name===d(l,{aliases:o}).name))||{}).filter(([m])=>!["$schema","name","type","files"].includes(m)))),P=S.resolve(process.cwd(),"public/r",b.name+".json");console.log(`- ${l.padEnd(Math.max(...h.map(m=>m.length))+2," ")} ${p.dependencies.length?"\u{1F4E6}"+String(p.dependencies.length).padEnd(2," "):" "} ${p.files.length-1?"\u{1F4C4}"+String(p.files.length).padEnd(2," "):" "} ${P.replace(process.cwd()+"/","")}`),await v.promises.mkdir(S.dirname(P),{recursive:!0}),await v.promises.writeFile(P,JSON.stringify(b,null,2)+`
17
+ `),b.files.forEach(m=>delete m.content),u.items.push(b)}catch(p){y.push(l+": "+p.message);continue}u.items.sort((l,p)=>l.name.localeCompare(p.name)),await v.promises.writeFile(S.resolve(process.cwd(),"public/registry.json"),JSON.stringify(u,null,2)+`
18
18
  `),y.length&&(console.log(),y.forEach(l=>console.error(`\x1B[31m- ${l}\x1B[0m`))),process.exit(0)}catch(s){console.error(I),console.error(`
19
19
  ${s.message}
20
20
  `),process.exit(1)}};Q();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "smart-registry",
3
- "version": "0.5.1",
3
+ "version": "0.5.4",
4
4
  "description": "A zero-configuration (no registry.json required), shadcn add / open in v0 compatible registry builder.",
5
5
  "keywords": [
6
6
  "smart-registry"