gaboesquivel 3.18.0 → 4.0.0
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/cli.js +431 -72
- package/dist/cli.mjs +2958 -69
- package/dist/content/projects/4tius-fitness-data-tracker.md +34 -0
- package/dist/content/projects/amc-yeah-tv-facebook-app.md +37 -0
- package/dist/content/projects/american-express.md +37 -0
- package/dist/content/projects/amex-money-talk.md +30 -0
- package/dist/content/projects/arinc-microfids.md +33 -0
- package/dist/content/projects/asoblockchain.md +46 -0
- package/dist/content/projects/bitcashbank.md +48 -0
- package/dist/content/projects/bitlauncher.md +63 -0
- package/dist/content/projects/bureau-of-trade-beta.md +33 -0
- package/dist/content/projects/capoeira-abolicao.md +32 -0
- package/dist/content/projects/chaingraph.md +38 -0
- package/dist/content/projects/costa-rica-js.md +48 -0
- package/dist/content/projects/cryptocantinacr.md +39 -0
- package/dist/content/projects/dboard.md +39 -0
- package/dist/content/projects/earth.md +31 -0
- package/dist/content/projects/eat-arcade.md +37 -0
- package/dist/content/projects/elder-scrolls-online.md +34 -0
- package/dist/content/projects/emanate.md +35 -0
- package/dist/content/projects/eos-costa-rica.md +45 -0
- package/dist/content/projects/eos-rate.md +40 -0
- package/dist/content/projects/fantasy-tennis.md +32 -0
- package/dist/content/projects/fantasy-top-shots.md +37 -0
- package/dist/content/projects/gridium.md +33 -0
- package/dist/content/projects/its.md +32 -0
- package/dist/content/projects/jockey-hollow-bar-and-kitchen-menu-kiosk-app.md +36 -0
- package/dist/content/projects/jockey-hollow-bar-and-kitchen.md +36 -0
- package/dist/content/projects/knowledge-io.md +43 -0
- package/dist/content/projects/legal-agent.md +44 -0
- package/dist/content/projects/living-with-dryness.md +31 -0
- package/dist/content/projects/make-sense-labs.md +33 -0
- package/dist/content/projects/masterbots.md +48 -0
- package/dist/content/projects/mobtion.md +32 -0
- package/dist/content/projects/opyn.md +47 -0
- package/dist/content/projects/panini.md +31 -0
- package/dist/content/projects/photo-and-go.md +36 -0
- package/dist/content/projects/proparques.md +31 -0
- package/dist/content/projects/raremint.md +45 -0
- package/dist/content/projects/scotiatico.md +31 -0
- package/dist/content/projects/staples.md +31 -0
- package/dist/content/projects/substrate-contracts-ui.md +34 -0
- package/dist/content/projects/suntrust.md +30 -0
- package/dist/content/projects/tikr.md +35 -0
- package/dist/content/projects/tractor-supply.md +34 -0
- package/dist/content/projects/trivenzor.md +31 -0
- package/dist/content/projects/wink.md +41 -0
- package/dist/content/projects/wizard-world.md +39 -0
- package/dist/content/projects/ztx.md +42 -0
- package/dist/content/tags.md +95 -0
- package/dist/content/tech/ai-sdk.md +22 -0
- package/dist/content/tech/alchemy.md +18 -0
- package/dist/content/tech/angularjs.md +19 -0
- package/dist/content/tech/antelope.md +18 -0
- package/dist/content/tech/artificial-intelligence.md +24 -0
- package/dist/content/tech/aws.md +19 -0
- package/dist/content/tech/biometrics.md +18 -0
- package/dist/content/tech/blockchain.md +24 -0
- package/dist/content/tech/bootstrap.md +19 -0
- package/dist/content/tech/cms.md +20 -0
- package/dist/content/tech/cpp.md +18 -0
- package/dist/content/tech/css.md +19 -0
- package/dist/content/tech/dalle.md +18 -0
- package/dist/content/tech/data-charts.md +18 -0
- package/dist/content/tech/datocms.md +19 -0
- package/dist/content/tech/docker.md +19 -0
- package/dist/content/tech/eos.md +18 -0
- package/dist/content/tech/ethereum.md +23 -0
- package/dist/content/tech/ethersjs.md +22 -0
- package/dist/content/tech/evm.md +22 -0
- package/dist/content/tech/expo.md +19 -0
- package/dist/content/tech/faye.md +19 -0
- package/dist/content/tech/flow.md +18 -0
- package/dist/content/tech/foundry.md +22 -0
- package/dist/content/tech/gcloud.md +19 -0
- package/dist/content/tech/graphql.md +19 -0
- package/dist/content/tech/hardhat.md +18 -0
- package/dist/content/tech/heroku.md +18 -0
- package/dist/content/tech/javascript.md +19 -0
- package/dist/content/tech/less.md +18 -0
- package/dist/content/tech/llms.md +22 -0
- package/dist/content/tech/mongodb.md +19 -0
- package/dist/content/tech/mootools.md +18 -0
- package/dist/content/tech/nextjs.md +23 -0
- package/dist/content/tech/nft.md +18 -0
- package/dist/content/tech/niftory.md +18 -0
- package/dist/content/tech/nodejs.md +23 -0
- package/dist/content/tech/nuqs.md +19 -0
- package/dist/content/tech/openai.md +18 -0
- package/dist/content/tech/polkadot.md +18 -0
- package/dist/content/tech/ponder.md +22 -0
- package/dist/content/tech/postgresql.md +22 -0
- package/dist/content/tech/rails.md +19 -0
- package/dist/content/tech/react-native.md +22 -0
- package/dist/content/tech/reactjs.md +22 -0
- package/dist/content/tech/redis.md +18 -0
- package/dist/content/tech/redux.md +19 -0
- package/dist/content/tech/rxjs.md +18 -0
- package/dist/content/tech/serverless.md +18 -0
- package/dist/content/tech/shadcn.md +19 -0
- package/dist/content/tech/solidity.md +23 -0
- package/dist/content/tech/stitches.md +19 -0
- package/dist/content/tech/stripe.md +18 -0
- package/dist/content/tech/substrate.md +18 -0
- package/dist/content/tech/supabase.md +20 -0
- package/dist/content/tech/tailwind.md +19 -0
- package/dist/content/tech/tanstack-form.md +19 -0
- package/dist/content/tech/tanstack-query.md +19 -0
- package/dist/content/tech/tanstack-start.md +19 -0
- package/dist/content/tech/terraform.md +19 -0
- package/dist/content/tech/thirdweb.md +22 -0
- package/dist/content/tech/trigger.md +19 -0
- package/dist/content/tech/twilio.md +18 -0
- package/dist/content/tech/typescript.md +22 -0
- package/dist/content/tech/viem.md +23 -0
- package/dist/content/tech/viroar.md +19 -0
- package/dist/content/tech/wagmi.md +23 -0
- package/dist/content/tech/webauthn.md +19 -0
- package/dist/content/tech/webgl.md +18 -0
- package/dist/content/tech/wordpress.md +19 -0
- package/dist/content/tech/zod.md +19 -0
- package/dist/content/tech/zustand.md +19 -0
- package/dist/index.d.mts +8 -2
- package/dist/index.d.ts +8 -2
- package/dist/index.js +3279 -1741
- package/dist/index.mjs +4067 -4
- package/dist/projects.json +1621 -0
- package/dist/tags.json +89 -0
- package/dist/tech.json +1132 -0
- package/package.json +23 -4
- package/dist/chunk-2M5YMKJU.mjs +0 -2536
- package/dist/chunk-3XJB6JQB.mjs +0 -2475
- package/dist/chunk-7BGBLAS7.mjs +0 -2475
- package/dist/chunk-EW5XIF7Q.mjs +0 -2474
- package/dist/chunk-F5O2AC7V.mjs +0 -2450
- package/dist/chunk-FTX6UF5M.mjs +0 -2511
- package/dist/chunk-FX52Y6GF.mjs +0 -2474
- package/dist/chunk-GQEE5WN4.mjs +0 -2450
- package/dist/chunk-LF6T72UC.mjs +0 -2466
- package/dist/chunk-LPLZ3JRN.mjs +0 -2475
- package/dist/chunk-ME4GIHM6.mjs +0 -2474
- package/dist/chunk-QMWCTZHU.mjs +0 -2450
- package/dist/chunk-WOFK3FJJ.mjs +0 -2502
- package/dist/chunk-Y4OM6UBU.mjs +0 -2461
package/dist/cli.js
CHANGED
|
@@ -25,6 +25,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
25
25
|
|
|
26
26
|
// src/cli.ts
|
|
27
27
|
var import_chalk = __toESM(require("chalk"));
|
|
28
|
+
var import_prompts = __toESM(require("prompts"));
|
|
28
29
|
|
|
29
30
|
// src/projects.ts
|
|
30
31
|
var projects = [
|
|
@@ -82,7 +83,8 @@ var projects = [
|
|
|
82
83
|
"Zod",
|
|
83
84
|
"nuqs",
|
|
84
85
|
"EVM",
|
|
85
|
-
"Ethereum"
|
|
86
|
+
"Ethereum",
|
|
87
|
+
"Alchemy"
|
|
86
88
|
],
|
|
87
89
|
type: ["web3", "contract", "featured", "frontend", "backend"],
|
|
88
90
|
link: "https://opyn.co",
|
|
@@ -166,8 +168,7 @@ var projects = [
|
|
|
166
168
|
"Zod",
|
|
167
169
|
"nuqs",
|
|
168
170
|
"OpenAI",
|
|
169
|
-
"AI SDK"
|
|
170
|
-
"PostgreSQL"
|
|
171
|
+
"AI SDK"
|
|
171
172
|
],
|
|
172
173
|
type: [
|
|
173
174
|
"web3",
|
|
@@ -221,8 +222,7 @@ var projects = [
|
|
|
221
222
|
"Tailwind",
|
|
222
223
|
"TanStack Query",
|
|
223
224
|
"Zod",
|
|
224
|
-
"nuqs"
|
|
225
|
-
"PostgreSQL"
|
|
225
|
+
"nuqs"
|
|
226
226
|
],
|
|
227
227
|
type: ["ai", "oss", "featured", "frontend", "backend", "fullstack"],
|
|
228
228
|
link: "https://masterbots.ai",
|
|
@@ -765,7 +765,7 @@ var projects = [
|
|
|
765
765
|
link: "http://tikr.com",
|
|
766
766
|
image: "https://gaboesquivel.com/images/work/tikr.jpg",
|
|
767
767
|
type: ["contract", "featured", "frontend"],
|
|
768
|
-
tech: ["Ruby on Rails", "Spree", "Heroku", "
|
|
768
|
+
tech: ["Ruby on Rails", "Spree", "Heroku", "PostgreSQL", "jQuery", "SASS"],
|
|
769
769
|
achievements: [
|
|
770
770
|
"Developed a dynamic pricing engine using Spree and Ruby on Rails.",
|
|
771
771
|
"Implemented a real-time price fluctuation system for enhanced user engagement.",
|
|
@@ -1525,7 +1525,7 @@ var techStack = [
|
|
|
1525
1525
|
{
|
|
1526
1526
|
name: "PostgreSQL",
|
|
1527
1527
|
slug: "postgresql",
|
|
1528
|
-
tag: "
|
|
1528
|
+
tag: "PostgreSQL",
|
|
1529
1529
|
image: "/images/tech/postgresql.png",
|
|
1530
1530
|
description: "A powerful, open-source object-relational database system with a strong reputation for reliability, feature robustness, and performance.",
|
|
1531
1531
|
link: "https://www.postgresql.org/",
|
|
@@ -2559,113 +2559,472 @@ var techStack = [
|
|
|
2559
2559
|
];
|
|
2560
2560
|
|
|
2561
2561
|
// src/cli.ts
|
|
2562
|
+
var COLORS = {
|
|
2563
|
+
title: import_chalk.default.bold.cyan,
|
|
2564
|
+
subtitle: import_chalk.default.bold.yellow,
|
|
2565
|
+
highlight: import_chalk.default.bold.green,
|
|
2566
|
+
info: import_chalk.default.blue,
|
|
2567
|
+
link: import_chalk.default.underline.blue,
|
|
2568
|
+
dim: import_chalk.default.dim,
|
|
2569
|
+
success: import_chalk.default.green,
|
|
2570
|
+
warning: import_chalk.default.yellow,
|
|
2571
|
+
error: import_chalk.default.red
|
|
2572
|
+
};
|
|
2562
2573
|
function displayBanner() {
|
|
2563
2574
|
console.log(
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
`)
|
|
2575
|
+
COLORS.title(`
|
|
2576
|
+
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
|
|
2577
|
+
\u2551 \u2551
|
|
2578
|
+
\u2551 ${import_chalk.default.bold.yellow("Gabo Esquivel")} - ${import_chalk.default.bold.cyan("Software Engineer")} \u2551
|
|
2579
|
+
\u2551 \u2551
|
|
2580
|
+
\u2551 ${COLORS.success("Full-stack engineer")} with ${COLORS.highlight("15+ years")} of experience \u2551
|
|
2581
|
+
\u2551 ${COLORS.success("Web3 specialist")} since ${COLORS.highlight("2017")} \u2551
|
|
2582
|
+
\u2551 ${COLORS.success("Node.js expert")} with ${COLORS.highlight("10+ years")} \u2551
|
|
2583
|
+
\u2551 ${COLORS.success("React & TypeScript")} advanced expertise \u2551
|
|
2584
|
+
\u2551 ${COLORS.success("Currently exploring AI")} \u2551
|
|
2585
|
+
\u2551 \u2551
|
|
2586
|
+
\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
|
|
2587
|
+
`)
|
|
2578
2588
|
);
|
|
2579
2589
|
}
|
|
2580
|
-
function
|
|
2590
|
+
function displayLinks() {
|
|
2591
|
+
console.log(`
|
|
2592
|
+
${COLORS.subtitle("\u{1F517} Links:")}`);
|
|
2581
2593
|
console.log(
|
|
2582
|
-
|
|
2594
|
+
` ${COLORS.info("Website:")} ${COLORS.link("https://gaboesquivel.com")}`
|
|
2583
2595
|
);
|
|
2584
2596
|
console.log(
|
|
2585
|
-
|
|
2597
|
+
` ${COLORS.info("GitHub:")} ${COLORS.link("https://github.com/gaboesquivel")}`
|
|
2586
2598
|
);
|
|
2587
2599
|
console.log(
|
|
2588
|
-
|
|
2600
|
+
` ${COLORS.info("Twitter:")} ${COLORS.link("https://twitter.com/gaboesquivel")}`
|
|
2589
2601
|
);
|
|
2590
2602
|
console.log(
|
|
2591
|
-
|
|
2603
|
+
` ${COLORS.info("Calendar:")} ${COLORS.link("https://cal.com/gaboesquivel")}`
|
|
2592
2604
|
);
|
|
2593
|
-
|
|
2605
|
+
}
|
|
2606
|
+
function formatProjectCard(project, index) {
|
|
2607
|
+
const prefix = index !== void 0 ? `${COLORS.dim(`${index + 1}.`)} ` : "";
|
|
2608
|
+
const types = project.type?.length ? ` ${COLORS.dim("[")}${project.type.slice(0, 3).map((t) => COLORS.warning(t)).join(COLORS.dim(", "))}${COLORS.dim("]")}` : "";
|
|
2609
|
+
return `${prefix}${COLORS.title(project.title)}${types}`;
|
|
2610
|
+
}
|
|
2611
|
+
function displayProjectSummary(project) {
|
|
2594
2612
|
console.log(
|
|
2595
|
-
|
|
2613
|
+
`
|
|
2614
|
+
${COLORS.title("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")}`
|
|
2596
2615
|
);
|
|
2616
|
+
console.log(`
|
|
2617
|
+
${COLORS.title("\u{1F4E6}")} ${COLORS.title(project.title)}`);
|
|
2618
|
+
console.log(`
|
|
2619
|
+
${COLORS.subtitle("Description:")}`);
|
|
2620
|
+
console.log(` ${project.description}`);
|
|
2621
|
+
if (project.tech && project.tech.length > 0) {
|
|
2622
|
+
console.log(`
|
|
2623
|
+
${COLORS.subtitle("Tech Stack:")}`);
|
|
2624
|
+
const techDisplay = project.tech.slice(0, 8).map((t) => COLORS.highlight(t)).join(COLORS.dim(", "));
|
|
2625
|
+
const moreTech = project.tech.length > 8 ? COLORS.dim(` +${project.tech.length - 8} more`) : "";
|
|
2626
|
+
console.log(` ${techDisplay}${moreTech}`);
|
|
2627
|
+
}
|
|
2628
|
+
if (project.type && project.type.length > 0) {
|
|
2629
|
+
console.log(`
|
|
2630
|
+
${COLORS.subtitle("Type:")}`);
|
|
2631
|
+
console.log(
|
|
2632
|
+
` ${project.type.map((t) => COLORS.warning(`\u2022 ${t}`)).join(" ")}`
|
|
2633
|
+
);
|
|
2634
|
+
}
|
|
2635
|
+
if (project.achievements && project.achievements.length > 0) {
|
|
2636
|
+
console.log(`
|
|
2637
|
+
${COLORS.subtitle("Key Achievements:")}`);
|
|
2638
|
+
for (const achievement of project.achievements.slice(0, 3)) {
|
|
2639
|
+
console.log(` ${COLORS.success("\u2713")} ${achievement}`);
|
|
2640
|
+
}
|
|
2641
|
+
if (project.achievements.length > 3) {
|
|
2642
|
+
console.log(
|
|
2643
|
+
` ${COLORS.dim(`... and ${project.achievements.length - 3} more`)}`
|
|
2644
|
+
);
|
|
2645
|
+
}
|
|
2646
|
+
}
|
|
2647
|
+
if (project.story && project.story.length > 0) {
|
|
2648
|
+
console.log(`
|
|
2649
|
+
${COLORS.subtitle("Story:")}`);
|
|
2650
|
+
for (const paragraph of project.story) {
|
|
2651
|
+
console.log(` ${paragraph}
|
|
2652
|
+
`);
|
|
2653
|
+
}
|
|
2654
|
+
}
|
|
2655
|
+
const portfolioLink = `https://gaboesquivel.com/project/${project.slug}`;
|
|
2656
|
+
console.log(`
|
|
2657
|
+
${COLORS.subtitle("Portfolio Link:")}`);
|
|
2658
|
+
console.log(` ${COLORS.link(portfolioLink)}`);
|
|
2659
|
+
if (project.link) {
|
|
2660
|
+
console.log(`
|
|
2661
|
+
${COLORS.subtitle("Project Link:")}`);
|
|
2662
|
+
console.log(` ${COLORS.link(project.link)}`);
|
|
2663
|
+
}
|
|
2664
|
+
if (project.repo) {
|
|
2665
|
+
console.log(`
|
|
2666
|
+
${COLORS.subtitle("Repository:")}`);
|
|
2667
|
+
console.log(` ${COLORS.link(project.repo)}`);
|
|
2668
|
+
}
|
|
2597
2669
|
console.log(
|
|
2598
|
-
|
|
2670
|
+
`
|
|
2671
|
+
${COLORS.title("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")}`
|
|
2599
2672
|
);
|
|
2600
2673
|
}
|
|
2601
|
-
function displayProjectList() {
|
|
2602
|
-
console.log(
|
|
2603
|
-
|
|
2604
|
-
|
|
2605
|
-
|
|
2674
|
+
function displayProjectList(projectList = projects) {
|
|
2675
|
+
console.log(`
|
|
2676
|
+
${COLORS.subtitle(`\u{1F4CB} Projects (${projectList.length}):`)}
|
|
2677
|
+
`);
|
|
2678
|
+
for (let index = 0; index < projectList.length; index++) {
|
|
2679
|
+
const project = projectList[index];
|
|
2680
|
+
console.log(formatProjectCard(project, index));
|
|
2681
|
+
const desc = project.description.length > 80 ? `${project.description.substring(0, 80)}...` : project.description;
|
|
2682
|
+
console.log(` ${COLORS.dim(desc)}
|
|
2683
|
+
`);
|
|
2606
2684
|
}
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2685
|
+
}
|
|
2686
|
+
function displayTechSummary(techItem) {
|
|
2687
|
+
console.log(
|
|
2688
|
+
`
|
|
2689
|
+
${COLORS.title("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")}`
|
|
2690
|
+
);
|
|
2691
|
+
console.log(
|
|
2692
|
+
`
|
|
2693
|
+
${COLORS.title("\u26A1")} ${COLORS.title(techItem.name)} ${COLORS.warning(`(since ${techItem.since})`)}`
|
|
2694
|
+
);
|
|
2695
|
+
console.log(`
|
|
2696
|
+
${COLORS.subtitle("Description:")}`);
|
|
2697
|
+
console.log(` ${techItem.description}`);
|
|
2698
|
+
if (techItem.experience && techItem.experience.length > 0) {
|
|
2699
|
+
console.log(`
|
|
2700
|
+
${COLORS.subtitle("Experience Highlights:")}`);
|
|
2701
|
+
for (const exp of techItem.experience.slice(0, 3)) {
|
|
2702
|
+
console.log(` ${COLORS.success("\u2022")} ${exp}`);
|
|
2617
2703
|
}
|
|
2618
|
-
if (
|
|
2704
|
+
if (techItem.experience.length > 3) {
|
|
2619
2705
|
console.log(
|
|
2620
|
-
`
|
|
2706
|
+
` ${COLORS.dim(`... and ${techItem.experience.length - 3} more`)}`
|
|
2621
2707
|
);
|
|
2622
2708
|
}
|
|
2709
|
+
}
|
|
2710
|
+
const portfolioLink = `https://gaboesquivel.com/tech/${techItem.slug}`;
|
|
2711
|
+
console.log(`
|
|
2712
|
+
${COLORS.subtitle("Portfolio Link:")}`);
|
|
2713
|
+
console.log(` ${COLORS.link(portfolioLink)}`);
|
|
2714
|
+
if (techItem.link) {
|
|
2715
|
+
console.log(`
|
|
2716
|
+
${COLORS.subtitle("Official Link:")}`);
|
|
2717
|
+
console.log(` ${COLORS.link(techItem.link)}`);
|
|
2718
|
+
}
|
|
2719
|
+
console.log(
|
|
2720
|
+
`
|
|
2721
|
+
${COLORS.title("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")}`
|
|
2722
|
+
);
|
|
2723
|
+
}
|
|
2724
|
+
function displayTechList(techList = techStack) {
|
|
2725
|
+
console.log(`
|
|
2726
|
+
${COLORS.subtitle(`\u{1F6E0}\uFE0F Technologies (${techList.length}):`)}
|
|
2727
|
+
`);
|
|
2728
|
+
for (const item of techList) {
|
|
2623
2729
|
console.log(
|
|
2624
|
-
`
|
|
2730
|
+
` ${COLORS.highlight(item.name)} ${COLORS.dim(`(since ${item.since})`)}`
|
|
2625
2731
|
);
|
|
2626
|
-
|
|
2732
|
+
const desc = item.description.length > 70 ? `${item.description.substring(0, 70)}...` : item.description;
|
|
2733
|
+
console.log(` ${COLORS.dim(desc)}
|
|
2734
|
+
`);
|
|
2627
2735
|
}
|
|
2628
2736
|
}
|
|
2629
|
-
function
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
|
|
2737
|
+
async function browseProjects() {
|
|
2738
|
+
const projectList = projects;
|
|
2739
|
+
while (true) {
|
|
2740
|
+
const { action } = await (0, import_prompts.default)({
|
|
2741
|
+
type: "select",
|
|
2742
|
+
name: "action",
|
|
2743
|
+
message: COLORS.subtitle("What would you like to do?"),
|
|
2744
|
+
choices: [
|
|
2745
|
+
{ title: "\u{1F4CB} View all projects", value: "list" },
|
|
2746
|
+
{ title: "\u{1F50D} Search projects", value: "search" },
|
|
2747
|
+
{ title: "\u{1F3F7}\uFE0F Filter by type", value: "filter" },
|
|
2748
|
+
{ title: "\u{1F519} Back to main menu", value: "back" }
|
|
2749
|
+
]
|
|
2750
|
+
});
|
|
2751
|
+
if (!action || action === "back") break;
|
|
2752
|
+
if (action === "list") {
|
|
2753
|
+
displayProjectList(projectList);
|
|
2754
|
+
const { selected } = await (0, import_prompts.default)({
|
|
2755
|
+
type: "select",
|
|
2756
|
+
name: "selected",
|
|
2757
|
+
message: COLORS.subtitle("Select a project to view details:"),
|
|
2758
|
+
choices: [
|
|
2759
|
+
...projectList.map((p, i) => ({
|
|
2760
|
+
title: formatProjectCard(p, i),
|
|
2761
|
+
value: i
|
|
2762
|
+
})),
|
|
2763
|
+
{ title: COLORS.dim("\u2190 Back"), value: -1 }
|
|
2764
|
+
]
|
|
2765
|
+
});
|
|
2766
|
+
if (selected !== void 0 && selected >= 0) {
|
|
2767
|
+
displayProjectSummary(projectList[selected]);
|
|
2768
|
+
await (0, import_prompts.default)({
|
|
2769
|
+
type: "confirm",
|
|
2770
|
+
name: "continue",
|
|
2771
|
+
message: COLORS.info("Press Enter to continue..."),
|
|
2772
|
+
initial: true
|
|
2773
|
+
});
|
|
2774
|
+
}
|
|
2775
|
+
}
|
|
2776
|
+
if (action === "search") {
|
|
2777
|
+
const { query } = await (0, import_prompts.default)({
|
|
2778
|
+
type: "text",
|
|
2779
|
+
name: "query",
|
|
2780
|
+
message: COLORS.subtitle(
|
|
2781
|
+
"Search projects (by name, tech, or description):"
|
|
2782
|
+
)
|
|
2783
|
+
});
|
|
2784
|
+
if (query) {
|
|
2785
|
+
const searchLower = query.toLowerCase();
|
|
2786
|
+
const filtered = projectList.filter(
|
|
2787
|
+
(p) => p.title.toLowerCase().includes(searchLower) || p.description.toLowerCase().includes(searchLower) || p.tech?.some((t) => t.toLowerCase().includes(searchLower)) || p.type?.some((t) => t.toLowerCase().includes(searchLower))
|
|
2788
|
+
);
|
|
2789
|
+
if (filtered.length === 0) {
|
|
2790
|
+
console.log(
|
|
2791
|
+
`
|
|
2792
|
+
${COLORS.error("No projects found matching your search.")}
|
|
2793
|
+
`
|
|
2794
|
+
);
|
|
2795
|
+
} else {
|
|
2796
|
+
displayProjectList(filtered);
|
|
2797
|
+
const { selected } = await (0, import_prompts.default)({
|
|
2798
|
+
type: "select",
|
|
2799
|
+
name: "selected",
|
|
2800
|
+
message: COLORS.subtitle("Select a project to view details:"),
|
|
2801
|
+
choices: [
|
|
2802
|
+
...filtered.map((p, i) => ({
|
|
2803
|
+
title: formatProjectCard(p, i),
|
|
2804
|
+
value: i
|
|
2805
|
+
})),
|
|
2806
|
+
{ title: COLORS.dim("\u2190 Back"), value: -1 }
|
|
2807
|
+
]
|
|
2808
|
+
});
|
|
2809
|
+
if (selected !== void 0 && selected >= 0) {
|
|
2810
|
+
displayProjectSummary(filtered[selected]);
|
|
2811
|
+
await (0, import_prompts.default)({
|
|
2812
|
+
type: "confirm",
|
|
2813
|
+
name: "continue",
|
|
2814
|
+
message: COLORS.info("Press Enter to continue..."),
|
|
2815
|
+
initial: true
|
|
2816
|
+
});
|
|
2817
|
+
}
|
|
2818
|
+
}
|
|
2819
|
+
}
|
|
2820
|
+
}
|
|
2821
|
+
if (action === "filter") {
|
|
2822
|
+
const allTypes = /* @__PURE__ */ new Set();
|
|
2823
|
+
for (const p of projectList) {
|
|
2824
|
+
if (p.type) {
|
|
2825
|
+
for (const t of p.type) {
|
|
2826
|
+
allTypes.add(t);
|
|
2827
|
+
}
|
|
2828
|
+
}
|
|
2829
|
+
}
|
|
2830
|
+
const typeArray = Array.from(allTypes).sort();
|
|
2831
|
+
const { selectedType } = await (0, import_prompts.default)({
|
|
2832
|
+
type: "select",
|
|
2833
|
+
name: "selectedType",
|
|
2834
|
+
message: COLORS.subtitle("Filter by project type:"),
|
|
2835
|
+
choices: [
|
|
2836
|
+
...typeArray.map((t) => ({ title: COLORS.warning(t), value: t })),
|
|
2837
|
+
{ title: COLORS.dim("\u2190 Back"), value: "back" }
|
|
2838
|
+
]
|
|
2839
|
+
});
|
|
2840
|
+
if (selectedType && selectedType !== "back") {
|
|
2841
|
+
const filtered = projectList.filter(
|
|
2842
|
+
(p) => p.type?.includes(selectedType)
|
|
2843
|
+
);
|
|
2844
|
+
displayProjectList(filtered);
|
|
2845
|
+
const { selected } = await (0, import_prompts.default)({
|
|
2846
|
+
type: "select",
|
|
2847
|
+
name: "selected",
|
|
2848
|
+
message: COLORS.subtitle("Select a project to view details:"),
|
|
2849
|
+
choices: [
|
|
2850
|
+
...filtered.map((p, i) => ({
|
|
2851
|
+
title: formatProjectCard(p, i),
|
|
2852
|
+
value: i
|
|
2853
|
+
})),
|
|
2854
|
+
{ title: COLORS.dim("\u2190 Back"), value: -1 }
|
|
2855
|
+
]
|
|
2856
|
+
});
|
|
2857
|
+
if (selected !== void 0 && selected >= 0) {
|
|
2858
|
+
displayProjectSummary(filtered[selected]);
|
|
2859
|
+
await (0, import_prompts.default)({
|
|
2860
|
+
type: "confirm",
|
|
2861
|
+
name: "continue",
|
|
2862
|
+
message: COLORS.info("Press Enter to continue..."),
|
|
2863
|
+
initial: true
|
|
2864
|
+
});
|
|
2865
|
+
}
|
|
2866
|
+
}
|
|
2867
|
+
}
|
|
2634
2868
|
}
|
|
2635
|
-
|
|
2636
|
-
|
|
2637
|
-
|
|
2638
|
-
|
|
2639
|
-
const
|
|
2640
|
-
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2869
|
+
}
|
|
2870
|
+
async function browseTech() {
|
|
2871
|
+
const techList = techStack;
|
|
2872
|
+
while (true) {
|
|
2873
|
+
const { action } = await (0, import_prompts.default)({
|
|
2874
|
+
type: "select",
|
|
2875
|
+
name: "action",
|
|
2876
|
+
message: COLORS.subtitle("What would you like to do?"),
|
|
2877
|
+
choices: [
|
|
2878
|
+
{ title: "\u{1F4CB} View all technologies", value: "list" },
|
|
2879
|
+
{ title: "\u{1F50D} Search technologies", value: "search" },
|
|
2880
|
+
{ title: "\u{1F519} Back to main menu", value: "back" }
|
|
2881
|
+
]
|
|
2882
|
+
});
|
|
2883
|
+
if (!action || action === "back") break;
|
|
2884
|
+
if (action === "list") {
|
|
2885
|
+
displayTechList(techList);
|
|
2886
|
+
const { selected } = await (0, import_prompts.default)({
|
|
2887
|
+
type: "select",
|
|
2888
|
+
name: "selected",
|
|
2889
|
+
message: COLORS.subtitle("Select a technology to view details:"),
|
|
2890
|
+
choices: [
|
|
2891
|
+
...techList.map((t, i) => ({
|
|
2892
|
+
title: `${COLORS.highlight(t.name)} ${COLORS.dim(`(since ${t.since})`)}`,
|
|
2893
|
+
value: i
|
|
2894
|
+
})),
|
|
2895
|
+
{ title: COLORS.dim("\u2190 Back"), value: -1 }
|
|
2896
|
+
]
|
|
2897
|
+
});
|
|
2898
|
+
if (selected !== void 0 && selected >= 0) {
|
|
2899
|
+
displayTechSummary(techList[selected]);
|
|
2900
|
+
await (0, import_prompts.default)({
|
|
2901
|
+
type: "confirm",
|
|
2902
|
+
name: "continue",
|
|
2903
|
+
message: COLORS.info("Press Enter to continue..."),
|
|
2904
|
+
initial: true
|
|
2905
|
+
});
|
|
2906
|
+
}
|
|
2645
2907
|
}
|
|
2646
|
-
|
|
2647
|
-
|
|
2908
|
+
if (action === "search") {
|
|
2909
|
+
const { query } = await (0, import_prompts.default)({
|
|
2910
|
+
type: "text",
|
|
2911
|
+
name: "query",
|
|
2912
|
+
message: COLORS.subtitle(
|
|
2913
|
+
"Search technologies (by name or description):"
|
|
2914
|
+
)
|
|
2915
|
+
});
|
|
2916
|
+
if (query) {
|
|
2917
|
+
const searchLower = query.toLowerCase();
|
|
2918
|
+
const filtered = techList.filter(
|
|
2919
|
+
(t) => t.name.toLowerCase().includes(searchLower) || t.description.toLowerCase().includes(searchLower) || t.experience?.some((e) => e.toLowerCase().includes(searchLower))
|
|
2920
|
+
);
|
|
2921
|
+
if (filtered.length === 0) {
|
|
2922
|
+
console.log(
|
|
2923
|
+
`
|
|
2924
|
+
${COLORS.error("No technologies found matching your search.")}
|
|
2648
2925
|
`
|
|
2649
|
-
|
|
2926
|
+
);
|
|
2927
|
+
} else {
|
|
2928
|
+
displayTechList(filtered);
|
|
2929
|
+
const { selected } = await (0, import_prompts.default)({
|
|
2930
|
+
type: "select",
|
|
2931
|
+
name: "selected",
|
|
2932
|
+
message: COLORS.subtitle("Select a technology to view details:"),
|
|
2933
|
+
choices: [
|
|
2934
|
+
...filtered.map((t, i) => ({
|
|
2935
|
+
title: `${COLORS.highlight(t.name)} ${COLORS.dim(`(since ${t.since})`)}`,
|
|
2936
|
+
value: i
|
|
2937
|
+
})),
|
|
2938
|
+
{ title: COLORS.dim("\u2190 Back"), value: -1 }
|
|
2939
|
+
]
|
|
2940
|
+
});
|
|
2941
|
+
if (selected !== void 0 && selected >= 0) {
|
|
2942
|
+
displayTechSummary(filtered[selected]);
|
|
2943
|
+
await (0, import_prompts.default)({
|
|
2944
|
+
type: "confirm",
|
|
2945
|
+
name: "continue",
|
|
2946
|
+
message: COLORS.info("Press Enter to continue..."),
|
|
2947
|
+
initial: true
|
|
2948
|
+
});
|
|
2949
|
+
}
|
|
2950
|
+
}
|
|
2951
|
+
}
|
|
2952
|
+
}
|
|
2650
2953
|
}
|
|
2651
2954
|
}
|
|
2652
|
-
function
|
|
2955
|
+
async function mainMenu() {
|
|
2956
|
+
while (true) {
|
|
2957
|
+
const { choice } = await (0, import_prompts.default)({
|
|
2958
|
+
type: "select",
|
|
2959
|
+
name: "choice",
|
|
2960
|
+
message: COLORS.subtitle("What would you like to explore?"),
|
|
2961
|
+
choices: [
|
|
2962
|
+
{ title: "\u{1F4E6} Browse Projects", value: "projects" },
|
|
2963
|
+
{ title: "\u{1F6E0}\uFE0F Browse Technologies", value: "tech" },
|
|
2964
|
+
{ title: "\u{1F44B} Exit", value: "exit" }
|
|
2965
|
+
]
|
|
2966
|
+
});
|
|
2967
|
+
if (!choice || choice === "exit") {
|
|
2968
|
+
console.log(`
|
|
2969
|
+
${COLORS.success("Thanks for exploring! \u{1F44B}\n")}`);
|
|
2970
|
+
break;
|
|
2971
|
+
}
|
|
2972
|
+
if (choice === "projects") {
|
|
2973
|
+
await browseProjects();
|
|
2974
|
+
}
|
|
2975
|
+
if (choice === "tech") {
|
|
2976
|
+
await browseTech();
|
|
2977
|
+
}
|
|
2978
|
+
}
|
|
2979
|
+
}
|
|
2980
|
+
async function handleArgs() {
|
|
2653
2981
|
const args = process.argv.slice(2);
|
|
2654
2982
|
if (args.length === 0) {
|
|
2655
2983
|
displayBanner();
|
|
2656
|
-
|
|
2984
|
+
displayLinks();
|
|
2985
|
+
await mainMenu();
|
|
2657
2986
|
return;
|
|
2658
2987
|
}
|
|
2659
2988
|
const command = args[0];
|
|
2660
2989
|
switch (command) {
|
|
2661
2990
|
case "--projects":
|
|
2662
|
-
|
|
2991
|
+
case "-p":
|
|
2992
|
+
displayBanner();
|
|
2993
|
+
await browseProjects();
|
|
2663
2994
|
break;
|
|
2664
2995
|
case "--tech":
|
|
2665
|
-
|
|
2996
|
+
case "-t":
|
|
2997
|
+
displayBanner();
|
|
2998
|
+
await browseTech();
|
|
2999
|
+
break;
|
|
3000
|
+
case "--help":
|
|
3001
|
+
case "-h":
|
|
3002
|
+
displayBanner();
|
|
3003
|
+
console.log(`
|
|
3004
|
+
${COLORS.subtitle("Available Commands:")}
|
|
3005
|
+
`);
|
|
3006
|
+
console.log(
|
|
3007
|
+
` ${COLORS.info("npx gaboesquivel")} Interactive menu`
|
|
3008
|
+
);
|
|
3009
|
+
console.log(
|
|
3010
|
+
` ${COLORS.info("npx gaboesquivel --projects")} Browse projects`
|
|
3011
|
+
);
|
|
3012
|
+
console.log(
|
|
3013
|
+
` ${COLORS.info("npx gaboesquivel --tech")} Browse technologies`
|
|
3014
|
+
);
|
|
3015
|
+
console.log(
|
|
3016
|
+
` ${COLORS.info("npx gaboesquivel --help")} Show this help
|
|
3017
|
+
`
|
|
3018
|
+
);
|
|
2666
3019
|
break;
|
|
2667
3020
|
default:
|
|
2668
|
-
console.log(
|
|
3021
|
+
console.log(`${COLORS.error(`Unknown command: ${command}`)}`);
|
|
3022
|
+
console.log(
|
|
3023
|
+
`Run ${COLORS.info("npx gaboesquivel --help")} for available commands.`
|
|
3024
|
+
);
|
|
2669
3025
|
}
|
|
2670
3026
|
}
|
|
2671
|
-
handleArgs()
|
|
3027
|
+
handleArgs().catch((error) => {
|
|
3028
|
+
console.error(COLORS.error("An error occurred:"), error);
|
|
3029
|
+
process.exit(1);
|
|
3030
|
+
});
|