regpick 0.9.1 → 0.9.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/add-DdKm2Ifq.mjs +1 -0
- package/dist/index.mjs +1 -1
- package/dist/{list-CizDH9jF.mjs → list-vvmSIn82.mjs} +1 -1
- package/dist/pack-Xnel4K2o.mjs +1 -0
- package/dist/registry-CzJU-6q5.mjs +1 -0
- package/dist/update-CBBNRAJE.mjs +2 -0
- package/package.json +1 -1
- package/dist/add-CgdSjgD2.mjs +0 -1
- package/dist/pack-C5oJjxLv.mjs +0 -1
- package/dist/registry-1NeuOcNL.mjs +0 -1
- package/dist/update-B8qIlN-C.mjs +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import{i as r,r as i}from"./config-BadTCZSR.mjs";import{n as a,t as o}from"./registry-CzJU-6q5.mjs";import s from"node:path";import*as c from"valibot";import l from"node:crypto";function u(e){return e.replace(/\\/g,`/`)}function d(r,i,a){let o=`${s.resolve(r)}${s.sep}`,c=s.resolve(i);return a?t(void 0):c!==s.resolve(r)&&!c.startsWith(o)?n(e(`ValidationError`,`Refusing to write outside project: ${c}`)):t(void 0)}function f(e,n,r,i){let a=n.type||e.type||`registry:file`,o=i.targetsByType?.[a],c=i.preferManifestTarget!==!1,l=s.basename(n.path||`${e.name}.txt`),f;f=c&&n.target?n.target:o?s.join(o,l):n.target?n.target:s.join(`src`,l);let p=s.resolve(r,f),m=d(r,p,!!i.allowOutsideProject);return m.ok?t({absoluteTarget:p,relativeTarget:u(s.relative(r,p))}):m}function p(e){return[...new Set(e.filter(Boolean))]}function m(e){return{dependencies:p(e.flatMap(e=>e.dependencies||[])),devDependencies:p(e.flatMap(e=>e.devDependencies||[]))}}function h(e,t){let n=new Map,r=[...e],i=[];for(;r.length>0;){let e=r.shift();if(!n.has(e.name)&&(n.set(e.name,e),e.registryDependencies&&e.registryDependencies.length>0))for(let a of e.registryDependencies){if(n.has(a))continue;let e=t.find(e=>e.name===a);e?r.push(e):i.push(a)}}return{resolvedItems:Array.from(n.values()),missingDependencies:p(i)}}function g(e,n,r,i=new Set){let a=[],o=[];for(let t of e)for(let e of t.files){let s=f(t,e,n,r);if(!s.ok)return s;let{absoluteTarget:c,relativeTarget:l}=s.value,u={itemName:t.name,sourceFile:e,absoluteTarget:c,relativeTarget:l};a.push(u),i.has(c)&&o.push(u)}return t({selectedItems:e,plannedWrites:a,dependencyPlan:m(e),conflicts:o})}function _(e,t){let n=e;for(let[e,r]of Object.entries(t.aliases||{})){let t=RegExp(`from ["']${e}(.*?)["']`,`g`);n=n.replace(t,`from "${r}$1"`);let i=RegExp(`import\\(["']${e}(.*?)["']\\)`,`g`);n=n.replace(i,`import("${r}$1")`)}return n}function v(e){return e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[]}function y(r,i){let{flags:a}=i.args,o=v(a.select);if(a.all)return t(r);if(o.length){let i=r.filter(e=>o.includes(e.name));return i.length?t(i):n(e(`ValidationError`,`No items matched --select=${String(a.select)}`))}return t(null)}function b(e,t){let n=[];return e.length&&n.push({command:`npm`,args:[`install`,...e]}),t.length&&n.push({command:`npm`,args:[`install`,`-D`,...t]}),n}function x(e,t){let n=[];return e.length&&n.push({command:`yarn`,args:[`add`,...e]}),t.length&&n.push({command:`yarn`,args:[`add`,`-D`,...t]}),n}function S(e,t){let n=[];return e.length&&n.push({command:`pnpm`,args:[`add`,...e]}),t.length&&n.push({command:`pnpm`,args:[`add`,`-D`,...t]}),n}const C={npm:{manager:`npm`,buildInstallCommands:b},yarn:{manager:`yarn`,buildInstallCommands:x},pnpm:{manager:`pnpm`,buildInstallCommands:S}};function w(e){return C[e]}const T=c.object({dependencies:c.optional(c.record(c.string(),c.string()),{}),devDependencies:c.optional(c.record(c.string(),c.string()),{}),peerDependencies:c.optional(c.record(c.string(),c.string()),{})});function E(e){return[...new Set(e.filter(Boolean))]}function D(e,t,n){let r=s.join(t,`package.json`);if(!n.fs.existsSync(r))return{missingDependencies:[],missingDevDependencies:[]};let i=n.fs.readJsonSync(r),a=i.ok?i.value:{},o=c.safeParse(T,a),l=o.success?o.output:{dependencies:{},devDependencies:{},peerDependencies:{}},u={...l.dependencies,...l.devDependencies,...l.peerDependencies},d=E(e.flatMap(e=>e.dependencies||[])),f=E(e.flatMap(e=>e.devDependencies||[]));return{missingDependencies:d.filter(e=>!u[e]),missingDevDependencies:f.filter(e=>!u[e])}}function O(r,i,a,o,s){if(!a.length&&!o.length)return t(void 0);let c=w(i).buildInstallCommands(a,o);for(let t of c)if(s.process.run(t.command,t.args,r).status!==0)return n(e(`InstallError`,`Dependency install failed: ${t.command} ${t.args.join(` `)}`));return t(void 0)}const k=c.object({version:c.optional(c.string()),source:c.optional(c.string()),hash:c.string()}),A=c.object({components:c.record(c.string(),k)});function j(e){return s.join(e,`regpick-lock.json`)}async function M(e,t){let n=j(e);if(!await t.fs.pathExists(n))return{components:{}};let r=t.fs.readJsonSync(n);if(!r.ok)return{components:{}};try{return c.parse(A,r.value)}catch{return{components:{}}}}async function N(e,t,n){let r=j(e);await n.fs.writeJson(r,t,{spaces:2})}function P(e){return l.createHash(`sha256`).update(e).digest(`hex`)}function F(e,t,n){return t&&t!==`auto`?t:n.fs.existsSync(s.join(e,`pnpm-lock.yaml`))?`pnpm`:n.fs.existsSync(s.join(e,`yarn.lock`))?`yarn`:(n.fs.existsSync(s.join(e,`package-lock.json`)),`npm`)}async function I(i,a,o){let s=o[1];if(s)return t(r(s,a));let c=Object.entries(a.registries||{}).map(([e,t])=>({label:`${e} -> ${t}`,value:e}));if(c.length){let o=await i.runtime.prompt.multiselect({message:`Pick registry alias (or cancel and provide URL/path manually)`,options:c,maxItems:1,required:!1});if(await i.runtime.prompt.isCancel(o))return n(e(`UserCancelled`,`Operation cancelled.`));if(Array.isArray(o)&&o.length>0)return t(r(String(o[0]),a))}let l=await i.runtime.prompt.text({message:`Registry URL/path:`,placeholder:`https://example.com/registry.json`});return await i.runtime.prompt.isCancel(l)?n(e(`UserCancelled`,`Operation cancelled.`)):t(String(l))}function L(e){return e.map(e=>({value:e.name,label:`${e.name} (${e.type||`registry:file`})`,hint:e.description||`${e.files.length} file(s)`}))}async function R(r,i){if(!i.length)return t([]);let a=await r.runtime.prompt.autocompleteMultiselect({message:`Select items to install`,options:L(i),maxItems:10,required:!0});if(await r.runtime.prompt.isCancel(a))return n(e(`UserCancelled`,`Operation cancelled.`));let o=Array.isArray(a)?a:[],s=new Set(o.map(e=>String(e)));return t(i.filter(e=>s.has(e.name)))}async function z(r){let c=!!r.args.flags.yes,{config:l,configPath:u}=await i(r.cwd);if(!u)return r.runtime.prompt.error(`No regpick.json configuration found. Please run 'init' first.`),n(e(`ValidationError`,`No config file found`));let d=(r.args.positionals[0]===`add`?1:0)+1,f=await I(r,l,r.args.positionals);if(!f.ok)return f;let p=f.value;if(!p)return t({kind:`noop`,message:`No registry source provided.`});let m=await o(p,r.cwd,r.runtime);if(!m.ok)return m;let{items:v}=m.value;if(!v.length)return r.runtime.prompt.warn(`No installable items in registry.`),t({kind:`noop`,message:`No installable items in registry.`});let b=r.args.positionals[d];b&&!r.args.flags.select&&(r.args.flags.select=b);let x=y(v,r),S;if(x.ok&&x.value)S=x.value;else if(x.ok){let e=await R(r,v);if(!e.ok)return e;S=e.value}else return x;let{resolvedItems:C,missingDependencies:w}=h(S,v);S=C;for(let e of w)r.runtime.prompt.warn(`Registry dependency "${e}" not found in current registry.`);if(!S||!S.length)return r.runtime.prompt.warn(`No items selected.`),t({kind:`noop`,message:`No items selected.`});if(!c){let t=await r.runtime.prompt.confirm({message:`Install ${S.length} item(s)?`,initialValue:!0});if(await r.runtime.prompt.isCancel(t)||!t)return n(e(`UserCancelled`,`Operation cancelled.`))}let T=new Set,E=g(S,r.cwd,l);if(!E.ok)return E;let k=E.value,A=await Promise.all(k.plannedWrites.map(async e=>await r.runtime.fs.pathExists(e.absoluteTarget)?e.absoluteTarget:null));for(let e of A)e&&T.add(e);let j=g(S,r.cwd,l,T);if(!j.ok)return j;let L=j.value,z=[];for(let t of L.plannedWrites)if(T.has(t.absoluteTarget))if(c||l.overwritePolicy===`overwrite`)z.push(t);else if(l.overwritePolicy===`skip`)r.runtime.prompt.warn(`Skipped existing file: ${t.absoluteTarget}`);else{let i=await r.runtime.prompt.select({message:`File exists: ${t.absoluteTarget}`,options:[{value:`overwrite`,label:`Overwrite this file`},{value:`skip`,label:`Skip this file`},{value:`abort`,label:`Abort installation`}]});if(await r.runtime.prompt.isCancel(i)||i===`abort`)return n(e(`UserCancelled`,`Installation aborted by user.`));i===`overwrite`&&z.push(t)}else z.push(t);let{missingDependencies:B,missingDevDependencies:V}=D(S,r.cwd,r.runtime),H=!1;if(B.length||V.length)if(c)H=!0;else{let t=F(r.cwd,l.packageManager,r.runtime),i=[];B.length&&i.push(`dependencies: ${B.join(`, `)}`),V.length&&i.push(`devDependencies: ${V.join(`, `)}`);let a=await r.runtime.prompt.confirm({message:`Install missing packages with ${t}? (${i.join(` | `)})`,initialValue:!0});if(await r.runtime.prompt.isCancel(a))return n(e(`UserCancelled`,`Dependency installation cancelled by user.`));H=!!a,H||r.runtime.prompt.warn(`Skipped dependency installation.`)}let U=await M(r.cwd,r.runtime),W={},G=await Promise.all(z.map(async e=>{let n=S.find(t=>t.name===e.itemName);if(!n)return t({ignored:!0});let i=await a(e.sourceFile,n,r.cwd,r.runtime);if(!i.ok)return i;let o=_(i.value,l),c=await r.runtime.fs.ensureDir(s.dirname(e.absoluteTarget));if(!c.ok)return c;let u=await r.runtime.fs.writeFile(e.absoluteTarget,o,`utf8`);if(!u.ok)return u;let d=P(o);return t({ignored:!1,itemName:n.name,relativeTarget:e.relativeTarget,contentHash:d})})),K=0;for(let e of G){if(!e.ok)return e;if(e.value.ignored)continue;let{itemName:t,relativeTarget:n,contentHash:i}=e.value;W[t]||(W[t]=[]),W[t].push(i),K+=1,r.runtime.prompt.success(`Wrote ${n}`)}if(K>0){for(let[e,t]of Object.entries(W)){let n=P(t.sort().join(``));U.components[e]={source:p,hash:n}}await N(r.cwd,U,r.runtime)}if(H){let e=F(r.cwd,l.packageManager,r.runtime),t=O(r.cwd,e,B,V,r.runtime);if(!t.ok)return t}return r.runtime.prompt.info(`Installed ${S.length} item(s), wrote ${K} file(s).`),t({kind:`success`,message:`Installed ${S.length} item(s), wrote ${K} file(s).`})}export{f as a,_ as i,M as n,N as r,z as runAddCommand,P as t};
|
package/dist/index.mjs
CHANGED
|
@@ -12,4 +12,4 @@ Options:
|
|
|
12
12
|
--select=a,b,c Select explicit item names in add flow
|
|
13
13
|
--yes Skip confirmation prompts where safe
|
|
14
14
|
--help Show this help
|
|
15
|
-
`)}async function s(){let n=new AbortController,i=e=>{n.signal.aborted||n.abort(e),e instanceof Error&&console.error(t(`red`,`\n[Fatal Error] ${e.message}`)),process.exit(1)};process.on(`SIGINT`,()=>i()),process.on(`SIGTERM`,()=>i()),process.on(`uncaughtException`,i),process.on(`unhandledRejection`,e=>i(e instanceof Error?e:Error(String(e))));let s=a(process.argv.slice(2)),l=s.positionals[0];if(!l||s.flags.help){o();return}let{createRuntimePorts:u}=await import(`./ports-Cr6fDIR9.mjs`),d=u({signal:n.signal});if(!l||s.flags.help){o();return}let f={cwd:s.flags.cwd?e.resolve(process.cwd(),String(s.flags.cwd)):process.cwd(),args:s,runtime:d};d.prompt.intro(t(`cyan`,`regpick`));try{let e;if(l===`init`)e=await import(`./init-BRDg97Sb.mjs`).then(e=>e.runInitCommand(f));else if(l===`list`)e=await import(`./list-
|
|
15
|
+
`)}async function s(){let n=new AbortController,i=e=>{n.signal.aborted||n.abort(e),e instanceof Error&&console.error(t(`red`,`\n[Fatal Error] ${e.message}`)),process.exit(1)};process.on(`SIGINT`,()=>i()),process.on(`SIGTERM`,()=>i()),process.on(`uncaughtException`,i),process.on(`unhandledRejection`,e=>i(e instanceof Error?e:Error(String(e))));let s=a(process.argv.slice(2)),l=s.positionals[0];if(!l||s.flags.help){o();return}let{createRuntimePorts:u}=await import(`./ports-Cr6fDIR9.mjs`),d=u({signal:n.signal});if(!l||s.flags.help){o();return}let f={cwd:s.flags.cwd?e.resolve(process.cwd(),String(s.flags.cwd)):process.cwd(),args:s,runtime:d};d.prompt.intro(t(`cyan`,`regpick`));try{let e;if(l===`init`)e=await import(`./init-BRDg97Sb.mjs`).then(e=>e.runInitCommand(f));else if(l===`list`)e=await import(`./list-vvmSIn82.mjs`).then(e=>e.runListCommand(f));else if(l===`add`)e=await import(`./add-DdKm2Ifq.mjs`).then(e=>e.runAddCommand(f));else if(l===`update`)e=await import(`./update-CBBNRAJE.mjs`).then(e=>e.runUpdateCommand(f));else if(l===`pack`)e=await import(`./pack-Xnel4K2o.mjs`).then(e=>e.runPackCommand(f));else{d.prompt.error(`Unknown command: ${l}`),o(),process.exitCode=1;return}if(!e.ok){c(e.error,d.prompt.error),d.prompt.outro(t(`red`,`Failed.`)),process.exitCode=1;return}if(e.value.kind===`noop`){d.prompt.outro(t(`yellow`,e.value.message));return}d.prompt.outro(t(`green`,`Done.`))}catch(e){c(r(e),d.prompt.error),d.prompt.outro(t(`red`,`Failed.`)),process.exitCode=1}}function c(e,t){if(e.kind===`UserCancelled`){t(e.message);return}t(`[${e.kind}] ${e.message}`)}s();export{n as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import{r}from"./config-BadTCZSR.mjs";import{t as i}from"./registry-
|
|
1
|
+
import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import{r}from"./config-BadTCZSR.mjs";import{t as i}from"./registry-CzJU-6q5.mjs";function a(e,t){return e?t[e]?String(t[e]):e:null}function o(e,t){let n=a(e,t);if(n)return{source:n,requiresPrompt:!1};let r=Object.keys(t)[0];return r?{source:a(r,t),requiresPrompt:!1}:{source:null,requiresPrompt:!0}}function s(e){let t=e.type||`registry:file`,n=Array.isArray(e.files)?e.files.length:0;return`${e.name} (${t}, files: ${n})`}async function c(a){let{config:c}=await r(a.cwd),l=o(a.args.positionals[1],c.registries),u=l.source;if(l.requiresPrompt){let t=await a.runtime.prompt.text({message:`Registry URL/path:`,placeholder:`https://example.com/registry.json`});if(await a.runtime.prompt.isCancel(t))return n(e(`UserCancelled`,`Operation cancelled.`));u=String(t)}if(!u)return t({kind:`noop`,message:`No registry source provided.`});let d=await i(u,a.cwd,a.runtime);if(!d.ok)return d;let{items:f}=d.value;if(!f.length)return a.runtime.prompt.warn(`No items found in registry.`),t({kind:`noop`,message:`No items found in registry.`});a.runtime.prompt.info(`Found ${f.length} items.`);for(let e of f)console.log(`- ${s(e)}`);return t({kind:`success`,message:`Listed ${f.length} item(s).`})}export{c as runListCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import r from"node:path";function i(e){let t=/import\s+[\s\S]*?from\s+["']([^"']+)["']/g,n=/import\(["']([^"']+)["']\)/g,r=new Set,i;for(;(i=t.exec(e))!==null;){let e=i[1];if(!e.startsWith(`.`)&&!e.startsWith(`/`)&&!e.startsWith(`~`)&&!e.startsWith(`@/`)&&!e.startsWith(`@\\`)){let t=e.split(`/`);e.startsWith(`@`)&&t.length>1?r.add(`${t[0]}/${t[1]}`):r.add(t[0])}}for(;(i=n.exec(e))!==null;){let e=i[1];if(!e.startsWith(`.`)&&!e.startsWith(`/`)&&!e.startsWith(`~`)&&!e.startsWith(`@/`)&&!e.startsWith(`@\\`)){let t=e.split(`/`);e.startsWith(`@`)&&t.length>1?r.add(`${t[0]}/${t[1]}`):r.add(t[0])}}return Array.from(r)}function a(e){let t=i(e.content),n=r.relative(e.targetDir,e.path).replace(/\\/g,`/`),a=r.basename(e.path,r.extname(e.path));return{name:a,title:a,description:`Packed component`,type:`registry:component`,dependencies:t,devDependencies:[],registryDependencies:[],files:[{path:n,type:`registry:component`}]}}async function o(e,i){let a=[];async function o(e){let n=await i.runtime.fs.readdir(e);if(!n.ok)return n;let s=await Promise.all(n.value.map(async n=>{let s=r.join(e,n),c=await i.runtime.fs.stat(s);if(!c.ok)return c;if(c.value.isDirectory()){let e=await o(s);if(!e.ok)return e}else (s.endsWith(`.ts`)||s.endsWith(`.tsx`))&&a.push(s);return t(void 0)}));for(let e of s)if(!e.ok)return e;return t(void 0)}let s=await o(e);return s.ok?t(a):n(s.error)}async function s(i){let s=i.args.positionals[1]||`.`,c=r.resolve(i.cwd,s),l=await i.runtime.fs.stat(c);if(!l.ok||!l.value.isDirectory())return n(e(`ValidationError`,`Target is not a directory: ${c}`));i.runtime.prompt.info(`Scanning ${c} for components...`);let u=await o(c,i);if(!u.ok)return u;let d=u.value;if(d.length===0)return i.runtime.prompt.warn(`No .ts or .tsx files found.`),t({kind:`noop`,message:`No files found.`});let f=[],p=await Promise.all(d.map(async e=>{let n=await i.runtime.fs.readFile(e,`utf8`);return n.ok?t(a({path:e,content:n.value,targetDir:c})):n}));for(let e of p){if(!e.ok)return n(e.error);f.push(e.value)}let m={items:f},h=r.join(i.cwd,`registry.json`),g=await i.runtime.fs.writeJson(h,m,{spaces:2});return g.ok?(i.runtime.prompt.success(`Packed ${f.length} components into registry.json`),t({kind:`success`,message:`Generated registry.json`})):n(g.error)}export{s as runPackCommand};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import r from"node:path";import*as i from"valibot";import{fileURLToPath as a}from"node:url";const o=i.object({path:i.optional(i.string()),target:i.optional(i.string()),type:i.optional(i.string(),`registry:file`),content:i.optional(i.string()),url:i.optional(i.string())}),s=i.object({name:i.optional(i.string(),`unnamed-item`),title:i.optional(i.string()),description:i.optional(i.string(),``),type:i.optional(i.string(),`registry:file`),dependencies:i.optional(i.array(i.string()),[]),devDependencies:i.optional(i.array(i.string()),[]),registryDependencies:i.optional(i.array(i.string()),[]),files:i.optional(i.array(o),[])});i.object({type:i.union([i.literal(`http`),i.literal(`file`),i.literal(`directory`)]),baseUrl:i.optional(i.string()),baseDir:i.optional(i.string())});function c(e,t){let n=i.parse(s,e),r=n.name===`unnamed-item`&&n.title?n.title:n.name,a=n.title??r,o=n.files.map(e=>({...e,type:e.type===`registry:file`&&n.type!==`registry:file`?n.type:e.type}));return{...n,name:r,title:a,files:o,sourceMeta:t}}const l=i.object({url:i.optional(i.string()),href:i.optional(i.string()),path:i.optional(i.string()),files:i.optional(i.unknown())}),u=i.object({items:i.array(i.union([i.record(i.string(),i.unknown()),l]))});function d(e){let t=i.safeParse(u,e);return t.success?t.output.items.map(e=>{let t=e;return`files`in t&&Array.isArray(t.files)?null:typeof t.url==`string`?t.url:typeof t.href==`string`?t.href:typeof t.path==`string`?t.path:null}).filter(e=>!!e):[]}const f=i.object({files:i.array(i.unknown())});function p(r,a){try{if(Array.isArray(r))return t(r.filter(e=>!!(e&&typeof e==`object`)).map(e=>c(e,a)));let o=i.safeParse(u,r);return o.success?t(o.output.items.filter(e=>`files`in e&&Array.isArray(e.files)).map(e=>c(e,a))):i.safeParse(f,r).success?t([c(r,a)]):n(e(`RegistryError`,`Unsupported manifest structure.`))}catch(t){return i.isValiError(t)?n(e(`ValidationError`,`Manifest validation failed: ${t.message}`)):n(e(`RegistryError`,`Failed to parse manifest`))}}function m(e){return/^https?:\/\//i.test(e)}function h(e){return e.includes(`github.com`)?e.replace(/^https?:\/\/github\.com\//,`https://raw.githubusercontent.com/`).replace(/\/(blob|tree)\//,`/`):e}function g(e){return/^file:\/\//i.test(e)}function _(e,t){return new URL(t,e).toString()}async function v(i,a,o){let s=p(i,a);if(!i||typeof i!=`object`||Array.isArray(i))return s;let l=d(i);if(!l.length)return s;let u=s.ok?s.value:[],f=await Promise.all(l.map(async i=>{let s;if(m(i)){let e=await o.http.getJson(i);if(!e.ok)return n(e.error);s=e.value}else if(a.type===`http`&&a.baseUrl){let e=await o.http.getJson(_(a.baseUrl,i));if(!e.ok)return n(e.error);s=e.value}else if((a.type===`file`||a.type===`directory`)&&a.baseDir){let t=await o.fs.readFile(r.resolve(a.baseDir,i),`utf8`);if(!t.ok)return n(t.error);try{s=JSON.parse(t.value)}catch{return n(e(`RegistryError`,`Invalid JSON: ${i}`))}}else{let t=await o.fs.readFile(r.resolve(i),`utf8`);if(!t.ok)return n(t.error);try{s=JSON.parse(t.value)}catch{return n(e(`RegistryError`,`Invalid JSON: ${i}`))}}return t(s&&typeof s==`object`?c(s,a):null)})),h=[];for(let e of f){if(!e.ok)return e;e.value&&h.push(e.value)}return t([...u,...h])}async function y(e,i){let a=r.resolve(e),o=await i.fs.readdir(a);if(!o.ok)return n(o.error);let s=o.value.filter(e=>e.endsWith(`.json`)),l=await Promise.all(s.map(async e=>{let n=r.join(a,e),o=await i.fs.readFile(n,`utf8`);if(!o.ok)return o;let s;try{s=JSON.parse(o.value)}catch{return t(null)}return!s||typeof s!=`object`||!(`files`in s)||!Array.isArray(s.files)?t(null):t(c(s,{type:`directory`,baseDir:a}))})),u=[];for(let e of l){if(!e.ok)return n(e.error);e.value&&u.push(e.value)}return t(u)}async function b(i,o,s){if(!i)return n(e(`ValidationError`,`Registry source is required.`));let c=m(i)||g(i)?h(i):r.resolve(o,i);if(m(c)){let e=await s.http.getJson(c);if(!e.ok)return n(e.error);let r=c.endsWith(`/`)?c:c.replace(/[^/]*$/,``),i=await v(e.value,{type:`http`,baseUrl:r},s);return i.ok?t({items:i.value,source:c}):n(i.error)}let l=g(c)?a(new URL(c)):r.resolve(c),u=await s.fs.stat(l);if(!u.ok)return n(e(`RegistryError`,`Registry source not found: ${i}`));if(u.value.isDirectory()){let e=await y(l,s);return e.ok?t({items:e.value,source:l}):n(e.error)}let d=await s.fs.readFile(l,`utf8`);if(!d.ok)return n(d.error);let f;try{f=JSON.parse(d.value)}catch(t){return n(e(`RegistryError`,`Failed to parse registry JSON.`,t))}let p=await v(f,{type:`file`,baseDir:r.dirname(l)},s);return p.ok?t({items:p.value,source:l}):n(p.error)}async function x(i,a,o,s){if(typeof i.content==`string`)return t(i.content);let c=i.url||i.path;if(!c)return n(e(`ValidationError`,`File entry in "${a.name}" is missing both content and path/url.`));let l=m(c)?h(c):c;if(m(l))return await s.http.getText(l);if(a.sourceMeta.type===`http`&&a.sourceMeta.baseUrl){let e=_(a.sourceMeta.baseUrl,l);return await s.http.getText(e)}let u=a.sourceMeta.baseDir&&!r.isAbsolute(c)?r.resolve(a.sourceMeta.baseDir,c):r.resolve(o,c);return await s.fs.readFile(u,`utf8`)}export{x as n,b as t};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{n as e}from"./result-Dmv-uoQK.mjs";import{r as t}from"./config-BadTCZSR.mjs";import{n,t as r}from"./registry-CzJU-6q5.mjs";import{a as i,i as a,n as o,r as s,t as c}from"./add-DdKm2Ifq.mjs";import l from"node:path";import{styleText as u}from"node:util";function d(e){let t={};for(let n of Object.keys(e.components)){let r=e.components[n].source;r&&(t[r]||(t[r]=[]),t[r].push(n))}return t}function f(t,n,r,o,s,l){let u=[],d=[];for(let{file:e,content:t}of r){let r=a(t,l);u.push(r);let o=i(n,e,s,l);if(!o.ok)return o;d.push({target:o.value.absoluteTarget,content:r})}let f=c(u.sort().join(``));return e({itemName:t,status:f===o?`up-to-date`:`requires-diff-prompt`,newHash:f,files:d})}async function p(e,t){let n=await import(`diff`).then(({diffLines:n})=>n(e,t));for(let e of n){let t=e.added?`green`:e.removed?`red`:`gray`,n=e.added?`+ `:e.removed?`- `:` `,r=e.value.replace(/\n$/,``).split(`
|
|
2
|
+
`);for(let e of r)console.log(u(t,`${n}${e}`))}}async function m(i){let a=await o(i.cwd,i.runtime);if(Object.keys(a.components).length===0)return i.runtime.prompt.info(`No components installed. Nothing to update.`),e({kind:`noop`,message:`No components to update.`});let{config:c}=await t(i.cwd),m=d(a),h=0;for(let[e,t]of Object.entries(m)){let o=await r(e,i.cwd,i.runtime);if(!o.ok){i.runtime.prompt.warn(`Failed to load registry ${e}`);continue}let s=o.value.items;for(let e of t){let t=s.find(t=>t.name===e);if(!t)continue;let r=(await Promise.all(t.files.map(async e=>{let r=await n(e,t,i.cwd,i.runtime);return r.ok?{file:e,content:r.value}:null}))).filter(e=>e!==null),o=a.components[e].hash,d=f(e,t,r,o,i.cwd,c);if(!d.ok)continue;let m=d.value;if(m.status===`requires-diff-prompt`){i.runtime.prompt.info(`Update available for ${e}`);let t=await i.runtime.prompt.select({message:`What do you want to do with ${e}?`,options:[{value:`diff`,label:`Show diff`},{value:`update`,label:`Update`},{value:`skip`,label:`Skip`}]});if(await i.runtime.prompt.isCancel(t)||t===`skip`)continue;if(t===`diff`){for(let e of m.files){let t=await i.runtime.fs.readFile(e.target,`utf8`),n=t.ok?t.value:``;console.log(u(`bold`,`\nDiff for ${e.target}:`)),await p(n,e.content)}let t=await i.runtime.prompt.confirm({message:`Update ${e} now?`,initialValue:!0});if(await i.runtime.prompt.isCancel(t)||!t)continue}let n=await Promise.all(m.files.map(async e=>{let t=await i.runtime.fs.ensureDir(l.dirname(e.target));return t.ok?await i.runtime.fs.writeFile(e.target,e.content,`utf8`):t}));for(let e of n)if(!e.ok)return e;a.components[e].hash=m.newHash,h++,i.runtime.prompt.success(`Updated ${e}`)}}}return h>0?(await s(i.cwd,a,i.runtime),e({kind:`success`,message:`Updated ${h} components.`})):e({kind:`noop`,message:`All components are up to date.`})}export{m as runUpdateCommand};
|
package/package.json
CHANGED
package/dist/add-CgdSjgD2.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import{i as r,r as i}from"./config-BadTCZSR.mjs";import{n as a,t as o}from"./registry-1NeuOcNL.mjs";import s from"node:path";import*as c from"valibot";import l from"node:crypto";function u(e){return e.replace(/\\/g,`/`)}function d(r,i,a){let o=`${s.resolve(r)}${s.sep}`,c=s.resolve(i);return a?t(void 0):c!==s.resolve(r)&&!c.startsWith(o)?n(e(`ValidationError`,`Refusing to write outside project: ${c}`)):t(void 0)}function f(e,n,r,i){let a=n.type||e.type||`registry:file`,o=i.targetsByType?.[a],c=i.preferManifestTarget!==!1,l=s.basename(n.path||`${e.name}.txt`),f;f=c&&n.target?n.target:o?s.join(o,l):n.target?n.target:s.join(`src`,l);let p=s.resolve(r,f),m=d(r,p,!!i.allowOutsideProject);return m.ok?t({absoluteTarget:p,relativeTarget:u(s.relative(r,p))}):m}function p(e){return[...new Set(e.filter(Boolean))]}function m(e){return{dependencies:p(e.flatMap(e=>e.dependencies||[])),devDependencies:p(e.flatMap(e=>e.devDependencies||[]))}}function h(e,t){let n=new Map,r=[...e],i=[];for(;r.length>0;){let e=r.shift();if(!n.has(e.name)&&(n.set(e.name,e),e.registryDependencies&&e.registryDependencies.length>0))for(let a of e.registryDependencies){if(n.has(a))continue;let e=t.find(e=>e.name===a);e?r.push(e):i.push(a)}}return{resolvedItems:Array.from(n.values()),missingDependencies:p(i)}}function g(e,n,r,i=new Set){let a=[],o=[];for(let t of e)for(let e of t.files){let s=f(t,e,n,r);if(!s.ok)return s;let{absoluteTarget:c,relativeTarget:l}=s.value,u={itemName:t.name,sourceFile:e,absoluteTarget:c,relativeTarget:l};a.push(u),i.has(c)&&o.push(u)}return t({selectedItems:e,plannedWrites:a,dependencyPlan:m(e),conflicts:o})}function _(e,t){let n=e;for(let[e,r]of Object.entries(t.aliases||{})){let t=RegExp(`from ["']${e}(.*?)["']`,`g`);n=n.replace(t,`from "${r}$1"`);let i=RegExp(`import\\(["']${e}(.*?)["']\\)`,`g`);n=n.replace(i,`import("${r}$1")`)}return n}function v(e){return e?String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[]}function y(r,i){let{flags:a}=i.args,o=v(a.select);if(a.all)return t(r);if(o.length){let i=r.filter(e=>o.includes(e.name));return i.length?t(i):n(e(`ValidationError`,`No items matched --select=${String(a.select)}`))}return t(null)}function b(e,t){let n=[];return e.length&&n.push({command:`npm`,args:[`install`,...e]}),t.length&&n.push({command:`npm`,args:[`install`,`-D`,...t]}),n}function x(e,t){let n=[];return e.length&&n.push({command:`yarn`,args:[`add`,...e]}),t.length&&n.push({command:`yarn`,args:[`add`,`-D`,...t]}),n}function S(e,t){let n=[];return e.length&&n.push({command:`pnpm`,args:[`add`,...e]}),t.length&&n.push({command:`pnpm`,args:[`add`,`-D`,...t]}),n}const C={npm:{manager:`npm`,buildInstallCommands:b},yarn:{manager:`yarn`,buildInstallCommands:x},pnpm:{manager:`pnpm`,buildInstallCommands:S}};function w(e){return C[e]}const T=c.object({dependencies:c.optional(c.record(c.string(),c.string()),{}),devDependencies:c.optional(c.record(c.string(),c.string()),{}),peerDependencies:c.optional(c.record(c.string(),c.string()),{})});function E(e){return[...new Set(e.filter(Boolean))]}function D(e,t,n){let r=s.join(t,`package.json`);if(!n.fs.existsSync(r))return{missingDependencies:[],missingDevDependencies:[]};let i=n.fs.readJsonSync(r),a=i.ok?i.value:{},o=c.safeParse(T,a),l=o.success?o.output:{dependencies:{},devDependencies:{},peerDependencies:{}},u={...l.dependencies,...l.devDependencies,...l.peerDependencies},d=E(e.flatMap(e=>e.dependencies||[])),f=E(e.flatMap(e=>e.devDependencies||[]));return{missingDependencies:d.filter(e=>!u[e]),missingDevDependencies:f.filter(e=>!u[e])}}function O(r,i,a,o,s){if(!a.length&&!o.length)return t(void 0);let c=w(i).buildInstallCommands(a,o);for(let t of c)if(s.process.run(t.command,t.args,r).status!==0)return n(e(`InstallError`,`Dependency install failed: ${t.command} ${t.args.join(` `)}`));return t(void 0)}const k=c.object({components:c.record(c.string(),c.object({version:c.optional(c.string()),source:c.optional(c.string()),hash:c.string()}))});function A(e){return s.join(e,`regpick-lock.json`)}async function j(e,t){let n=A(e);if(!await t.fs.pathExists(n))return{components:{}};let r=t.fs.readJsonSync(n);if(!r.ok)return{components:{}};try{return c.parse(k,r.value)}catch{return{components:{}}}}async function M(e,t,n){let r=A(e);await n.fs.writeJson(r,t,{spaces:2})}function N(e){return l.createHash(`sha256`).update(e).digest(`hex`)}function P(e,t,n){return t&&t!==`auto`?t:n.fs.existsSync(s.join(e,`pnpm-lock.yaml`))?`pnpm`:n.fs.existsSync(s.join(e,`yarn.lock`))?`yarn`:(n.fs.existsSync(s.join(e,`package-lock.json`)),`npm`)}async function F(i,a,o){let s=o[1];if(s)return t(r(s,a));let c=Object.entries(a.registries||{}).map(([e,t])=>({label:`${e} -> ${t}`,value:e}));if(c.length){let o=await i.runtime.prompt.multiselect({message:`Pick registry alias (or cancel and provide URL/path manually)`,options:c,maxItems:1,required:!1});if(await i.runtime.prompt.isCancel(o))return n(e(`UserCancelled`,`Operation cancelled.`));if(Array.isArray(o)&&o.length>0)return t(r(String(o[0]),a))}let l=await i.runtime.prompt.text({message:`Registry URL/path:`,placeholder:`https://example.com/registry.json`});return await i.runtime.prompt.isCancel(l)?n(e(`UserCancelled`,`Operation cancelled.`)):t(String(l))}function I(e){return e.map(e=>({value:e.name,label:`${e.name} (${e.type||`registry:file`})`,hint:e.description||`${e.files.length} file(s)`}))}async function L(r,i){if(!i.length)return t([]);let a=await r.runtime.prompt.autocompleteMultiselect({message:`Select items to install`,options:I(i),maxItems:10,required:!0});if(await r.runtime.prompt.isCancel(a))return n(e(`UserCancelled`,`Operation cancelled.`));let o=Array.isArray(a)?a:[],s=new Set(o.map(e=>String(e)));return t(i.filter(e=>s.has(e.name)))}async function R(r){let c=!!r.args.flags.yes,{config:l,configPath:u}=await i(r.cwd);if(!u)return r.runtime.prompt.error(`No regpick.json configuration found. Please run 'init' first.`),n(e(`ValidationError`,`No config file found`));let d=(r.args.positionals[0]===`add`?1:0)+1,f=await F(r,l,r.args.positionals);if(!f.ok)return f;let p=f.value;if(!p)return t({kind:`noop`,message:`No registry source provided.`});let m=await o(p,r.cwd,r.runtime);if(!m.ok)return m;let{items:v}=m.value;if(!v.length)return r.runtime.prompt.warn(`No installable items in registry.`),t({kind:`noop`,message:`No installable items in registry.`});let b=r.args.positionals[d];b&&!r.args.flags.select&&(r.args.flags.select=b);let x=y(v,r),S=x.ok&&x.value?x:await L(r,v);if(!S.ok)return S;let C=S.value,{resolvedItems:w,missingDependencies:T}=h(C,v);C=w;for(let e of T)r.runtime.prompt.warn(`Registry dependency "${e}" not found in current registry.`);if(!C||!C.length)return r.runtime.prompt.warn(`No items selected.`),t({kind:`noop`,message:`No items selected.`});if(!c){let t=await r.runtime.prompt.confirm({message:`Install ${C.length} item(s)?`,initialValue:!0});if(await r.runtime.prompt.isCancel(t)||!t)return n(e(`UserCancelled`,`Operation cancelled.`))}let E=new Set,k=g(C,r.cwd,l);if(!k.ok)return k;let A=k.value;for(let e of A.plannedWrites)await r.runtime.fs.pathExists(e.absoluteTarget)&&E.add(e.absoluteTarget);let I=g(C,r.cwd,l,E);if(!I.ok)return I;let R=I.value,z=[];for(let t of R.plannedWrites)if(E.has(t.absoluteTarget))if(c||l.overwritePolicy===`overwrite`)z.push(t);else if(l.overwritePolicy===`skip`)r.runtime.prompt.warn(`Skipped existing file: ${t.absoluteTarget}`);else{let i=await r.runtime.prompt.select({message:`File exists: ${t.absoluteTarget}`,options:[{value:`overwrite`,label:`Overwrite this file`},{value:`skip`,label:`Skip this file`},{value:`abort`,label:`Abort installation`}]});if(await r.runtime.prompt.isCancel(i)||i===`abort`)return n(e(`UserCancelled`,`Installation aborted by user.`));i===`overwrite`&&z.push(t)}else z.push(t);let{missingDependencies:B,missingDevDependencies:V}=D(C,r.cwd,r.runtime),H=!1;if(B.length||V.length)if(c)H=!0;else{let t=P(r.cwd,l.packageManager,r.runtime),i=[];B.length&&i.push(`dependencies: ${B.join(`, `)}`),V.length&&i.push(`devDependencies: ${V.join(`, `)}`);let a=await r.runtime.prompt.confirm({message:`Install missing packages with ${t}? (${i.join(` | `)})`,initialValue:!0});if(await r.runtime.prompt.isCancel(a))return n(e(`UserCancelled`,`Dependency installation cancelled by user.`));H=!!a,H||r.runtime.prompt.warn(`Skipped dependency installation.`)}let U=0,W=await j(r.cwd,r.runtime),G={};for(let e of z){let t=C.find(t=>t.name===e.itemName);if(!t)continue;let n=await a(e.sourceFile,t,r.cwd,r.runtime);if(!n.ok)return n;let i=_(n.value,l),o=await r.runtime.fs.ensureDir(s.dirname(e.absoluteTarget));if(!o.ok)return o;let c=await r.runtime.fs.writeFile(e.absoluteTarget,i,`utf8`);if(!c.ok)return c;let u=N(i);G[t.name]||(G[t.name]=[]),G[t.name].push(u),U+=1,r.runtime.prompt.success(`Wrote ${e.relativeTarget}`)}if(U>0){for(let[e,t]of Object.entries(G)){let n=N(t.sort().join(``));W.components[e]={source:p,hash:n}}await M(r.cwd,W,r.runtime)}if(H){let e=P(r.cwd,l.packageManager,r.runtime),t=O(r.cwd,e,B,V,r.runtime);if(!t.ok)return t}return r.runtime.prompt.info(`Installed ${C.length} item(s), wrote ${U} file(s).`),t({kind:`success`,message:`Installed ${C.length} item(s), wrote ${U} file(s).`})}export{f as a,_ as i,j as n,M as r,R as runAddCommand,N as t};
|
package/dist/pack-C5oJjxLv.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import r from"node:path";function i(e){let t=/import\s+[\s\S]*?from\s+["']([^"']+)["']/g,n=/import\(["']([^"']+)["']\)/g,r=new Set,i;for(;(i=t.exec(e))!==null;){let e=i[1];if(!e.startsWith(`.`)&&!e.startsWith(`/`)&&!e.startsWith(`~`)&&!e.startsWith(`@/`)&&!e.startsWith(`@\\`)){let t=e.split(`/`);e.startsWith(`@`)&&t.length>1?r.add(`${t[0]}/${t[1]}`):r.add(t[0])}}for(;(i=n.exec(e))!==null;){let e=i[1];if(!e.startsWith(`.`)&&!e.startsWith(`/`)&&!e.startsWith(`~`)&&!e.startsWith(`@/`)&&!e.startsWith(`@\\`)){let t=e.split(`/`);e.startsWith(`@`)&&t.length>1?r.add(`${t[0]}/${t[1]}`):r.add(t[0])}}return Array.from(r)}function a(e){let t=i(e.content),n=r.relative(e.targetDir,e.path).replace(/\\/g,`/`),a=r.basename(e.path,r.extname(e.path));return{name:a,title:a,description:`Packed component`,type:`registry:component`,dependencies:t,devDependencies:[],registryDependencies:[],files:[{path:n,type:`registry:component`}]}}async function o(e,i){let a=[];async function o(e){let n=await i.runtime.fs.readdir(e);if(!n.ok)return n;for(let t of n.value){let n=r.join(e,t),s=await i.runtime.fs.stat(n);if(!s.ok)return s;if(s.value.isDirectory()){let e=await o(n);if(!e.ok)return e}else (n.endsWith(`.ts`)||n.endsWith(`.tsx`))&&a.push(n)}return t(void 0)}let s=await o(e);return s.ok?t(a):n(s.error)}async function s(i){let s=i.args.positionals[1]||`.`,c=r.resolve(i.cwd,s),l=await i.runtime.fs.stat(c);if(!l.ok||!l.value.isDirectory())return n(e(`ValidationError`,`Target is not a directory: ${c}`));i.runtime.prompt.info(`Scanning ${c} for components...`);let u=await o(c,i);if(!u.ok)return u;let d=u.value;if(d.length===0)return i.runtime.prompt.warn(`No .ts or .tsx files found.`),t({kind:`noop`,message:`No files found.`});let f=[];for(let e of d){let t=await i.runtime.fs.readFile(e,`utf8`);if(!t.ok)return n(t.error);f.push(a({path:e,content:t.value,targetDir:c}))}let p={items:f},m=r.join(i.cwd,`registry.json`),h=await i.runtime.fs.writeJson(m,p,{spaces:2});return h.ok?(i.runtime.prompt.success(`Packed ${f.length} components into registry.json`),t({kind:`success`,message:`Generated registry.json`})):n(h.error)}export{s as runPackCommand};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./index.mjs";import{n as t,t as n}from"./result-Dmv-uoQK.mjs";import r from"node:path";import*as i from"valibot";import{fileURLToPath as a}from"node:url";const o=i.object({path:i.optional(i.string()),target:i.optional(i.string()),type:i.optional(i.string(),`registry:file`),content:i.optional(i.string()),url:i.optional(i.string())}),s=i.object({name:i.optional(i.string(),`unnamed-item`),title:i.optional(i.string()),description:i.optional(i.string(),``),type:i.optional(i.string(),`registry:file`),dependencies:i.optional(i.array(i.string()),[]),devDependencies:i.optional(i.array(i.string()),[]),registryDependencies:i.optional(i.array(i.string()),[]),files:i.optional(i.array(o),[])});function c(e,t){let n=i.parse(s,e),r=n.name===`unnamed-item`&&n.title?n.title:n.name,a=n.title??r,o=n.files.map(e=>({...e,type:e.type===`registry:file`&&n.type!==`registry:file`?n.type:e.type}));return{...n,name:r,title:a,files:o,sourceMeta:t}}function l(e){let t=i.safeParse(u,e);return t.success?t.output.items.map(e=>Array.isArray(e.files)?null:typeof e.url==`string`?e.url:typeof e.href==`string`?e.href:typeof e.path==`string`?e.path:null).filter(e=>!!e):[]}const u=i.object({items:i.array(i.record(i.string(),i.unknown()))}),d=i.object({files:i.array(i.unknown())});function f(r,a){try{if(Array.isArray(r))return t(r.filter(e=>!!(e&&typeof e==`object`)).map(e=>c(e,a)));let o=i.safeParse(u,r);return o.success?t(o.output.items.filter(e=>Array.isArray(e.files)).map(e=>c(e,a))):i.safeParse(d,r).success?t([c(r,a)]):n(e(`RegistryError`,`Unsupported manifest structure.`))}catch(t){return i.isValiError(t)?n(e(`ValidationError`,`Manifest validation failed: ${t.message}`)):n(e(`RegistryError`,`Failed to parse manifest`))}}function p(e){return/^https?:\/\//i.test(e)}function m(e){return e.includes(`github.com`)?e.replace(/^https?:\/\/github\.com\//,`https://raw.githubusercontent.com/`).replace(/\/(blob|tree)\//,`/`):e}function h(e){return/^file:\/\//i.test(e)}function g(e,t){return new URL(t,e).toString()}async function _(i,a,o){let s=f(i,a);if(!i||typeof i!=`object`||Array.isArray(i))return s;let u=l(i);if(!u.length)return s;let d=s.ok?s.value:[],m=[];for(let t of u){let i;if(p(t)){let e=await o.http.getJson(t);if(!e.ok)return n(e.error);i=e.value}else if(a.type===`http`&&a.baseUrl){let e=await o.http.getJson(g(a.baseUrl,t));if(!e.ok)return n(e.error);i=e.value}else if((a.type===`file`||a.type===`directory`)&&a.baseDir){let s=await o.fs.readFile(r.resolve(a.baseDir,t),`utf8`);if(!s.ok)return n(s.error);try{i=JSON.parse(s.value)}catch{return n(e(`RegistryError`,`Invalid JSON: ${t}`))}}else{let a=await o.fs.readFile(r.resolve(t),`utf8`);if(!a.ok)return n(a.error);try{i=JSON.parse(a.value)}catch{return n(e(`RegistryError`,`Invalid JSON: ${t}`))}}i&&typeof i==`object`&&m.push(c(i,a))}return t([...d,...m])}async function v(e,i){let a=r.resolve(e),o=await i.fs.readdir(a);if(!o.ok)return n(o.error);let s=o.value.filter(e=>e.endsWith(`.json`)),l=[];for(let e of s){let t=r.join(a,e),o=await i.fs.readFile(t,`utf8`);if(!o.ok)return n(o.error);let s;try{s=JSON.parse(o.value)}catch{continue}!s||typeof s!=`object`||!(`files`in s)||!Array.isArray(s.files)||l.push(c(s,{type:`directory`,baseDir:a}))}return t(l)}async function y(i,o,s){if(!i)return n(e(`ValidationError`,`Registry source is required.`));let c=p(i)||h(i)?m(i):r.resolve(o,i);if(p(c)){let e=await s.http.getJson(c);if(!e.ok)return n(e.error);let r=c.endsWith(`/`)?c:c.replace(/[^/]*$/,``),i=await _(e.value,{type:`http`,baseUrl:r},s);return i.ok?t({items:i.value,source:c}):n(i.error)}let l=h(c)?a(new URL(c)):r.resolve(c),u=await s.fs.stat(l);if(!u.ok)return n(e(`RegistryError`,`Registry source not found: ${i}`));if(u.value.isDirectory()){let e=await v(l,s);return e.ok?t({items:e.value,source:l}):n(e.error)}let d=await s.fs.readFile(l,`utf8`);if(!d.ok)return n(d.error);let f;try{f=JSON.parse(d.value)}catch(t){return n(e(`RegistryError`,`Failed to parse registry JSON.`,t))}let g=await _(f,{type:`file`,baseDir:r.dirname(l)},s);return g.ok?t({items:g.value,source:l}):n(g.error)}async function b(i,a,o,s){if(typeof i.content==`string`)return t(i.content);let c=i.url||i.path;if(!c)return n(e(`ValidationError`,`File entry in "${a.name}" is missing both content and path/url.`));let l=p(c)?m(c):c;if(p(l))return await s.http.getText(l);if(a.sourceMeta.type===`http`&&a.sourceMeta.baseUrl){let e=g(a.sourceMeta.baseUrl,l);return await s.http.getText(e)}let u=a.sourceMeta.baseDir&&!r.isAbsolute(c)?r.resolve(a.sourceMeta.baseDir,c):r.resolve(o,c);return await s.fs.readFile(u,`utf8`)}export{b as n,y as t};
|
package/dist/update-B8qIlN-C.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./result-Dmv-uoQK.mjs";import{r as t}from"./config-BadTCZSR.mjs";import{n,t as r}from"./registry-1NeuOcNL.mjs";import{a as i,i as a,n as o,r as s,t as c}from"./add-CgdSjgD2.mjs";import l from"node:path";import{styleText as u}from"node:util";function d(e){let t={};for(let n of Object.keys(e.components)){let r=e.components[n].source;r&&(t[r]||(t[r]=[]),t[r].push(n))}return t}function f(t,n,r,o,s,l){let u=[],d=[];for(let{file:e,content:t}of r){let r=a(t,l);u.push(r);let o=i(n,e,s,l);if(!o.ok)return o;d.push({target:o.value.absoluteTarget,content:r})}let f=c(u.sort().join(``));return e({itemName:t,status:f===o?`up-to-date`:`requires-diff-prompt`,newHash:f,files:d})}async function p(e,t){let n=await import(`diff`).then(({diffLines:n})=>n(e,t));for(let e of n){let t=e.added?`green`:e.removed?`red`:`gray`,n=e.added?`+ `:e.removed?`- `:` `,r=e.value.replace(/\n$/,``).split(`
|
|
2
|
-
`);for(let e of r)console.log(u(t,`${n}${e}`))}}async function m(i){let a=await o(i.cwd,i.runtime);if(Object.keys(a.components).length===0)return i.runtime.prompt.info(`No components installed. Nothing to update.`),e({kind:`noop`,message:`No components to update.`});let{config:c}=await t(i.cwd),m=d(a),h=0;for(let[e,t]of Object.entries(m)){let o=await r(e,i.cwd,i.runtime);if(!o.ok){i.runtime.prompt.warn(`Failed to load registry ${e}`);continue}let s=o.value.items;for(let e of t){let t=s.find(t=>t.name===e);if(!t)continue;let r=[];for(let e of t.files){let a=await n(e,t,i.cwd,i.runtime);a.ok&&r.push({file:e,content:a.value})}let o=a.components[e].hash,d=f(e,t,r,o,i.cwd,c);if(!d.ok)continue;let m=d.value;if(m.status===`requires-diff-prompt`){i.runtime.prompt.info(`Update available for ${e}`);let t=await i.runtime.prompt.select({message:`What do you want to do with ${e}?`,options:[{value:`diff`,label:`Show diff`},{value:`update`,label:`Update`},{value:`skip`,label:`Skip`}]});if(await i.runtime.prompt.isCancel(t)||t===`skip`)continue;if(t===`diff`){for(let e of m.files){let t=await i.runtime.fs.readFile(e.target,`utf8`),n=t.ok?t.value:``;console.log(u(`bold`,`\nDiff for ${e.target}:`)),await p(n,e.content)}let t=await i.runtime.prompt.confirm({message:`Update ${e} now?`,initialValue:!0});if(await i.runtime.prompt.isCancel(t)||!t)continue}for(let e of m.files){let t=await i.runtime.fs.ensureDir(l.dirname(e.target));if(!t.ok)return t;let n=await i.runtime.fs.writeFile(e.target,e.content,`utf8`);if(!n.ok)return n}a.components[e].hash=m.newHash,h++,i.runtime.prompt.success(`Updated ${e}`)}}}return h>0?(await s(i.cwd,a,i.runtime),e({kind:`success`,message:`Updated ${h} components.`})):e({kind:`noop`,message:`All components are up to date.`})}export{m as runUpdateCommand};
|