smart-registry 0.25.0 → 0.27.0
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 +6 -2
- package/dist/bin/index.js +10 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,7 +13,9 @@ A `zero-configuration` (no registry.json required), [shadcn add](https://ui.shad
|
|
|
13
13
|
|
|
14
14
|
## What is Zero-Configuration?
|
|
15
15
|
|
|
16
|
-
Simplify your `registry.json` by removing properties like `
|
|
16
|
+
Simplify your `registry.json` by removing properties like `dependencies`, `devDependencies`, `registryDependencies`, and `files`.
|
|
17
|
+
|
|
18
|
+
If you don't need to add custom properties or extend default ones, you can even delete the `registry.json` file entirely.
|
|
17
19
|
|
|
18
20
|
```diff
|
|
19
21
|
{
|
|
@@ -103,7 +105,9 @@ Manual maintenance of `registry.json` files can lead to errors due to missing de
|
|
|
103
105
|
|
|
104
106
|
### Automatic Detection
|
|
105
107
|
|
|
106
|
-
If your project contains a `registry`, `components`, or `src/components` directory, `Smart Registry` will automatically detect and generate the necessary registry files.
|
|
108
|
+
If your project contains a `registry`, `components`, or `src/components` directory, `Smart Registry` will automatically detect and generate the necessary registry files.
|
|
109
|
+
|
|
110
|
+
For more details, refer to the [directory structure](#directory-structure) section.
|
|
107
111
|
|
|
108
112
|
```bash
|
|
109
113
|
npx smart-registry
|
package/dist/bin/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`).filter(p=>p.trim()&&!p.startsWith("#")).map(p=>p.replace(/^\//,"").replace(/^/,"**/")):[],o=await
|
|
4
|
-
Codemod ran successfully. Please run the command again without the --codemod-radix flag to generate the registry.`)};var
|
|
5
|
-
${
|
|
2
|
+
var oe=Object.defineProperty,ae=Object.defineProperties;var pe=Object.getOwnPropertyDescriptors;var V=Object.getOwnPropertySymbols;var le=Object.prototype.hasOwnProperty,ce=Object.prototype.propertyIsEnumerable;var q=(r,t,s)=>t in r?oe(r,t,{enumerable:!0,configurable:!0,writable:!0,value:s}):r[t]=s,$=(r,t)=>{for(var s in t||(t={}))le.call(t,s)&&q(r,s,t[s]);if(V)for(var s of V(t))ce.call(t,s)&&q(r,s,t[s]);return r},_=(r,t)=>ae(r,pe(t));import B from"node:fs";import w from"node:path";import{parseArgs as be}from"node:util";import F,{existsSync as T}from"node:fs";import{readFile as ge}from"node:fs/promises";import J from"node:path";import{detect as me}from"@antfu/ni";async function L(r,{withFallback:t}={withFallback:!1}){let s=await me({programmatic:!0,cwd:r});if(s==="yarn@berry")return"yarn";if(s==="pnpm@6")return"pnpm";if(s==="bun")return"bun";if(s==="deno")return"deno";if(!t)return s!=null?s:"npm";let o=process.env.npm_config_user_agent||"";return o.startsWith("yarn")?"yarn":o.startsWith("pnpm")?"pnpm":o.startsWith("bun")?"bun":"npm"}import{execa as U}from"execa";import{glob as de}from"tinyglobby";var G=async({cwd:r})=>{let t=J.resolve(r,".gitignore"),s=T(t)?(await ge(t,"utf8")).split(`
|
|
3
|
+
`).filter(p=>p.trim()&&!p.startsWith("#")).map(p=>p.replace(/^\//,"").replace(/^/,"**/")):[],o=await de(["**/*.ts","**/*.tsx","**/*.js","**/*.jsx"],{cwd:r,ignore:s}),e=new Set,n=o.map(async p=>{let d=J.resolve(r,p),c=await F.promises.readFile(d,"utf-8"),g=c.replace(/import \* as (\w+Primitive) from "@radix-ui\/react-([\w-]+)"/g,(k,u,m)=>(e.add(`@radix-ui/react-${m}`),`import { ${u.replace("Primitive","")} as ${u} } from "radix-ui"`)).replace(/Sheet\s+as\s+SheetPrimitive/g,"Dialog as SheetPrimitive");return/import\s+\{\s+Slot\s+\}\s+from\s+"@radix-ui\/react-slot"/.test(c)&&(g=g.replace(/import\s+\{\s+Slot\s+\}\s+from\s+"@radix-ui\/react-slot"/,()=>(e.add("@radix-ui/react-slot"),"import { Slot as SlotPrimitive } from 'radix-ui'")).replace(/typeof\s+Slot\b/g,"typeof SlotPrimitive.Slot").replace(/\?\s+Slot\s+:/g,"? SlotPrimitive.Slot :").replace(/<Slot\b/g,"<SlotPrimitive.Slot")),F.promises.writeFile(d,g,"utf-8")});await Promise.all(n);let i=J.resolve(r,"registry.json");if(T(i)){let p=await F.promises.readFile(i,"utf-8"),d=JSON.parse(p),c=k=>{for(let u in k)u==="dependencies"||u==="devDependencies"?k[u]=Array.from(new Set(k[u].map(m=>e.has(m)?"radix-ui":m))):typeof k[u]=="object"&&k[u]!==null&&c(k[u])};c(d);let g=JSON.stringify(d,null,2);await F.promises.writeFile(i,g,"utf-8")}let a=await L(r);e.size&&await U(a,[a==="npm"?"uninstall":"remove",...Array.from(e)],{cwd:r}),await U(a,[a==="npm"?"install":"add","radix-ui"],{cwd:r}),console.log(`
|
|
4
|
+
Codemod ran successfully. Please run the command again without the --codemod-radix flag to generate the registry.`)};var H=["registry/**",["blocks/**","components/**","helpers/**","hooks/**","lib/**","ui/**","utils/**"],["src/blocks/**","src/components/**","src/helpers/**","src/hooks/**","src/lib/**","src/ui/**","src/utils/**"]],D={default:["$schema","name","homepage","items"],items:{default:["$schema","name","type","description","title","author","dependencies","devDependencies","registryDependencies","files","tailwind","cssVars","meta","docs","categories"],type:{default:["registry:ui","registry:hook","registry:lib","registry:theme","registry:page","registry:file","registry:component","registry:block"]},files:{default:["type","target","content","path"],type:{default:["registry:block","registry:component","registry:file","registry:page","registry:theme","registry:lib","registry:hook","registry:ui"]}}}};import N from"node:fs";import I from"node:path";import fe from"strip-json-comments";var K=async r=>{let t={},s=["tsconfig.json","jsconfig.json"].find(o=>N.existsSync(I.resolve(r,o)));if(s){let o=await N.promises.readFile(I.resolve(r,s),"utf8"),{compilerOptions:e}=JSON.parse(fe(o,{trailingCommas:!0}));e.paths&&(t=Object.entries(e.paths).reduce((n,[i,[a]])=>(i.endsWith("*")&&a.endsWith("*")&&(n[i.replace(/\*$/,"")]=a.replace(/\*$/,"")),n),{}))}return t["@/"]||(t["@/"]=N.existsSync(I.resolve(r,"src"))?"./src/":"./"),t=Object.entries(t).sort(([o],[e])=>e.length-o.length).reduce((o,[e,n])=>(o[e]=n,o),{}),t};import Q from"node:fs";import he from"node:path";import ue from"node:path";var x=({cwd:r,aliases:t,filepath:s})=>{var i;let o=s;for(let a in t)s=s.replace(t[a].replaceAll("./","").replaceAll("../",""),"");let e=s.startsWith("registry/")?s.replace(/^registry\//,"").replace(/^(?:([^\/]*)\/)?blocks\//,(a,p)=>`blocks/${p?p+"/":""}`).replace(/^(?:([^\/]*)\/)?charts\//,(a,p)=>`charts/${p?p+"/":""}`).replace(/^(?:([^\/]*)\/)?components\/ui\//,(a,p)=>`${p?p+"/":""}ui/`).replace(/^(?:([^\/]*)\/)?components\//,(a,p)=>`components/${p?p+"/":""}`).replace(/^(?:([^\/]*)\/)?hooks\//,(a,p)=>`hooks/${p?p+"/":""}`).replace(/^(?:([^\/]*)\/)?lib\//,(a,p)=>`lib/${p?p+"/":""}`).replace(/^(?:([^\/]*)\/)?ui\//,(a,p)=>`components/ui/${p?p+"/":""}`).replace(/\/default\//,"/").replace(/^default\//,"").replace(/\.\.\//g,"").replace(/\.\//g,"").replace(/^charts\//,"components/charts/"):s.replace(/\/default\//,"/").replace(/^default\//,"").replace(/\.\.\//g,"").replace(/\.\//g,""),n=e.toLowerCase().replace(/^(blocks|components\/charts|components\/ui|components|hooks|lib|utils|helpers)\//,"").replace(/\/(blocks|components\/charts|components\/ui|components|hooks|lib|utils|helpers)\//,"/").replace(/\.[^\/.]+$/,"").replace(/\/index$/,"").replace(/\/page$/,"").replace(/\/route$/,"").replace(/\/\[.*\]$/,"").replace(/(\b\w+)\b\/\1\b/g,"$1").replace(/\//g,"-");return{type:e.endsWith("page.tsx")?"registry:page":((i=e.match(/^(blocks|components\/charts|components\/ui|components|hooks|lib|utils|helpers)/))==null?void 0:i[1].replace("blocks","registry:block").replace("components/charts","registry:component").replace("components/ui","registry:ui").replace("components","registry:component").replace("hooks","registry:hook").replace("lib","registry:lib").replace("utils","registry:lib").replace("helpers","registry:lib"))||"registry:file",name:n,import:"@/"+e.replace(r+ue.sep,"").replace(/\.[^/.]+$/,"").replace(/\/index$/,""),target:o.split("/").length>1?e:`~/${e}`,path:s}};var X=async({cwd:r,aliases:t,registryFiles:s})=>{let o=he.resolve(r,"registry.json"),e={$schema:"https://ui.shadcn.com/schema/registry.json",name:"nrjdalal",homepage:"https://nrjdalal.com",items:[]};Q.existsSync(o)&&(e=$({},JSON.parse(await Q.promises.readFile(o,"utf8"))));let n=[];for(let i of s)x({cwd:r,aliases:t,filepath:i}).type==="registry:ui"&&n.push({type:"registry:ui",path:i});return n.length&&e.items.push({name:"ui",type:"registry:ui",files:n}),e};import Y from"node:fs";import Z from"node:path";import{glob as ye}from"tinyglobby";var j=async({cwd:r,patterns:t=["**",".**"],ignore:s=[]})=>{t=Array.isArray(t)?t:[t],t=t.map(e=>e.replace(/^'|'$/g,"").replace(/^"|"$/g,"").trim()),t=[...t,...t.flatMap(e=>e.includes("*")?[]:[e+".**",e+"**"])],t=t.filter(Boolean),s=typeof s=="string"?s.split(",").map(e=>e.trim()):s,s=s.filter(Boolean);let o=await ye(t,{cwd:r,ignore:s.filter(e=>!t.includes(e))});for(let e of t)if(!o.includes(e)&&!e.endsWith("**")&&!e.endsWith(".**"))try{let n=Z.resolve(r,e),i=await Y.promises.stat(n);if(i.isDirectory()){let a=(await Y.promises.readdir(n)).map(p=>Z.resolve(e,p));o.push(...a)}else i.isFile()&&o.push(e)}catch(n){continue}return[...new Set(o)]};var ee=async({cwd:r,patterns:t,ignore:s,patternsOnly:o})=>{let e=[];if(!o){for(let n of H)if(e=await j({cwd:r,patterns:n,ignore:s}),e.length)break}if(t.length&&(e=e.concat(await j({cwd:r,patterns:t,ignore:s}))),!e.length)throw new Error("No files/directories found to build the registry from!");return e=e.sort((n,i)=>n.localeCompare(i,void 0,{numeric:!0,sensitivity:"base"})),e};import te from"node:fs";import se from"node:path";var O={imports:/import\s+type\s+[\s\S]+?from\s+['"][^'"]+['"]|import\s+['"][^'"]+['"]|import\s+[\s\S]+?from\s+['"][^'"]+['"]/g};var M=async({cwd:r,aliases:t,filepaths:s,resolved:o})=>{o=o!=null?o:new Set;let e={dependencies:[],devDependencies:[],files:[],content:{}};for(let n of s){if(o.has(n))continue;o.add(n),e.files.push(n),e.content[n]||(e.content[n]=await te.promises.readFile(se.resolve(r,n),"utf8"));let{dependencies:i,devDependencies:a,files:p,transformations:d}=await re({cwd:r,aliases:t,filepath:n,content:e.content[n]});e.content[n]=e.content[n].replace(O.imports,c=>{let g=c.match(/['"](.*)['"]/);return g&&d[g[1]]?c.replace(g[1],d[g[1]].import):c}),p.forEach(c=>e.files.push(c)),i.forEach(c=>e.dependencies.push(c)),a.forEach(c=>e.devDependencies.push(c))}for(let n of e.files){let{dependencies:i,devDependencies:a,files:p,content:d}=await M({cwd:r,aliases:t,filepaths:[n],resolved:o});e.content[n]||(e.content[n]=d[n]||await te.promises.readFile(se.resolve(r,n),"utf8")),p.forEach(c=>e.files.push(c)),i.forEach(c=>e.dependencies.push(c)),a.forEach(c=>e.devDependencies.push(c))}return e.dependencies=[...new Set(e.dependencies)].sort(),e.devDependencies=[...new Set(e.devDependencies)].sort(),e.files=[...new Set(e.files)].sort(),e};import ie from"node:fs";import P from"node:path";var xe=async({cwd:r,current:t,aliases:s})=>{t=t.replace(new RegExp(`^${Object.keys(s).find(e=>t.startsWith(e.replace(/\.\//g,"").replace(/\.\.\//g,"")))}`),s[Object.keys(s).find(e=>t.startsWith(e.replace(/\.\//g,"").replace(/\.\.\//g,"")))]),t=t.replace(/\.\//g,"").replace(/\.\.\//g,"");let o=await j({cwd:r,patterns:t});return t=o.find(e=>e.startsWith(t+"."))||o.find(e=>e.startsWith(t+"/index"))||t,t.replace(r+"/","")},ve=async({cwd:r,filepath:t,current:s})=>{s=P.relative(r,P.resolve(r,P.dirname(t),s));let o=await j({cwd:r,patterns:s});return s=o.find(e=>e.startsWith(s+"."))||o.find(e=>e.startsWith(s+"/index"))||s,s.replace(r+"/","")},re=async({cwd:r,aliases:t,filepath:s,content:o})=>{let e={dependencies:[],devDependencies:[],files:[],transformations:{}},n=o.match(O.imports)||[];if(!n.length)return e;n=n.map(i=>{var a;return(a=i.match(/['"](.*)['"]/))==null?void 0:a[1].replace(/\/\//g,"/")});for(let i of n){let a=i;if(Object.keys(t).some(d=>i.startsWith(d.replace(/\.\//g,"").replace(/\.\.\//g,""))))i=await xe({cwd:r,aliases:t,current:i}),e.transformations[a]=x({cwd:r,aliases:t,filepath:i}),e.files.push(i);else if(i.startsWith("."))i=await ve({cwd:r,filepath:s,current:i}),e.transformations[a]=x({cwd:r,aliases:t,filepath:i}),e.files.push(i);else{let d=P.resolve(r,"package.json"),c={};if(ie.existsSync(d)){let g=JSON.parse(await ie.promises.readFile(d,"utf8"));c=$({},g.devDependencies)}if(i.startsWith("@")){let g=i.split("/").slice(0,2).join("/");c[g]?e.devDependencies.push(g):e.dependencies.push(g)}else{let g=i.split("/")[0];c[g]?e.devDependencies.push(g):e.dependencies.push(g)}}}return e};var W="smart-registry",z="0.27.0";var A={name:"Neeraj Dalal",email:"admin@nrjdalal.com",url:"https://nrjdalal.com"};var ne=`Version:
|
|
5
|
+
${W}@${z}
|
|
6
6
|
|
|
7
7
|
Usage:
|
|
8
|
-
$ ${
|
|
8
|
+
$ ${W} [files/directories] ... [options]
|
|
9
9
|
|
|
10
10
|
Arguments:
|
|
11
11
|
files/directories files or directories to extend the registry (optional)
|
|
@@ -25,9 +25,9 @@ Codemods:
|
|
|
25
25
|
--codemod-radix migrate to unify "@radix-ui/react-*" imports to "radix-ui"
|
|
26
26
|
|
|
27
27
|
Author:
|
|
28
|
-
${
|
|
29
|
-
- every 'registry:ui' component pack`.padEnd(Math.max(...d.map(
|
|
30
|
-
`),h.files.forEach(
|
|
31
|
-
`),g.length&&(console.log(),g.forEach(m=>console.error(`\x1B[31m- ${m}\x1B[0m`))),process.exit(0)}catch(n){console.error(
|
|
28
|
+
${A.name} <${A.email}> (${A.url})`,we=r=>{try{return be(r)}catch(t){throw new Error(`Error parsing arguments: ${t.message}`)}},ke=async()=>{var r,t,s,o,e;try{let{positionals:n,values:i}=we({allowPositionals:!0,options:{output:{type:"string",short:"o",default:"public/r"},cwd:{type:"string",short:"c"},ignore:{type:"string",short:"i",default:""},"patterns-only":{type:"boolean",short:"p",default:!1},"registry-only":{type:"boolean",short:"r",default:!1},"codemod-radix":{type:"boolean"},help:{type:"boolean",short:"h"},version:{type:"boolean",short:"v"}}});n.length||(i.version&&(console.log(`${W}@${z}`),process.exit(0)),i.help&&(console.log(ne),process.exit(0)));let a=w.resolve((r=i.cwd)!=null?r:process.cwd());i["codemod-radix"]&&(await G({cwd:a}),process.exit(0));let p=await K(a),d=i["registry-only"]?[]:await ee({cwd:a,patterns:n,ignore:i.ignore,patternsOnly:i["patterns-only"]}),c=await X({cwd:a,aliases:p,registryFiles:d}),g=[],k=((t=c.items)==null?void 0:t.map(m=>m.name))||[],u=_($({},c),{items:[]});for(let m of[...d,...k])try{if((s=u.items)!=null&&s.find(l=>l.name===m||l.name===x({cwd:a,aliases:p,filepath:m}).name))continue;let f=((o=c.items)==null?void 0:o.find(l=>l.name===m||l.name===x({cwd:a,aliases:p,filepath:m}).name))||{},v=await M({cwd:a,aliases:p,filepaths:[...k.includes(m)?[]:[m],...((e=f==null?void 0:f.files)==null?void 0:e.map(l=>l.path))||[]]}),S={dependencies:[...new Set([...v.dependencies,...(f==null?void 0:f.dependencies)||[]])].filter((l,b,y)=>!y.some(R=>R!==l&&R.startsWith(l+"@"))).sort(),devDependencies:[...new Set([...v.devDependencies,...(f==null?void 0:f.devDependencies)||[]])].filter((l,b,y)=>!y.some(R=>R!==l&&R.startsWith(l+"@"))).sort(),registryDependencies:[...new Set([...(f==null?void 0:f.registryDependencies)||[]])].sort()},h=$(_($($($({$schema:"https://ui.shadcn.com/schema/registry-item.json",name:x({cwd:a,aliases:p,filepath:m}).name,type:f.type||x({cwd:a,aliases:p,filepath:m}).type||"registry:file"},S.dependencies.length&&{dependencies:S.dependencies}),S.devDependencies.length&&{devDependencies:S.devDependencies}),S.registryDependencies.length&&{registryDependencies:S.registryDependencies}),{files:v.files.map(l=>({type:x({cwd:a,aliases:p,filepath:l}).type||"registry:file",target:x({cwd:a,aliases:p,filepath:l}).target||l,content:v.content[l],path:l}))}),Object.fromEntries(Object.entries(f).filter(([l])=>!["$schema","name","type","dependencies","devDependencies","registryDependencies","files"].includes(l))));h.files.length&&(h.files.some(l=>l.path===m)?h.files=h.files.sort((l,b)=>{if(l.path===m)return-1;if(b.path===m)return 1;let y=D.items.files.type.default;return y.indexOf(l.type)-y.indexOf(b.type)}):h.files=[h.files[0],...h.files.slice(1).sort((l,b)=>{let y=D.items.files.type.default;return y.indexOf(l.type)-y.indexOf(b.type)})]),h=Object.keys(h).sort((l,b)=>{let y=D.items.default;return y.indexOf(l)-y.indexOf(b)}).reduce((l,b)=>(l[b]=h[b],l),{});let E=w.resolve(a,i.output,h.name+".json");console.log(`${m==="ui"?`
|
|
29
|
+
- every 'registry:ui' component pack`.padEnd(Math.max(...d.map(l=>w.relative(process.cwd(),w.resolve(a,l)).length))+5," "):"- "+w.relative(process.cwd(),w.resolve(a,m)).padEnd(Math.max(...d.map(l=>w.relative(process.cwd(),w.resolve(a,l)).length))+2," ")} ${v.dependencies.length?"\u{1F4E6}"+String(v.dependencies.length).padEnd(2," "):" "} ${v.files.length-1?"\u{1F4C4}"+String(v.files.length).padEnd(2," "):" "} ${w.relative(process.cwd(),E)}`),await B.promises.mkdir(w.dirname(E),{recursive:!0}),await B.promises.writeFile(E,JSON.stringify(h,null,2)+`
|
|
30
|
+
`),h.files.forEach(l=>delete l.content),u.items.push(h)}catch(f){g.push(m+": "+f.message);continue}u.items.sort((m,f)=>m.name.localeCompare(f.name)).sort((m,f)=>{let v=D.items.type.default;return v.indexOf(m.type)-v.indexOf(f.type)}),await B.promises.writeFile(w.resolve(a,i.output,"registry.json"),JSON.stringify(u,null,2)+`
|
|
31
|
+
`),g.length&&(console.log(),g.forEach(m=>console.error(`\x1B[31m- ${m}\x1B[0m`))),process.exit(0)}catch(n){console.error(ne),console.error(`
|
|
32
32
|
${n.message}
|
|
33
|
-
`),process.exit(1)}};
|
|
33
|
+
`),process.exit(1)}};ke();
|