plekta 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +49 -5
- package/index.ts +0 -1
package/README.md
CHANGED
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import e from"chalk";import{Command as t}from"commander";import n from"node:path";import{whichPMRuns as r}from"which-pm-runs";import{confirm as i,input as a}from"@inquirer/prompts";import o from"ora";import{execFile as s}from"node:child_process";import{promisify as c}from"node:util";import l from"node:fs";import u from"node:os";import d from"node:readline";const f={name:`plekta`,version:`0.0.3`,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`,chalk:`^6.0.0`,commander:`^15.0.0`,ora:`^9.4.1`,"which-pm-runs":`^2.0.0`},devDependencies:{"@plekta/tsconfig":`workspace:*`,"@types/bun":`^1.4.3`,"@types/node":`^22.20.2`,tsdown:`0.22.14`}},p={npm:{name:`npm`,installer:`npm install`,runner:`npx`},pnpm:{name:`pnpm`,installer:`pnpm add`,runner:`pnpm dlx`},yarn:{name:`yarn`,installer:`yarn add`,runner:`yarn dlx`},bun:{name:`bun`,installer:`bun add`,runner:`bunx`},nub:{name:`nub`,installer:`nub install`,runner:`nubx`}};function m(e){return/[\\/]bunx-/.test(e)?p.bun:/[\\/]nubx-/.test(e)?p.nub:/[\\/]_npx[\\/]/.test(e)?p.npm:/[\\/]\.pnpm[\\/]dlx|[\\/]pnpm-dlx/.test(e)?p.pnpm:/[\\/]\.yarn[\\/].*dlx|yarn[\\/]dlx-/.test(e)?p.yarn:null}function h(){return m(process.argv[1]??``)??p[r()?.name??``]??p.npm}const g={success:`✔`,error:`✖`,warning:`⚠`,info:`ℹ`,question:`?`,plus:`+`,minus:`-`,multiply:`*`,divide:`/`,arrow:`→`,arrowLeft:`←`,arrowUp:`↑`,arrowDown:`↓`,chevron:`»`,chevronLeft:`«`,chevronUp:`⌃`,chevronDown:`⌄`,branchFirst:`╭─▶`,branch:`├─▶`,branchLast:`╰─▶`,bullet:`•`,dot:`·`,circle:`●`,circleOutline:`○`,square:`■`,squareOutline:`□`,diamond:`◆`,diamondOutline:`◇`,star:`★`,starOutline:`☆`,gear:`⚙`,sparkle:`✦`,sparkleAlt:`✧`,lightning:`⚡`,heart:`♥`,flag:`⚑`,pipe:`│`};function _({command:e,version:t,getCliCommand:n,status:r}){let i=n(),a=process.argv.slice(2),o=a.find(e=>!e.startsWith(`-`))||``,s=a.filter(e=>e.startsWith(`-`)),c=a.filter(e=>!e.startsWith(`-`)),l=[];e?s.forEach(t=>{if(t.startsWith(`-`)&&!t.startsWith(`--`)&&t.length>2)t.slice(1).split(``).forEach(t=>{let n=`-${t}`,r=e.options.find(e=>e.short===n);l.push(r?.long||n)});else{let n=e.options.find(e=>e.short===t||e.long===t);l.push(n?.long||t)}}):l=s,l=[...new Set(l)];let u=c.slice(1),d=[i,o].filter(Boolean).join(` `),f=[d,...u,...l].filter(Boolean).join(` `);return{commandTitle:[r,f,t?`${g.chevron} v${t}`:void 0].filter(Boolean).join(` `),baseCommand:d,fullCommand:f}}function v({name:e,aliases:t=[]}){let r=[e,...t];return function(){let t=process.argv[1]??``,i=n.basename(t).replace(/\.(js|cjs|mjs|exe|cmd|ps1)$/,``);if(m(t)){let{runner:t}=h();return`${t} ${e}`}return r.includes(i)||r.some(e=>process.env._?.endsWith(e))?i:e}}function y(e){let t=v(e);function n({command:e,version:n,status:r}){return _({command:e,version:n,getCliCommand:t,status:r})}return{resolveCommandName:t,createCommandTitle:n}}const{createCommandTitle:b,resolveCommandName:x}=y({name:f.name,aliases:[f.name]});var S=class{command;constructor(e){this.command=e}description(e){return this.command.description(e),this}argument(e,t){return this.command.argument(e,t),this}option(e,t){return this.command.option(e,t),this}requiredOption(e,t){return this.command.requiredOption(e,t),this}action(e){return this.command.action((...t)=>{let n=t.at(-1),r=n.opts(),i=t.slice(0,-1),a={};return n.registeredArguments.forEach((e,t)=>{let n=e.name();n&&(a[n]=i[t])}),e(r,n,a)}),this}};function C(e,t){return new S(e.command(t))}const w=f.name;function T({title:t=w,symbol:n=`chevron`,color:r=e.cyan,margin:i={}}={}){let a={top:!0,bottom:!0,...i},o=r(`${g[n]} ${t}`);a.top&&console.log(),console.log(o),a.bottom&&console.log()}function E({title:t=w,symbol:n=`sparkle`,color:r=e.cyan,exitType:i=0,margin:a={}}={}){let o={top:!0,bottom:!0,...a},s=r(`${g[n]} ${t}`);o.top&&console.log(),console.log(s),o.bottom&&console.log(),process.exit(i)}const D={intro:T,outro:E};var O=class extends Error{code;constructor(e,t){super(t),this.name=`TamioError`,this.code=e}};function k(t){if(t instanceof Error&&t.name===`ExitPromptError`)throw t;let n=t instanceof Error?t.message:String(t);return!(t instanceof O)&&process.env.TAMIO_DEBUG&&console.error(t),D.outro({title:n,color:e.red,symbol:`error`,exitType:1}),process.exit(1)}function A(e=`cyan`){return o({color:e})}const j=()=>({definition:e=>C(e,`init`).description(`scaffold a new ${f.name} project`).argument(`[name]`,`name of the project directory (defaults to the current folder)`),handler:async(t,n)=>{let{commandTitle:r}=b({command:n,version:f.version});D.intro({title:r,color:e.cyan});let i=A(`cyan`),o=n?.args[0];try{let t=o||await a({message:`Where should your project live?`,default:`${f.name}-dApp`,validate:e=>e.trim()?!0:`directory name cannot be empty.`});i.succeed(`${e.cyan(t)} created successfully`),D.outro({title:r,color:e.magenta})}catch(e){i.stop(),k(e)}}}),M=()=>({definition:e=>C(e,`test`).description(`testing the cli command`).option(`-f, --flag`,`show flag in display`).option(`-d, --disk`,`show something`),handler:async(t,n)=>{let{commandTitle:r}=b({command:n,version:f.version});D.intro({title:r,color:e.magenta}),console.log({options:t}),D.outro({title:r,color:e.magenta})}});function N(e,t){let n=e=>e.replace(/^v/,``).split(`-`)[0].split(`.`).map(Number),[r,i,a]=n(e),[o,s,c]=n(t);return r===o?i===s?(a??0)>(c??0):(i??0)>(s??0):(r??0)>(o??0)}async function P(e){let t=new AbortController,n=setTimeout(()=>t.abort(),3e3);try{let n=await fetch(`https://registry.npmjs.org/${e}/latest`,{signal:t.signal,headers:{Accept:`application/json`}});return n.ok?(await n.json()).version??null:null}catch{return null}finally{clearTimeout(n)}}function F(e){return n.join(u.homedir(),`.config`,e,`.update-check.json`)}function I(e,t){try{let n=F(e);if(!l.existsSync(n))return null;let r=JSON.parse(l.readFileSync(n,`utf8`));return Date.now()-r.checkedAt>864e5||r.info.current!==t?null:r}catch{return null}}function L(e,t){try{let r=F(e);l.mkdirSync(n.dirname(r),{recursive:!0}),l.writeFileSync(r,JSON.stringify({checkedAt:Date.now(),info:t}))}catch{}}async function R(e,t,n=e){let r=I(n,t);if(r)return r.info;let i=await P(e),a=i?{current:t,latest:i,outdated:N(i,t)}:{current:t,latest:t,outdated:!1};return L(n,a),a}async function z(e,t,n=e){let r=await P(e),i=r?{current:t,latest:r,outdated:N(r,t)}:{current:t,latest:t,outdated:!1};return L(n,i),i}function B(e,t){let n=e.split(` `),r=[],i=``;for(let e of n){let n=i?`${i} ${e}`:e;n.length>t&&i?(r.push(i),i=e):i=n}return i&&r.push(i),r}function V({headerTitle:t,items:n,color:r=e.cyan,margin:{top:i=!1,bottom:a=!1}={}}){if(n.length===0)return;let o=Math.max((process.stdout.columns||80)-10,20);i&&console.log(),console.log(`${r(g.branchFirst)} ${t}`),console.log(`${r(g.pipe)}`),n.forEach((t,i)=>{let s=i===n.length-1,c=s?g.branchLast:g.branch,l=B(t.title,o);console.log(`${r(c)} ${r(l[0])}`);let u=s?` `:g.pipe;for(let e of l.slice(1))console.log(`${r(u)} ${r(e)}`);if(t.description){let e=B(t.description,o);for(let t of e)console.log(`${r(u)} ${t}`)}if(t.details&&t.details.length>0)for(let n of t.details)console.log(`${r(u)} ${e.dim(n)}`);a&&console.log()})}const H=c(s),U=()=>({definition:e=>C(e,`update`).description(`check and update to newest version`).option(`-y, --yes`,`skip update confirmation`),handler:async(t,n)=>{let r=h(),{commandTitle:a}=b({command:n,version:f.version});D.intro({title:a,color:e.cyan,symbol:`gear`});let o=A(`cyan`);o.start(`checking npm registry..`);let s=await z(f.name,f.version),c=()=>{V({headerTitle:`version status`,items:[{title:`latest: v${s.latest}`,description:`installed: v${s.current}`}],color:s.outdated?e.yellow:e.cyan})};if(!s.outdated)o.succeed(`already up to date`),console.log(),c(),console.log(),D.outro({title:`you're on the latest version (v${s.current}).`,color:e.green,symbol:`success`,margin:{top:!1}});else if(o.succeed(`new version found ${g.chevron} v${s.latest}`),console.log(),c(),console.log(),!t.yes&&!await i({message:`update to the latest version (v${s.latest})?`,default:!0}))D.outro({title:`update skipped.`,color:e.dim,symbol:`info`});else{o.start(`installing ${f.name}@${s.latest}..`);try{let[t,...n]=r.installer.split(` `);await H(t,[...n,`-g`,`${f.name}@${s.latest}`]),o.succeed(`updated ${f.name} to v${s.latest}`),D.outro({title:`successfully updated.`,color:e.green,symbol:`success`})}catch(t){o.fail(`failed to update ${f.name}.`);let n=t instanceof Error?t.message:`unknown update error.`;D.outro({title:n,color:e.red,symbol:`error`,exitType:1})}}}}),W={init:{register(e){j().definition(e).action((e,t)=>j().handler(e,t))}},test:{register(e){M().definition(e).action((e,t)=>M().handler(e,t))}},update:{register(e){U().definition(e).action((e,t)=>U().handler(e,t))}}};function G(e){return e instanceof Error&&(e.name===`ExitPromptError`||e.message.includes(`force closed`))}function K(t){let n=A();n.isSpinning&&n.stopAndPersist(),process.stdout.write(`\x1B[?25h`),console.log(),D.outro({title:t||`operation cancelled.`,color:e.red,symbol:`error`})}let q=!1;function J(e,t){return async(...n)=>{let r=!1,i=()=>{r||(r=!0,K(t),process.exit(130))};process.once(`SIGINT`,i);let a;process.stdin.isTTY&&(q||=(d.emitKeypressEvents(process.stdin),!0),a=(e,t)=>{t?.ctrl&&t.name===`c`&&i()},process.stdin.on(`keypress`,a));try{await e(...n)}catch(e){if(!G(e))throw e;r=!0,K(t),process.exit(0)}finally{process.removeListener(`SIGINT`,i),a&&process.stdin.removeListener(`keypress`,a)}}}const Y=process.argv[2],X=/* @__PURE__ */ new Set([`update`,`-h`,`--help`]);async function Z(){X.has(Y)||await Promise.race([(async()=>{let t=x(),n=await R(f.name,f.version);n.outdated&&(console.log(),V({headerTitle:`update available`,items:[{title:`v${n.latest} is now available (current: v${n.current})`,description:`Run \`${t} update\` to upgrade to the latest version.`}],color:e.yellow}))})(),new Promise(e=>setTimeout(e,1500))]);let n=new t;n.name(f.name).description(f.description).version(f.version,`-v, --version`,`show version`),n.configureOutput({writeOut:e=>{if(e.trim()===f.version){let e=process.version;process.stdout.write(`v${f.version}\n${`${g.chevron} node ${e} (from PATH)`}\n`)}else process.stdout.write(e)}}),Object.values(W).forEach(e=>{e.register(n)}),await J(async()=>{await n.parseAsync(process.argv)})()}Z();export{};
|
|
3
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["packageJson","chalk","path","ora","fs","os","readline","pkg","\"name\"","\"email\"","\"url\"","\"types\"","\"import\"","\"plekta\"","\"node\"","\"build\"","\"start\"","\"lint\"","\"clean\"","\"prepublishOnly\"","\"typecheck\"","\"chalk\"","\"commander\"","\"ora\"","\"tsdown\"","MANAGERS","detectRunnerFromPath","executable","getPackageManager","whichPMRuns","symbols","commandTitle","cliCommand","getCliCommand","args","action","arg","rawFlags","positionalArgs","flags","command","flag","shortFlag","char","optDef","opt","commandArgs","baseCommand","fullCommand","status","version","createCliCommandResolver","commandNames","name","aliases","execName","runner","createCli","resolveCommandName","options","createCommandTitle","TypedCommand","text","description","positionalValues","argumentValues","argument","index","handler","typedCommand","parent","pkgTitle","intro","resolvedMargin","margin","heading","color","symbol","title","outro","exitType","display","TamioError","message","code","exitWithError","error","createSpinner","initCommand","program","spinner","dir","directoryName","input","value","testCommand","isNewer","clean","v","aMaj","aMin","aPat","latest","bMaj","bMin","bPat","current","fetchLatestVersion","ctrl","timer","res","packageName","cachePath","serviceName","readCache","file","entry","currentVersion","writeCache","checkForUpdate","cached","info","checkForUpdateFresh","wrap","words","lines","word","next","width","showTree","items","top","headerTitle","isLast","branchIcon","titleLines","item","continuationPipe","line","descLines","detail","bottom","execFileAsync","promisify","execFile","updateCommand","pm","renderVersionTree","confirm","commandHandlers","isPromptCancellation","printCancelled","fallback","keypressPatched","onCancel","handled","cancel","onKeypress","key","operation","invoked","SKIP_PASSIVE_CHECK","main","resolve","Command","str","nodeVersion"],"sources":["../package.json","../src/config/package.ts","../src/runtime/package-manager.ts","../src/ui/symbols.ts","../src/cli/command.ts","../src/cli/resolver.ts","../src/cli/index.ts","../src/cli/builder.ts","../src/ui/display.ts","../src/cli/errors.ts","../src/ui/spinner.ts","../src/commands/handlers/init.helper.ts","../src/commands/handlers/test.handler.ts","../src/runtime/update-checker.ts","../src/ui/tree.ts","../src/commands/handlers/update.handler.ts","../src/commands/index.ts","../src/runtime/cancellation.ts","../src/index.ts"],"sourcesContent":["","import packageJson from \"../../package.json\";\n\nexport const pkg = { ...packageJson };\n","import { whichPMRuns } from \"which-pm-runs\";\nimport type { PackageManagerInfo } from \"../types\";\n\nexport const MANAGERS: Record<string, PackageManagerInfo> = {\n npm: {\n name: \"npm\",\n installer: \"npm install\",\n runner: \"npx\",\n },\n pnpm: {\n name: \"pnpm\",\n installer: \"pnpm add\",\n runner: \"pnpm dlx\",\n },\n yarn: {\n name: \"yarn\",\n installer: \"yarn add\",\n runner: \"yarn dlx\",\n },\n bun: {\n name: \"bun\",\n installer: \"bun add\",\n runner: \"bunx\",\n },\n nub: {\n name: \"nub\",\n installer: \"nub install\",\n runner: \"nubx\",\n },\n};\n\nexport function detectRunnerFromPath(\n executable: string,\n): PackageManagerInfo | null {\n if (/[\\\\/]bunx-/.test(executable)) return MANAGERS.bun;\n if (/[\\\\/]nubx-/.test(executable)) return MANAGERS.nub;\n if (/[\\\\/]_npx[\\\\/]/.test(executable)) return MANAGERS.npm;\n\n if (/[\\\\/]\\.pnpm[\\\\/]dlx|[\\\\/]pnpm-dlx/.test(executable)) {\n return MANAGERS.pnpm;\n }\n\n if (/[\\\\/]\\.yarn[\\\\/].*dlx|yarn[\\\\/]dlx-/.test(executable)) {\n return MANAGERS.yarn;\n }\n\n return null;\n}\n\nexport function getPackageManager(): PackageManagerInfo {\n const executable = process.argv[1] ?? \"\";\n\n return (\n detectRunnerFromPath(executable) ??\n MANAGERS[whichPMRuns()?.name ?? \"\"] ??\n MANAGERS.npm\n );\n}\n","export const symbols = {\n // Status\n success: \"✔\",\n error: \"✖\",\n warning: \"⚠\",\n info: \"ℹ\",\n question: \"?\",\n\n // Operators\n plus: \"+\",\n minus: \"-\",\n multiply: \"*\",\n divide: \"/\",\n\n // Navigation / actions\n arrow: \"→\",\n arrowLeft: \"←\",\n arrowUp: \"↑\",\n arrowDown: \"↓\",\n chevron: \"»\",\n chevronLeft: \"«\",\n chevronUp: \"⌃\",\n chevronDown: \"⌄\",\n\n // Tree / branches\n branchFirst: \"╭─▶\",\n branch: \"├─▶\",\n branchLast: \"╰─▶\",\n\n // Common UI\n bullet: \"•\",\n dot: \"·\",\n circle: \"●\",\n circleOutline: \"○\",\n square: \"■\",\n squareOutline: \"□\",\n diamond: \"◆\",\n diamondOutline: \"◇\",\n star: \"★\",\n starOutline: \"☆\",\n\n // Development / tools\n gear: \"⚙\",\n\n // Misc\n sparkle: \"✦\",\n sparkleAlt: \"✧\",\n lightning: \"⚡\",\n heart: \"♥\",\n flag: \"⚑\",\n\n // Others\n pipe: \"│\",\n} as const;\n\nexport type SymbolType = keyof typeof symbols;\n","import type { CommandContext, CommandTitleOptions } from \"../types\";\nimport { symbols } from \"../ui/symbols\";\n\nexport function commandTitle({\n command,\n version,\n getCliCommand,\n status,\n}: CommandTitleOptions): CommandContext {\n const cliCommand = getCliCommand();\n const args = process.argv.slice(2);\n\n // Get the command action (first positional argument).\n const action = args.find((arg) => !arg.startsWith(\"-\")) || \"\";\n\n const rawFlags = args.filter((arg) => arg.startsWith(\"-\"));\n const positionalArgs = args.filter((arg) => !arg.startsWith(\"-\"));\n\n let flags: string[] = [];\n\n if (command) {\n rawFlags.forEach((flag) => {\n if (flag.startsWith(\"-\") && !flag.startsWith(\"--\") && flag.length > 2) {\n // Expand combined short flags, e.g. -abc => -a -b -c.\n const chars = flag.slice(1).split(\"\");\n\n chars.forEach((char) => {\n const shortFlag = `-${char}`;\n const optDef = command.options.find((opt) => opt.short === shortFlag);\n\n flags.push(optDef?.long || shortFlag);\n });\n } else {\n const optDef = command.options.find(\n (opt) => opt.short === flag || opt.long === flag,\n );\n\n flags.push(optDef?.long || flag);\n }\n });\n } else {\n flags = rawFlags;\n }\n\n flags = [...new Set(flags)];\n\n // Include positional arguments after the command action.\n const commandArgs = positionalArgs.slice(1);\n\n const baseCommand = [cliCommand, action].filter(Boolean).join(\" \");\n\n const fullCommand = [baseCommand, ...commandArgs, ...flags]\n .filter(Boolean)\n .join(\" \");\n\n const title = [\n status,\n fullCommand,\n version ? `${symbols.chevron} v${version}` : undefined,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return {\n commandTitle: title,\n baseCommand,\n fullCommand,\n };\n}\n","import path from \"node:path\";\n\nimport {\n detectRunnerFromPath,\n getPackageManager,\n} from \"../runtime/package-manager\";\nimport type { CliCommandOptions, CommandTitleOptions } from \"../types\";\nimport { commandTitle } from \"./command\";\n\nfunction createCliCommandResolver({ name, aliases = [] }: CliCommandOptions) {\n const commandNames = [name, ...aliases];\n\n return function getCliCommand(): string {\n const executable = process.argv[1] ?? \"\";\n\n const execName = path\n .basename(executable)\n .replace(/\\.(js|cjs|mjs|exe|cmd|ps1)$/, \"\");\n\n if (detectRunnerFromPath(executable)) {\n const { runner } = getPackageManager();\n return `${runner} ${name}`;\n }\n\n if (\n commandNames.includes(execName) ||\n commandNames.some((command) => process.env._?.endsWith(command))\n ) {\n return execName;\n }\n\n return name;\n };\n}\n\nexport function createCli(options: CliCommandOptions) {\n const resolveCommandName = createCliCommandResolver(options);\n\n function createCommandTitle({\n command,\n version,\n status,\n }: Omit<CommandTitleOptions, \"getCliCommand\">) {\n return commandTitle({\n command,\n version,\n getCliCommand: resolveCommandName,\n status,\n });\n }\n\n return { resolveCommandName, createCommandTitle };\n}\n","import { pkg } from \"../config/package\";\nimport { createCli } from \"./resolver\";\n\nexport const { createCommandTitle, resolveCommandName } = createCli({\n name: pkg.name,\n aliases: [pkg.name],\n});\n","/** biome-ignore-all lint/complexity/noBannedTypes: Required for generic defaults */\n\nimport type { Argument, Command } from \"commander\";\n\n// ============================================================\n// Utility Types\n// ============================================================\n\n/**\n * Remove leading and trailing spaces from a string literal.\n *\n * Example:\n * \" package \" -> \"package\"\n */\ntype TrimSpaces<S extends string> = S extends ` ${infer Rest}`\n ? TrimSpaces<Rest>\n : S extends `${infer Rest} `\n ? TrimSpaces<Rest>\n : S;\n\n/**\n * Extract a clean name from a Commander option or argument definition.\n *\n * Examples:\n * \"package <name>\" -> \"package\"\n * \"package [name]\" -> \"package\"\n * \"output, --output <path>\" -> \"output\"\n */\ntype CleanName<S extends string> = S extends `${infer Name} <${string}`\n ? TrimSpaces<Name>\n : S extends `${infer Name} [${string}`\n ? TrimSpaces<Name>\n : S extends `${infer Name},${string}`\n ? TrimSpaces<Name>\n : TrimSpaces<S>;\n\n/**\n * Capitalize the first character of a string.\n *\n * Example:\n * \"color\" -> \"Color\"\n */\ntype CapitalizeFirst<S extends string> = S extends `${infer First}${infer Rest}`\n ? `${Uppercase<First>}${Rest}`\n : S;\n\n/**\n * Convert a hyphenated string into camelCase.\n *\n * Examples:\n * \"dry-run\" -> \"dryRun\"\n * \"template-engine\" -> \"templateEngine\"\n */\ntype CamelCase<S extends string> = S extends `${infer Head}-${infer Tail}`\n ? `${Head}${CapitalizeFirst<CamelCase<Tail>>}`\n : S;\n\n// ============================================================\n// Option Type Inference\n// ============================================================\n\n/**\n * Extract the normalized option name from Commander flags.\n *\n * Examples:\n * \"--json\" -> \"json\"\n * \"-f, --flag\" -> \"flag\"\n * \"--no-color\" -> \"noColor\"\n * \"--dry-run\" -> \"dryRun\"\n * \"-o, --output <path>\" -> \"output\"\n */\ntype ExtractLongName<S extends string> = S extends `${string}--no-${infer Rest}`\n ? `no${CapitalizeFirst<CamelCase<CleanName<Rest>>>}`\n : S extends `${string}--${infer Rest}`\n ? CamelCase<CleanName<Rest>>\n : never;\n\n/**\n * Extract a short option name when no long option exists.\n *\n * Example:\n * \"-v\" -> \"v\"\n */\ntype ExtractShortName<S extends string> = S extends `-${infer Rest}`\n ? CleanName<Rest>\n : never;\n\n/**\n * Determine the option property name.\n *\n * Prefer long names when available; otherwise, use short names.\n */\ntype LongOptionName<Flags extends string> =\n ExtractLongName<Flags> extends never\n ? ExtractShortName<Flags>\n : ExtractLongName<Flags>;\n\n/**\n * Check whether an option requires a value.\n *\n * Example:\n * \"--output <path>\" -> true\n */\ntype HasRequiredValue<Flags extends string> =\n Flags extends `${string}<${string}>${string}` ? true : false;\n\n/**\n * Check whether an option accepts an optional value.\n *\n * Example:\n * \"--format [type]\" -> true\n */\ntype HasOptionalValue<Flags extends string> =\n Flags extends `${string}[${string}]${string}` ? true : false;\n\n/**\n * Check whether an option is negated.\n *\n * Example:\n * \"--no-color\" -> true\n */\ntype IsNegatedOption<Flags extends string> =\n Flags extends `${string}--no-${string}` ? true : false;\n\n/**\n * Infer the TypeScript value type of an option.\n *\n * Examples:\n * \"--json\" -> boolean\n * \"--output <path>\" -> string\n * \"--format [type]\" -> string | boolean\n * \"--no-color\" -> boolean\n */\ntype InferOptionValue<Flags extends string> =\n IsNegatedOption<Flags> extends true\n ? boolean\n : HasRequiredValue<Flags> extends true\n ? string\n : HasOptionalValue<Flags> extends true\n ? string | boolean\n : boolean;\n\n/**\n * Infer an option property from its Commander flags.\n *\n * Required-value options become required properties.\n * Boolean and optional-value options become optional properties.\n */\ntype InferOption<Flags extends string> =\n IsNegatedOption<Flags> extends true\n ? { [K in LongOptionName<Flags>]?: boolean }\n : HasRequiredValue<Flags> extends true\n ? { [K in LongOptionName<Flags>]: string }\n : { [K in LongOptionName<Flags>]?: InferOptionValue<Flags> };\n\n/**\n * Combine inferred option types into a readable object type.\n */\ntype Simplify<T> = {\n [K in keyof T]: T[K];\n} & {};\n\n// ============================================================\n// Positional Argument Type Inference\n// ============================================================\n\n/**\n * Extract the name of a Commander positional argument.\n *\n * Examples:\n * \"<package>\" -> \"package\"\n * \"[package]\" -> \"package\"\n */\ntype ArgumentName<Arg extends string> = Arg extends `<${infer Name}>`\n ? Name\n : Arg extends `[${infer Name}]`\n ? Name\n : never;\n\n/**\n * Determine whether a positional argument is required.\n *\n * Examples:\n * \"<package>\" -> true\n * \"[package]\" -> false\n */\ntype IsRequiredArgument<Arg extends string> = Arg extends `<${string}>`\n ? true\n : false;\n\n/**\n * Infer the object property associated with an argument.\n *\n * Required arguments become required string properties.\n * Optional arguments become optional string properties.\n */\ntype InferArgument<Arg extends string> =\n IsRequiredArgument<Arg> extends true\n ? { [K in ArgumentName<Arg>]: string }\n : { [K in ArgumentName<Arg>]?: string };\n\n// ============================================================\n// Typed Command\n// ============================================================\n\n/**\n * A typed wrapper around Commander.Command.\n *\n * Options:\n * Contains inferred option types.\n *\n * Arguments:\n * Contains inferred positional argument types.\n *\n * This wrapper preserves type information when chaining methods.\n */\nexport class TypedCommand<\n Options extends object = {},\n Arguments extends object = {},\n> {\n /**\n * Create a typed command around an existing Commander command.\n */\n constructor(public readonly command: Command) {}\n\n /**\n * Set the command description.\n *\n * Example:\n * .description(\"Manage package versions\")\n */\n description(text: string): this {\n this.command.description(text);\n\n return this;\n }\n\n /**\n * Register a positional argument and infer its TypeScript type.\n *\n * Required argument:\n * .argument(\"<package>\", \"Package name\")\n *\n * Inferred type:\n * { package: string }\n *\n * Optional argument:\n * .argument(\"[package]\", \"Package name\")\n *\n * Inferred type:\n * { package?: string }\n */\n argument<const Arg extends string>(\n name: Arg,\n description?: string,\n ): TypedCommand<Options, Simplify<Arguments & InferArgument<Arg>>> {\n this.command.argument(name, description);\n\n return this as unknown as TypedCommand<\n Options,\n Simplify<Arguments & InferArgument<Arg>>\n >;\n }\n\n /**\n * Register an option and infer its TypeScript type.\n *\n * Example:\n * .option(\"-j, --json\", \"Output JSON\")\n *\n * Inferred type:\n * { json?: boolean }\n *\n * Value option:\n * .option(\"-o, --output <path>\", \"Output path\")\n *\n * Inferred type:\n * { output: string }\n */\n option<const Flags extends string>(\n flags: Flags,\n description?: string,\n ): TypedCommand<Simplify<Options & InferOption<Flags>>, Arguments> {\n this.command.option(flags, description);\n\n return this as unknown as TypedCommand<\n Simplify<Options & InferOption<Flags>>,\n Arguments\n >;\n }\n\n /**\n * Register a required option and infer its TypeScript type.\n *\n * Example:\n * .requiredOption(\"-t, --token <token>\", \"API token\")\n *\n * Inferred type:\n * { token: string }\n *\n * Commander will require the option when executing the command.\n */\n requiredOption<const Flags extends string>(\n flags: Flags,\n description?: string,\n ): TypedCommand<Simplify<Options & InferOption<Flags>>, Arguments> {\n this.command.requiredOption(flags, description);\n\n return this as unknown as TypedCommand<\n Simplify<Options & InferOption<Flags>>,\n Arguments\n >;\n }\n\n /**\n * Register the command action handler.\n *\n * The handler receives:\n *\n * options:\n * Parsed Commander options, with inferred TypeScript types.\n *\n * command:\n * The underlying Commander command instance.\n *\n * arguments_:\n * Positional arguments mapped to their declared names.\n *\n * Commander passes positional argument values to the action handler\n * before the Command instance. We use the registered argument\n * definitions to map those values to named properties.\n */\n action(\n handler: (\n options: Options,\n command: Command,\n arguments_: Arguments,\n ) => void | Promise<void>,\n ): this {\n this.command.action((...args: unknown[]) => {\n // Commander passes the command instance as the final argument.\n const command = args.at(-1) as Command;\n\n // Retrieve the parsed options from Commander.\n const options = command.opts() as Options;\n\n // Positional values precede the command instance.\n const positionalValues = args.slice(0, -1);\n\n // Build the named argument object.\n const argumentValues: Record<string, unknown> = {};\n\n const declaredArguments: readonly Argument[] =\n command.registeredArguments;\n\n declaredArguments.forEach((argument, index) => {\n const name = argument.name();\n\n if (name) {\n argumentValues[name] = positionalValues[index];\n }\n });\n\n // Invoke the user's handler with inferred options and arguments.\n return handler(options, command, argumentValues as Arguments);\n });\n\n return this;\n }\n}\n\n// ============================================================\n// Command Factory\n// ============================================================\n\n/**\n * Create a typed subcommand under a parent Commander command.\n *\n * Example:\n * const versions = typedCommand(program, \"versions\");\n */\nexport function typedCommand(parent: Command, name: string): TypedCommand {\n return new TypedCommand(parent.command(name));\n}\n\n// ============================================================\n// Type Extraction Helpers\n// ============================================================\n\n/**\n * Extract inferred options from a TypedCommand instance.\n *\n * Example:\n * type Options = InferCommandOptions<typeof versions>;\n */\nexport type InferCommandOptions<T> =\n T extends TypedCommand<infer Options, object> ? Options : never;\n\n/**\n * Extract inferred positional arguments from a TypedCommand instance.\n *\n * Example:\n * type Arguments = InferCommandArguments<typeof versions>;\n */\nexport type InferCommandArguments<T> =\n T extends TypedCommand<object, infer Arguments> ? Arguments : never;\n","import chalk from \"chalk\";\nimport { pkg } from \"../config/package\";\nimport type { DisplayProps } from \"../types\";\nimport { symbols } from \"./symbols\";\n\nconst pkgTitle = pkg.name;\n\nfunction intro({\n title = pkgTitle,\n symbol = \"chevron\",\n color = chalk.cyan,\n margin = {},\n}: DisplayProps = {}) {\n const resolvedMargin = {\n top: true,\n bottom: true,\n ...margin,\n };\n\n const heading = color(`${symbols[symbol]} ${title}`);\n\n if (resolvedMargin.top) console.log();\n console.log(heading);\n if (resolvedMargin.bottom) console.log();\n}\n\nfunction outro({\n title = pkgTitle,\n symbol = \"sparkle\",\n color = chalk.cyan,\n exitType = 0,\n margin = {},\n}: DisplayProps = {}) {\n const resolvedMargin = {\n top: true,\n bottom: true,\n ...margin,\n };\n\n const heading = color(`${symbols[symbol]} ${title}`);\n\n if (resolvedMargin.top) console.log();\n console.log(heading);\n if (resolvedMargin.bottom) console.log();\n\n process.exit(exitType);\n}\n\nexport const display = { intro, outro };\n","import chalk from \"chalk\";\nimport type { TamioErrorCode } from \"../types\";\nimport { display } from \"../ui/display\";\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 ora, { type Color, type Ora } from \"ora\";\n\nexport function createSpinner(color: Color = \"cyan\"): Ora {\n return ora({ color });\n}\n","import { input } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { createCommandTitle } from \"../../cli\";\nimport { type InferCommandOptions, typedCommand } from \"../../cli/builder\";\nimport { exitWithError } from \"../../cli/errors\";\nimport { pkg } from \"../../config/package\";\nimport { display } from \"../../ui/display\";\nimport { createSpinner } from \"../../ui/spinner\";\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(\n \"[name]\",\n \"name of the project directory (defaults to the current folder)\",\n );\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 const dir = command?.args[0];\n\n try {\n const directoryName =\n dir ||\n (await input({\n message: \"Where should your project live?\",\n default: `${pkg.name}-dApp`,\n validate: (value) => {\n if (!value.trim()) return \"directory name cannot be empty.\";\n return true;\n },\n }));\n\n spinner.succeed(`${chalk.cyan(directoryName)} created successfully`);\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 chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { createCommandTitle } from \"../../cli\";\nimport { type InferCommandOptions, typedCommand } from \"../../cli/builder\";\nimport { pkg } from \"../../config/package\";\nimport { display } from \"../../ui/display\";\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 fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nconst REGISTRY = \"https://registry.npmjs.org\";\nconst TIMEOUT_MS = 3000;\nconst CACHE_TTL_MS = 1000 * 60 * 60 * 24; // 24h\n\nexport interface UpdateInfo {\n current: string;\n latest: string;\n outdated: boolean;\n}\n\nfunction isNewer(latest: string, current: string): boolean {\n const clean = (v: string) =>\n v.replace(/^v/, \"\").split(\"-\")[0].split(\".\").map(Number);\n const [aMaj, aMin, aPat] = clean(latest);\n const [bMaj, bMin, bPat] = clean(current);\n\n if (aMaj !== bMaj) return (aMaj ?? 0) > (bMaj ?? 0);\n if (aMin !== bMin) return (aMin ?? 0) > (bMin ?? 0);\n return (aPat ?? 0) > (bPat ?? 0);\n}\n\nasync function fetchLatestVersion(packageName: string): Promise<string | null> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), TIMEOUT_MS);\n\n try {\n const res = await fetch(`${REGISTRY}/${packageName}/latest`, {\n signal: ctrl.signal,\n headers: { Accept: \"application/json\" },\n });\n\n if (!res.ok) return null;\n\n const data = (await res.json()) as { version?: string };\n return data.version ?? null;\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction cachePath(serviceName: string): string {\n return path.join(os.homedir(), \".config\", serviceName, \".update-check.json\");\n}\n\ninterface CacheEntry {\n checkedAt: number;\n info: UpdateInfo;\n}\n\nfunction readCache(\n serviceName: string,\n currentVersion: string,\n): CacheEntry | null {\n try {\n const file = cachePath(serviceName);\n if (!fs.existsSync(file)) return null;\n\n const entry = JSON.parse(fs.readFileSync(file, \"utf8\")) as CacheEntry;\n\n if (Date.now() - entry.checkedAt > CACHE_TTL_MS) return null;\n\n // The cache is only valid for the version it was recorded against. If\n // the running binary's version has changed since (e.g. the user just\n // ran `binary update`), the cached current/outdated fields are stale even\n // though the timestamp hasn't expired — treat it as a miss.\n if (entry.info.current !== currentVersion) return null;\n\n return entry;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(serviceName: string, info: UpdateInfo): void {\n try {\n const file = cachePath(serviceName);\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(\n file,\n JSON.stringify({ checkedAt: Date.now(), info } satisfies CacheEntry),\n );\n } catch {\n /* cache write is best-effort */\n }\n}\n\n/**\n * Check whether the running package is outdated. Results are cached for\n * 24h under ~/.config/<serviceName>/.update-check.json, but the cache is\n * invalidated early if the running version no longer matches what was\n * cached (e.g. right after `binary update`). Never throws.\n */\nexport async function checkForUpdate(\n packageName: string,\n currentVersion: string,\n serviceName: string = packageName,\n): Promise<UpdateInfo> {\n const cached = readCache(serviceName, currentVersion);\n if (cached) return cached.info;\n\n const latest = await fetchLatestVersion(packageName);\n\n const info: UpdateInfo = latest\n ? {\n current: currentVersion,\n latest,\n outdated: isNewer(latest, currentVersion),\n }\n : { current: currentVersion, latest: currentVersion, outdated: false };\n\n writeCache(serviceName, info);\n\n return info;\n}\n\n/** Force a fresh check, bypassing the cache. */\nexport async function checkForUpdateFresh(\n packageName: string,\n currentVersion: string,\n serviceName: string = packageName,\n): Promise<UpdateInfo> {\n const latest = await fetchLatestVersion(packageName);\n\n const info: UpdateInfo = latest\n ? {\n current: currentVersion,\n latest,\n outdated: isNewer(latest, currentVersion),\n }\n : { current: currentVersion, latest: currentVersion, outdated: false };\n\n writeCache(serviceName, info);\n\n return info;\n}\n","import chalk, { type ChalkInstance } from \"chalk\";\nimport { symbols } from \"./symbols\";\n\nexport interface TreeItem {\n title: string;\n description?: string;\n details?: string[];\n}\n\nexport interface ShowTreeOptions {\n headerTitle: string;\n items: TreeItem[];\n margin?: {\n top?: boolean;\n bottom?: boolean;\n };\n}\n\ntype ColorFunction = ChalkInstance | ((text: string) => string);\n\nfunction wrap(text: string, width: number): string[] {\n const words = text.split(\" \");\n const lines: string[] = [];\n let current = \"\";\n\n for (const word of words) {\n const next = current ? `${current} ${word}` : word;\n\n if (next.length > width && current) {\n lines.push(current);\n current = word;\n } else {\n current = next;\n }\n }\n\n if (current) lines.push(current);\n\n return lines;\n}\n\n/**\n * Generic tree renderer for structured terminal outputs.\n */\nexport function showTree({\n headerTitle,\n items,\n color = chalk.cyan,\n margin: { top = false, bottom = false } = {},\n}: ShowTreeOptions & { color?: ColorFunction }) {\n if (items.length === 0) return;\n\n const width = Math.max((process.stdout.columns || 80) - 10, 20);\n\n // Margin top\n if (top) console.log();\n\n console.log(`${color(symbols.branchFirst)} ${headerTitle}`);\n console.log(`${color(symbols.pipe)}`);\n\n items.forEach((item, index) => {\n const isLast = index === items.length - 1;\n const branchIcon = isLast ? symbols.branchLast : symbols.branch;\n\n const titleLines = wrap(item.title, width);\n\n // First line of the item\n console.log(`${color(branchIcon)} ${color(titleLines[0])}`);\n\n // Wrapped title lines\n const continuationPipe = isLast ? \" \" : symbols.pipe;\n for (const line of titleLines.slice(1)) {\n console.log(`${color(continuationPipe)} ${color(line)}`);\n }\n\n // Description text\n if (item.description) {\n const descLines = wrap(item.description, width);\n for (const line of descLines) {\n console.log(`${color(continuationPipe)} ${line}`);\n }\n }\n\n // Additional details (e.g. API keys or extra metadata)\n if (item.details && item.details.length > 0) {\n for (const detail of item.details) {\n console.log(`${color(continuationPipe)} ${chalk.dim(detail)}`);\n }\n }\n\n // Margin bottom\n if (bottom) console.log();\n });\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { confirm } from \"@inquirer/prompts\";\nimport chalk from \"chalk\";\nimport type { Command } from \"commander\";\nimport { createCommandTitle } from \"../../cli\";\nimport { type InferCommandOptions, typedCommand } from \"../../cli/builder\";\nimport { pkg } from \"../../config/package\";\nimport { getPackageManager } from \"../../runtime/package-manager\";\nimport { checkForUpdateFresh } from \"../../runtime/update-checker\";\nimport { display } from \"../../ui/display\";\nimport { createSpinner } from \"../../ui/spinner\";\nimport { symbols } from \"../../ui/symbols\";\nimport { showTree } from \"../../ui/tree\";\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 readline from \"node:readline\";\nimport chalk from \"chalk\";\nimport { display } from \"../ui/display\";\nimport { createSpinner } from \"../ui/spinner\";\n\nfunction isPromptCancellation(error: unknown): boolean {\n return (\n error instanceof Error &&\n (error.name === \"ExitPromptError\" || error.message.includes(\"force closed\"))\n );\n}\n\nfunction printCancelled(fallback?: string) {\n const spinner = createSpinner();\n\n if (spinner.isSpinning) {\n spinner.stopAndPersist();\n }\n\n process.stdout.write(\"\\u001B[?25h\");\n\n console.log();\n display.outro({\n title: fallback || \"operation cancelled.\",\n color: chalk.red,\n symbol: \"error\",\n });\n}\n\nlet keypressPatched = false;\n\nexport function onCancel<T extends unknown[]>(\n operation: (...args: T) => Promise<unknown>,\n fallback?: string,\n) {\n return async (...args: T): Promise<void> => {\n let handled = false;\n\n const cancel = () => {\n if (handled) return;\n handled = true;\n\n printCancelled(fallback);\n process.exit(130); // 128 + SIGINT(2)\n };\n\n // cooked stdin: the terminal generates a real SIGINT\n process.once(\"SIGINT\", cancel);\n\n // raw stdin (left over from an @inquirer/prompts prompt): the terminal\n // no longer turns Ctrl+C into SIGINT, so catch the keypress itself\n let onKeypress: ((str: string, key: readline.Key) => void) | undefined;\n\n if (process.stdin.isTTY) {\n if (!keypressPatched) {\n readline.emitKeypressEvents(process.stdin);\n keypressPatched = true;\n }\n\n onKeypress = (_str, key) => {\n if (key?.ctrl && key.name === \"c\") {\n cancel();\n }\n };\n\n process.stdin.on(\"keypress\", onKeypress);\n }\n\n try {\n await operation(...args);\n } catch (error: unknown) {\n if (!isPromptCancellation(error)) {\n throw error;\n }\n\n handled = true;\n printCancelled(fallback);\n process.exit(0);\n } finally {\n process.removeListener(\"SIGINT\", cancel);\n\n if (onKeypress) {\n process.stdin.removeListener(\"keypress\", onKeypress);\n }\n }\n };\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { resolveCommandName } from \"./cli\";\nimport { commandHandlers } from \"./commands\";\nimport { pkg } from \"./config/package\";\nimport { onCancel } from \"./runtime/cancellation\";\nimport { checkForUpdate } from \"./runtime/update-checker\";\nimport { symbols } from \"./ui/symbols\";\nimport { showTree } from \"./ui/tree\";\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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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,53 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "plekta",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"
|
|
3
|
+
"version": "0.0.3",
|
|
4
|
+
"description": "Description coming soon",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": {
|
|
8
|
+
"name": "Osilama",
|
|
9
|
+
"email": "thelastofinusa@gmail.com",
|
|
10
|
+
"url": "https://thelastofinusa.vercel.app"
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/index.mjs",
|
|
13
|
+
"module": "./dist/index.mjs",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"import": "./dist/index.mjs"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"bin": {
|
|
22
|
+
"plekta": "./dist/index.mjs"
|
|
23
|
+
},
|
|
5
24
|
"files": [
|
|
6
|
-
"
|
|
25
|
+
"dist",
|
|
7
26
|
"README.md"
|
|
8
|
-
]
|
|
9
|
-
|
|
27
|
+
],
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=18"
|
|
30
|
+
},
|
|
31
|
+
"scripts": {
|
|
32
|
+
"build": "tsdown",
|
|
33
|
+
"start": "bun run ./src/index.ts",
|
|
34
|
+
"lint": "biome check .",
|
|
35
|
+
"clean": "rm -rf .turbo dist node_modules",
|
|
36
|
+
"pack:dry": "bun run build && bun pm pack --dry-run",
|
|
37
|
+
"prepublishOnly": "bun run build",
|
|
38
|
+
"typecheck": "tsdown --noEmit"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@inquirer/prompts": "^8.7.2",
|
|
42
|
+
"chalk": "^6.0.0",
|
|
43
|
+
"commander": "^15.0.0",
|
|
44
|
+
"ora": "^9.4.1",
|
|
45
|
+
"which-pm-runs": "^2.0.0"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@plekta/tsconfig": "workspace:*",
|
|
49
|
+
"@types/bun": "^1.4.3",
|
|
50
|
+
"@types/node": "^22.20.2",
|
|
51
|
+
"tsdown": "0.22.14"
|
|
52
|
+
}
|
|
53
|
+
}
|
package/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
console.log("Hello via Bun!");
|