plekta 0.0.6 → 0.0.8
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/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -4
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{checkDirectory as e,checkForUpdate as t,checkForUpdateFresh as n,createCli as r,createSpinner as i,display as a,getPackageManager as o,onCancel as s,showTree as c,symbols as l,typedCommand as u}from"@plekta/utils";import d from"chalk";import{Command as f}from"commander";import{mkdir as p}from"node:fs/promises";import m from"node:path";import{confirm as h,input as g}from"@inquirer/prompts";import{execFile as _}from"node:child_process";import{promisify as v}from"node:util";const y={name:`plekta`,version:`0.0.6`,description:`Description coming soon`,type:`module`,license:`MIT`,author:{name:`Osilama`,email:`thelastofinusa@gmail.com`,url:`https://thelastofinusa.vercel.app`},main:`./dist/index.mjs`,module:`./dist/index.mjs`,types:`./dist/index.d.ts`,exports:{".":{types:`./dist/index.d.ts`,import:`./dist/index.mjs`}},bin:{plekta:`./dist/index.mjs`},files:[`dist`,`README.md`],engines:{node:`>=18`},scripts:{build:`tsdown`,start:`bun run ./src/index.ts`,lint:`biome check .`,clean:`rm -rf .turbo dist node_modules`,"pack:dry":`bun run build && bun pm pack --dry-run`,prepublishOnly:`bun run build`,typecheck:`tsdown --noEmit`},dependencies:{"@inquirer/prompts":`^8.7.2`,"@plekta/utils":`^0.0.3`,chalk:`^6.0.0`,commander:`^15.0.0`,ora:`^9.4.1`},devDependencies:{"@plekta/tsconfig":`^0.0.0`,"@types/bun":`^1.4.3`,"@types/node":`^22.20.2`,tsdown:`0.22.14`}},{createCommandTitle:b,resolveCommandName:x}=r({name:y.name,aliases:[y.name]});var S=class extends Error{code;constructor(e,t){super(t),this.name=`TamioError`,this.code=e}};function C(e){if(e instanceof Error&&e.name===`ExitPromptError`)throw e;let t=e instanceof Error?e.message:String(e);return!(e instanceof S)&&process.env.TAMIO_DEBUG&&console.error(e),a.outro({title:t,color:d.red,symbol:`error`,exitType:1}),process.exit(1)}const w=()=>({definition:e=>u(e,`init`).description(`scaffold a new ${y.name} project`).argument(`[name]`,`name of the project directory`),handler:async(t,n)=>{let{commandTitle:r}=b({command:n,version:y.version});a.intro({title:r,color:d.cyan});let o=i(`cyan`);try{let t=async t=>{if(!t.trim())return`Directory name cannot be empty.`;try{let n=await e(t);return n.exists&&!n.isEmpty?`Directory "${t}" already exists and is not empty.`:!0}catch{return`Unable to access directory "${t}". Please choose another path.`}},i=n?.args[0];if(i){let e=await t(i);if(e!==!0)throw Error(e)}else i=await g({message:`Where should your project live?`,default:`${y.name}-dapp`,validate:t});let s=m.resolve(process.cwd(),i);await p(s,{recursive:!0}),o.succeed(`${d.cyan(i)} directory created.`),a.outro({title:r,color:d.magenta})}catch(e){o.stop(),C(e)}}}),T=()=>({definition:e=>u(e,`test`).description(`testing the cli command`).option(`-f, --flag`,`show flag in display`).option(`-d, --disk`,`show something`),handler:async(e,t)=>{let{commandTitle:n}=b({command:t,version:y.version});a.intro({title:n,color:d.magenta}),console.log({options:e}),a.outro({title:n,color:d.magenta})}}),E=v(_),D=()=>({definition:e=>u(e,`update`).description(`check and update to newest version`).option(`-y, --yes`,`skip update confirmation`),handler:async(e,t)=>{let r=o(),{commandTitle:s}=b({command:t,version:y.version});a.intro({title:s,color:d.cyan,symbol:`gear`});let u=i(`cyan`);u.start(`checking npm registry..`);let f=await n(y.name,y.version),p=()=>{c({headerTitle:`version status`,items:[{title:`latest: v${f.latest}`,description:`installed: v${f.current}`}],color:f.outdated?d.yellow:d.cyan})};if(!f.outdated)u.succeed(`already up to date`),console.log(),p(),console.log(),a.outro({title:`you're on the latest version (v${f.current}).`,color:d.green,symbol:`success`,margin:{top:!1}});else if(u.succeed(`new version found ${l.chevron} v${f.latest}`),console.log(),p(),console.log(),!e.yes&&!await h({message:`update to the latest version (v${f.latest})?`,default:!0}))a.outro({title:`update skipped.`,color:d.dim,symbol:`info`});else{u.start(`installing ${y.name}@${f.latest}..`);try{let[e,...t]=r.installer.split(` `);await E(e,[...t,`-g`,`${y.name}@${f.latest}`]),u.succeed(`updated ${y.name} to v${f.latest}`),a.outro({title:`successfully updated.`,color:d.green,symbol:`success`})}catch(e){u.fail(`failed to update ${y.name}.`);let t=e instanceof Error?e.message:`unknown update error.`;a.outro({title:t,color:d.red,symbol:`error`,exitType:1})}}}}),O={init:{register(e){w().definition(e).action((e,t)=>w().handler(e,t))}},test:{register(e){T().definition(e).action((e,t)=>T().handler(e,t))}},update:{register(e){D().definition(e).action((e,t)=>D().handler(e,t))}}},k=process.argv[2],A=/* @__PURE__ */ new Set([`update`,`-h`,`--help`]);async function j(){A.has(k)||await Promise.race([(async()=>{let e=x(),n=await t(y.name,y.version);n.outdated&&(console.log(),c({headerTitle:`update available`,items:[{title:`v${n.latest} is now available (current: v${n.current})`,description:`Run \`${e} update\` to upgrade to the latest version.`}],color:d.yellow}))})(),new Promise(e=>setTimeout(e,1500))]);let e=new f;e.name(y.name).description(y.description).version(y.version,`-v, --version`,`show version`),e.configureOutput({writeOut:e=>{if(e.trim()===y.version){let e=process.version;process.stdout.write(`v${y.version}\n${`${l.chevron} node ${e} (from PATH)`}\n`)}else process.stdout.write(e)}}),Object.values(O).forEach(t=>{t.register(e)}),await s(async()=>{await e.parseAsync(process.argv)})()}j();export{};
|
|
2
|
+
import{checkDirectory as e,checkForUpdate as t,checkForUpdateFresh as n,createCli as r,createSpinner as i,display as a,getPackageManager as o,onCancel as s,showTree as c,symbols as l,typedCommand as u}from"@plekta/utils";import d from"chalk";import{Command as f}from"commander";import{mkdir as p}from"node:fs/promises";import m from"node:path";import{confirm as h,input as g,select as _}from"@inquirer/prompts";import v from"fuzzy";import y from"inquirer-checkbox-plus-plus";import*as b from"viem/chains";import x from"node:fs";import S from"node:os";import{execFile as C}from"node:child_process";import{promisify as w}from"node:util";const T={english:{name:`English`,description:`Standard crystal clear English.`,global:{updateAvailableHeader:`update available`,updateAvailableTitle:(e,t)=>`v${e} is now available (current: v${t})`,updateAvailableDescription:e=>`Run \`${e} update\` to upgrade to the latest version.`,versionDescription:`show version`},lang:{command:{description:`Configure the CLI display language`,argumentDescription:`Preferred CLI language (e.g., english, gen-z, shakespeare)`},prompts:{selectLanguage:`Select your preferred CLI language:`},validation:{invalidLanguage:e=>`Invalid language: "${e}"`,useValidLanguage:`Please use a valid language key (e.g., gen-z).`},success:{languageUpdated:e=>`Language updated to ${e}!`}},init:{description:e=>`scaffold a new ${e} project`,argDescription:`name of the project directory`,prompts:{projectDirectory:`Where should your project live?`,network:`Select network:`,chains:`Select chains to support (type to search):`,framework:`Select framework:`},validation:{atLeastOneChain:`Please select at least one chain.`,directoryNameRequired:`Directory name cannot be empty.`,directoryNotEmpty:e=>`Directory "${e}" already exists and is not empty.`,directoryAccessError:e=>`Unable to access directory "${e}". Please choose another path.`},success:{directoryCreated:e=>`Project directory ${d.cyan(e)} created.`,outro:`Project initialized successfully!`},loading:{scaffolding:`Scaffolding project structure..`},summary:{title:`Project Configuration`,projectDirectory:`Project Directory`,directoryPath:e=>`Path: ${e}`,network:`Network`,supportedChains:e=>`Supported Chains: ${e}`,framework:`Framework`,templatePath:e=>`Template Path: ${e}`}},update:{command:{description:`Check for and install the latest version`,skipConfirmationOption:`Skip update confirmation`},status:{versionHeader:`Version Status`,latestVersion:e=>`Latest: v${e}`,installedVersion:e=>`Installed: v${e}`,upToDate:`Already up to date`,latestVersionInstalled:e=>`You're running the latest version (v${e}).`,newVersionAvailable:e=>`New version available: v${e}`},prompts:{confirmUpdate:e=>`Update to the latest version (v${e})?`},loading:{checkingRegistry:`Checking npm registry..`,installingUpdate:(e,t)=>`Installing ${e}@${t}..`},success:{updateSkipped:`Update skipped.`,updateInstalled:(e,t)=>`Updated ${e} to v${t}`,outro:`Update completed successfully!`},errors:{updateFailed:`Failed to update.`,unknownError:`An unknown error occurred during the update.`}}},"gen-z":{name:`Gen Z`,description:`Chronically online. Lowkey unhinged. Highkey iconic.`,global:{updateAvailableHeader:`new update just dropped`,updateAvailableTitle:(e,t)=>`v${e} just dropped (you're on v${t} rn)`,updateAvailableDescription:e=>`Run \`${e} update\` to get the latest tea.`,versionDescription:`show version, bestie`},lang:{command:{description:`Switch up your CLI's whole vibe`,argumentDescription:`Your preferred CLI vibe (e.g., english, gen-z, shakespeare)`},prompts:{selectLanguage:`Pick your vibe:`},validation:{invalidLanguage:e=>`Uhh, "${e}" is not the vibe.`,useValidLanguage:`Pick a valid language key, bestie. No cap.`},success:{languageUpdated:e=>`Vibe switched to ${e}. We love character development!`}},init:{description:e=>`cook up a fresh ${e} project`,argDescription:`name your project folder`,prompts:{projectDirectory:`Where are we dropping this project?`,network:`Pick your network, bestie:`,chains:`Choose your chains (type to search, it's giving smart):`,framework:`What's the framework vibe?`},validation:{atLeastOneChain:`Bestie, pick at least one chain. We need something to work with.`,directoryNameRequired:`The folder needs a name. Empty is not giving.`,directoryNotEmpty:e=>`"${e}" already has stuff in it. Pick an empty folder, bestie.`,directoryAccessError:e=>`Can't access "${e}" rn. Try another path.`},success:{directoryCreated:e=>`Project folder ${d.cyan(e)} just dropped. Slay.`,outro:`Project initialized. Absolutely ate. No crumbs.`},loading:{scaffolding:`Cooking up your project structure..`},summary:{title:`The Project Lore`,projectDirectory:`Project Folder`,directoryPath:e=>`Located at: ${e}`,network:`Network Vibe`,supportedChains:e=>`Chains in the squad: ${e}`,framework:`Framework Era`,templatePath:e=>`Template located at: ${e}`}},update:{command:{description:`Check for updates and get that fresh version`,skipConfirmationOption:`Skip the 'are you sure?' moment`},status:{versionHeader:`Version Check: The Lore`,latestVersion:e=>`Latest drop: v${e}`,installedVersion:e=>`Your version: v${e}`,upToDate:`You're already up to date. We love that for you.`,latestVersionInstalled:e=>`You're on v${e}, the latest drop. Literally iconic.`,newVersionAvailable:e=>`New version just dropped: v${e}. It's giving upgrade.`},prompts:{confirmUpdate:e=>`Update to v${e}? Let's get you that glow-up.`},loading:{checkingRegistry:`Checking npm registry, spill the tea..`,installingUpdate:(e,t)=>`Installing ${e}@${t}.. Trust the process.`},success:{updateSkipped:`Update skipped. Staying in your current era.`,updateInstalled:(e,t)=>`${e} upgraded to v${t}. We love a glow-up.`,outro:`Update complete. You ate and left no crumbs.`},errors:{updateFailed:`Update failed. Not the plot twist we wanted.`,unknownError:`Something went wrong. The vibes are off, fr.`}}},shakespeare:{name:`Shakespeare`,description:`Speak as though upon the stage of the Bard.`,global:{updateAvailableHeader:`A new release doth await`,updateAvailableTitle:(e,t)=>`Version ${e} hath arrived; thou art using v${t}`,updateAvailableDescription:e=>`Pray, run \`${e} update\` to obtain the latest version.`,versionDescription:`reveal the version`},lang:{command:{description:`Set the tongue in which this CLI shall speak`,argumentDescription:`Thy preferred tongue (e.g., english, gen-z, shakespeare, pirate)`},prompts:{selectLanguage:`Which tongue dost thou prefer?`},validation:{invalidLanguage:e=>`Alas! "${e}" is not a recognized tongue.`,useValidLanguage:`Pray, choose a valid language key, good sir.`},success:{languageUpdated:e=>`Well met! The tongue hath been set to ${e}.`}},init:{description:e=>`summon a new ${e} project into being`,argDescription:`the name of thy project directory`,prompts:{projectDirectory:`Where shall thy project make its home?`,network:`Choose thy network:`,chains:`Choose the chains thy project shall support (search by typing):`,framework:`Choose thy framework:`},validation:{atLeastOneChain:`Thou must select at least one chain.`,directoryNameRequired:`A project directory name is required, good sir.`,directoryNotEmpty:e=>`The directory "${e}" already exists and is not empty.`,directoryAccessError:e=>`We cannot enter "${e}". Pray, choose another path.`},success:{directoryCreated:e=>`Thy project directory ${d.cyan(e)} hath been created.`,outro:`Rejoice! Thy project hath been initialized.`},loading:{scaffolding:`Preparing the foundations of thy project..`},summary:{title:`The Configuration of Thy Project`,projectDirectory:`Project Directory`,directoryPath:e=>`The path: ${e}`,network:`Network`,supportedChains:e=>`The chains thou dost support: ${e}`,framework:`Framework`,templatePath:e=>`The template's path: ${e}`}},update:{command:{description:`Seek and install the latest version`,skipConfirmationOption:`Proceed without seeking thy consent`},status:{versionHeader:`The State of Thy Version`,latestVersion:e=>`Latest: v${e}`,installedVersion:e=>`Installed: v${e}`,upToDate:`Thy version is already up to date`,latestVersionInstalled:e=>`Fear not, thou hast the latest version (v${e}).`,newVersionAvailable:e=>`Hark! A newer version, v${e}, doth await.`},prompts:{confirmUpdate:e=>`Wilt thou update to the latest version (v${e})?`},loading:{checkingRegistry:`Consulting the royal registry..`,installingUpdate:(e,t)=>`Installing ${e}@${t}.. Pray, be patient.`},success:{updateSkipped:`The update hath been declined.`,updateInstalled:(e,t)=>`${e} hath been updated to v${t}.`,outro:`The update is complete! All the world's well.`},errors:{updateFailed:`Alas! The update hath failed.`,unknownError:`A most mysterious error hath occurred during the update.`}}}},E=(e,t=`english`,...n)=>{let r=T[t]||T.english,i=e.split(`.`),a=e=>{let t=e;for(let e of i)if(t&&typeof t==`object`&&e in t)t=t[e];else return;return t},o=a(r)??a(T.english);return typeof o==`function`?o(...n):typeof o==`string`?o:e},D={name:`plekta`,version:`0.0.8`,description:`Description coming soon`,type:`module`,license:`MIT`,author:{name:`Osilama`,email:`thelastofinusa@gmail.com`,url:`https://thelastofinusa.vercel.app`},main:`./dist/index.mjs`,module:`./dist/index.mjs`,types:`./dist/index.d.ts`,exports:{".":{types:`./dist/index.d.ts`,import:`./dist/index.mjs`}},bin:{plekta:`./dist/index.mjs`},files:[`dist`,`README.md`],engines:{node:`>=18`},scripts:{build:`tsdown`,start:`bun run ./src/index.ts`,lint:`biome check .`,clean:`rm -rf .turbo dist node_modules`,"pack:dry":`bun run build && bun pm pack --dry-run`,prepublishOnly:`bun run build`,typecheck:`tsc --noEmit`},dependencies:{"@inquirer/prompts":`^8.7.2`,"@plekta/utils":`^0.0.4`,chalk:`^6.0.0`,commander:`^15.0.0`,fuzzy:`^0.1.3`,"inquirer-checkbox-plus-plus":`^1.2.0`,"inquirerjs-checkbox-search":`^3.0.0`,ora:`^9.4.1`,viem:`^2.57.11`},devDependencies:{"@plekta/tsconfig":`^0.0.0`,"@types/bun":`^1.4.3`,"@types/node":`^22.20.2`,tsdown:`0.22.14`}},{createCommandTitle:O,resolveCommandName:k}=r({name:D.name,aliases:[D.name]});var A=class extends Error{code;constructor(e,t){super(t),this.name=`TamioError`,this.code=e}};function j(e){if(e instanceof Error&&e.name===`ExitPromptError`)throw e;let t=e instanceof Error?e.message:String(e);return!(e instanceof A)&&process.env.TAMIO_DEBUG&&console.error(e),a.outro({title:t,color:d.red,symbol:`error`,exitType:1}),process.exit(1)}const M=[{name:`Ethereum`,value:`ethereum`,description:`EVM-compatible networks via Viem/Wagmi`}],N=Object.values(b).filter(e=>typeof e==`object`&&!!e&&`id`in e&&`name`in e&&`nativeCurrency`in e&&`rpcUrls`in e),P=[{name:`Next.js (App Router)`,value:`nextjs`,description:`Full-stack React framework`},{name:`Vite + React`,value:`vite-react`,description:`Single-page application client template`}],F=m.join(S.homedir(),`.${D.name}`),I=m.join(F,`config.json`),L={language:`english`},R=()=>{try{if(x.existsSync(I)){let e=x.readFileSync(I,`utf-8`);return{...L,...JSON.parse(e)}}}catch{}return L},z=e=>{try{x.existsSync(F)||x.mkdirSync(F,{recursive:!0});let t={...R(),...e};x.writeFileSync(I,JSON.stringify(t,null,2),`utf-8`)}catch(e){console.error(`Failed to save config:`,e)}},B=()=>{let{language:t}=R();return{definition:e=>u(e,`init`).description(E(`init.description`,t,D.name)).argument(`[name]`,E(`init.argDescription`,t)),handler:async(n,r)=>{let{commandTitle:o}=O({command:r,version:D.version});a.intro({title:o,color:d.cyan});let s=i(`cyan`);try{let n=async n=>{if(!n.trim())return E(`init.validation.directoryNameRequired`,t);try{let r=await e(n);return r.exists&&!r.isEmpty?E(`init.validation.directoryNotEmpty`,t,n):!0}catch{return E(`init.validation.directoryAccessError`,t,n)}},i=r?.args[0];if(i){let e=await n(i);if(e!==!0)throw Error(e)}else i=await g({message:E(`init.prompts.projectDirectory`,t),default:`${D.name}-dapp`,validate:n});let o=await _({message:E(`init.prompts.network`,t),choices:M.map(e=>({name:e.name,value:e.value,description:e.description}))}),l=await y({message:E(`init.prompts.chains`,t),pageSize:10,searchable:!0,loop:!1,source:async(e,t)=>{let n=(t||``).toLowerCase();return v.filter(n,N,{extract:e=>e.name}).map(e=>e.original).map(e=>({name:e.name,value:e.id}))},validate:e=>e.length!==0||E(`init.validation.atLeastOneChain`,t),theme:{style:{searchHint:e=>{let t=e.match(/"([^"]*)"/);return` ${d.cyan(t?t[1]:e)}`}}}}),u=await _({message:E(`init.prompts.framework`,t),choices:P.map(e=>({name:e.name,value:e.value,description:e.description}))}),f=m.resolve(process.cwd(),i);s.start(E(`init.loading.scaffolding`,t)),await new Promise(e=>setTimeout(e,1e3)),await p(f,{recursive:!0}),s.succeed(E(`init.success.directoryCreated`,t,i)),c({headerTitle:E(`init.summary.title`,t),items:[{title:`${E(`init.summary.projectDirectory`,t)}: ${d.cyan(i)}`,description:E(`init.summary.directoryPath`,t,f)},{title:`${E(`init.summary.network`,t)}: ${d.green(o)}`,description:E(`init.summary.supportedChains`,t,l.join(`, `))},{title:`${E(`init.summary.framework`,t)}: ${d.yellow(u)}`,description:E(`init.summary.templatePath`,t,`templates/${o}/${u}`)}],color:d.cyan,margin:{top:!0}}),a.outro({title:E(`init.success.outro`,t),color:d.green})}catch(e){s.stop(),j(e)}}}},V=()=>{let{language:e}=R();return{definition:t=>u(t,`lang`).description(E(`lang.command.description`,e)).argument(`[language]`,E(`lang.command.argumentDescription`,e)),handler:async(t,n)=>{let r=R(),{commandTitle:i}=O({command:n,version:D.version});a.intro({title:i,color:d.cyan});try{let t,i=n?.args[0]?.toLowerCase();if(i){if(i in T)t=i;else{c({headerTitle:E(`lang.validation.invalidLanguage`,e,n?.args[0]),items:Object.entries(T).map(([e,t])=>({title:`${t.name}: ${d.cyan(e)}`,description:t.description})),color:d.red}),a.outro({title:E(`lang.validation.useValidLanguage`,e),color:d.red,symbol:`error`});return}}else t=await _({message:E(`lang.prompts.selectLanguage`,e),default:r.language||`english`,choices:Object.entries(T).map(([e,t])=>({name:t.name.toLowerCase()===`english`?`${t.name} (Default)`:t.name,value:e,description:t.description}))});z({language:t}),a.outro({title:E(`lang.success.languageUpdated`,t,T[t].name),color:d.green,symbol:`success`,margin:{top:!i}})}catch(e){j(e)}}}},H=w(C),U=()=>{let{language:e}=R();return{definition:t=>u(t,`update`).description(E(`update.command.description`,e)).option(`-y, --yes`,E(`update.command.skipConfirmationOption`,e)),handler:async(t,r)=>{let s=o(),{commandTitle:l}=O({command:r,version:D.version});a.intro({title:l,color:d.cyan,symbol:`gear`});let u=i(`cyan`);u.start(E(`update.loading.checkingRegistry`,e));let f=await n(D.name,D.version),p=()=>{c({headerTitle:E(`update.status.versionHeader`,e),items:[{title:E(`update.status.latestVersion`,e,f.latest),description:E(`update.status.installedVersion`,e,f.current)}],color:f.outdated?d.yellow:d.cyan})};if(!f.outdated)u.succeed(E(`update.status.upToDate`,e)),console.log(),p(),console.log(),a.outro({title:E(`update.status.latestVersionInstalled`,e,f.current),color:d.green,symbol:`success`,margin:{top:!1}});else if(u.succeed(E(`update.status.newVersionAvailable`,e,f.latest)),console.log(),p(),console.log(),!t.yes&&!await h({message:E(`update.prompts.confirmUpdate`,e,f.latest),default:!0}))a.outro({title:E(`update.success.updateSkipped`,e),color:d.dim,symbol:`info`});else{u.start(E(`update.loading.installingUpdate`,e,D.name,f.latest));try{let[t,...n]=s.installer.split(` `);await H(t,[...n,`-g`,`${D.name}@${f.latest}`]),u.succeed(E(`update.success.updateInstalled`,e,D.name,f.latest)),a.outro({title:E(`update.success.outro`,e),color:d.green,symbol:`success`})}catch(e){j(e)}}}}},W={init:{register(e){B().definition(e).action((e,t)=>B().handler(e,t))}},lang:{register(e){V().definition(e).action((e,t)=>V().handler(e,t))}},update:{register(e){U().definition(e).action((e,t)=>U().handler(e,t))}}},G=process.argv[2],K=/* @__PURE__ */ new Set([`update`,`-h`,`--help`]);async function q(){let{language:e}=R();K.has(G)||await Promise.race([(async()=>{let n=k(),r=await t(D.name,D.version);r.outdated&&c({margin:{top:!0},headerTitle:E(`global.updateAvailableHeader`,e),items:[{title:E(`global.updateAvailableTitle`,e,r.latest,r.current),description:E(`global.updateAvailableDescription`,e,n)}],color:d.yellow})})(),new Promise(e=>setTimeout(e,1500))]);let n=new f;n.name(D.name).description(D.description).version(D.version,`-v, --version`,E(`global.versionDescription`,e)),n.configureOutput({writeOut:e=>{if(e.trim()===D.version){let e=process.version;process.stdout.write(`v${D.version}\n${`${l.chevron} node ${e} (from PATH)`}\n`)}else process.stdout.write(e)}}),Object.values(W).forEach(e=>{e.register(n)}),await s(async()=>{await n.parseAsync(process.argv)})()}q();export{};
|
|
3
3
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["packageJson","chalk","path","pkg","\"name\"","\"email\"","\"url\"","\"types\"","\"import\"","\"plekta\"","\"node\"","\"build\"","\"start\"","\"lint\"","\"clean\"","\"prepublishOnly\"","\"typecheck\"","\"chalk\"","\"commander\"","\"ora\"","\"tsdown\"","createCli","TamioError","message","code","exitWithError","error","display","initCommand","typedCommand","program","createCommandTitle","commandTitle","spinner","createSpinner","validateDirectory","value","result","checkDirectory","directoryName","command","validation","input","directoryPath","mkdir","testCommand","execFileAsync","promisify","execFile","updateCommand","pm","getPackageManager","info","checkForUpdateFresh","renderVersionTree","showTree","symbols","options","confirm","executable","args","commandHandlers","invoked","SKIP_PASSIVE_CHECK","main","resolveCommandName","checkForUpdate","resolve","Command","str","nodeVersion","handler","onCancel"],"sources":["../package.json","../src/config/package.ts","../src/core/cli.ts","../src/core/errors.ts","../src/commands/handlers/init.helper.ts","../src/commands/handlers/test.handler.ts","../src/commands/handlers/update.handler.ts","../src/commands/index.ts","../src/index.ts"],"sourcesContent":["","import packageJson from \"../../package.json\";\n\nexport const pkg = { ...packageJson };\n","import { createCli } from \"@plekta/utils\";\nimport { pkg } from \"../config/package\";\n\nexport const { createCommandTitle, resolveCommandName } = createCli({\n name: pkg.name,\n aliases: [pkg.name],\n});\n","import chalk from \"chalk\";\nimport { display } from \"@plekta/utils\";\n\nexport type TamioErrorCode =\n | \"INVALID_PACKAGE_NAME\"\n | \"INVALID_VERSION\"\n | \"VERSION_NOT_FOUND\"\n | \"VERSION_EXISTS\"\n | \"INVALID_TRANSITION\"\n | \"NOTHING_TO_PUBLISH\"\n | \"ALREADY_PUBLISHED\"\n | \"VERSION_SKIPPED\"\n | \"CORRUPT_STORE\"\n | \"INVALID_PACKAGE_JSON\"\n | \"PACKAGE_PRIVATE\"\n | \"UNSUPPORTED_PACKAGE_MANAGER\"\n | \"BUILD_FAILED\"\n | \"PACK_FAILED\";\n\n/**\n * Every failure raised by \"@tamio/core\". The `code` is stable, so the CLI and\n * Studio can branch on it instead of matching message text.\n */\nexport class TamioError extends Error {\n readonly code: TamioErrorCode;\n\n constructor(code: TamioErrorCode, message: string) {\n super(message);\n this.name = \"TamioError\";\n this.code = code;\n }\n}\n\n/**\n * Print an error the way every command does, then exit with code 1.\n *\n * A cancelled prompt (Ctrl-C) is rethrown instead, so the shared\n * cancellation handler in index.ts can deal with it.\n */\nexport function exitWithError(error: unknown): never {\n if (error instanceof Error && error.name === \"ExitPromptError\") {\n throw error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n // Unexpected errors (bugs, not Tamio's own checks) get their stack on request.\n if (!(error instanceof TamioError) && process.env.TAMIO_DEBUG) {\n console.error(error);\n }\n\n display.outro({\n title: message,\n color: chalk.red,\n symbol: \"error\",\n exitType: 1,\n });\n\n return process.exit(1);\n}\n","import { mkdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { input } from \"@inquirer/prompts\";\nimport {\n checkDirectory,\n createSpinner,\n display,\n type InferCommandOptions,\n typedCommand,\n} from \"@plekta/utils\";\nimport chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { pkg } from \"../../config/package\";\nimport { createCommandTitle } from \"../../core/cli\";\nimport { exitWithError } from \"../../core/errors\";\n\nexport const initCommand = () => {\n //? ==========================================\n //? COMMAND DEFINITION\n //? ==========================================\n const definition = (program: Command) =>\n typedCommand(program, \"init\")\n .description(`scaffold a new ${pkg.name} project`)\n .argument(\"[name]\", \"name of the project directory\");\n\n //? ==========================================\n //? COMMAND HANDLER\n //? ==========================================\n const handler = async (\n _options: InferCommandOptions<ReturnType<typeof definition>>,\n command?: Command,\n ) => {\n const { commandTitle } = createCommandTitle({\n command,\n version: pkg.version,\n });\n\n display.intro({\n title: commandTitle,\n color: chalk.cyan,\n });\n\n const spinner = createSpinner(\"cyan\");\n\n try {\n const validateDirectory = async (value: string) => {\n if (!value.trim()) {\n return \"Directory name cannot be empty.\";\n }\n\n try {\n const result = await checkDirectory(value);\n\n if (result.exists && !result.isEmpty) {\n return `Directory \"${value}\" already exists and is not empty.`;\n }\n\n return true;\n } catch {\n return `Unable to access directory \"${value}\". Please choose another path.`;\n }\n };\n\n let directoryName = command?.args[0];\n\n if (directoryName) {\n const validation = await validateDirectory(directoryName);\n\n if (validation !== true) {\n throw new Error(validation);\n }\n } else {\n directoryName = await input({\n message: \"Where should your project live?\",\n default: `${pkg.name}-dapp`,\n validate: validateDirectory,\n });\n }\n\n const directoryPath = path.resolve(process.cwd(), directoryName);\n\n await mkdir(directoryPath, { recursive: true });\n\n spinner.succeed(`${chalk.cyan(directoryName)} directory created.`);\n\n display.outro({\n title: commandTitle,\n color: chalk.magenta,\n });\n } catch (error) {\n spinner.stop();\n exitWithError(error);\n }\n };\n\n return { definition, handler };\n};\n","import { display, type InferCommandOptions, typedCommand } from \"@plekta/utils\";\nimport chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { pkg } from \"../../config/package\";\nimport { createCommandTitle } from \"../../core/cli\";\n\nexport const testCommand = () => {\n //? ==========================================\n //? COMMAND DEFINITION\n //? ==========================================\n const definition = (program: Command) =>\n typedCommand(program, \"test\")\n .description(\"testing the cli command\")\n .option(\"-f, --flag\", \"show flag in display\")\n .option(\"-d, --disk\", \"show something\");\n\n //? ==========================================\n //? COMMAND HANDLER\n //? ==========================================\n const handler = async (\n options: InferCommandOptions<ReturnType<typeof definition>>,\n command?: Command,\n ) => {\n const { commandTitle } = createCommandTitle({\n command,\n version: pkg.version,\n });\n\n display.intro({\n title: commandTitle,\n color: chalk.magenta,\n });\n\n console.log({ options });\n\n display.outro({\n title: commandTitle,\n color: chalk.magenta,\n });\n };\n\n return { definition, handler };\n};\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { confirm } from \"@inquirer/prompts\";\nimport {\n checkForUpdateFresh,\n createSpinner,\n display,\n getPackageManager,\n type InferCommandOptions,\n showTree,\n symbols,\n typedCommand,\n} from \"@plekta/utils\";\nimport chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { pkg } from \"../../config/package\";\nimport { createCommandTitle } from \"../../core/cli\";\n\nconst execFileAsync = promisify(execFile);\n\nexport const updateCommand = () => {\n //? ==========================================\n //? COMMAND DEFINITION\n //? ==========================================\n const definition = (program: Command) =>\n typedCommand(program, \"update\")\n .description(\"check and update to newest version\")\n .option(\"-y, --yes\", \"skip update confirmation\");\n\n //? ==========================================\n //? COMMAND HANDLER\n //? ==========================================\n const handler = async (\n options: InferCommandOptions<ReturnType<typeof definition>>,\n command?: Command,\n ) => {\n const pm = getPackageManager();\n\n const { commandTitle } = createCommandTitle({\n command,\n version: pkg.version,\n });\n\n display.intro({\n title: commandTitle,\n color: chalk.cyan,\n symbol: \"gear\",\n });\n\n const spinner = createSpinner(\"cyan\");\n spinner.start(\"checking npm registry..\");\n\n const info = await checkForUpdateFresh(pkg.name, pkg.version);\n\n const renderVersionTree = () => {\n showTree({\n headerTitle: \"version status\",\n items: [\n {\n title: `latest: v${info.latest}`,\n description: `installed: v${info.current}`,\n },\n ],\n color: info.outdated ? chalk.yellow : chalk.cyan,\n });\n };\n\n if (!info.outdated) {\n spinner.succeed(\"already up to date\");\n\n console.log();\n renderVersionTree();\n console.log();\n\n display.outro({\n title: `you're on the latest version (v${info.current}).`,\n color: chalk.green,\n symbol: \"success\",\n margin: { top: false },\n });\n\n return;\n }\n\n spinner.succeed(`new version found ${symbols.chevron} v${info.latest}`);\n\n console.log();\n renderVersionTree();\n console.log();\n\n if (!options.yes) {\n const shouldUpdate = await confirm({\n message: `update to the latest version (v${info.latest})?`,\n default: true,\n });\n\n if (!shouldUpdate) {\n display.outro({\n title: \"update skipped.\",\n color: chalk.dim,\n symbol: \"info\",\n });\n\n return;\n }\n }\n\n spinner.start(`installing ${pkg.name}@${info.latest}..`);\n\n try {\n const [executable, ...args] = pm.installer.split(\" \");\n\n await execFileAsync(executable, [\n ...args,\n \"-g\",\n `${pkg.name}@${info.latest}`,\n ]);\n\n spinner.succeed(`updated ${pkg.name} to v${info.latest}`);\n\n display.outro({\n title: \"successfully updated.\",\n color: chalk.green,\n symbol: \"success\",\n });\n } catch (error) {\n spinner.fail(`failed to update ${pkg.name}.`);\n\n const message =\n error instanceof Error ? error.message : \"unknown update error.\";\n\n display.outro({\n title: message,\n color: chalk.red,\n symbol: \"error\",\n exitType: 1,\n });\n }\n };\n\n return { definition, handler };\n};\n","import type { Command } from \"commander\";\nimport { initCommand } from \"./handlers/init.helper\";\nimport { testCommand } from \"./handlers/test.handler\";\nimport { updateCommand } from \"./handlers/update.handler\";\n\nexport const commandHandlers = {\n init: {\n register(program: Command) {\n initCommand()\n .definition(program)\n .action((options, command) => initCommand().handler(options, command));\n },\n },\n test: {\n register(program: Command) {\n testCommand()\n .definition(program)\n .action((options, command) => testCommand().handler(options, command));\n },\n },\n update: {\n register(program: Command) {\n updateCommand()\n .definition(program)\n .action((options, command) =>\n updateCommand().handler(options, command),\n );\n },\n },\n};\n","import { checkForUpdate, onCancel, showTree, symbols } from \"@plekta/utils\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { commandHandlers } from \"./commands\";\nimport { pkg } from \"./config/package\";\nimport { resolveCommandName } from \"./core/cli\";\n\nconst invoked = process.argv[2];\nconst SKIP_PASSIVE_CHECK = new Set([\"update\", \"-h\", \"--help\"]);\n\nasync function main() {\n if (!SKIP_PASSIVE_CHECK.has(invoked)) {\n await Promise.race([\n (async () => {\n const command = resolveCommandName();\n\n const info = await checkForUpdate(pkg.name, pkg.version);\n\n if (info.outdated) {\n console.log();\n\n showTree({\n headerTitle: \"update available\",\n items: [\n {\n title: `v${info.latest} is now available (current: v${info.current})`,\n description: `Run \\`${command} update\\` to upgrade to the latest version.`,\n },\n ],\n color: chalk.yellow,\n });\n }\n })(),\n new Promise((resolve) => setTimeout(resolve, 1500)),\n ]);\n }\n\n const program = new Command();\n\n program\n .name(pkg.name)\n .description(pkg.description)\n .version(pkg.version, \"-v, --version\", \"show version\");\n\n program.configureOutput({\n writeOut: (str) => {\n if (str.trim() === pkg.version) {\n const nodeVersion = process.version;\n\n process.stdout.write(\n `v${pkg.version}\\n${`${symbols.chevron} node ${nodeVersion} (from PATH)`}\\n`,\n );\n\n return;\n }\n\n process.stdout.write(str);\n },\n });\n\n Object.values(commandHandlers).forEach((handler) => {\n handler.register(program);\n });\n\n // Parse arguments inside the shared cancellation wrapper.\n await onCancel(async () => {\n await program.parseAsync(process.argv);\n })();\n}\n\nvoid main();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["packageJson","chalk","path","fuzzy","checkboxPlus","viemChains","fs","os","languages","latest","current","command","value","name","chains","version","t","args","langObj","lang","keys","pathKey","resolve","source","key","pkg","\"name\"","\"email\"","\"url\"","\"types\"","\"import\"","\"plekta\"","\"node\"","\"build\"","\"start\"","\"lint\"","\"clean\"","\"prepublishOnly\"","\"typecheck\"","\"chalk\"","\"commander\"","\"fuzzy\"","\"ora\"","\"viem\"","\"tsdown\"","createCli","TamioError","message","code","exitWithError","error","display","NETWORKS","ETHEREUM_CHAINS","chain","FRAMEWORKS","configDir","configFile","defaultConfig","getConfig","data","saveConfig","updated","newConfig","initCommand","typedCommand","program","language","createCommandTitle","commandTitle","spinner","createSpinner","validateDirectory","result","checkDirectory","directoryName","validation","input","selectedNetwork","select","network","selectedChains","searchTerm","r","c","choices","match","text","selectedFramework","framework","directoryPath","mkdir","showTree","langCommand","currentConfig","selectedLang","inputLang","val","execFileAsync","promisify","execFile","updateCommand","pm","getPackageManager","info","checkForUpdateFresh","renderVersionTree","options","confirm","executable","commandHandlers","invoked","SKIP_PASSIVE_CHECK","main","resolveCommandName","checkForUpdate","Command","str","nodeVersion","symbols","handler","onCancel"],"sources":["../src/config/languages.ts","../package.json","../src/config/package.ts","../src/core/cli.ts","../src/core/errors.ts","../src/core/mock-core.ts","../src/core/storage.ts","../src/commands/handlers/init.helper.ts","../src/commands/handlers/lang.handler.ts","../src/commands/handlers/update.handler.ts","../src/commands/index.ts","../src/index.ts"],"sourcesContent":["import chalk from \"chalk\";\n\nexport const languages = {\n english: {\n name: \"English\",\n description: \"Standard crystal clear English.\",\n global: {\n updateAvailableHeader: \"update available\",\n updateAvailableTitle: (latest: string, current: string) =>\n `v${latest} is now available (current: v${current})`,\n updateAvailableDescription: (command: string) =>\n `Run \\`${command} update\\` to upgrade to the latest version.`,\n versionDescription: \"show version\",\n },\n lang: {\n command: {\n description: \"Configure the CLI display language\",\n argumentDescription:\n \"Preferred CLI language (e.g., english, gen-z, shakespeare)\",\n },\n prompts: {\n selectLanguage: \"Select your preferred CLI language:\",\n },\n validation: {\n invalidLanguage: (value: string) => `Invalid language: \"${value}\"`,\n useValidLanguage: \"Please use a valid language key (e.g., gen-z).\",\n },\n success: {\n languageUpdated: (name: string) => `Language updated to ${name}!`,\n },\n },\n init: {\n description: (value: string) => `scaffold a new ${value} project`,\n argDescription: \"name of the project directory\",\n prompts: {\n projectDirectory: \"Where should your project live?\",\n network: \"Select network:\",\n chains: \"Select chains to support (type to search):\",\n framework: \"Select framework:\",\n },\n validation: {\n atLeastOneChain: \"Please select at least one chain.\",\n directoryNameRequired: \"Directory name cannot be empty.\",\n directoryNotEmpty: (value: string) =>\n `Directory \"${value}\" already exists and is not empty.`,\n directoryAccessError: (value: string) =>\n `Unable to access directory \"${value}\". Please choose another path.`,\n },\n success: {\n directoryCreated: (value: string) =>\n `Project directory ${chalk.cyan(value)} created.`,\n outro: \"Project initialized successfully!\",\n },\n loading: {\n scaffolding: \"Scaffolding project structure..\",\n },\n summary: {\n title: \"Project Configuration\",\n projectDirectory: \"Project Directory\",\n directoryPath: (value: string) => `Path: ${value}`,\n network: \"Network\",\n supportedChains: (chains: string) => `Supported Chains: ${chains}`,\n framework: \"Framework\",\n templatePath: (value: string) => `Template Path: ${value}`,\n },\n },\n update: {\n command: {\n description: \"Check for and install the latest version\",\n skipConfirmationOption: \"Skip update confirmation\",\n },\n status: {\n versionHeader: \"Version Status\",\n latestVersion: (version: string) => `Latest: v${version}`,\n installedVersion: (version: string) => `Installed: v${version}`,\n upToDate: \"Already up to date\",\n latestVersionInstalled: (version: string) =>\n `You're running the latest version (v${version}).`,\n newVersionAvailable: (version: string) =>\n `New version available: v${version}`,\n },\n prompts: {\n confirmUpdate: (version: string) =>\n `Update to the latest version (v${version})?`,\n },\n loading: {\n checkingRegistry: \"Checking npm registry..\",\n installingUpdate: (name: string, version: string) =>\n `Installing ${name}@${version}..`,\n },\n success: {\n updateSkipped: \"Update skipped.\",\n updateInstalled: (name: string, version: string) =>\n `Updated ${name} to v${version}`,\n outro: \"Update completed successfully!\",\n },\n errors: {\n updateFailed: \"Failed to update.\",\n unknownError: \"An unknown error occurred during the update.\",\n },\n },\n },\n \"gen-z\": {\n name: \"Gen Z\",\n description: \"Chronically online. Lowkey unhinged. Highkey iconic.\",\n global: {\n updateAvailableHeader: \"new update just dropped\",\n updateAvailableTitle: (latest: string, current: string) =>\n `v${latest} just dropped (you're on v${current} rn)`,\n updateAvailableDescription: (command: string) =>\n `Run \\`${command} update\\` to get the latest tea.`,\n versionDescription: \"show version, bestie\",\n },\n lang: {\n command: {\n description: \"Switch up your CLI's whole vibe\",\n argumentDescription:\n \"Your preferred CLI vibe (e.g., english, gen-z, shakespeare)\",\n },\n prompts: {\n selectLanguage: \"Pick your vibe:\",\n },\n validation: {\n invalidLanguage: (value: string) => `Uhh, \"${value}\" is not the vibe.`,\n useValidLanguage: \"Pick a valid language key, bestie. No cap.\",\n },\n success: {\n languageUpdated: (name: string) =>\n `Vibe switched to ${name}. We love character development!`,\n },\n },\n init: {\n description: (value: string) => `cook up a fresh ${value} project`,\n argDescription: \"name your project folder\",\n prompts: {\n projectDirectory: \"Where are we dropping this project?\",\n network: \"Pick your network, bestie:\",\n chains: \"Choose your chains (type to search, it's giving smart):\",\n framework: \"What's the framework vibe?\",\n },\n validation: {\n atLeastOneChain:\n \"Bestie, pick at least one chain. We need something to work with.\",\n directoryNameRequired: \"The folder needs a name. Empty is not giving.\",\n directoryNotEmpty: (value: string) =>\n `\"${value}\" already has stuff in it. Pick an empty folder, bestie.`,\n directoryAccessError: (value: string) =>\n `Can't access \"${value}\" rn. Try another path.`,\n },\n success: {\n directoryCreated: (value: string) =>\n `Project folder ${chalk.cyan(value)} just dropped. Slay.`,\n outro: \"Project initialized. Absolutely ate. No crumbs.\",\n },\n loading: {\n scaffolding: \"Cooking up your project structure..\",\n },\n summary: {\n title: \"The Project Lore\",\n projectDirectory: \"Project Folder\",\n directoryPath: (value: string) => `Located at: ${value}`,\n network: \"Network Vibe\",\n supportedChains: (chains: string) => `Chains in the squad: ${chains}`,\n framework: \"Framework Era\",\n templatePath: (value: string) => `Template located at: ${value}`,\n },\n },\n update: {\n command: {\n description: \"Check for updates and get that fresh version\",\n skipConfirmationOption: \"Skip the 'are you sure?' moment\",\n },\n status: {\n versionHeader: \"Version Check: The Lore\",\n latestVersion: (version: string) => `Latest drop: v${version}`,\n installedVersion: (version: string) => `Your version: v${version}`,\n upToDate: \"You're already up to date. We love that for you.\",\n latestVersionInstalled: (version: string) =>\n `You're on v${version}, the latest drop. Literally iconic.`,\n newVersionAvailable: (version: string) =>\n `New version just dropped: v${version}. It's giving upgrade.`,\n },\n prompts: {\n confirmUpdate: (version: string) =>\n `Update to v${version}? Let's get you that glow-up.`,\n },\n loading: {\n checkingRegistry: \"Checking npm registry, spill the tea..\",\n installingUpdate: (name: string, version: string) =>\n `Installing ${name}@${version}.. Trust the process.`,\n },\n success: {\n updateSkipped: \"Update skipped. Staying in your current era.\",\n updateInstalled: (name: string, version: string) =>\n `${name} upgraded to v${version}. We love a glow-up.`,\n outro: \"Update complete. You ate and left no crumbs.\",\n },\n errors: {\n updateFailed: \"Update failed. Not the plot twist we wanted.\",\n unknownError: \"Something went wrong. The vibes are off, fr.\",\n },\n },\n },\n shakespeare: {\n name: \"Shakespeare\",\n description: \"Speak as though upon the stage of the Bard.\",\n global: {\n updateAvailableHeader: \"A new release doth await\",\n updateAvailableTitle: (latest: string, current: string) =>\n `Version ${latest} hath arrived; thou art using v${current}`,\n updateAvailableDescription: (command: string) =>\n `Pray, run \\`${command} update\\` to obtain the latest version.`,\n versionDescription: \"reveal the version\",\n },\n lang: {\n command: {\n description: \"Set the tongue in which this CLI shall speak\",\n argumentDescription:\n \"Thy preferred tongue (e.g., english, gen-z, shakespeare, pirate)\",\n },\n prompts: {\n selectLanguage: \"Which tongue dost thou prefer?\",\n },\n validation: {\n invalidLanguage: (value: string) =>\n `Alas! \"${value}\" is not a recognized tongue.`,\n useValidLanguage: \"Pray, choose a valid language key, good sir.\",\n },\n success: {\n languageUpdated: (name: string) =>\n `Well met! The tongue hath been set to ${name}.`,\n },\n },\n init: {\n description: (value: string) =>\n `summon a new ${value} project into being`,\n argDescription: \"the name of thy project directory\",\n prompts: {\n projectDirectory: \"Where shall thy project make its home?\",\n network: \"Choose thy network:\",\n chains:\n \"Choose the chains thy project shall support (search by typing):\",\n framework: \"Choose thy framework:\",\n },\n validation: {\n atLeastOneChain: \"Thou must select at least one chain.\",\n directoryNameRequired:\n \"A project directory name is required, good sir.\",\n directoryNotEmpty: (value: string) =>\n `The directory \"${value}\" already exists and is not empty.`,\n directoryAccessError: (value: string) =>\n `We cannot enter \"${value}\". Pray, choose another path.`,\n },\n success: {\n directoryCreated: (value: string) =>\n `Thy project directory ${chalk.cyan(value)} hath been created.`,\n outro: \"Rejoice! Thy project hath been initialized.\",\n },\n loading: {\n scaffolding: \"Preparing the foundations of thy project..\",\n },\n summary: {\n title: \"The Configuration of Thy Project\",\n projectDirectory: \"Project Directory\",\n directoryPath: (value: string) => `The path: ${value}`,\n network: \"Network\",\n supportedChains: (chains: string) =>\n `The chains thou dost support: ${chains}`,\n framework: \"Framework\",\n templatePath: (value: string) => `The template's path: ${value}`,\n },\n },\n update: {\n command: {\n description: \"Seek and install the latest version\",\n skipConfirmationOption: \"Proceed without seeking thy consent\",\n },\n status: {\n versionHeader: \"The State of Thy Version\",\n latestVersion: (version: string) => `Latest: v${version}`,\n installedVersion: (version: string) => `Installed: v${version}`,\n upToDate: \"Thy version is already up to date\",\n latestVersionInstalled: (version: string) =>\n `Fear not, thou hast the latest version (v${version}).`,\n newVersionAvailable: (version: string) =>\n `Hark! A newer version, v${version}, doth await.`,\n },\n prompts: {\n confirmUpdate: (version: string) =>\n `Wilt thou update to the latest version (v${version})?`,\n },\n loading: {\n checkingRegistry: \"Consulting the royal registry..\",\n installingUpdate: (name: string, version: string) =>\n `Installing ${name}@${version}.. Pray, be patient.`,\n },\n success: {\n updateSkipped: \"The update hath been declined.\",\n updateInstalled: (name: string, version: string) =>\n `${name} hath been updated to v${version}.`,\n outro: \"The update is complete! All the world's well.\",\n },\n errors: {\n updateFailed: \"Alas! The update hath failed.\",\n unknownError:\n \"A most mysterious error hath occurred during the update.\",\n },\n },\n },\n} as const;\n\nexport type LanguageType = keyof typeof languages;\n\ntype DeepPaths<T> = T extends object\n ? {\n [K in keyof T]: K extends string\n ? T[K] extends (...args: any[]) => any\n ? K\n : T[K] extends string\n ? K\n : K | `${K}.${DeepPaths<T[K]>}`\n : never;\n }[keyof T]\n : never;\n\nexport type TranslationKey = DeepPaths<(typeof languages)[\"english\"]>;\n\nexport const t = (\n pathKey: TranslationKey,\n lang: LanguageType = \"english\",\n ...args: any[]\n): string => {\n const langObj = languages[lang] || languages.english;\n const keys = pathKey.split(\".\");\n\n const resolve = (source: unknown): unknown => {\n let current: any = source;\n\n for (const key of keys) {\n if (current && typeof current === \"object\" && key in current) {\n current = current[key];\n } else {\n return undefined;\n }\n }\n\n return current;\n };\n\n const value = resolve(langObj) ?? resolve(languages.english);\n\n if (typeof value === \"function\") {\n return value(...args);\n }\n\n return typeof value === \"string\" ? value : pathKey;\n};\n","","import packageJson from \"../../package.json\";\n\nexport const pkg = { ...packageJson };\n","import { createCli } from \"@plekta/utils\";\nimport { pkg } from \"../config/package\";\n\nexport const { createCommandTitle, resolveCommandName } = createCli({\n name: pkg.name,\n aliases: [pkg.name],\n});\n","import { display } from \"@plekta/utils\";\nimport chalk from \"chalk\";\n\nexport type TamioErrorCode =\n | \"INVALID_PACKAGE_NAME\"\n | \"INVALID_VERSION\"\n | \"VERSION_NOT_FOUND\"\n | \"VERSION_EXISTS\"\n | \"INVALID_TRANSITION\"\n | \"NOTHING_TO_PUBLISH\"\n | \"ALREADY_PUBLISHED\"\n | \"VERSION_SKIPPED\"\n | \"CORRUPT_STORE\"\n | \"INVALID_PACKAGE_JSON\"\n | \"PACKAGE_PRIVATE\"\n | \"UNSUPPORTED_PACKAGE_MANAGER\"\n | \"BUILD_FAILED\"\n | \"PACK_FAILED\";\n\n/**\n * Every failure raised by \"@tamio/core\". The `code` is stable, so the CLI and\n * Studio can branch on it instead of matching message text.\n */\nexport class TamioError extends Error {\n readonly code: TamioErrorCode;\n\n constructor(code: TamioErrorCode, message: string) {\n super(message);\n this.name = \"TamioError\";\n this.code = code;\n }\n}\n\n/**\n * Print an error the way every command does, then exit with code 1.\n *\n * A cancelled prompt (Ctrl-C) is rethrown instead, so the shared\n * cancellation handler in index.ts can deal with it.\n */\nexport function exitWithError(error: unknown): never {\n if (error instanceof Error && error.name === \"ExitPromptError\") {\n throw error;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n // Unexpected errors (bugs, not Tamio's own checks) get their stack on request.\n if (!(error instanceof TamioError) && process.env.TAMIO_DEBUG) {\n console.error(error);\n }\n\n display.outro({\n title: message,\n color: chalk.red,\n symbol: \"error\",\n exitType: 1,\n });\n\n return process.exit(1);\n}\n","import type { Chain } from \"viem\";\nimport * as viemChains from \"viem/chains\";\n\nexport const NETWORKS = [\n {\n name: \"Ethereum\",\n value: \"ethereum\",\n description: \"EVM-compatible networks via Viem/Wagmi\",\n },\n] as const;\n\nexport const ETHEREUM_CHAINS: Chain[] = (\n Object.values(viemChains) as unknown[]\n).filter(\n (chain): chain is Chain =>\n typeof chain === \"object\" &&\n chain !== null &&\n \"id\" in chain &&\n \"name\" in chain &&\n \"nativeCurrency\" in chain &&\n \"rpcUrls\" in chain,\n);\n\nexport const FRAMEWORKS = [\n {\n name: \"Next.js (App Router)\",\n value: \"nextjs\",\n description: \"Full-stack React framework\",\n },\n {\n name: \"Vite + React\",\n value: \"vite-react\",\n description: \"Single-page application client template\",\n },\n] as const;\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { LanguageType } from \"../config/languages\";\nimport { pkg } from \"../config/package\";\n\nconst configDir = path.join(os.homedir(), `.${pkg.name}`);\nconst configFile = path.join(configDir, \"config.json\");\n\nexport interface Config {\n language: LanguageType;\n [key: string]: any;\n}\n\nconst defaultConfig: Config = {\n language: \"english\",\n};\n\nexport const getConfig = (): Config => {\n try {\n if (fs.existsSync(configFile)) {\n const data = fs.readFileSync(configFile, \"utf-8\");\n return { ...defaultConfig, ...JSON.parse(data) };\n }\n } catch {}\n return defaultConfig;\n};\n\nexport const saveConfig = (newConfig: Partial<Config>) => {\n try {\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true });\n }\n const current = getConfig();\n const updated = { ...current, ...newConfig };\n fs.writeFileSync(configFile, JSON.stringify(updated, null, 2), \"utf-8\");\n } catch (error) {\n console.error(\"Failed to save config:\", error);\n }\n};\n","import { mkdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { input, select } from \"@inquirer/prompts\";\nimport {\n checkDirectory,\n createSpinner,\n display,\n type InferCommandOptions,\n showTree,\n typedCommand,\n} from \"@plekta/utils\";\nimport chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport fuzzy from \"fuzzy\";\nimport checkboxPlus from \"inquirer-checkbox-plus-plus\";\nimport { t } from \"../../config/languages\";\nimport { pkg } from \"../../config/package\";\nimport { createCommandTitle } from \"../../core/cli\";\nimport { exitWithError } from \"../../core/errors\";\nimport { ETHEREUM_CHAINS, FRAMEWORKS, NETWORKS } from \"../../core/mock-core\";\nimport { getConfig } from \"../../core/storage\";\n\nexport const initCommand = () => {\n const { language } = getConfig();\n\n const definition = (program: Command) =>\n typedCommand(program, \"init\")\n .description(t(\"init.description\", language, pkg.name))\n .argument(\"[name]\", t(\"init.argDescription\", language));\n\n const handler = async (\n _options: InferCommandOptions<ReturnType<typeof definition>>,\n command?: Command,\n ) => {\n const { commandTitle } = createCommandTitle({\n command,\n version: pkg.version,\n });\n\n display.intro({\n title: commandTitle,\n color: chalk.cyan,\n });\n\n const spinner = createSpinner(\"cyan\");\n\n try {\n const validateDirectory = async (value: string) => {\n if (!value.trim()) {\n return t(\"init.validation.directoryNameRequired\", language);\n }\n\n try {\n const result = await checkDirectory(value);\n\n if (result.exists && !result.isEmpty) {\n return t(\"init.validation.directoryNotEmpty\", language, value);\n }\n\n return true;\n } catch {\n return t(\"init.validation.directoryAccessError\", language, value);\n }\n };\n\n let directoryName = command?.args[0];\n\n if (directoryName) {\n const validation = await validateDirectory(directoryName);\n\n if (validation !== true) {\n throw new Error(validation);\n }\n } else {\n directoryName = await input({\n message: t(\"init.prompts.projectDirectory\", language),\n default: `${pkg.name}-dapp`,\n validate: validateDirectory,\n });\n }\n\n // 1. Select Network\n const selectedNetwork = await select({\n message: t(\"init.prompts.network\", language),\n choices: NETWORKS.map((network) => ({\n name: network.name,\n value: network.value,\n description: network.description,\n })),\n });\n\n // 2. Select Chains (Searchable Multi-select)\n const selectedChains = await checkboxPlus({\n message: t(\"init.prompts.chains\", language),\n pageSize: 10,\n searchable: true,\n loop: false,\n source: async (_answersSoFar, input) => {\n const searchTerm = (input || \"\").toLowerCase();\n\n const fuzzyResult = fuzzy.filter(searchTerm, ETHEREUM_CHAINS, {\n extract: (chain) => chain.name,\n });\n const filtered = fuzzyResult.map((r) => r.original);\n\n return filtered.map((c) => ({ name: c.name, value: c.id }));\n },\n validate: (choices) => {\n if (choices.length === 0) {\n return t(\"init.validation.atLeastOneChain\", language);\n }\n return true;\n },\n theme: {\n style: {\n searchHint: (text) => {\n // Extracts the term inside the quotes from [searching: \"main\"]\n const match = text.match(/\"([^\"]*)\"/);\n return ` ${chalk.cyan(match ? match[1] : text)}`;\n },\n },\n },\n });\n\n // 3. Select Framework\n const selectedFramework = await select({\n message: t(\"init.prompts.framework\", language),\n choices: FRAMEWORKS.map((framework) => ({\n name: framework.name,\n value: framework.value,\n description: framework.description,\n })),\n });\n\n const directoryPath = path.resolve(process.cwd(), directoryName);\n\n // Demo simulation of directory creation\n spinner.start(t(\"init.loading.scaffolding\", language));\n await new Promise((resolve) => setTimeout(resolve, 1000));\n await mkdir(directoryPath, { recursive: true });\n\n spinner.succeed(\n t(\"init.success.directoryCreated\", language, directoryName),\n );\n\n // Display configuration summary\n showTree({\n headerTitle: t(\"init.summary.title\", language),\n items: [\n {\n title: `${t(\"init.summary.projectDirectory\", language)}: ${chalk.cyan(directoryName)}`,\n description: t(\n \"init.summary.directoryPath\",\n language,\n directoryPath,\n ),\n },\n {\n title: `${t(\"init.summary.network\", language)}: ${chalk.green(selectedNetwork)}`,\n description: t(\n \"init.summary.supportedChains\",\n language,\n selectedChains.join(\", \"),\n ),\n },\n {\n title: `${t(\"init.summary.framework\", language)}: ${chalk.yellow(selectedFramework)}`,\n description: t(\n \"init.summary.templatePath\",\n language,\n `templates/${selectedNetwork}/${selectedFramework}`,\n ),\n },\n ],\n color: chalk.cyan,\n margin: { top: true },\n });\n\n display.outro({\n title: t(\"init.success.outro\", language),\n color: chalk.green,\n });\n } catch (error) {\n spinner.stop();\n exitWithError(error);\n }\n };\n\n return { definition, handler };\n};\n","import { select } from \"@inquirer/prompts\";\nimport {\n display,\n type InferCommandOptions,\n showTree,\n typedCommand,\n} from \"@plekta/utils\";\nimport chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { type LanguageType, languages, t } from \"../../config/languages\";\nimport { pkg } from \"../../config/package\";\nimport { createCommandTitle } from \"../../core/cli\";\nimport { exitWithError } from \"../../core/errors\";\nimport { getConfig, saveConfig } from \"../../core/storage\";\n\nexport const langCommand = () => {\n const { language } = getConfig();\n\n const definition = (program: Command) =>\n typedCommand(program, \"lang\")\n .description(t(\"lang.command.description\", language))\n .argument(\"[language]\", t(\"lang.command.argumentDescription\", language));\n\n const handler = async (\n _options: InferCommandOptions<ReturnType<typeof definition>>,\n command?: Command,\n ) => {\n const currentConfig = getConfig();\n\n const { commandTitle } = createCommandTitle({\n command,\n version: pkg.version,\n });\n\n display.intro({\n title: commandTitle,\n color: chalk.cyan,\n });\n\n try {\n let selectedLang: LanguageType;\n const inputLang = command?.args[0]?.toLowerCase();\n\n if (inputLang) {\n if (inputLang in languages) {\n selectedLang = inputLang as LanguageType;\n } else {\n showTree({\n headerTitle: t(\n \"lang.validation.invalidLanguage\",\n language,\n command?.args[0],\n ),\n items: Object.entries(languages).map(([key, val]) => ({\n title: `${val.name}: ${chalk.cyan(key)}`,\n description: val.description,\n })),\n color: chalk.red,\n });\n\n display.outro({\n title: t(\"lang.validation.useValidLanguage\", language),\n color: chalk.red,\n symbol: \"error\",\n });\n return;\n }\n } else {\n selectedLang = await select<LanguageType>({\n message: t(\"lang.prompts.selectLanguage\", language),\n default: currentConfig.language || \"english\",\n choices: Object.entries(languages).map(([key, val]) => ({\n name:\n val.name.toLowerCase() === \"english\"\n ? `${val.name} (Default)`\n : val.name,\n value: key as LanguageType,\n description: val.description,\n })),\n });\n }\n\n saveConfig({ language: selectedLang });\n\n display.outro({\n title: t(\n \"lang.success.languageUpdated\",\n selectedLang,\n languages[selectedLang].name,\n ),\n color: chalk.green,\n symbol: \"success\",\n margin: { top: Boolean(!inputLang) },\n });\n } catch (error) {\n exitWithError(error);\n }\n };\n\n return { definition, handler };\n};\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { confirm } from \"@inquirer/prompts\";\nimport {\n checkForUpdateFresh,\n createSpinner,\n display,\n getPackageManager,\n type InferCommandOptions,\n showTree,\n symbols,\n typedCommand,\n} from \"@plekta/utils\";\nimport chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { t } from \"../../config/languages\";\nimport { pkg } from \"../../config/package\";\nimport { createCommandTitle } from \"../../core/cli\";\nimport { exitWithError } from \"../../core/errors\";\nimport { getConfig } from \"../../core/storage\";\n\nconst execFileAsync = promisify(execFile);\n\nexport const updateCommand = () => {\n const { language } = getConfig();\n\n const definition = (program: Command) =>\n typedCommand(program, \"update\")\n .description(t(\"update.command.description\", language))\n .option(\n \"-y, --yes\",\n t(\"update.command.skipConfirmationOption\", language),\n );\n\n const handler = async (\n options: InferCommandOptions<ReturnType<typeof definition>>,\n command?: Command,\n ) => {\n const pm = getPackageManager();\n\n const { commandTitle } = createCommandTitle({\n command,\n version: pkg.version,\n });\n\n display.intro({\n title: commandTitle,\n color: chalk.cyan,\n symbol: \"gear\",\n });\n\n const spinner = createSpinner(\"cyan\");\n spinner.start(t(\"update.loading.checkingRegistry\", language));\n\n const info = await checkForUpdateFresh(pkg.name, pkg.version);\n\n const renderVersionTree = () => {\n showTree({\n headerTitle: t(\"update.status.versionHeader\", language),\n items: [\n {\n title: t(\"update.status.latestVersion\", language, info.latest),\n description: t(\n \"update.status.installedVersion\",\n language,\n info.current,\n ),\n },\n ],\n color: info.outdated ? chalk.yellow : chalk.cyan,\n });\n };\n\n if (!info.outdated) {\n spinner.succeed(t(\"update.status.upToDate\", language));\n\n console.log();\n renderVersionTree();\n console.log();\n\n display.outro({\n title: t(\n \"update.status.latestVersionInstalled\",\n language,\n info.current,\n ),\n color: chalk.green,\n symbol: \"success\",\n margin: { top: false },\n });\n\n return;\n }\n\n spinner.succeed(\n t(\"update.status.newVersionAvailable\", language, info.latest),\n );\n\n console.log();\n renderVersionTree();\n console.log();\n\n if (!options.yes) {\n const shouldUpdate = await confirm({\n message: t(\"update.prompts.confirmUpdate\", language, info.latest),\n default: true,\n });\n\n if (!shouldUpdate) {\n display.outro({\n title: t(\"update.success.updateSkipped\", language),\n color: chalk.dim,\n symbol: \"info\",\n });\n\n return;\n }\n }\n\n spinner.start(\n t(\"update.loading.installingUpdate\", language, pkg.name, info.latest),\n );\n\n try {\n const [executable, ...args] = pm.installer.split(\" \");\n\n await execFileAsync(executable, [\n ...args,\n \"-g\",\n `${pkg.name}@${info.latest}`,\n ]);\n\n spinner.succeed(\n t(\"update.success.updateInstalled\", language, pkg.name, info.latest),\n );\n\n display.outro({\n title: t(\"update.success.outro\", language),\n color: chalk.green,\n symbol: \"success\",\n });\n } catch (error) {\n exitWithError(error);\n }\n };\n\n return { definition, handler };\n};\n","import type { Command } from \"commander\";\nimport { initCommand } from \"./handlers/init.helper\";\nimport { langCommand } from \"./handlers/lang.handler\";\nimport { updateCommand } from \"./handlers/update.handler\";\n\nexport const commandHandlers = {\n init: {\n register(program: Command) {\n initCommand()\n .definition(program)\n .action((options, command) => initCommand().handler(options, command));\n },\n },\n lang: {\n register(program: Command) {\n langCommand()\n .definition(program)\n .action((options, command) => langCommand().handler(options, command));\n },\n },\n update: {\n register(program: Command) {\n updateCommand()\n .definition(program)\n .action((options, command) =>\n updateCommand().handler(options, command),\n );\n },\n },\n};\n","import { checkForUpdate, onCancel, showTree, symbols } from \"@plekta/utils\";\nimport chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { commandHandlers } from \"./commands\";\nimport { t } from \"./config/languages\";\nimport { pkg } from \"./config/package\";\nimport { resolveCommandName } from \"./core/cli\";\nimport { getConfig } from \"./core/storage\";\n\nconst invoked = process.argv[2];\nconst SKIP_PASSIVE_CHECK = new Set([\"update\", \"-h\", \"--help\"]);\n\nasync function main() {\n const { language } = getConfig();\n\n if (!SKIP_PASSIVE_CHECK.has(invoked)) {\n await Promise.race([\n (async () => {\n const command = resolveCommandName();\n\n const info = await checkForUpdate(pkg.name, pkg.version);\n\n if (info.outdated) {\n showTree({\n margin: { top: true },\n headerTitle: t(\"global.updateAvailableHeader\", language),\n items: [\n {\n title: t(\n \"global.updateAvailableTitle\",\n language,\n info.latest,\n info.current,\n ),\n description: t(\n \"global.updateAvailableDescription\",\n language,\n command,\n ),\n },\n ],\n color: chalk.yellow,\n });\n }\n })(),\n new Promise((resolve) => setTimeout(resolve, 1500)),\n ]);\n }\n\n const program = new Command();\n\n program\n .name(pkg.name)\n .description(pkg.description)\n .version(\n pkg.version,\n \"-v, --version\",\n t(\"global.versionDescription\", language),\n );\n\n program.configureOutput({\n writeOut: (str) => {\n if (str.trim() === pkg.version) {\n const nodeVersion = process.version;\n\n process.stdout.write(\n `v${pkg.version}\\n${`${symbols.chevron} node ${nodeVersion} (from PATH)`}\\n`,\n );\n\n return;\n }\n\n process.stdout.write(str);\n },\n });\n\n Object.values(commandHandlers).forEach((handler) => {\n handler.register(program);\n });\n\n // Parse arguments inside the shared cancellation wrapper.\n await onCancel(async () => {\n await program.parseAsync(process.argv);\n })();\n}\n\nvoid main();\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "plekta",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.8",
|
|
4
4
|
"description": "Description coming soon",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -35,14 +35,18 @@
|
|
|
35
35
|
"clean": "rm -rf .turbo dist node_modules",
|
|
36
36
|
"pack:dry": "bun run build && bun pm pack --dry-run",
|
|
37
37
|
"prepublishOnly": "bun run build",
|
|
38
|
-
"typecheck": "
|
|
38
|
+
"typecheck": "tsc --noEmit"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@inquirer/prompts": "^8.7.2",
|
|
42
|
-
"@plekta/utils": "^0.0.
|
|
42
|
+
"@plekta/utils": "^0.0.4",
|
|
43
43
|
"chalk": "^6.0.0",
|
|
44
44
|
"commander": "^15.0.0",
|
|
45
|
-
"
|
|
45
|
+
"fuzzy": "^0.1.3",
|
|
46
|
+
"inquirer-checkbox-plus-plus": "^1.2.0",
|
|
47
|
+
"inquirerjs-checkbox-search": "^3.0.0",
|
|
48
|
+
"ora": "^9.4.1",
|
|
49
|
+
"viem": "^2.57.11"
|
|
46
50
|
},
|
|
47
51
|
"devDependencies": {
|
|
48
52
|
"@plekta/tsconfig": "^0.0.0",
|