plekta 0.0.7 → 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 +6 -2
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,select as _}from"@inquirer/prompts";import v from"node:fs";import y from"node:os";import{execFile as b}from"node:child_process";import{promisify as x}from"node:util";const S={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:{definitionDescription:`configure CLI display language vibe`,selectPrompt:`Select your preferred CLI language vibe:`,updatedSuccess:`Language updated to`},init:{description:e=>`scaffold a new ${e} project`,argDescription:`name of the project directory`,promptDir:`Where should your project live?`,dirCreated:e=>`${d.cyan(e)} directory created.`,errors:{emptyName:`Directory name cannot be empty.`,notEmpty:e=>`Directory "${e}" already exists and is not empty.`,accessError:e=>`Unable to access directory "${e}". Please choose another path.`}},update:{description:`check and update to newest version`,optionYes:`skip update confirmation`,checkingRegistry:`checking npm registry..`,versionStatusHeader:`version status`,alreadyUpToDate:`already up to date`,alreadyLatestOutro:`you're on the latest version`,newVersionFound:`new version found`,confirmMessage:`update to the latest version`,skippedOutro:`update skipped.`,installingSpinner:`installing`,successSpinner:`updated`,successOutro:`successfully updated.`,failSpinner:`failed to update`,unknownError:`unknown update error.`},test:{description:`testing the cli command`,optionFlag:`show flag in display`,optionDisk:`show something`}},"gen-z":{name:`Gen-Z Slang`,description:`No cap, absolute rizz terminology fr fr.`,global:{updateAvailableHeader:`vibe check: update available`,updateAvailableTitle:(e,t)=>`v${e} is dropping rn (current: v${t})`,updateAvailableDescription:e=>`Run \`${e} update\` to get the drip bestie.`,versionDescription:`show version bestie`},lang:{definitionDescription:`vibe-check and switch your CLI language`,selectPrompt:`Pick your vibe bestie:`,updatedSuccess:`Vibe successfully updated to`},init:{description:e=>`cook up a fresh ${e} project no cap`,argDescription:`name of the project directory bestie`,promptDir:`Where we dropping this masterpiece?`,dirCreated:`brodie got cooked fr.`,errors:{emptyName:`Directory name cannot be ghosted, type something bestie.`,notEmpty:e=>`Directory "${e}" is already occupied, pick another spot bestie.`,accessError:e=>`Can't touch "${e}" rn, choose a different path.`}},update:{description:`check for major glow ups and update`,optionYes:`skip update confirmation bestie`,checkingRegistry:`vibe-checking npm registry rn..`,versionStatusHeader:`vibe check status`,alreadyUpToDate:`we so locked in, completely current no cap`,alreadyLatestOutro:`you're already at peak performance`,newVersionFound:`major glow up available bestie`,confirmMessage:`you tryna level up to this fresh drop`,skippedOutro:`we staying retro bestie, update skipped.`,installingSpinner:`installing the drip`,successSpinner:`upgraded`,successOutro:`w rizz, successfully updated no cap.`,failSpinner:`oof it flopped, failed to update`,unknownError:`major L, unknown update error.`},test:{description:`testing the cli command fr`,optionFlag:`show flag in display bestie`,optionDisk:`show something cool`}},shakespeare:{name:`Shakespearean`,description:`Hark! Verily speaketh in olden tongue.`,global:{updateAvailableHeader:`royal notice: update available`,updateAvailableTitle:(e,t)=>`v${e} hath arrived (current: v${t})`,updateAvailableDescription:e=>`Execute \`${e} update\` to claim the new vessel.`,versionDescription:`display version of thy vessel`},lang:{definitionDescription:`configure thy royal tongue for the CLI`,selectPrompt:`Choose thy preferred dialect, good sir:`,updatedSuccess:`Thy tongue hath been shifted unto`},init:{description:e=>`forge a noble ${e} enterprise`,argDescription:`the title of thy domain`,promptDir:`Whither shall thy noble enterprise be founded?`,dirCreated:`thy domain hath been wrought successfully.`,errors:{emptyName:`Thy directory name cannot be void.`,notEmpty:e=>`Thy domain "${e}" already exists and is not desolate.`,accessError:e=>`Alas, cannot reach "${e}". Choose another path.`}},update:{description:`consult the royal registry for newer designs`,optionYes:`bypass royal inquiry`,checkingRegistry:`consulting the royal registry of npm..`,versionStatusHeader:`royal status of vessels`,alreadyUpToDate:`thy vessel is already of the newest design`,alreadyLatestOutro:`thou art already upon the highest pinnacle`,newVersionFound:`behold! a fairer version hath arrived`,confirmMessage:`dost thou wish to ascend unto this newer realm`,skippedOutro:`very well, thy current state remaineth undisturbed.`,installingSpinner:`raising the sails for`,successSpinner:`ascended`,successOutro:`huzzah! triumphant ascension achieved.`,failSpinner:`alas! the enterprise of updating hath faltered for`,unknownError:`a mysterious woe befell the update.`},test:{description:`test the mock trials of the cli`,optionFlag:`display thy banner flag`,optionDisk:`reveal thy hidden relics`}},pirate:{name:`Pirate`,description:`Ahoy matey! Talk like a salty sea dog.`,global:{updateAvailableHeader:`horizon notice: update available`,updateAvailableTitle:(e,t)=>`v${e} be spotted on the radar (current: v${t})`,updateAvailableDescription:e=>`Run \`${e} update\` to hoist the new sails, matey!`,versionDescription:`show ship version`},lang:{definitionDescription:`set yer course and choose yer tongue, matey`,selectPrompt:`Choose yer preferred tongue, ye scurvy dog:`,updatedSuccess:`Language set to arrr`},init:{description:e=>`build a brand new ${e} treasure chest`,argDescription:`name of the treasure cove`,promptDir:`Where shall we anchor this new vessel?`,dirCreated:`cove carved out successfully, arrr!`,errors:{emptyName:`Yer cove name can't be empty water, matey!`,notEmpty:e=>`The cove "${e}" is already claimed by another crew!`,accessError:e=>`Can't drop anchor at "${e}". Pick another spot!`}},update:{description:`scan the horizon for newer charts`,optionYes:`skip the captain's warning`,checkingRegistry:`scouting the npm horizon..`,versionStatusHeader:`ship status log`,alreadyUpToDate:`yer ship is already seaworthy and up to date`,alreadyLatestOutro:`ye be sailing the newest ship on the seas`,newVersionFound:`treasure spotted on the horizon`,confirmMessage:`hoist the sails and update to the newest chart`,skippedOutro:`update abandoned to Davy Jones' locker.`,installingSpinner:`hoisting new rigging for`,successSpinner:`upgraded`,successOutro:`shiver me timbers, successfully updated!`,failSpinner:`mutiny! failed to update`,unknownError:`kraken attack! unknown update error.`},test:{description:`test the cannons of the CLI`,optionFlag:`fly the Jolly Roger flag`,optionDisk:`show treasures from the bilge`}}},C=(e,t=`english`,...n)=>{let r=S[t]||S.english,i=e.split(`.`),a=r;for(let t of i)if(a&&typeof a==`object`&&t in a)a=a[t];else{let t=S.english;for(let n of i)if(t&&typeof t==`object`&&n in t)t=t[n];else return e;a=t;break}return typeof a==`function`?a(...n):typeof a==`string`?a:e},w={name:`plekta`,version:`0.0.7`,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`,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:T,resolveCommandName:E}=r({name:w.name,aliases:[w.name]});var D=class extends Error{code;constructor(e,t){super(t),this.name=`TamioError`,this.code=e}};function O(e){if(e instanceof Error&&e.name===`ExitPromptError`)throw e;let t=e instanceof Error?e.message:String(e);return!(e instanceof D)&&process.env.TAMIO_DEBUG&&console.error(e),a.outro({title:t,color:d.red,symbol:`error`,exitType:1}),process.exit(1)}const k=m.join(y.homedir(),`.${w.name}`),A=m.join(k,`config.json`),j={language:`english`},M=()=>{try{if(v.existsSync(A)){let e=v.readFileSync(A,`utf-8`);return{...j,...JSON.parse(e)}}}catch{}return j},N=e=>{try{v.existsSync(k)||v.mkdirSync(k,{recursive:!0});let t={...M(),...e};v.writeFileSync(A,JSON.stringify(t,null,2),`utf-8`)}catch(e){console.error(`Failed to save config:`,e)}},P=()=>{let{language:t}=M();return{definition:e=>u(e,`init`).description(C(`init.description`,t,w.name)).argument(`[name]`,C(`init.argDescription`,t)),handler:async(n,r)=>{let{commandTitle:o}=T({command:r,version:w.version});a.intro({title:o,color:d.cyan});let s=i(`cyan`);try{let n=async n=>{if(!n.trim())return C(`init.errors.emptyName`,t);try{let r=await e(n);return r.exists&&!r.isEmpty?C(`init.errors.notEmpty`,t,n):!0}catch{return C(`init.errors.accessError`,t,n)}},i=r?.args[0];if(i){let e=await n(i);if(e!==!0)throw Error(e)}else i=await g({message:C(`init.promptDir`,t),default:`${w.name}-dapp`,validate:n});let o=m.resolve(process.cwd(),i);await p(o,{recursive:!0}),s.succeed(C(`init.dirCreated`,t,i)),a.outro({title:`successfully`,color:d.green})}catch(e){s.stop(),O(e)}}}},F=()=>{let{language:e}=M();return{definition:t=>u(t,`lang`).description(C(`lang.definitionDescription`,e)).argument(`[language]`,`preferred CLI language (e.g., english, gen-z, shakespeare, pirate)`),handler:async(t,n)=>{let r=M(),{commandTitle:i}=T({command:n,version:w.version});a.intro({title:i,color:d.cyan});try{let t,i=n?.args[0]?.toLowerCase();if(i){if(i in S)t=i;else{c({headerTitle:`invalid language: "${n?.args[0]}"`,items:Object.entries(S).map(([e,t])=>({title:`${t.name}: ${d.cyan(e)}`,description:t.description})),color:d.red}),a.outro({title:`please use a valid language key (e.g. gen-z).`,color:d.red,symbol:`error`});return}}else t=await _({message:C(`lang.selectPrompt`,e),default:r.language||`english`,choices:Object.entries(S).map(([e,t])=>({name:t.name.toLowerCase()===`english`?`${t.name} (Default)`:t.name,value:e,description:t.description}))});N({language:t}),a.outro({title:`${C(`lang.updatedSuccess`,t)} ${S[t].name}!`,color:d.green,symbol:`success`,margin:{top:!i}})}catch(e){O(e)}}}},I=x(b),L=()=>{let{language:e}=M();return{definition:t=>u(t,`update`).description(C(`update.description`,e)).option(`-y, --yes`,C(`update.optionYes`,e)),handler:async(t,r)=>{let s=o(),{commandTitle:u}=T({command:r,version:w.version});a.intro({title:u,color:d.cyan,symbol:`gear`});let f=i(`cyan`);f.start(C(`update.checkingRegistry`,e));let p=await n(w.name,w.version),m=()=>{c({headerTitle:C(`update.versionStatusHeader`,e),items:[{title:`latest: v${p.latest}`,description:`installed: v${p.current}`}],color:p.outdated?d.yellow:d.cyan})};if(!p.outdated)f.succeed(C(`update.alreadyUpToDate`,e)),console.log(),m(),console.log(),a.outro({title:`${C(`update.alreadyLatestOutro`,e)} (v${p.current}).`,color:d.green,symbol:`success`,margin:{top:!1}});else if(f.succeed(`${C(`update.newVersionFound`,e)} ${l.chevron} v${p.latest}`),console.log(),m(),console.log(),!t.yes&&!await h({message:`${C(`update.confirmMessage`,e)} (v${p.latest})?`,default:!0}))a.outro({title:C(`update.skippedOutro`,e),color:d.dim,symbol:`info`});else{f.start(`${C(`update.installingSpinner`,e)} ${w.name}@${p.latest}..`);try{let[t,...n]=s.installer.split(` `);await I(t,[...n,`-g`,`${w.name}@${p.latest}`]),f.succeed(`${C(`update.successSpinner`,e)} ${w.name} to v${p.latest}`),a.outro({title:C(`update.successOutro`,e),color:d.green,symbol:`success`})}catch(t){f.fail(`${C(`update.failSpinner`,e)} ${w.name}.`);let n=t instanceof Error?t.message:C(`update.unknownError`,e);a.outro({title:n,color:d.red,symbol:`error`,exitType:1})}}}}},R={init:{register(e){P().definition(e).action((e,t)=>P().handler(e,t))}},lang:{register(e){F().definition(e).action((e,t)=>F().handler(e,t))}},update:{register(e){L().definition(e).action((e,t)=>L().handler(e,t))}}},z=process.argv[2],B=/* @__PURE__ */ new Set([`update`,`-h`,`--help`]);async function V(){let{language:e}=M();B.has(z)||await Promise.race([(async()=>{let n=E(),r=await t(w.name,w.version);r.outdated&&(console.log(),c({headerTitle:C(`global.updateAvailableHeader`,e),items:[{title:C(`global.updateAvailableTitle`,e,r.latest,r.current),description:C(`global.updateAvailableDescription`,e,n)}],color:d.yellow}))})(),new Promise(e=>setTimeout(e,1500))]);let n=new f;n.name(w.name).description(w.description).version(w.version,`-v, --version`,C(`global.versionDescription`,e)),n.configureOutput({writeOut:e=>{if(e.trim()===w.version){let e=process.version;process.stdout.write(`v${w.version}\n${`${l.chevron} node ${e} (from PATH)`}\n`)}else process.stdout.write(e)}}),Object.values(R).forEach(e=>{e.register(n)}),await s(async()=>{await n.parseAsync(process.argv)})()}V();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","fs","os","languages","latest","current","command","value","t","args","langObj","lang","keys","pathKey","k","fallback","fk","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","configDir","configFile","defaultConfig","getConfig","data","saveConfig","updated","newConfig","initCommand","typedCommand","program","language","createCommandTitle","commandTitle","spinner","createSpinner","validateDirectory","result","checkDirectory","directoryName","validation","input","directoryPath","mkdir","langCommand","currentConfig","selectedLang","inputLang","showTree","key","val","select","execFileAsync","promisify","execFile","updateCommand","pm","getPackageManager","info","checkForUpdateFresh","renderVersionTree","symbols","options","confirm","executable","commandHandlers","invoked","SKIP_PASSIVE_CHECK","main","resolveCommandName","checkForUpdate","resolve","Command","str","nodeVersion","handler","onCancel"],"sources":["../src/config/languages.ts","../package.json","../src/config/package.ts","../src/core/cli.ts","../src/core/errors.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 definitionDescription: \"configure CLI display language vibe\",\n selectPrompt: \"Select your preferred CLI language vibe:\",\n updatedSuccess: \"Language updated to\",\n },\n init: {\n description: (value: string) => `scaffold a new ${value} project`,\n argDescription: \"name of the project directory\",\n promptDir: \"Where should your project live?\",\n dirCreated: (value: string) => `${chalk.cyan(value)} directory created.`,\n errors: {\n emptyName: \"Directory name cannot be empty.\",\n notEmpty: (value: string) =>\n `Directory \"${value}\" already exists and is not empty.`,\n accessError: (value: string) =>\n `Unable to access directory \"${value}\". Please choose another path.`,\n },\n },\n update: {\n description: \"check and update to newest version\",\n optionYes: \"skip update confirmation\",\n checkingRegistry: \"checking npm registry..\",\n versionStatusHeader: \"version status\",\n alreadyUpToDate: \"already up to date\",\n alreadyLatestOutro: \"you're on the latest version\",\n newVersionFound: \"new version found\",\n confirmMessage: \"update to the latest version\",\n skippedOutro: \"update skipped.\",\n installingSpinner: \"installing\",\n successSpinner: \"updated\",\n successOutro: \"successfully updated.\",\n failSpinner: \"failed to update\",\n unknownError: \"unknown update error.\",\n },\n test: {\n description: \"testing the cli command\",\n optionFlag: \"show flag in display\",\n optionDisk: \"show something\",\n },\n },\n \"gen-z\": {\n name: \"Gen-Z Slang\",\n description: \"No cap, absolute rizz terminology fr fr.\",\n global: {\n updateAvailableHeader: \"vibe check: update available\",\n updateAvailableTitle: (latest: string, current: string) =>\n `v${latest} is dropping rn (current: v${current})`,\n updateAvailableDescription: (command: string) =>\n `Run \\`${command} update\\` to get the drip bestie.`,\n versionDescription: \"show version bestie\",\n },\n lang: {\n definitionDescription: \"vibe-check and switch your CLI language\",\n selectPrompt: \"Pick your vibe bestie:\",\n updatedSuccess: \"Vibe successfully updated to\",\n },\n init: {\n description: (value: string) => `cook up a fresh ${value} project no cap`,\n argDescription: \"name of the project directory bestie\",\n promptDir: \"Where we dropping this masterpiece?\",\n dirCreated: \"brodie got cooked fr.\",\n errors: {\n emptyName: \"Directory name cannot be ghosted, type something bestie.\",\n notEmpty: (value: string) =>\n `Directory \"${value}\" is already occupied, pick another spot bestie.`,\n accessError: (value: string) =>\n `Can't touch \"${value}\" rn, choose a different path.`,\n },\n },\n update: {\n description: \"check for major glow ups and update\",\n optionYes: \"skip update confirmation bestie\",\n checkingRegistry: \"vibe-checking npm registry rn..\",\n versionStatusHeader: \"vibe check status\",\n alreadyUpToDate: \"we so locked in, completely current no cap\",\n alreadyLatestOutro: \"you're already at peak performance\",\n newVersionFound: \"major glow up available bestie\",\n confirmMessage: \"you tryna level up to this fresh drop\",\n skippedOutro: \"we staying retro bestie, update skipped.\",\n installingSpinner: \"installing the drip\",\n successSpinner: \"upgraded\",\n successOutro: \"w rizz, successfully updated no cap.\",\n failSpinner: \"oof it flopped, failed to update\",\n unknownError: \"major L, unknown update error.\",\n },\n test: {\n description: \"testing the cli command fr\",\n optionFlag: \"show flag in display bestie\",\n optionDisk: \"show something cool\",\n },\n },\n shakespeare: {\n name: \"Shakespearean\",\n description: \"Hark! Verily speaketh in olden tongue.\",\n global: {\n updateAvailableHeader: \"royal notice: update available\",\n updateAvailableTitle: (latest: string, current: string) =>\n `v${latest} hath arrived (current: v${current})`,\n updateAvailableDescription: (command: string) =>\n `Execute \\`${command} update\\` to claim the new vessel.`,\n versionDescription: \"display version of thy vessel\",\n },\n lang: {\n definitionDescription: \"configure thy royal tongue for the CLI\",\n selectPrompt: \"Choose thy preferred dialect, good sir:\",\n updatedSuccess: \"Thy tongue hath been shifted unto\",\n },\n init: {\n description: (value: string) => `forge a noble ${value} enterprise`,\n argDescription: \"the title of thy domain\",\n promptDir: \"Whither shall thy noble enterprise be founded?\",\n dirCreated: \"thy domain hath been wrought successfully.\",\n errors: {\n emptyName: \"Thy directory name cannot be void.\",\n notEmpty: (value: string) =>\n `Thy domain \"${value}\" already exists and is not desolate.`,\n accessError: (value: string) =>\n `Alas, cannot reach \"${value}\". Choose another path.`,\n },\n },\n update: {\n description: \"consult the royal registry for newer designs\",\n optionYes: \"bypass royal inquiry\",\n checkingRegistry: \"consulting the royal registry of npm..\",\n versionStatusHeader: \"royal status of vessels\",\n alreadyUpToDate: \"thy vessel is already of the newest design\",\n alreadyLatestOutro: \"thou art already upon the highest pinnacle\",\n newVersionFound: \"behold! a fairer version hath arrived\",\n confirmMessage: \"dost thou wish to ascend unto this newer realm\",\n skippedOutro: \"very well, thy current state remaineth undisturbed.\",\n installingSpinner: \"raising the sails for\",\n successSpinner: \"ascended\",\n successOutro: \"huzzah! triumphant ascension achieved.\",\n failSpinner: \"alas! the enterprise of updating hath faltered for\",\n unknownError: \"a mysterious woe befell the update.\",\n },\n test: {\n description: \"test the mock trials of the cli\",\n optionFlag: \"display thy banner flag\",\n optionDisk: \"reveal thy hidden relics\",\n },\n },\n pirate: {\n name: \"Pirate\",\n description: \"Ahoy matey! Talk like a salty sea dog.\",\n global: {\n updateAvailableHeader: \"horizon notice: update available\",\n updateAvailableTitle: (latest: string, current: string) =>\n `v${latest} be spotted on the radar (current: v${current})`,\n updateAvailableDescription: (command: string) =>\n `Run \\`${command} update\\` to hoist the new sails, matey!`,\n versionDescription: \"show ship version\",\n },\n lang: {\n definitionDescription: \"set yer course and choose yer tongue, matey\",\n selectPrompt: \"Choose yer preferred tongue, ye scurvy dog:\",\n updatedSuccess: \"Language set to arrr\",\n },\n init: {\n description: (value: string) =>\n `build a brand new ${value} treasure chest`,\n argDescription: \"name of the treasure cove\",\n promptDir: \"Where shall we anchor this new vessel?\",\n dirCreated: \"cove carved out successfully, arrr!\",\n errors: {\n emptyName: \"Yer cove name can't be empty water, matey!\",\n notEmpty: (value: string) =>\n `The cove \"${value}\" is already claimed by another crew!`,\n accessError: (value: string) =>\n `Can't drop anchor at \"${value}\". Pick another spot!`,\n },\n },\n update: {\n description: \"scan the horizon for newer charts\",\n optionYes: \"skip the captain's warning\",\n checkingRegistry: \"scouting the npm horizon..\",\n versionStatusHeader: \"ship status log\",\n alreadyUpToDate: \"yer ship is already seaworthy and up to date\",\n alreadyLatestOutro: \"ye be sailing the newest ship on the seas\",\n newVersionFound: \"treasure spotted on the horizon\",\n confirmMessage: \"hoist the sails and update to the newest chart\",\n skippedOutro: \"update abandoned to Davy Jones' locker.\",\n installingSpinner: \"hoisting new rigging for\",\n successSpinner: \"upgraded\",\n successOutro: \"shiver me timbers, successfully updated!\",\n failSpinner: \"mutiny! failed to update\",\n unknownError: \"kraken attack! unknown update error.\",\n },\n test: {\n description: \"test the cannons of the CLI\",\n optionFlag: \"fly the Jolly Roger flag\",\n optionDisk: \"show treasures from the bilge\",\n },\n },\n} as const;\n\n// Automatically derives LanguageType from the languages object keys\nexport type LanguageType = keyof typeof languages;\n\n// Recursively builds union types of all dot-separated object paths for IntelliSense autocomplete\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 | (string & {}),\n lang: LanguageType = \"english\",\n ...args: any[]\n): string => {\n const langObj = languages[lang] || languages.english;\n const keys = (pathKey as string).split(\".\");\n let current: any = langObj;\n\n for (const k of keys) {\n if (current && typeof current === \"object\" && k in current) {\n current = current[k];\n } else {\n let fallback: any = languages.english;\n for (const fk of keys) {\n if (fallback && typeof fallback === \"object\" && fk in fallback) {\n fallback = fallback[fk];\n } else {\n return pathKey;\n }\n }\n current = fallback;\n break;\n }\n }\n\n // If the value is a function, call it with the provided arguments\n if (typeof current === \"function\") {\n return current(...args);\n }\n\n return typeof current === \"string\" ? current : 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 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 } 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 { 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\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.errors.emptyName\", language);\n }\n\n try {\n const result = await checkDirectory(value);\n\n if (result.exists && !result.isEmpty) {\n return t(\"init.errors.notEmpty\", language, value);\n }\n\n return true;\n } catch {\n return t(\"init.errors.accessError\", 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.promptDir\", language),\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(t(\"init.dirCreated\", language, directoryName));\n\n display.outro({\n title: \"successfully\",\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.definitionDescription\", language))\n .argument(\n \"[language]\",\n \"preferred CLI language (e.g., english, gen-z, shakespeare, pirate)\",\n );\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: `invalid language: \"${command?.args[0]}\"`,\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: \"please use a valid language key (e.g. gen-z).\",\n color: chalk.red,\n symbol: \"error\",\n });\n return;\n }\n } else {\n selectedLang = await select<LanguageType>({\n message: t(\"lang.selectPrompt\", 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(\"lang.updatedSuccess\", selectedLang)} ${languages[selectedLang].name}!`,\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 { 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.description\", language))\n .option(\"-y, --yes\", t(\"update.optionYes\", language));\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.checkingRegistry\", language));\n\n const info = await checkForUpdateFresh(pkg.name, pkg.version);\n\n const renderVersionTree = () => {\n showTree({\n headerTitle: t(\"update.versionStatusHeader\", language),\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(t(\"update.alreadyUpToDate\", language));\n\n console.log();\n renderVersionTree();\n console.log();\n\n display.outro({\n title: `${t(\"update.alreadyLatestOutro\", language)} (v${info.current}).`,\n color: chalk.green,\n symbol: \"success\",\n margin: { top: false },\n });\n\n return;\n }\n\n spinner.succeed(\n `${t(\"update.newVersionFound\", language)} ${symbols.chevron} v${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.confirmMessage\", language)} (v${info.latest})?`,\n default: true,\n });\n\n if (!shouldUpdate) {\n display.outro({\n title: t(\"update.skippedOutro\", language),\n color: chalk.dim,\n symbol: \"info\",\n });\n\n return;\n }\n }\n\n spinner.start(\n `${t(\"update.installingSpinner\", 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.successSpinner\", language)} ${pkg.name} to v${info.latest}`,\n );\n\n display.outro({\n title: t(\"update.successOutro\", language),\n color: chalk.green,\n symbol: \"success\",\n });\n } catch (error) {\n spinner.fail(`${t(\"update.failSpinner\", language)} ${pkg.name}.`);\n\n const message =\n error instanceof Error\n ? error.message\n : t(\"update.unknownError\", language);\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 { 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 console.log();\n\n showTree({\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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"}
|
|
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",
|
|
@@ -42,7 +42,11 @@
|
|
|
42
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",
|