smart-registry 0.17.1 → 0.17.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/README.md +9 -6
- package/dist/bin/index.js +15 -12
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -117,19 +117,22 @@ If you want, you can customize the output directory, working directory, and prov
|
|
|
117
117
|
|
|
118
118
|
```plaintext
|
|
119
119
|
Version:
|
|
120
|
-
smart-registry@
|
|
120
|
+
smart-registry@0.17.2
|
|
121
121
|
|
|
122
122
|
Usage:
|
|
123
123
|
$ smart-registry [files/directories] ... [options]
|
|
124
124
|
|
|
125
125
|
Arguments:
|
|
126
|
-
files/directories
|
|
126
|
+
files/directories files or directories to extend the registry (optional)
|
|
127
127
|
|
|
128
128
|
Options:
|
|
129
|
-
-o, --output <path>
|
|
130
|
-
-c, --cwd <cwd>
|
|
131
|
-
-
|
|
132
|
-
-
|
|
129
|
+
-o, --output <path> destination directory for json files (default: "./public/r")
|
|
130
|
+
-c, --cwd <cwd> the working directory (default: "./")
|
|
131
|
+
-i, --ignore <pattern> ignore files matching the pattern (default: none)
|
|
132
|
+
-p, --patterns-only generate registry items for only given files/directories (default: false)
|
|
133
|
+
--codemod-radix migrate to unify "@radix-ui/react-*" imports to "radix-ui"
|
|
134
|
+
-v, --version display version
|
|
135
|
+
-h, --help display help
|
|
133
136
|
|
|
134
137
|
Author:
|
|
135
138
|
Neeraj Dalal <admin@nrjdalal.com> (https://nrjdalal.com)
|
package/dist/bin/index.js
CHANGED
|
@@ -1,24 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var re=Object.defineProperty,se=Object.defineProperties;var ie=Object.getOwnPropertyDescriptors;var M=Object.getOwnPropertySymbols;var ne=Object.prototype.hasOwnProperty,oe=Object.prototype.propertyIsEnumerable;var z=(s,t,r)=>t in s?re(s,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):s[t]=r,h=(s,t)=>{for(var r in t||(t={}))ne.call(t,r)&&z(s,r,t[r]);if(M)for(var r of M(t))oe.call(t,r)&&z(s,r,t[r]);return s},P=(s,t)=>se(s,ie(t));import I from"node:fs";import x from"node:path";import{parseArgs as he}from"node:util";import $,{existsSync as C}from"node:fs";import{readFile as pe}from"node:fs/promises";import W from"node:path";import{detect as ae}from"@antfu/ni";async function B(s,{withFallback:t}={withFallback:!1}){let r=await ae({programmatic:!0,cwd:s});if(r==="yarn@berry")return"yarn";if(r==="pnpm@6")return"pnpm";if(r==="bun")return"bun";if(r==="deno")return"deno";if(!t)return r!=null?r:"npm";let
|
|
3
|
-
`).filter(a=>a.trim()&&!a.startsWith("#")).map(a=>a.replace(/^\//,"").replace(/^/,"**/")):[],
|
|
4
|
-
Codemod ran successfully. Please run the command again without the --codemod-radix flag to generate the registry.`)};var L=["registry/**",["blocks/**","components/**","helpers/**","hooks/**","lib/**","ui/**","utils/**"],["src/blocks/**","src/components/**","src/helpers/**","src/hooks/**","src/lib/**","src/ui/**","src/utils/**"]],S={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 A from"node:fs";import E from"node:path";import le from"strip-json-comments";var T=async s=>{let t={},r=["tsconfig.json","jsconfig.json"].find(
|
|
2
|
+
var re=Object.defineProperty,se=Object.defineProperties;var ie=Object.getOwnPropertyDescriptors;var M=Object.getOwnPropertySymbols;var ne=Object.prototype.hasOwnProperty,oe=Object.prototype.propertyIsEnumerable;var z=(s,t,r)=>t in s?re(s,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):s[t]=r,h=(s,t)=>{for(var r in t||(t={}))ne.call(t,r)&&z(s,r,t[r]);if(M)for(var r of M(t))oe.call(t,r)&&z(s,r,t[r]);return s},P=(s,t)=>se(s,ie(t));import I from"node:fs";import x from"node:path";import{parseArgs as he}from"node:util";import $,{existsSync as C}from"node:fs";import{readFile as pe}from"node:fs/promises";import W from"node:path";import{detect as ae}from"@antfu/ni";async function B(s,{withFallback:t}={withFallback:!1}){let r=await ae({programmatic:!0,cwd:s});if(r==="yarn@berry")return"yarn";if(r==="pnpm@6")return"pnpm";if(r==="bun")return"bun";if(r==="deno")return"deno";if(!t)return r!=null?r:"npm";let n=process.env.npm_config_user_agent||"";return n.startsWith("yarn")?"yarn":n.startsWith("pnpm")?"pnpm":n.startsWith("bun")?"bun":"npm"}import{execa as V}from"execa";import{glob as ce}from"tinyglobby";var q=async({cwd:s})=>{let t=W.resolve(s,".gitignore"),r=C(t)?(await pe(t,"utf8")).split(`
|
|
3
|
+
`).filter(a=>a.trim()&&!a.startsWith("#")).map(a=>a.replace(/^\//,"").replace(/^/,"**/")):[],n=await ce(["**/*.ts","**/*.tsx","**/*.js","**/*.jsx"],{cwd:s,ignore:r}),e=new Set,i=n.map(async a=>{let f=W.resolve(s,a),l=await $.promises.readFile(f,"utf-8"),p=l.replace(/import \* as (\w+Primitive) from "@radix-ui\/react-([\w-]+)"/g,(m,g,u)=>(e.add(`@radix-ui/react-${u}`),`import { ${g.replace("Primitive","")} as ${g} } 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(l)&&(p=p.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")),$.promises.writeFile(f,p,"utf-8")});await Promise.all(i);let o=W.resolve(s,"registry.json");if(C(o)){let a=await $.promises.readFile(o,"utf-8"),f=JSON.parse(a),l=m=>{for(let g in m)g==="dependencies"||g==="devDependencies"?m[g]=Array.from(new Set(m[g].map(u=>e.has(u)?"radix-ui":u))):typeof m[g]=="object"&&m[g]!==null&&l(m[g])};l(f);let p=JSON.stringify(f,null,2);await $.promises.writeFile(o,p,"utf-8")}let c=await B(s);e.size&&await V(c,[c==="npm"?"uninstall":"remove",...Array.from(e)],{cwd:s}),await V(c,[c==="npm"?"install":"add","radix-ui"],{cwd:s}),console.log(`
|
|
4
|
+
Codemod ran successfully. Please run the command again without the --codemod-radix flag to generate the registry.`)};var L=["registry/**",["blocks/**","components/**","helpers/**","hooks/**","lib/**","ui/**","utils/**"],["src/blocks/**","src/components/**","src/helpers/**","src/hooks/**","src/lib/**","src/ui/**","src/utils/**"]],S={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 A from"node:fs";import E from"node:path";import le from"strip-json-comments";var T=async s=>{let t={},r=["tsconfig.json","jsconfig.json"].find(n=>A.existsSync(E.resolve(s,n)));if(r){let n=await A.promises.readFile(E.resolve(s,r),"utf8"),{compilerOptions:e}=JSON.parse(le(n,{trailingCommas:!0}));e.paths&&(t=Object.entries(e.paths).reduce((i,[o,[c]])=>(o.endsWith("*")&&c.endsWith("*")&&(i[o.replace(/\*$/,"")]=c.replace(/\*$/,"")),i),{}))}return t["@/"]||(t["@/"]=A.existsSync(E.resolve(s,"src"))?"./src/":"./"),t=Object.entries(t).sort(([n],[e])=>e.length-n.length).reduce((n,[e,i])=>(n[e]=i,n),{}),t};import U from"node:fs";import me from"node:path";var G=async s=>{let t=me.resolve(s,"registry.json"),r={$schema:"https://ui.shadcn.com/schema/registry.json",name:"nrjdalal",homepage:"https://nrjdalal.com",items:[]};return U.existsSync(t)&&(r=h({},JSON.parse(await U.promises.readFile(t,"utf8")))),r};import H from"node:fs";import K from"node:path";import{glob as de}from"tinyglobby";var w=async({cwd:s,patterns:t=["**",".**"],ignore:r=[]})=>{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),r=typeof r=="string"?r.split(",").map(e=>e.trim()):r,r=r.filter(Boolean);let n=await de(t,{cwd:s,ignore:r.filter(e=>!t.includes(e))});for(let e of t)if(!n.includes(e)&&!e.endsWith("**")&&!e.endsWith(".**"))try{let i=K.resolve(s,e),o=await H.promises.stat(i);if(o.isDirectory()){let c=(await H.promises.readdir(i)).map(a=>K.resolve(e,a));n.push(...c)}else o.isFile()&&n.push(e)}catch(i){continue}return[...new Set(n)]};var Q=async({cwd:s,patterns:t,ignore:r,patternsOnly:n})=>{let e=[];if(!n){for(let i of L)if(e=await w({cwd:s,patterns:i,ignore:r}),e.length)break}if(t.length&&(e=e.concat(await w({cwd:s,patterns:t,ignore:r}))),!e.length)throw new Error("No files/directories found to build the registry from!");return e};import X from"node:fs";import Y from"node:path";var j={imports:/import\s+type\s+[\s\S]+?from\s+['"][^'"]+['"]|import\s+['"][^'"]+['"]|import\s+[\s\S]+?from\s+['"][^'"]+['"]/g};var J=async({cwd:s,aliases:t,filepaths:r,resolved:n})=>{n=n!=null?n:new Set;let e={dependencies:[],devDependencies:[],files:[],content:{}};for(let i of r){if(n.has(i))continue;n.add(i),e.files.push(i),e.content[i]||(e.content[i]=await X.promises.readFile(Y.resolve(s,i),"utf8"));let{dependencies:o,devDependencies:c,files:a,transformations:f}=await Z({cwd:s,aliases:t,filepath:i,content:e.content[i]});e.content[i]=e.content[i].replace(j.imports,l=>{let p=l.match(/['"](.*)['"]/);return p&&f[p[1]]?l.replace(p[1],f[p[1]].import):l}),a.forEach(l=>e.files.push(l)),o.forEach(l=>e.dependencies.push(l)),c.forEach(l=>e.devDependencies.push(l))}for(let i of e.files){let{dependencies:o,devDependencies:c,files:a,content:f}=await J({cwd:s,aliases:t,filepaths:[i],resolved:n});e.content[i]||(e.content[i]=f[i]||await X.promises.readFile(Y.resolve(s,i),"utf8")),a.forEach(l=>e.files.push(l)),o.forEach(l=>e.dependencies.push(l)),c.forEach(l=>e.devDependencies.push(l))}return e.dependencies=[...new Set(e.dependencies)].sort(),e.devDependencies=[...new Set(e.devDependencies)].sort(),e.files=[...new Set(e.files)].sort(),e};import ee from"node:fs";import D from"node:path";import ge from"node:path";var y=({cwd:s,aliases:t,filepath:r})=>{var o;let n=r;for(let c in t)r=r.replace(t[c].replaceAll("./","").replaceAll("../",""),"");let e=r.startsWith("registry/")?r.replace(/^registry\//,"").replace(/^(?:([^\/]*)\/)?blocks\//,(c,a)=>`blocks/${a?a+"/":""}`).replace(/^(?:([^\/]*)\/)?charts\//,(c,a)=>`charts/${a?a+"/":""}`).replace(/^(?:([^\/]*)\/)?components\/ui\//,(c,a)=>`${a?a+"/":""}ui/`).replace(/^(?:([^\/]*)\/)?components\//,(c,a)=>`components/${a?a+"/":""}`).replace(/^(?:([^\/]*)\/)?hooks\//,(c,a)=>`hooks/${a?a+"/":""}`).replace(/^(?:([^\/]*)\/)?lib\//,(c,a)=>`lib/${a?a+"/":""}`).replace(/^(?:([^\/]*)\/)?ui\//,(c,a)=>`components/ui/${a?a+"/":""}`).replace(/\/default\//,"/").replace(/^default\//,"").replace(/\.\.\//g,"").replace(/\.\//g,"").replace(/^charts\//,"components/charts/"):r.replace(/\/default\//,"/").replace(/^default\//,"").replace(/\.\.\//g,"").replace(/\.\//g,""),i=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":((o=e.match(/^(blocks|components\/charts|components\/ui|components|hooks|lib|utils|helpers)/))==null?void 0:o[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:i,import:"@/"+e.replace(s+ge.sep,"").replace(/\.[^/.]+$/,"").replace(/\/index$/,""),target:n.split("/").length>1?e:`~/${e}`,path:r}};var fe=async({cwd:s,current:t,aliases:r})=>{t=t.replace(new RegExp(`^${Object.keys(r).find(e=>t.startsWith(e.replace(/\.\//g,"").replace(/\.\.\//g,"")))}`),r[Object.keys(r).find(e=>t.startsWith(e.replace(/\.\//g,"").replace(/\.\.\//g,"")))]),t=t.replace(/\.\//g,"").replace(/\.\.\//g,"");let n=await w({cwd:s,patterns:t});return t=n.find(e=>e.startsWith(t+"."))||n.find(e=>e.startsWith(t+"/index"))||t,t.replace(s+"/","")},ue=async({cwd:s,filepath:t,current:r})=>{r=D.relative(s,D.resolve(s,D.dirname(t),r));let n=await w({cwd:s,patterns:r});return r=n.find(e=>e.startsWith(r+"."))||n.find(e=>e.startsWith(r+"/index"))||r,r.replace(s+"/","")},Z=async({cwd:s,aliases:t,filepath:r,content:n})=>{let e={dependencies:[],devDependencies:[],files:[],transformations:{}},i=n.match(j.imports)||[];if(!i.length)return e;i=i.map(o=>{var c;return(c=o.match(/['"](.*)['"]/))==null?void 0:c[1].replace(/\/\//g,"/")});for(let o of i){let c=o;if(Object.keys(t).some(f=>o.startsWith(f.replace(/\.\//g,"").replace(/\.\.\//g,""))))o=await fe({cwd:s,aliases:t,current:o}),e.transformations[c]=y({cwd:s,aliases:t,filepath:o}),e.files.push(o);else if(o.startsWith("."))o=await ue({cwd:s,filepath:r,current:o}),e.transformations[c]=y({cwd:s,aliases:t,filepath:o}),e.files.push(o);else{let f=D.resolve(s,"package.json"),l={};if(ee.existsSync(f)){let p=JSON.parse(await ee.promises.readFile(f,"utf8"));l=h({},p.devDependencies)}if(o.startsWith("@")){let p=o.split("/").slice(0,2).join("/");l[p]?e.devDependencies.push(p):e.dependencies.push(p)}else{let p=o.split("/")[0];l[p]?e.devDependencies.push(p):e.dependencies.push(p)}}}return e};var R="smart-registry",N="0.17.3";var F={name:"Neeraj Dalal",email:"admin@nrjdalal.com",url:"https://nrjdalal.com"};var te=`Version:
|
|
5
5
|
${R}@${N}
|
|
6
6
|
|
|
7
7
|
Usage:
|
|
8
8
|
$ ${R} [files/directories] ... [options]
|
|
9
9
|
|
|
10
10
|
Arguments:
|
|
11
|
-
files/directories
|
|
11
|
+
files/directories files or directories to extend the registry (optional)
|
|
12
12
|
|
|
13
13
|
Options:
|
|
14
|
-
-o, --output <path>
|
|
15
|
-
-c, --cwd <cwd>
|
|
16
|
-
-
|
|
17
|
-
-
|
|
14
|
+
-o, --output <path> destination directory for json files (default: "./public/r")
|
|
15
|
+
-c, --cwd <cwd> the working directory (default: "./")
|
|
16
|
+
-i, --ignore <pattern> ignore files matching the pattern (default: none)
|
|
17
|
+
-p, --patterns-only generate registry items for only given files/directories (default: false)
|
|
18
|
+
--codemod-radix migrate to unify "@radix-ui/react-*" imports to "radix-ui"
|
|
19
|
+
-v, --version display version
|
|
20
|
+
-h, --help display help
|
|
18
21
|
|
|
19
22
|
Author:
|
|
20
|
-
${F.name} <${F.email}> (${F.url})`,ye=s=>{try{return he(s)}catch(t){throw new Error(`Error parsing arguments: ${t.message}`)}},xe=async()=>{var s,t,r;try{let{positionals:
|
|
21
|
-
`),v.files.forEach(d=>delete d.content),l.items.push(v)}catch(m){f.push(p+": "+m.message);continue}l.items.sort((p,m)=>p.name.localeCompare(m.name)).sort((p,m)=>{let g=S.items.type.default;return g.indexOf(p.type)-g.indexOf(m.type)}),await I.promises.writeFile(x.resolve(
|
|
22
|
-
`),f.length&&(console.log(),f.forEach(p=>console.error(`\x1B[31m- ${p}\x1B[0m`))),process.exit(0)}catch(
|
|
23
|
-
${
|
|
23
|
+
${F.name} <${F.email}> (${F.url})`,ye=s=>{try{return he(s)}catch(t){throw new Error(`Error parsing arguments: ${t.message}`)}},xe=async()=>{var s,t,r;try{let{positionals:n,values:e}=ye({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},"codemod-radix":{type:"boolean"},help:{type:"boolean",short:"h"},version:{type:"boolean",short:"v"}}});n.length||(e.version&&(console.log(`${R}@${N}`),process.exit(0)),e.help&&(console.log(te),process.exit(0)));let i=x.resolve((s=e.cwd)!=null?s:process.cwd());e["codemod-radix"]&&(await q({cwd:i}),process.exit(0));let o=await T(i),c=await G(i),a=await Q({cwd:i,patterns:n,ignore:e.ignore,patternsOnly:e["patterns-only"]}),f=[],l=P(h({},c),{items:[]});for(let p of a)try{let m=((t=c.items)==null?void 0:t.find(d=>d.name===y({cwd:i,aliases:o,filepath:p}).name))||{},g=await J({cwd:i,aliases:o,filepaths:[p,...((r=m==null?void 0:m.files)==null?void 0:r.map(d=>d.path))||[]]}),u={dependencies:[...new Set([...g.dependencies,...(m==null?void 0:m.dependencies)||[]])].sort(),devDependencies:[...new Set([...g.devDependencies,...(m==null?void 0:m.devDependencies)||[]])].sort(),registryDependencies:[...new Set([...(m==null?void 0:m.registryDependencies)||[]])].sort()},v=h(P(h(h(h({$schema:"https://ui.shadcn.com/schema/registry-item.json",name:y({cwd:i,aliases:o,filepath:p}).name,type:y({cwd:i,aliases:o,filepath:p}).type||"registry:file"},u.dependencies.length&&{dependencies:u.dependencies}),u.devDependencies.length&&{devDependencies:u.devDependencies}),u.registryDependencies.length&&{registryDependencies:u.registryDependencies}),{files:g.files.map(d=>({type:y({cwd:i,aliases:o,filepath:d}).type||"registry:file",target:y({cwd:i,aliases:o,filepath:d}).target||d,content:g.content[d],path:d})).sort((d,b)=>{if(d.path===p)return-1;if(b.path===p)return 1;let k=S.items.files.type.default;return k.indexOf(d.type)-k.indexOf(b.type)})}),Object.fromEntries(Object.entries(m).filter(([d])=>!["$schema","name","type","dependencies","devDependencies","registryDependencies","files"].includes(d))));v=Object.keys(v).sort((d,b)=>{let k=S.items.default;return k.indexOf(d)-k.indexOf(b)}).reduce((d,b)=>(d[b]=v[b],d),{});let O=x.resolve(i,e.output,v.name+".json");console.log(`- ${x.relative(process.cwd(),x.resolve(i,p)).padEnd(Math.max(...a.map(d=>x.relative(process.cwd(),x.resolve(i,d)).length))+2," ")} ${g.dependencies.length?"\u{1F4E6}"+String(g.dependencies.length).padEnd(2," "):" "} ${g.files.length-1?"\u{1F4C4}"+String(g.files.length).padEnd(2," "):" "} ${x.relative(process.cwd(),O)}`),await I.promises.mkdir(x.dirname(O),{recursive:!0}),await I.promises.writeFile(O,JSON.stringify(v,null,2)+`
|
|
24
|
+
`),v.files.forEach(d=>delete d.content),l.items.push(v)}catch(m){f.push(p+": "+m.message);continue}l.items.sort((p,m)=>p.name.localeCompare(m.name)).sort((p,m)=>{let g=S.items.type.default;return g.indexOf(p.type)-g.indexOf(m.type)}),await I.promises.writeFile(x.resolve(i,e.output,"registry.json"),JSON.stringify(l,null,2)+`
|
|
25
|
+
`),f.length&&(console.log(),f.forEach(p=>console.error(`\x1B[31m- ${p}\x1B[0m`))),process.exit(0)}catch(n){console.error(te),console.error(`
|
|
26
|
+
${n.message}
|
|
24
27
|
`),process.exit(1)}};xe();
|