starwind 1.0.0 → 1.0.2

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.
@@ -468,7 +468,7 @@ async function init(withinAdd = false) {
468
468
  });
469
469
  const cssFileExists = await fileExists(configChoices.cssFile);
470
470
  let updatedTailwindConfig = tailwindConfig;
471
- if (configChoices.twBaseColor !== "gray") {
471
+ if (configChoices.twBaseColor !== "neutral") {
472
472
  updatedTailwindConfig = updatedTailwindConfig.replace(
473
473
  /--color-neutral-/g,
474
474
  `--color-${configChoices.twBaseColor}-`
@@ -618,4 +618,4 @@ export {
618
618
  sleep,
619
619
  init
620
620
  };
621
- //# sourceMappingURL=chunk-JUEM67WU.js.map
621
+ //# sourceMappingURL=chunk-V7BBFSQ4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/init.ts","../src/templates/starwind.css.ts","../src/utils/highlighter.ts","../src/utils/astro-config.ts","../src/utils/fs.ts","../src/utils/constants.ts","../src/utils/config.ts","../src/utils/package-manager.ts","../src/utils/sleep.ts"],"sourcesContent":["import path from \"node:path\";\nimport { tailwindConfig } from \"@/templates/starwind.css.js\";\nimport { setupAstroConfig } from \"@/utils/astro-config.js\";\nimport { updateConfig } from \"@/utils/config.js\";\nimport { ASTRO_PACKAGES, MIN_ASTRO_VERSION, PATHS, getOtherPackages } from \"@/utils/constants.js\";\nimport { ensureDirectory, fileExists, readJsonFile, writeCssFile } from \"@/utils/fs.js\";\nimport { highlighter } from \"@/utils/highlighter.js\";\nimport { installDependencies, requestPackageManager } from \"@/utils/package-manager.js\";\nimport { sleep } from \"@/utils/sleep.js\";\nimport * as p from \"@clack/prompts\";\nimport semver from \"semver\";\n\nexport async function init(withinAdd: boolean = false) {\n\tif (!withinAdd) {\n\t\tp.intro(highlighter.title(\" Welcome to the Starwind CLI \"));\n\t}\n\n\ttry {\n\t\t// Validate project structure\n\t\tif (!(await fileExists(\"package.json\"))) {\n\t\t\tthrow new Error(\n\t\t\t\t\"No package.json found. Please run this command in the root of your project.\",\n\t\t\t);\n\t\t}\n\n\t\tconst pkg = await readJsonFile(\"package.json\");\n\n\t\t// Check Astro version compatibility\n\t\tconst installTasks = [];\n\t\tconst configTasks = [];\n\n\t\t// ================================================================\n\t\t// Prepare project structure and configuration tasks\n\t\t// ================================================================\n\t\tconst configChoices = await p.group(\n\t\t\t{\n\t\t\t\t// ask where to install components\n\t\t\t\tinstallLocation: () =>\n\t\t\t\t\tp.text({\n\t\t\t\t\t\tmessage: \"What is your components directory?\",\n\t\t\t\t\t\tplaceholder: PATHS.LOCAL_COMPONENTS_DIR,\n\t\t\t\t\t\tinitialValue: PATHS.LOCAL_COMPONENTS_DIR,\n\t\t\t\t\t\tvalidate(value) {\n\t\t\t\t\t\t\t// Check for empty value\n\t\t\t\t\t\t\tif (value.length === 0) return `Value is required!`;\n\n\t\t\t\t\t\t\t// Check for absolute paths\n\t\t\t\t\t\t\tif (path.isAbsolute(value)) return `Please use a relative path`;\n\n\t\t\t\t\t\t\t// Check for path traversal attempts\n\t\t\t\t\t\t\tif (value.includes(\"..\")) return `Path traversal is not allowed`;\n\n\t\t\t\t\t\t\t// Check for invalid characters in path\n\t\t\t\t\t\t\tconst invalidChars = /[<>:\"|?*]/;\n\t\t\t\t\t\t\tif (invalidChars.test(value)) return `Path contains invalid characters`;\n\n\t\t\t\t\t\t\t// Check if path starts with system directories\n\t\t\t\t\t\t\tconst systemDirs = [\"windows\", \"program files\", \"system32\"];\n\t\t\t\t\t\t\tif (systemDirs.some((dir) => value.toLowerCase().startsWith(dir))) {\n\t\t\t\t\t\t\t\treturn `Cannot install in system directories`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t// ask where to add the css file\n\t\t\t\tcssFile: () =>\n\t\t\t\t\tp.text({\n\t\t\t\t\t\tmessage: `Where would you like to add the Tailwind ${highlighter.info(\".css\")} file?`,\n\t\t\t\t\t\tplaceholder: PATHS.LOCAL_CSS_FILE,\n\t\t\t\t\t\tinitialValue: PATHS.LOCAL_CSS_FILE,\n\t\t\t\t\t\tvalidate(value) {\n\t\t\t\t\t\t\t// Check for empty value\n\t\t\t\t\t\t\tif (value.length === 0) return `Value is required!`;\n\n\t\t\t\t\t\t\t// Must end with .css\n\t\t\t\t\t\t\tif (!value.endsWith(\".css\")) return `File must end with .css extension`;\n\n\t\t\t\t\t\t\t// Check for absolute paths\n\t\t\t\t\t\t\tif (path.isAbsolute(value)) return `Please use a relative path`;\n\n\t\t\t\t\t\t\t// Check for path traversal attempts\n\t\t\t\t\t\t\tif (value.includes(\"..\")) return `Path traversal is not allowed`;\n\n\t\t\t\t\t\t\t// Check for invalid characters in path\n\t\t\t\t\t\t\tconst invalidChars = /[<>:\"|?*]/;\n\t\t\t\t\t\t\tif (invalidChars.test(value)) return `Path contains invalid characters`;\n\n\t\t\t\t\t\t\t// Check if path starts with system directories\n\t\t\t\t\t\t\tconst systemDirs = [\"windows\", \"program files\", \"system32\"];\n\t\t\t\t\t\t\tif (systemDirs.some((dir) => value.toLowerCase().startsWith(dir))) {\n\t\t\t\t\t\t\t\treturn `Cannot use system directories`;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Ensure the path has a valid filename\n\t\t\t\t\t\t\tconst basename = path.basename(value, \".css\");\n\t\t\t\t\t\t\tif (!basename || basename.trim().length === 0) {\n\t\t\t\t\t\t\t\treturn `Invalid filename`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\n\t\t\t\ttwBaseColor: () =>\n\t\t\t\t\tp.select({\n\t\t\t\t\t\tmessage: \"What Tailwind base color would you like to use?\",\n\t\t\t\t\t\tinitialValue: \"neutral\",\n\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t{ label: \"Neutral (default)\", value: \"neutral\" },\n\t\t\t\t\t\t\t{ label: \"Stone\", value: \"stone\" },\n\t\t\t\t\t\t\t{ label: \"Zinc\", value: \"zinc\" },\n\t\t\t\t\t\t\t{ label: \"Gray\", value: \"gray\" },\n\t\t\t\t\t\t\t{ label: \"Slate\", value: \"slate\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t}),\n\t\t\t},\n\t\t\t{\n\t\t\t\t// On Cancel callback that wraps the group\n\t\t\t\t// So if the user cancels one of the prompts in the group this function will be called\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tp.cancel(\"Operation cancelled.\");\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\t// ================================================================\n\t\t// Make sure appropriate directories exist\n\t\t// ================================================================\n\t\tconst cssFileDir = path.dirname(configChoices.cssFile);\n\t\tconst componentInstallDir = path.join(configChoices.installLocation, \"starwind\");\n\t\tconfigTasks.push({\n\t\t\ttitle: \"Creating project structure\",\n\t\t\ttask: async () => {\n\t\t\t\tawait ensureDirectory(componentInstallDir);\n\t\t\t\tawait ensureDirectory(cssFileDir);\n\t\t\t\tawait sleep(250);\n\t\t\t\treturn \"Created project structure\";\n\t\t\t},\n\t\t});\n\n\t\t// ================================================================\n\t\t// Prepare Astro config file setup\n\t\t// ================================================================\n\t\tconfigTasks.push({\n\t\t\ttitle: \"Setup Astro config file\",\n\t\t\ttask: async () => {\n\t\t\t\tconst success = await setupAstroConfig();\n\t\t\t\tif (!success) {\n\t\t\t\t\tthrow new Error(\"Failed to setup Astro config\");\n\t\t\t\t}\n\t\t\t\tawait sleep(250);\n\t\t\t\treturn \"Astro config setup completed\";\n\t\t\t},\n\t\t});\n\n\t\t// ================================================================\n\t\t// Prepare CSS file\n\t\t// ================================================================\n\t\t// Check if CSS file already exists\n\t\tconst cssFileExists = await fileExists(configChoices.cssFile);\n\t\tlet updatedTailwindConfig = tailwindConfig;\n\n\t\tif (configChoices.twBaseColor !== \"neutral\") {\n\t\t\t// replace all \"--color-neutral\" with \"--color-twBaseColor\"\n\t\t\tupdatedTailwindConfig = updatedTailwindConfig.replace(\n\t\t\t\t/--color-neutral-/g,\n\t\t\t\t`--color-${configChoices.twBaseColor}-`,\n\t\t\t);\n\t\t}\n\n\t\tif (cssFileExists) {\n\t\t\tconst shouldOverride = await p.confirm({\n\t\t\t\tmessage: `${highlighter.info(configChoices.cssFile)} already exists. Do you want to override it?`,\n\t\t\t});\n\n\t\t\tif (!shouldOverride) {\n\t\t\t\tp.log.info(\"Skipping Tailwind CSS configuration\");\n\t\t\t} else {\n\t\t\t\tconfigTasks.push({\n\t\t\t\t\ttitle: \"Creating Tailwind CSS configuration\",\n\t\t\t\t\ttask: async () => {\n\t\t\t\t\t\tawait writeCssFile(configChoices.cssFile, updatedTailwindConfig);\n\t\t\t\t\t\tawait sleep(250);\n\t\t\t\t\t\treturn \"Created Tailwind configuration\";\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tconfigTasks.push({\n\t\t\t\ttitle: \"Creating Tailwind CSS configuration\",\n\t\t\t\ttask: async () => {\n\t\t\t\t\tawait writeCssFile(configChoices.cssFile, updatedTailwindConfig);\n\t\t\t\t\tawait sleep(250);\n\t\t\t\t\treturn \"Created Tailwind configuration\";\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// ================================================================\n\t\t// Prepare project starwind configuration\n\t\t// ================================================================\n\t\tconfigTasks.push({\n\t\t\ttitle: \"Updating project configuration\",\n\t\t\ttask: async () => {\n\t\t\t\tawait updateConfig({\n\t\t\t\t\ttailwind: {\n\t\t\t\t\t\tcss: configChoices.cssFile,\n\t\t\t\t\t\tbaseColor: configChoices.twBaseColor as \"slate\" | \"gray\" | \"zinc\" | \"neutral\" | \"stone\",\n\t\t\t\t\t\tcssVariables: true,\n\t\t\t\t\t},\n\t\t\t\t\t// aliases: {\n\t\t\t\t\t// \tcomponents: \"@/components\",\n\t\t\t\t\t// },\n\t\t\t\t\tcomponentDir: configChoices.installLocation,\n\t\t\t\t\tcomponents: [],\n\t\t\t\t});\n\t\t\t\tawait sleep(250);\n\t\t\t\treturn \"Updated project starwind configuration\";\n\t\t\t},\n\t\t});\n\n\t\t// ================================================================\n\t\t// Prepare astro installation\n\t\t// ================================================================\n\t\t// Request package manager\n\t\tconst pm = await requestPackageManager();\n\n\t\tif (pkg.dependencies?.astro) {\n\t\t\tconst astroVersion = pkg.dependencies.astro.replace(/^\\^|~/, \"\");\n\t\t\tif (!semver.gte(astroVersion, MIN_ASTRO_VERSION)) {\n\t\t\t\tconst shouldUpgrade = await p.confirm({\n\t\t\t\t\tmessage: `Starwind requires Astro v${MIN_ASTRO_VERSION} or higher. Would you like to upgrade from v${astroVersion}?`,\n\t\t\t\t\tinitialValue: true,\n\t\t\t\t});\n\n\t\t\t\tif (p.isCancel(shouldUpgrade)) {\n\t\t\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\t\t\treturn process.exit(0);\n\t\t\t\t}\n\n\t\t\t\tif (!shouldUpgrade) {\n\t\t\t\t\tp.cancel(\"Astro v5 or higher is required to use Starwind\");\n\t\t\t\t\treturn process.exit(1);\n\t\t\t\t}\n\n\t\t\t\tinstallTasks.push({\n\t\t\t\t\ttitle: \"Upgrading Astro\",\n\t\t\t\t\ttask: async () => {\n\t\t\t\t\t\tawait installDependencies([ASTRO_PACKAGES.core], pm);\n\t\t\t\t\t\treturn \"Upgraded Astro successfully\";\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tconst shouldInstall = await p.confirm({\n\t\t\t\tmessage: `Starwind requires Astro v${MIN_ASTRO_VERSION} or higher. Would you like to install it?`,\n\t\t\t\tinitialValue: true,\n\t\t\t});\n\n\t\t\tif (p.isCancel(shouldInstall)) {\n\t\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\t\treturn process.exit(0);\n\t\t\t}\n\n\t\t\tif (!shouldInstall) {\n\t\t\t\tp.cancel(\"Astro is required to use Starwind\");\n\t\t\t\treturn process.exit(1);\n\t\t\t}\n\n\t\t\tinstallTasks.push({\n\t\t\t\ttitle: `Installing ${ASTRO_PACKAGES.core}`,\n\t\t\t\ttask: async () => {\n\t\t\t\t\tawait installDependencies([ASTRO_PACKAGES.core], pm);\n\t\t\t\t\treturn `Installed ${highlighter.info(ASTRO_PACKAGES.core)} successfully`;\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// ================================================================\n\t\t// Prepare tailwind and other package installation\n\t\t// ================================================================\n\t\tconst otherPackages = getOtherPackages();\n\n\t\tconst shouldInstall = await p.confirm({\n\t\t\tmessage: `Install ${highlighter.info(otherPackages.join(\", \"))} using ${highlighter.info(pm)}?`,\n\t\t});\n\n\t\tif (p.isCancel(shouldInstall)) {\n\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\treturn process.exit(0);\n\t\t}\n\n\t\tif (shouldInstall) {\n\t\t\tinstallTasks.push({\n\t\t\t\ttitle: `Installing packages`,\n\t\t\t\ttask: async () => {\n\t\t\t\t\tawait installDependencies(getOtherPackages(), pm, false, false);\n\t\t\t\t\treturn `${highlighter.info(\"Packages installed successfully\")}`;\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\tp.log.warn(\n\t\t\t\thighlighter.warn(`Skipped installation of packages. Make sure to install them manually`),\n\t\t\t);\n\t\t}\n\n\t\t// ================================================================\n\t\t// Execute all tasks\n\t\t// ================================================================\n\t\tif (installTasks.length > 0) {\n\t\t\tawait p.tasks(installTasks);\n\t\t}\n\n\t\tif (configTasks.length > 0) {\n\t\t\tawait p.tasks(configTasks);\n\t\t}\n\n\t\tawait sleep(250);\n\n\t\tp.note(\n\t\t\t`Make sure your layout imports the ${highlighter.infoBright(configChoices.cssFile)} file`,\n\t\t\t\"Next steps\",\n\t\t);\n\n\t\tif (!withinAdd) {\n\t\t\tsleep(1000);\n\t\t\tp.outro(\"Enjoy using Starwind UI 🚀\");\n\t\t}\n\t} catch (error) {\n\t\tp.log.error(error instanceof Error ? error.message : \"Failed to add components\");\n\t\tp.cancel(\"Operation cancelled\");\n\t\tprocess.exit(1);\n\t}\n}\n","export const tailwindConfig = `@import \"tailwindcss\";\n@plugin \"tailwindcss-animate\";\n@plugin \"@tailwindcss/forms\";\n@variant dark (&:where(.dark, .dark *));\n\n@theme {\n\t--animate-accordion-down: accordion-down 0.2s ease-out;\n\t--animate-accordion-up: accordion-up 0.2s ease-out;\n\n\t@keyframes accordion-down {\n\t\tfrom {\n\t\t\theight: 0;\n\t\t}\n\t\tto {\n\t\t\theight: var(--starwind-accordion-content-height);\n\t\t}\n\t}\n\n\t@keyframes accordion-up {\n\t\tfrom {\n\t\t\theight: var(--starwind-accordion-content-height);\n\t\t}\n\t\tto {\n\t\t\theight: 0;\n\t\t}\n\t}\n}\n\n@theme inline {\n\t--color-background: var(--background);\n\t--color-foreground: var(--foreground);\n\t--color-card: var(--card);\n\t--color-card-foreground: var(--card-foreground);\n\t--color-popover: var(--popover);\n\t--color-popover-foreground: var(--popover-foreground);\n\t--color-primary: var(--primary);\n\t--color-primary-foreground: var(--primary-foreground);\n\t--color-secondary: var(--secondary);\n\t--color-secondary-foreground: var(--secondary-foreground);\n\t--color-muted: var(--muted);\n\t--color-muted-foreground: var(--muted-foreground);\n\t--color-accent: var(--accent);\n\t--color-accent-foreground: var(--accent-foreground);\n\t--color-info: var(--info);\n\t--color-info-foreground: var(--info-foreground);\n\t--color-success: var(--success);\n\t--color-success-foreground: var(--success-foreground);\n\t--color-warning: var(--warning);\n\t--color-warning-foreground: var(--warning-foreground);\n\t--color-error: var(--error);\n\t--color-error-foreground: var(--error-foreground);\n\t--color-border: var(--border);\n\t--color-input: var(--input);\n\t--color-outline: var(--outline);\n\n\t--radius-xs: calc(var(--radius) - 0.375rem);\n\t--radius-sm: calc(var(--radius) - 0.25rem);\n\t--radius-md: calc(var(--radius) - 0.125rem);\n\t--radius-lg: var(--radius);\n\t--radius-xl: calc(var(--radius) + 0.25rem);\n\t--radius-2xl: calc(var(--radius) + 0.5rem);\n\t--radius-3xl: calc(var(--radius) + 1rem);\n}\n\n@layer base {\n\t:root {\n\t\t--background: var(--color-neutral-50);\n\t\t--foreground: var(--color-neutral-950);\n\t\t--card: var(--color-neutral-50);\n\t\t--card-foreground: var(--color-neutral-950);\n\t\t--popover: var(--color-neutral-50);\n\t\t--popover-foreground: var(--color-neutral-950);\n\t\t--primary: var(--color-blue-700);\n\t\t--primary-foreground: var(--color-neutral-50);\n\t\t--secondary: var(--color-fuchsia-700);\n\t\t--secondary-foreground: var(--color-neutral-50);\n\t\t--muted: var(--color-neutral-100);\n\t\t--muted-foreground: var(--color-neutral-600);\n\t\t--accent: var(--color-neutral-200);\n\t\t--accent-foreground: var(--color-neutral-900);\n\t\t--info: var(--color-sky-300);\n\t\t--info-foreground: var(--color-sky-950);\n\t\t--success: var(--color-green-300);\n\t\t--success-foreground: var(--color-green-950);\n\t\t--warning: var(--color-amber-300);\n\t\t--warning-foreground: var(--color-amber-950);\n\t\t--error: var(--color-red-700);\n\t\t--error-foreground: var(--color-neutral-50);\n\t\t--border: var(--color-neutral-200);\n\t\t--input: var(--color-neutral-200);\n\t\t--outline: var(--color-blue-600);\n\t\t--radius: 0.5rem;\n\t}\n\n\t.dark {\n\t\t--background: var(--color-neutral-950);\n\t\t--foreground: var(--color-neutral-50);\n\t\t--card: var(--color-neutral-950);\n\t\t--card-foreground: var(--color-neutral-50);\n\t\t--popover: var(--color-neutral-950);\n\t\t--popover-foreground: var(--color-neutral-50);\n\t\t--primary: var(--color-blue-700);\n\t\t--primary-foreground: var(--color-neutral-50);\n\t\t--secondary: var(--color-fuchsia-300);\n\t\t--secondary-foreground: var(--color-neutral-950);\n\t\t--muted: var(--color-neutral-900);\n\t\t--muted-foreground: var(--color-neutral-400);\n\t\t--accent: var(--color-neutral-900);\n\t\t--accent-foreground: var(--color-neutral-100);\n\t\t--info: var(--color-sky-300);\n\t\t--info-foreground: var(--color-sky-950);\n\t\t--success: var(--color-green-300);\n\t\t--success-foreground: var(--color-green-950);\n\t\t--warning: var(--color-amber-300);\n\t\t--warning-foreground: var(--color-amber-950);\n\t\t--error: var(--color-red-800);\n\t\t--error-foreground: var(--color-neutral-50);\n\t\t--border: var(--color-neutral-800);\n\t\t--input: var(--color-neutral-800);\n\t\t--outline: var(--color-blue-600);\n\t\t--radius: 0.5rem;\n\t}\n\n\t* {\n\t\t@apply border-border;\n\t}\n\t*:focus-visible {\n\t\t@apply outline-outline;\n\t}\n\thtml {\n\t\t@apply bg-background text-foreground scheme-light dark:scheme-dark;\n\t}\n\tbutton {\n\t\t@apply cursor-pointer;\n\t}\n}\n\n@layer utilities {\n\t/* transition-colors but without outline-color transition property */\n\t.starwind-transition-colors {\n\t\ttransition-property: color, background-color, border-color, text-decoration-color, fill, stroke,\n\t\t\t--tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n\t\ttransition-timing-function: var(--default-transition-timing-function);\n\t\ttransition-duration: var(--default-transition-duration);\n\t}\n}\n`;\n","import chalk from \"chalk\";\n\nexport const highlighter = {\n\terror: chalk.red,\n\twarn: chalk.yellow,\n\tinfo: chalk.cyan,\n\tinfoBright: chalk.cyanBright,\n\tsuccess: chalk.greenBright,\n\tunderline: chalk.underline,\n\ttitle: chalk.bgBlue,\n};\n","import { highlighter } from \"@/utils/highlighter.js\";\nimport * as p from \"@clack/prompts\";\nimport fs from \"fs-extra\";\nimport { fileExists } from \"./fs.js\";\n\nconst CONFIG_EXTENSIONS = [\"ts\", \"js\", \"mjs\", \"cjs\"] as const;\n// type ConfigExtension = (typeof CONFIG_EXTENSIONS)[number];\n\n/**\n * Finds the Astro config file in the current directory\n * @returns The path to the config file if found, null otherwise\n */\nasync function findAstroConfig(): Promise<string | null> {\n\tfor (const ext of CONFIG_EXTENSIONS) {\n\t\tconst configPath = `astro.config.${ext}`;\n\t\tif (await fileExists(configPath)) {\n\t\t\treturn configPath;\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n * Updates or creates the Astro configuration file\n * @returns true if successful, false otherwise\n */\nexport async function setupAstroConfig(): Promise<boolean> {\n\ttry {\n\t\tlet configPath = await findAstroConfig();\n\t\tlet content = \"\";\n\n\t\tif (configPath) {\n\t\t\tcontent = await fs.readFile(configPath, \"utf-8\");\n\t\t} else {\n\t\t\tconfigPath = \"astro.config.ts\";\n\t\t\tcontent = `import { defineConfig } from \"astro/config\";\\n\\nexport default defineConfig({});\\n`;\n\t\t}\n\n\t\t// Add tailwindcss import if not present\n\t\tif (!content.includes('import tailwindcss from \"@tailwindcss/vite\"')) {\n\t\t\tcontent = `import tailwindcss from \"@tailwindcss/vite\";\\n${content}`;\n\t\t}\n\n\t\t// Parse the configuration object\n\t\tconst configStart = content.indexOf(\"defineConfig(\") + \"defineConfig(\".length;\n\t\tconst configEnd = content.lastIndexOf(\");\");\n\t\tlet config = content.slice(configStart, configEnd);\n\n\t\t// Remove outer braces and trim\n\t\tconfig = config.trim().replace(/^{|}$/g, \"\").trim();\n\n\t\t// Add experimental configuration\n\t\tif (!config.includes(\"experimental\")) {\n\t\t\tconfig += `\\n\\texperimental: {\n\t\tsvg: {\n\t\t\tmode: \"sprite\",\n\t\t},\n\t},`;\n\t\t} else if (!config.includes(\"svg: {\")) {\n\t\t\t// Insert svg config into existing experimental block\n\t\t\tconst expEnd = config.indexOf(\"experimental:\") + \"experimental:\".length;\n\t\t\tconst blockStart = config.indexOf(\"{\", expEnd) + 1;\n\t\t\tconfig =\n\t\t\t\tconfig.slice(0, blockStart) +\n\t\t\t\t`\\n\\t\\tsvg: {\\n\\t\\t\\tmode: \"sprite\",\\n\\t\\t},` +\n\t\t\t\tconfig.slice(blockStart);\n\t\t}\n\n\t\t// Add vite configuration\n\t\tif (!config.includes(\"vite:\")) {\n\t\t\tconfig += `\\n\\tvite: {\n\t\tplugins: [tailwindcss()],\n\t},`;\n\t\t} else if (!config.includes(\"plugins: [\")) {\n\t\t\t// Insert plugins into existing vite block\n\t\t\tconst viteEnd = config.indexOf(\"vite:\") + \"vite:\".length;\n\t\t\tconst blockStart = config.indexOf(\"{\", viteEnd) + 1;\n\t\t\tconfig =\n\t\t\t\tconfig.slice(0, blockStart) + `\\n\\t\\tplugins: [tailwindcss()],` + config.slice(blockStart);\n\t\t} else if (!config.includes(\"tailwindcss()\")) {\n\t\t\t// Add tailwindcss to existing plugins array\n\t\t\tconst pluginsStart = config.indexOf(\"plugins:\") + \"plugins:\".length;\n\t\t\tconst arrayStart = config.indexOf(\"[\", pluginsStart) + 1;\n\t\t\tconfig = config.slice(0, arrayStart) + `tailwindcss(), ` + config.slice(arrayStart);\n\t\t}\n\n\t\t// Reconstruct the file content\n\t\tconst newContent = `${content.slice(0, configStart)}{\\n\\t${config}\\n}${content.slice(configEnd)}`;\n\n\t\tawait fs.writeFile(configPath, newContent, \"utf-8\");\n\t\treturn true;\n\t} catch (error) {\n\t\tconst errorMessage = error instanceof Error ? error.message : \"An unknown error occurred\";\n\t\tp.log.error(highlighter.error(`Failed to setup Astro config: ${errorMessage}`));\n\t\treturn false;\n\t}\n}\n","import fs from \"fs-extra\";\n\n/**\n * Ensures a directory exists, creating it and its parents if necessary\n * @param dir - Directory path to ensure exists\n */\nexport async function ensureDirectory(dir: string) {\n\tawait fs.ensureDir(dir);\n}\n\n/**\n * Copies a file from source to destination\n * @param src - Source file path\n * @param dest - Destination file path\n */\nexport async function copyFile(src: string, dest: string) {\n\tawait fs.copy(src, dest);\n}\n\n/**\n * Reads and parses a JSON file\n * @param filePath - Path to the JSON file\n * @returns Parsed JSON content\n */\nexport async function readJsonFile(filePath: string) {\n\treturn fs.readJson(filePath);\n}\n\n/**\n * Writes data to a JSON file\n * @param filePath - Path to write the JSON file\n * @param data - Data to write to the file\n */\nexport async function writeJsonFile(filePath: string, data: unknown) {\n\tawait fs.writeJson(filePath, data, { spaces: 2 });\n}\n\n/**\n * Checks if a file exists\n * @param filePath - Path to check\n * @returns True if the file exists, false otherwise\n */\nexport async function fileExists(filePath: string) {\n\treturn fs.pathExists(filePath);\n}\n\n/**\n * Creates a CSS file with the provided content\n * @param filePath - Path to write the CSS file\n * @param content - CSS content to write\n */\nexport async function writeCssFile(filePath: string, content: string) {\n\tawait fs.writeFile(filePath, content, \"utf-8\");\n}\n","export const MIN_ASTRO_VERSION = \"5.0.0\";\n\n/**\n * File system paths used throughout the application\n */\nexport const PATHS = {\n\tSTARWIND_CORE: \"@starwind-ui/core\",\n\tSTARWIND_CORE_COMPONENTS: \"src/components\",\n\tSTARWIND_CORE_REGISTRY: \"registry.json\",\n\tLOCAL_CSS_FILE: \"src/styles/starwind.css\",\n\tLOCAL_CONFIG_FILE: \"starwind.config.json\",\n\tLOCAL_STYLES_DIR: \"src/styles\",\n\tLOCAL_COMPONENTS_DIR: \"src/components\",\n} as const;\n\n/**\n * Core framework dependencies\n */\nexport const ASTRO_PACKAGES = {\n\tcore: \"astro@latest\",\n} as const;\n\n/**\n * Tailwind CSS related dependencies\n */\nexport const OTHER_PACKAGES = {\n\ttailwindCore: \"tailwindcss@latest\",\n\ttailwindVite: \"@tailwindcss/vite@latest\",\n\ttailwindForms: \"@tailwindcss/forms@latest\",\n\ttailwindAnimate: \"tailwindcss-animate@latest\",\n\ttablerIcons: \"@tabler/icons@latest\",\n} as const;\n\n/**\n * Get all Tailwind CSS related packages as an array\n */\nexport function getOtherPackages(): string[] {\n\treturn Object.values(OTHER_PACKAGES);\n}\n\n/**\n * Get all Astro related packages as an array\n */\nexport function getAstroPackages(): string[] {\n\treturn Object.values(ASTRO_PACKAGES);\n}\n","import { PATHS } from \"./constants.js\";\nimport { fileExists, readJsonFile, writeJsonFile } from \"./fs.js\";\n\ninterface ComponentConfig {\n\tname: string;\n\tversion: string;\n}\n\ninterface TailwindConfig {\n\tcss: string;\n\tbaseColor: \"slate\" | \"gray\" | \"zinc\" | \"neutral\" | \"stone\";\n\tcssVariables: boolean;\n}\n\ninterface AliasConfig {\n\tcomponents: string;\n}\n\nexport interface StarwindConfig {\n\ttailwind: TailwindConfig;\n\t// aliases: AliasConfig;\n\tcomponentDir: string;\n\tcomponents: ComponentConfig[];\n}\n\nconst defaultConfig: StarwindConfig = {\n\ttailwind: {\n\t\tcss: \"src/styles/starwind.css\",\n\t\tbaseColor: \"gray\",\n\t\tcssVariables: true,\n\t},\n\t// aliases: {\n\t// \tcomponents: \"@/components\",\n\t// },\n\tcomponentDir: \"src/components/starwind\",\n\tcomponents: [],\n};\n\n/**\n * Get the current config, ensuring the file is fully read\n */\nexport async function getConfig(): Promise<StarwindConfig> {\n\ttry {\n\t\tif (await fileExists(PATHS.LOCAL_CONFIG_FILE)) {\n\t\t\tconst config = await readJsonFile(PATHS.LOCAL_CONFIG_FILE);\n\t\t\treturn {\n\t\t\t\t...defaultConfig,\n\t\t\t\t...config,\n\t\t\t\tcomponents: Array.isArray(config.components) ? config.components : [],\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(\"Error reading config:\", error);\n\t}\n\n\treturn defaultConfig;\n}\n\n/**\n * Options for updating the config file\n */\nexport interface UpdateConfigOptions {\n\t/** If true, append new components to existing array. If false, replace the components array. */\n\tappendComponents?: boolean;\n}\n\n/**\n * Update the config file, ensuring the write operation is completed\n * @param updates - Partial config object to update\n * @param options - Options for updating the config\n */\nexport async function updateConfig(\n\tupdates: Partial<StarwindConfig>,\n\toptions: UpdateConfigOptions = { appendComponents: true },\n): Promise<void> {\n\tconst currentConfig = await getConfig();\n\n\t// Ensure components array exists\n\tconst currentComponents = Array.isArray(currentConfig.components) ? currentConfig.components : [];\n\n\tconst newConfig = {\n\t\t...currentConfig,\n\t\ttailwind: {\n\t\t\t...currentConfig.tailwind,\n\t\t\t...(updates.tailwind || {}),\n\t\t},\n\t\tcomponentDir: updates.componentDir ? updates.componentDir : currentConfig.componentDir,\n\t\tcomponents: updates.components\n\t\t\t? options.appendComponents\n\t\t\t\t? [...currentComponents, ...updates.components]\n\t\t\t\t: updates.components\n\t\t\t: currentComponents,\n\t};\n\n\ttry {\n\t\tawait writeJsonFile(PATHS.LOCAL_CONFIG_FILE, newConfig);\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Failed to update config: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n\t\t);\n\t}\n}\n","import * as p from \"@clack/prompts\";\nimport { execa } from \"execa\";\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\n/**\n * Prompts the user to select their preferred package manager\n * @returns The selected package manager, defaults to npm if cancelled\n */\nexport async function requestPackageManager(): Promise<PackageManager> {\n\tconst pm = await p.select({\n\t\tmessage: \"Select your preferred package manager\",\n\t\toptions: [\n\t\t\t{ value: \"pnpm\", label: \"pnpm\", hint: \"Default\" },\n\t\t\t{ value: \"npm\", label: \"npm\" },\n\t\t\t{ value: \"yarn\", label: \"yarn\" },\n\t\t\t{ value: \"bun\", label: \"bun\" },\n\t\t],\n\t});\n\n\tif (p.isCancel(pm)) {\n\t\tp.log.warn(\"No package manager selected, defaulting to npm\");\n\t\treturn \"npm\";\n\t}\n\n\treturn pm as PackageManager;\n}\n\n/**\n * Installs the specified packages using the detected package manager\n * @param packages - Array of package names to install\n * @param pm - The package manager to use\n * @param dev - Whether to install as dev dependencies\n * @param force - Whether to force install packages\n */\nexport async function installDependencies(\n\tpackages: string[],\n\tpm: PackageManager,\n\tdev = false,\n\tforce = false,\n): Promise<void> {\n\tconst args = [\n\t\tpm === \"npm\" ? \"install\" : \"add\",\n\t\t...packages,\n\t\tdev ? (pm === \"npm\" || pm === \"pnpm\" ? \"-D\" : \"--dev\") : \"\",\n\t\tforce ? \"--force\" : \"\",\n\t].filter(Boolean);\n\n\tawait execa(pm, args);\n}\n","/**\n * Pauses execution for the specified number of milliseconds.\n * @param ms - The number of milliseconds to sleep\n */\nexport const sleep = async (ms: number): Promise<void> => {\n\tawait new Promise((resolve) => setTimeout(resolve, ms));\n};\n"],"mappings":"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","names":["fs","fs","p","p","shouldInstall"]}
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  requestPackageManager,
10
10
  sleep,
11
11
  updateConfig
12
- } from "./chunk-JUEM67WU.js";
12
+ } from "./chunk-V7BBFSQ4.js";
13
13
 
14
14
  // src/index.ts
15
15
  import { Command } from "commander";
@@ -47,6 +47,7 @@ async function getAllComponents() {
47
47
 
48
48
  // src/utils/component.ts
49
49
  import semver from "semver";
50
+ import * as p from "@clack/prompts";
50
51
  async function copyComponent(name, overwrite = false) {
51
52
  const config = await getConfig();
52
53
  const currentComponents = Array.isArray(config.components) ? config.components : [];
@@ -130,6 +131,18 @@ async function updateComponent(name, currentVersion) {
130
131
  newVersion: registryComponent.version
131
132
  };
132
133
  }
134
+ const confirmUpdate = await p.confirm({
135
+ message: `Update component ${highlighter.info(name)} from ${highlighter.warn(`v${currentVersion}`)} to ${highlighter.success(`v${registryComponent.version}`)}? This will override the existing implementation.`
136
+ });
137
+ if (!confirmUpdate || p.isCancel(confirmUpdate)) {
138
+ p.log.info(`Skipping update for ${highlighter.info(name)}`);
139
+ return {
140
+ name,
141
+ status: "skipped",
142
+ oldVersion: currentVersion,
143
+ newVersion: registryComponent.version
144
+ };
145
+ }
133
146
  const result = await copyComponent(name, true);
134
147
  if (result.status === "installed") {
135
148
  return {
@@ -155,7 +168,7 @@ async function updateComponent(name, currentVersion) {
155
168
  }
156
169
 
157
170
  // src/utils/prompts.ts
158
- import { confirm, multiselect } from "@clack/prompts";
171
+ import { confirm as confirm2, multiselect } from "@clack/prompts";
159
172
  async function selectComponents() {
160
173
  const components = await getAllComponents();
161
174
  const selected = await multiselect({
@@ -173,7 +186,7 @@ async function selectComponents() {
173
186
  }
174
187
  async function confirmInstall(component) {
175
188
  if (component.dependencies.length === 0) return true;
176
- const confirmed = await confirm({
189
+ const confirmed = await confirm2({
177
190
  message: `This component requires the following dependencies: ${component.dependencies.join(", ")}. Install them?`
178
191
  });
179
192
  if (typeof confirmed === "symbol") {
@@ -222,25 +235,25 @@ async function isValidComponent(component, availableComponents) {
222
235
  }
223
236
 
224
237
  // src/commands/add.ts
225
- import * as p from "@clack/prompts";
226
- var { init: init2 } = await import("./init-JA2KC6GS.js");
238
+ import * as p2 from "@clack/prompts";
239
+ var { init: init2 } = await import("./init-MD7ZEY5H.js");
227
240
  async function add(components, options) {
228
241
  try {
229
- p.intro(highlighter.title(" Welcome to the Starwind CLI "));
242
+ p2.intro(highlighter.title(" Welcome to the Starwind CLI "));
230
243
  const configExists = await fileExists(PATHS.LOCAL_CONFIG_FILE);
231
244
  if (!configExists) {
232
- const shouldInit = await p.confirm({
245
+ const shouldInit = await p2.confirm({
233
246
  message: `Starwind configuration not found. Would you like to run ${highlighter.info("starwind init")} now?`,
234
247
  initialValue: true
235
248
  });
236
- if (p.isCancel(shouldInit)) {
237
- p.cancel("Operation cancelled");
249
+ if (p2.isCancel(shouldInit)) {
250
+ p2.cancel("Operation cancelled");
238
251
  process.exit(0);
239
252
  }
240
253
  if (shouldInit) {
241
254
  await init2(true);
242
255
  } else {
243
- p.log.error(
256
+ p2.log.error(
244
257
  `Please initialize starwind with ${highlighter.info("starwind init")} before adding components`
245
258
  );
246
259
  process.exit(1);
@@ -250,7 +263,7 @@ async function add(components, options) {
250
263
  if (options?.all) {
251
264
  const availableComponents = await getAllComponents();
252
265
  componentsToInstall = availableComponents.map((c) => c.name);
253
- p.log.info(`Adding all ${componentsToInstall.length} available components...`);
266
+ p2.log.info(`Adding all ${componentsToInstall.length} available components...`);
254
267
  } else if (components && components.length > 0) {
255
268
  const availableComponents = await getAllComponents();
256
269
  const { valid, invalid } = await components.reduce(
@@ -267,7 +280,7 @@ async function add(components, options) {
267
280
  Promise.resolve({ valid: [], invalid: [] })
268
281
  );
269
282
  if (invalid.length > 0) {
270
- p.log.warn(
283
+ p2.log.warn(
271
284
  `${highlighter.warn("Invalid components found:")}
272
285
  ${invalid.map((name) => ` ${name}`).join("\n")}`
273
286
  );
@@ -275,28 +288,28 @@ ${invalid.map((name) => ` ${name}`).join("\n")}`
275
288
  if (valid.length > 0) {
276
289
  componentsToInstall = valid;
277
290
  } else {
278
- p.log.warn(`${highlighter.warn("No valid components to install")}`);
279
- p.cancel("Operation cancelled");
291
+ p2.log.warn(`${highlighter.warn("No valid components to install")}`);
292
+ p2.cancel("Operation cancelled");
280
293
  return process.exit(0);
281
294
  }
282
295
  } else {
283
296
  const selected = await selectComponents();
284
297
  if (!selected) {
285
- p.cancel("No components selected");
298
+ p2.cancel("No components selected");
286
299
  return process.exit(0);
287
300
  }
288
301
  componentsToInstall = selected;
289
302
  }
290
303
  if (componentsToInstall.length === 0) {
291
- p.log.warn(`${highlighter.warn("No components selected")}`);
292
- p.cancel("Operation cancelled");
304
+ p2.log.warn(`${highlighter.warn("No components selected")}`);
305
+ p2.cancel("Operation cancelled");
293
306
  return process.exit(0);
294
307
  }
295
- const confirmed = await p.confirm({
308
+ const confirmed = await p2.confirm({
296
309
  message: `Install ${componentsToInstall.map((comp) => highlighter.info(comp)).join(", ")} ${componentsToInstall.length > 1 ? "components" : "component"}?`
297
310
  });
298
- if (!confirmed || p.isCancel(confirmed)) {
299
- p.cancel("Operation cancelled");
311
+ if (!confirmed || p2.isCancel(confirmed)) {
312
+ p2.cancel("Operation cancelled");
300
313
  return process.exit(0);
301
314
  }
302
315
  const results = {
@@ -324,68 +337,68 @@ ${invalid.map((name) => ` ${name}`).join("\n")}`
324
337
  try {
325
338
  await updateConfig({ components: installedComponents }, { appendComponents: true });
326
339
  } catch (error) {
327
- p.log.error(
340
+ p2.log.error(
328
341
  `Failed to update config: ${error instanceof Error ? error.message : "Unknown error"}`
329
342
  );
330
343
  process.exit(1);
331
344
  }
332
345
  }
333
- p.log.message(`
346
+ p2.log.message(`
334
347
 
335
348
  ${highlighter.underline("Installation Summary")}`);
336
349
  if (results.installed.length > 0) {
337
- p.log.success(
350
+ p2.log.success(
338
351
  `${highlighter.success("Successfully installed components:")}
339
352
  ${results.installed.map((r) => ` ${r.name} v${r.version}`).join("\n")}`
340
353
  );
341
354
  }
342
355
  if (results.skipped.length > 0) {
343
- p.log.warn(
356
+ p2.log.warn(
344
357
  `${highlighter.warn("Skipped components (already installed):")}
345
358
  ${results.skipped.map((r) => ` ${r.name} v${r.version}`).join("\n")}`
346
359
  );
347
360
  }
348
361
  if (results.failed.length > 0) {
349
- p.log.error(
362
+ p2.log.error(
350
363
  `${highlighter.error("Failed to install components:")}
351
364
  ${results.failed.map((r) => ` ${r.name} - ${r.error}`).join("\n")}`
352
365
  );
353
366
  }
354
367
  await sleep(1e3);
355
- p.outro("Enjoy using Starwind UI \u{1F680}");
368
+ p2.outro("Enjoy using Starwind UI \u{1F680}");
356
369
  } catch (error) {
357
- p.log.error(error instanceof Error ? error.message : "Failed to add components");
358
- p.cancel("Operation cancelled");
370
+ p2.log.error(error instanceof Error ? error.message : "Failed to add components");
371
+ p2.cancel("Operation cancelled");
359
372
  process.exit(1);
360
373
  }
361
374
  }
362
375
 
363
376
  // src/commands/remove.ts
364
- import * as p2 from "@clack/prompts";
377
+ import * as p3 from "@clack/prompts";
365
378
  async function remove(components, options) {
366
379
  try {
367
- p2.intro(highlighter.title(" Welcome to the Starwind CLI "));
380
+ p3.intro(highlighter.title(" Welcome to the Starwind CLI "));
368
381
  const configExists = await fileExists(PATHS.LOCAL_CONFIG_FILE);
369
382
  if (!configExists) {
370
- p2.log.error("No Starwind configuration found. Please run starwind init first.");
383
+ p3.log.error("No Starwind configuration found. Please run starwind init first.");
371
384
  process.exit(1);
372
385
  }
373
386
  const config = await getConfig();
374
387
  const installedComponents = config.components;
375
388
  if (installedComponents.length === 0) {
376
- p2.log.warn("No components are currently installed.");
389
+ p3.log.warn("No components are currently installed.");
377
390
  process.exit(0);
378
391
  }
379
392
  let componentsToRemove = [];
380
393
  if (options?.all) {
381
394
  componentsToRemove = installedComponents.map((comp) => comp.name);
382
- p2.log.info(`Removing all ${componentsToRemove.length} installed components...`);
395
+ p3.log.info(`Removing all ${componentsToRemove.length} installed components...`);
383
396
  } else if (components && components.length > 0) {
384
397
  const invalid = components.filter(
385
398
  (comp) => !installedComponents.some((ic) => ic.name === comp)
386
399
  );
387
400
  if (invalid.length > 0) {
388
- p2.log.warn(
401
+ p3.log.warn(
389
402
  `${highlighter.warn("Components not found:")}
390
403
  ${invalid.map((name) => ` ${name}`).join("\n")}`
391
404
  );
@@ -394,7 +407,7 @@ ${invalid.map((name) => ` ${name}`).join("\n")}`
394
407
  (comp) => installedComponents.some((ic) => ic.name === comp)
395
408
  );
396
409
  if (componentsToRemove.length === 0) {
397
- p2.log.warn("No valid components to remove");
410
+ p3.log.warn("No valid components to remove");
398
411
  process.exit(0);
399
412
  }
400
413
  } else {
@@ -402,25 +415,25 @@ ${invalid.map((name) => ` ${name}`).join("\n")}`
402
415
  value: comp.name,
403
416
  label: comp.name
404
417
  }));
405
- const selected = await p2.multiselect({
418
+ const selected = await p3.multiselect({
406
419
  message: "Select components to remove",
407
420
  options: choices
408
421
  });
409
- if (p2.isCancel(selected)) {
410
- p2.cancel("Operation cancelled");
422
+ if (p3.isCancel(selected)) {
423
+ p3.cancel("Operation cancelled");
411
424
  process.exit(0);
412
425
  }
413
426
  componentsToRemove = selected;
414
427
  }
415
428
  if (componentsToRemove.length === 0) {
416
- p2.log.warn("No components selected for removal");
429
+ p3.log.warn("No components selected for removal");
417
430
  process.exit(0);
418
431
  }
419
- const confirmed = await p2.confirm({
432
+ const confirmed = await p3.confirm({
420
433
  message: `Remove ${componentsToRemove.map((comp) => highlighter.info(comp)).join(", ")} ${componentsToRemove.length > 1 ? "components" : "component"}?`
421
434
  });
422
- if (!confirmed || p2.isCancel(confirmed)) {
423
- p2.cancel("Operation cancelled");
435
+ if (!confirmed || p3.isCancel(confirmed)) {
436
+ p3.cancel("Operation cancelled");
424
437
  process.exit(0);
425
438
  }
426
439
  const results = {
@@ -445,61 +458,61 @@ ${invalid.map((name) => ` ${name}`).join("\n")}`
445
458
  },
446
459
  { appendComponents: false }
447
460
  );
448
- p2.log.message(`
461
+ p3.log.message(`
449
462
 
450
463
  ${highlighter.underline("Removal Summary")}`);
451
464
  if (results.removed.length > 0) {
452
- p2.log.success(
465
+ p3.log.success(
453
466
  `${highlighter.success("Successfully removed components:")}
454
467
  ${results.removed.map((r) => ` ${r.name}`).join("\n")}`
455
468
  );
456
469
  }
457
470
  if (results.failed.length > 0) {
458
- p2.log.error(
471
+ p3.log.error(
459
472
  `${highlighter.error("Failed to remove components:")}
460
473
  ${results.failed.map((r) => ` ${r.name} - ${r.error}`).join("\n")}`
461
474
  );
462
475
  }
463
476
  await sleep(1e3);
464
477
  if (results.removed.length > 0) {
465
- p2.outro("Components removed successfully \u{1F5D1}\uFE0F");
478
+ p3.outro("Components removed successfully \u{1F5D1}\uFE0F");
466
479
  } else {
467
- p2.cancel("Errors occurred while removing components");
480
+ p3.cancel("Errors occurred while removing components");
468
481
  process.exit(1);
469
482
  }
470
483
  } catch (error) {
471
- p2.log.error(error instanceof Error ? error.message : "Failed to remove components");
472
- p2.cancel("Operation cancelled");
484
+ p3.log.error(error instanceof Error ? error.message : "Failed to remove components");
485
+ p3.cancel("Operation cancelled");
473
486
  process.exit(1);
474
487
  }
475
488
  }
476
489
 
477
490
  // src/commands/update.ts
478
- import * as p3 from "@clack/prompts";
491
+ import * as p4 from "@clack/prompts";
479
492
  async function update(components, options) {
480
493
  try {
481
- p3.intro(highlighter.title(" Welcome to the Starwind CLI "));
494
+ p4.intro(highlighter.title(" Welcome to the Starwind CLI "));
482
495
  const configExists = await fileExists(PATHS.LOCAL_CONFIG_FILE);
483
496
  if (!configExists) {
484
- p3.log.error("No Starwind configuration found. Please run starwind init first.");
497
+ p4.log.error("No Starwind configuration found. Please run starwind init first.");
485
498
  process.exit(1);
486
499
  }
487
500
  const config = await getConfig();
488
501
  const installedComponents = config.components;
489
502
  if (installedComponents.length === 0) {
490
- p3.log.warn("No components are currently installed.");
503
+ p4.log.warn("No components are currently installed.");
491
504
  process.exit(0);
492
505
  }
493
506
  let componentsToUpdate = [];
494
507
  if (options?.all) {
495
508
  componentsToUpdate = installedComponents.map((comp) => comp.name);
496
- p3.log.info(`Checking updates for all ${componentsToUpdate.length} installed components...`);
509
+ p4.log.info(`Checking updates for all ${componentsToUpdate.length} installed components...`);
497
510
  } else if (components && components.length > 0) {
498
511
  const invalid = components.filter(
499
512
  (comp) => !installedComponents.some((ic) => ic.name === comp)
500
513
  );
501
514
  if (invalid.length > 0) {
502
- p3.log.warn(
515
+ p4.log.warn(
503
516
  `${highlighter.warn("Components not found in project:")}
504
517
  ${invalid.map((name) => ` ${name}`).join("\n")}`
505
518
  );
@@ -508,7 +521,7 @@ ${invalid.map((name) => ` ${name}`).join("\n")}`
508
521
  (comp) => installedComponents.some((ic) => ic.name === comp)
509
522
  );
510
523
  if (componentsToUpdate.length === 0) {
511
- p3.log.warn("No valid components to update");
524
+ p4.log.warn("No valid components to update");
512
525
  process.exit(0);
513
526
  }
514
527
  } else {
@@ -516,25 +529,25 @@ ${invalid.map((name) => ` ${name}`).join("\n")}`
516
529
  value: comp.name,
517
530
  label: comp.name
518
531
  }));
519
- const selected = await p3.multiselect({
532
+ const selected = await p4.multiselect({
520
533
  message: "Select components to update",
521
534
  options: choices
522
535
  });
523
- if (p3.isCancel(selected)) {
524
- p3.cancel("Operation cancelled");
536
+ if (p4.isCancel(selected)) {
537
+ p4.cancel("Operation cancelled");
525
538
  process.exit(0);
526
539
  }
527
540
  componentsToUpdate = selected;
528
541
  }
529
542
  if (componentsToUpdate.length === 0) {
530
- p3.log.warn("No components selected for update");
543
+ p4.log.warn("No components selected for update");
531
544
  process.exit(0);
532
545
  }
533
- const confirmed = await p3.confirm({
546
+ const confirmed = await p4.confirm({
534
547
  message: `Check for updates to ${componentsToUpdate.map((comp) => highlighter.info(comp)).join(", ")} ${componentsToUpdate.length > 1 ? "components" : "component"}?`
535
548
  });
536
- if (!confirmed || p3.isCancel(confirmed)) {
537
- p3.cancel("Operation cancelled");
549
+ if (!confirmed || p4.isCancel(confirmed)) {
550
+ p4.cancel("Operation cancelled");
538
551
  process.exit(0);
539
552
  }
540
553
  const results = {
@@ -585,45 +598,45 @@ ${invalid.map((name) => ` ${name}`).join("\n")}`
585
598
  { appendComponents: false }
586
599
  );
587
600
  } catch (error) {
588
- p3.log.error(
601
+ p4.log.error(
589
602
  `Failed to update config: ${error instanceof Error ? error.message : "Unknown error"}`
590
603
  );
591
604
  process.exit(1);
592
605
  }
593
606
  }
594
- p3.log.message(`
607
+ p4.log.message(`
595
608
 
596
609
  ${highlighter.underline("Update Summary")}`);
597
610
  if (results.skipped.length > 0) {
598
- p3.log.info(
599
- `${highlighter.info("Components already up to date:")}
600
- ${results.skipped.map((r) => ` ${r.name} (${r.newVersion})`).join("\n")}`
611
+ p4.log.info(
612
+ `${highlighter.info("Components already up to date or skipped:")}
613
+ ${results.skipped.map((r) => ` ${r.name} (${r.oldVersion})`).join("\n")}`
601
614
  );
602
615
  }
603
616
  if (results.updated.length > 0) {
604
- p3.log.success(
617
+ p4.log.success(
605
618
  `${highlighter.success("Successfully updated components:")}
606
619
  ${results.updated.map((r) => ` ${r.name} (${r.oldVersion} \u2192 ${r.newVersion})`).join("\n")}`
607
620
  );
608
621
  }
609
622
  if (results.failed.length > 0) {
610
- p3.log.error(
623
+ p4.log.error(
611
624
  `${highlighter.error("Failed to update components:")}
612
625
  ${results.failed.map((r) => ` ${r.name} - ${r.error}`).join("\n")}`
613
626
  );
614
627
  }
615
628
  await sleep(1e3);
616
629
  if (results.updated.length > 0) {
617
- p3.outro("Components updated successfully \u{1F680}");
630
+ p4.outro("Components updated successfully \u{1F680}");
618
631
  } else if (results.skipped.length > 0 && results.failed.length === 0) {
619
- p3.outro("All components are up to date \u2728");
632
+ p4.outro("Components already up to date or skipped \u2728");
620
633
  } else {
621
- p3.cancel("No components were updated");
634
+ p4.cancel("No components were updated");
622
635
  process.exit(1);
623
636
  }
624
637
  } catch (error) {
625
- p3.log.error(error instanceof Error ? error.message : "Failed to update components");
626
- p3.cancel("Operation cancelled");
638
+ p4.log.error(error instanceof Error ? error.message : "Failed to update components");
639
+ p4.cancel("Operation cancelled");
627
640
  process.exit(1);
628
641
  }
629
642
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/component.ts","../src/utils/registry.ts","../src/utils/prompts.ts","../src/utils/install.ts","../src/utils/validate.ts","../src/commands/add.ts","../src/commands/remove.ts","../src/commands/update.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { add } from \"./commands/add.js\";\nimport { init } from \"./commands/init.js\";\nimport { remove } from \"./commands/remove.js\";\nimport { update } from \"./commands/update.js\";\n\nconst program = new Command()\n\t.name(\"starwind\")\n\t.description(\"Add beautifully designed components to your Astro applications\")\n\t.version(\"0.0.1\");\n\nprogram\n\t.command(\"init\")\n\t.description(\"Initialize your project with Starwind\")\n\t.option(\"--no-install\", \"Skip dependency installation\")\n\t.action(() => init(false));\n\nprogram\n\t.command(\"add\")\n\t.description(\"Add Starwind components to your project\")\n\t.argument(\"[components...]\", \"The components to add (space separated)\")\n\t.allowExcessArguments()\n\t.option(\"-a, --all\", \"Add all available components\")\n\t.action(add);\n\nprogram\n\t.command(\"update\")\n\t.description(\"Update Starwind components to their latest versions\")\n\t.argument(\"[components...]\", \"The components to update (space separated)\")\n\t.allowExcessArguments()\n\t.option(\"-a, --all\", \"Update all installed components\")\n\t.action(update);\n\nprogram\n\t.command(\"remove\")\n\t.description(\"Remove Starwind components from your project\")\n\t.argument(\"[components...]\", \"The components to remove (space separated)\")\n\t.allowExcessArguments()\n\t.option(\"-a, --all\", \"Remove all installed components\")\n\t.action(remove);\n\nprogram.parse();\n","import * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport fs from \"fs-extra\";\nimport { getConfig, updateConfig } from \"./config.js\";\nimport { PATHS } from \"./constants.js\";\nimport { getRegistry, getComponent } from \"./registry.js\";\nimport semver from \"semver\";\n\nexport type InstallResult = {\n\tstatus: \"installed\" | \"skipped\" | \"failed\";\n\tname: string;\n\tversion?: string;\n\terror?: string;\n};\n\nexport interface RemoveResult {\n\tname: string;\n\tstatus: \"removed\" | \"failed\";\n\terror?: string;\n}\n\nexport interface UpdateResult {\n\tname: string;\n\tstatus: \"updated\" | \"skipped\" | \"failed\";\n\toldVersion?: string;\n\tnewVersion?: string;\n\terror?: string;\n}\n\n/**\n * Copies a component from the core package to the local components directory\n * @param name - The name of the component to copy\n * @param overwrite - If true, will overwrite existing component instead of skipping\n * @returns A result object indicating the installation status\n */\nexport async function copyComponent(name: string, overwrite = false): Promise<InstallResult> {\n\tconst config = await getConfig();\n\n\t// Ensure components array exists\n\tconst currentComponents = Array.isArray(config.components) ? config.components : [];\n\n\t// Check if component already exists\n\tif (!overwrite && currentComponents.some((component) => component.name === name)) {\n\t\tconst existingComponent = currentComponents.find((c) => c.name === name);\n\t\treturn {\n\t\t\tstatus: \"skipped\",\n\t\t\tname,\n\t\t\tversion: existingComponent?.version,\n\t\t};\n\t}\n\n\tconst componentDir = path.join(config.componentDir, \"starwind\", name);\n\n\ttry {\n\t\tawait fs.ensureDir(componentDir);\n\n\t\t// Get the path to the installed @starwind/core package\n\t\tconst pkgUrl = import.meta.resolve?.(PATHS.STARWIND_CORE);\n\t\tif (!pkgUrl) {\n\t\t\tthrow new Error(`Could not resolve ${PATHS.STARWIND_CORE} package, is it installed?`);\n\t\t}\n\n\t\tconst coreDir = path.dirname(fileURLToPath(pkgUrl));\n\t\tconst sourceDir = path.join(coreDir, PATHS.STARWIND_CORE_COMPONENTS, name);\n\n\t\tconst files = await fs.readdir(sourceDir);\n\n\t\tfor (const file of files) {\n\t\t\tconst sourcePath = path.join(sourceDir, file);\n\t\t\tconst destPath = path.join(componentDir, file);\n\t\t\tawait fs.copy(sourcePath, destPath, { overwrite: true });\n\t\t}\n\n\t\t// Get component version from registry\n\t\tconst registry = await getRegistry();\n\t\tconst componentInfo = registry.find((c) => c.name === name);\n\t\tif (!componentInfo) {\n\t\t\tthrow new Error(`Component ${name} not found in registry`);\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: \"installed\",\n\t\t\tname,\n\t\t\tversion: componentInfo.version,\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tstatus: \"failed\",\n\t\t\tname,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n\n/**\n * Removes a component from the project's component directory\n * @param name - The name of the component to remove\n * @param componentDir - The base directory where components are installed\n * @returns A result object indicating the removal status and any errors\n */\nexport async function removeComponent(name: string, componentDir: string): Promise<RemoveResult> {\n\ttry {\n\t\tconst componentPath = path.join(componentDir, \"starwind\", name);\n\n\t\t// Check if component directory exists\n\t\tif (await fs.pathExists(componentPath)) {\n\t\t\t// Remove the component directory\n\t\t\tawait fs.remove(componentPath);\n\t\t\treturn { name, status: \"removed\" };\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: \"Component directory not found\",\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\treturn {\n\t\t\tname,\n\t\t\tstatus: \"failed\",\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n\n/**\n * Updates a component to its latest version from the registry\n * @param name - The name of the component to update\n * @param currentVersion - The currently installed version\n * @returns A result object indicating the update status\n */\nexport async function updateComponent(name: string, currentVersion: string): Promise<UpdateResult> {\n\ttry {\n\t\t// Get latest version from registry\n\t\tconst registryComponent = await getComponent(name);\n\t\tif (!registryComponent) {\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: \"Component not found in registry\",\n\t\t\t};\n\t\t}\n\n\t\t// Compare versions\n\t\tif (!semver.gt(registryComponent.version, currentVersion)) {\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tstatus: \"skipped\",\n\t\t\t\toldVersion: currentVersion,\n\t\t\t\tnewVersion: registryComponent.version,\n\t\t\t};\n\t\t}\n\n\t\t// Remove and reinstall component with overwrite enabled\n\t\tconst result = await copyComponent(name, true);\n\n\t\tif (result.status === \"installed\") {\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tstatus: \"updated\",\n\t\t\t\toldVersion: currentVersion,\n\t\t\t\tnewVersion: result.version,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: result.error || \"Failed to update component\",\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\treturn {\n\t\t\tname,\n\t\t\tstatus: \"failed\",\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n","import { registry } from \"@starwind-ui/core\";\nimport { z } from \"zod\";\n\nconst componentSchema = z.object({\n\tname: z.string(),\n\tversion: z.string(),\n\tdependencies: z.array(z.string()).default([]),\n\ttype: z.enum([\"component\"]),\n});\n\nexport type Component = z.infer<typeof componentSchema>;\n\nconst registrySchema = z.array(componentSchema);\n\nexport async function getRegistry(): Promise<Component[]> {\n\ttry {\n\t\treturn registrySchema.parse(registry);\n\t} catch (error) {\n\t\tconsole.error(\"Failed to load registry:\", error);\n\t\tthrow error;\n\t}\n}\n\nexport async function getComponent(name: string): Promise<Component | undefined> {\n\tconst registry = await getRegistry();\n\treturn registry.find((component) => component.name === name);\n}\n\nexport async function getAllComponents(): Promise<Component[]> {\n\treturn getRegistry();\n}\n","import { confirm, multiselect } from \"@clack/prompts\";\nimport { getAllComponents } from \"./registry.js\";\nimport type { Component } from \"./registry.js\";\n\nexport async function selectComponents(): Promise<string[]> {\n\tconst components = await getAllComponents();\n\n\tconst selected = await multiselect({\n\t\tmessage: \"Select components to add\",\n\t\toptions: components.map((component) => ({\n\t\t\tlabel: component.name,\n\t\t\tvalue: component.name,\n\t\t})),\n\t\trequired: false,\n\t});\n\n\t// Return empty array if user cancels selection\n\tif (typeof selected === \"symbol\") {\n\t\treturn [];\n\t}\n\n\treturn selected;\n}\n\nexport async function confirmInstall(component: Component): Promise<boolean> {\n\tif (component.dependencies.length === 0) return true;\n\n\tconst confirmed = await confirm({\n\t\tmessage: `This component requires the following dependencies: ${component.dependencies.join(\", \")}. Install them?`,\n\t});\n\n\tif (typeof confirmed === \"symbol\") {\n\t\treturn false;\n\t}\n\n\treturn confirmed;\n}\n","import { type InstallResult, copyComponent } from \"./component.js\";\nimport { installDependencies, requestPackageManager } from \"./package-manager.js\";\nimport { confirmInstall } from \"./prompts.js\";\nimport { getComponent } from \"./registry.js\";\n\nexport async function installComponent(name: string): Promise<InstallResult> {\n\tconst component = await getComponent(name);\n\n\tif (!component) {\n\t\treturn {\n\t\t\tstatus: \"failed\",\n\t\t\tname,\n\t\t\terror: \"Component not found in registry\",\n\t\t};\n\t}\n\n\t// Handle dependencies installation\n\tif (component.dependencies.length > 0) {\n\t\tconst confirmed = await confirmInstall(component);\n\t\tif (!confirmed) {\n\t\t\treturn {\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tname,\n\t\t\t\terror: \"Installation cancelled by user\",\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst pm = await requestPackageManager();\n\t\t\tawait installDependencies(component.dependencies, pm);\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tname,\n\t\t\t\terror: `Failed to install dependencies: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t};\n\t\t}\n\t}\n\n\t// Copy the component files\n\treturn await copyComponent(name);\n}\n","import { highlighter } from \"../utils/highlighter.js\";\nimport { type Component, getAllComponents } from \"./registry.js\";\n\n/**\n * Checks if a component name exists in the registry\n * @param component - The component name to validate\n * @param availableComponents - Optional array of available components from registry\n */\nexport async function isValidComponent(\n\tcomponent: string,\n\tavailableComponents?: Component[],\n): Promise<boolean> {\n\tconst components = availableComponents || (await getAllComponents());\n\treturn components.some((c) => c.name === component);\n}\n\n/**\n * Validates that a component exists in the registry\n * @param component - The component name to validate\n * @throws {Error} If the component is not found in the registry\n */\nexport async function validateComponent(component: string): Promise<void> {\n\tconst components = await getAllComponents();\n\tif (!(await isValidComponent(component, components))) {\n\t\tconst availableComponents = components.map((c) => highlighter.info(c.name));\n\t\tthrow new Error(\n\t\t\t`Invalid component: ${highlighter.error(component)}.\\nAvailable components:\\n ${availableComponents.join(\"\\n \")}`,\n\t\t);\n\t}\n}\n","import type { InstallResult } from \"@/utils/component.js\";\nimport { PATHS } from \"@/utils/constants.js\";\nimport { fileExists } from \"@/utils/fs.js\";\nimport { highlighter } from \"@/utils/highlighter.js\";\nimport { installComponent } from \"@/utils/install.js\";\nimport { selectComponents } from \"@/utils/prompts.js\";\nimport { getAllComponents } from \"@/utils/registry.js\";\nimport { sleep } from \"@/utils/sleep.js\";\nimport { isValidComponent } from \"@/utils/validate.js\";\nimport { updateConfig } from \"@/utils/config.js\";\nimport * as p from \"@clack/prompts\";\nconst { init } = await import(\"./init.js\");\n\nexport async function add(components?: string[], options?: { all?: boolean }) {\n\ttry {\n\t\tp.intro(highlighter.title(\" Welcome to the Starwind CLI \"));\n\n\t\t// Check if starwind.config.json exists\n\t\tconst configExists = await fileExists(PATHS.LOCAL_CONFIG_FILE);\n\n\t\tif (!configExists) {\n\t\t\tconst shouldInit = await p.confirm({\n\t\t\t\tmessage: `Starwind configuration not found. Would you like to run ${highlighter.info(\"starwind init\")} now?`,\n\t\t\t\tinitialValue: true,\n\t\t\t});\n\n\t\t\tif (p.isCancel(shouldInit)) {\n\t\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\n\t\t\tif (shouldInit) {\n\t\t\t\tawait init(true);\n\t\t\t} else {\n\t\t\t\tp.log.error(\n\t\t\t\t\t`Please initialize starwind with ${highlighter.info(\"starwind init\")} before adding components`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\n\t\tlet componentsToInstall: string[] = [];\n\n\t\t// ================================================================\n\t\t// Get components to install\n\t\t// ================================================================\n\t\tif (options?.all) {\n\t\t\t// Get all available components\n\t\t\tconst availableComponents = await getAllComponents();\n\t\t\tcomponentsToInstall = availableComponents.map((c) => c.name);\n\t\t\tp.log.info(`Adding all ${componentsToInstall.length} available components...`);\n\t\t} else if (components && components.length > 0) {\n\t\t\t// Get all available components once to avoid multiple registry calls\n\t\t\tconst availableComponents = await getAllComponents();\n\n\t\t\t// Filter valid components and collect invalid ones\n\t\t\tconst { valid, invalid } = await components.reduce<\n\t\t\t\tPromise<{ valid: string[]; invalid: string[] }>\n\t\t\t>(\n\t\t\t\tasync (accPromise, component) => {\n\t\t\t\t\tconst acc = await accPromise;\n\t\t\t\t\tconst isValid = await isValidComponent(component, availableComponents);\n\t\t\t\t\tif (isValid) {\n\t\t\t\t\t\tacc.valid.push(component);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tacc.invalid.push(component);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\tPromise.resolve({ valid: [], invalid: [] }),\n\t\t\t);\n\n\t\t\t// Warn about invalid components\n\t\t\tif (invalid.length > 0) {\n\t\t\t\tp.log.warn(\n\t\t\t\t\t`${highlighter.warn(\"Invalid components found:\")}\\n${invalid\n\t\t\t\t\t\t.map((name) => ` ${name}`)\n\t\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Proceed with valid components\n\t\t\tif (valid.length > 0) {\n\t\t\t\tcomponentsToInstall = valid;\n\t\t\t} else {\n\t\t\t\tp.log.warn(`${highlighter.warn(\"No valid components to install\")}`);\n\t\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\t\treturn process.exit(0);\n\t\t\t}\n\t\t} else {\n\t\t\t// If no components provided, show the interactive prompt\n\t\t\tconst selected = await selectComponents();\n\t\t\tif (!selected) {\n\t\t\t\tp.cancel(\"No components selected\");\n\t\t\t\treturn process.exit(0);\n\t\t\t}\n\t\t\tcomponentsToInstall = selected;\n\t\t}\n\n\t\tif (componentsToInstall.length === 0) {\n\t\t\tp.log.warn(`${highlighter.warn(\"No components selected\")}`);\n\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\treturn process.exit(0);\n\t\t}\n\n\t\tconst confirmed = await p.confirm({\n\t\t\tmessage: `Install ${componentsToInstall\n\t\t\t\t.map((comp) => highlighter.info(comp))\n\t\t\t\t.join(\", \")} ${componentsToInstall.length > 1 ? \"components\" : \"component\"}?`,\n\t\t});\n\n\t\tif (!confirmed || p.isCancel(confirmed)) {\n\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\treturn process.exit(0);\n\t\t}\n\n\t\tconst results = {\n\t\t\tinstalled: [] as InstallResult[],\n\t\t\tskipped: [] as InstallResult[],\n\t\t\tfailed: [] as InstallResult[],\n\t\t};\n\n\t\t// ================================================================\n\t\t// Install components\n\t\t// ================================================================\n\t\tconst installedComponents = [];\n\t\tfor (const comp of componentsToInstall) {\n\t\t\tconst result = await installComponent(comp);\n\t\t\tswitch (result.status) {\n\t\t\t\tcase \"installed\":\n\t\t\t\t\tresults.installed.push(result);\n\t\t\t\t\tinstalledComponents.push({ name: result.name, version: result.version! });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"skipped\":\n\t\t\t\t\tresults.skipped.push(result);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"failed\":\n\t\t\t\t\tresults.failed.push(result);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// ================================================================\n\t\t// Update Config File\n\t\t// ================================================================\n\t\tif (installedComponents.length > 0) {\n\t\t\ttry {\n\t\t\t\tawait updateConfig({ components: installedComponents }, { appendComponents: true });\n\t\t\t} catch (error) {\n\t\t\t\tp.log.error(\n\t\t\t\t\t`Failed to update config: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\n\t\t// ================================================================\n\t\t// Installation summary\n\t\t// ================================================================\n\t\tp.log.message(`\\n\\n${highlighter.underline(\"Installation Summary\")}`);\n\n\t\tif (results.installed.length > 0) {\n\t\t\tp.log.success(\n\t\t\t\t`${highlighter.success(\"Successfully installed components:\")}\\n${results.installed\n\t\t\t\t\t.map((r) => ` ${r.name} v${r.version}`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tif (results.skipped.length > 0) {\n\t\t\tp.log.warn(\n\t\t\t\t`${highlighter.warn(\"Skipped components (already installed):\")}\\n${results.skipped\n\t\t\t\t\t.map((r) => ` ${r.name} v${r.version}`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tif (results.failed.length > 0) {\n\t\t\tp.log.error(\n\t\t\t\t`${highlighter.error(\"Failed to install components:\")}\\n${results.failed\n\t\t\t\t\t.map((r) => ` ${r.name} - ${r.error}`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tawait sleep(1000);\n\n\t\tp.outro(\"Enjoy using Starwind UI 🚀\");\n\t} catch (error) {\n\t\tp.log.error(error instanceof Error ? error.message : \"Failed to add components\");\n\t\tp.cancel(\"Operation cancelled\");\n\t\tprocess.exit(1);\n\t}\n}\n","import { getConfig, updateConfig } from \"@/utils/config.js\";\nimport { PATHS } from \"@/utils/constants.js\";\nimport { fileExists } from \"@/utils/fs.js\";\nimport { highlighter } from \"@/utils/highlighter.js\";\nimport { sleep } from \"@/utils/sleep.js\";\nimport * as p from \"@clack/prompts\";\nimport { type RemoveResult, removeComponent } from \"@/utils/component.js\";\n\nexport async function remove(components?: string[], options?: { all?: boolean }) {\n\ttry {\n\t\tp.intro(highlighter.title(\" Welcome to the Starwind CLI \"));\n\n\t\t// Check if starwind.config.json exists\n\t\tconst configExists = await fileExists(PATHS.LOCAL_CONFIG_FILE);\n\n\t\tif (!configExists) {\n\t\t\tp.log.error(\"No Starwind configuration found. Please run starwind init first.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Get current config and installed components\n\t\tconst config = await getConfig();\n\t\tconst installedComponents = config.components;\n\n\t\tif (installedComponents.length === 0) {\n\t\t\tp.log.warn(\"No components are currently installed.\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\tlet componentsToRemove: string[] = [];\n\n\t\t// ================================================================\n\t\t// Get components to remove\n\t\t// ================================================================\n\t\tif (options?.all) {\n\t\t\t// Remove all installed components\n\t\t\tcomponentsToRemove = installedComponents.map((comp) => comp.name);\n\t\t\tp.log.info(`Removing all ${componentsToRemove.length} installed components...`);\n\t\t} else if (components && components.length > 0) {\n\t\t\t// Validate that all specified components are installed\n\t\t\tconst invalid = components.filter(\n\t\t\t\t(comp) => !installedComponents.some((ic) => ic.name === comp),\n\t\t\t);\n\n\t\t\tif (invalid.length > 0) {\n\t\t\t\tp.log.warn(\n\t\t\t\t\t`${highlighter.warn(\"Components not found:\")}\\n${invalid\n\t\t\t\t\t\t.map((name) => ` ${name}`)\n\t\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcomponentsToRemove = components.filter((comp) =>\n\t\t\t\tinstalledComponents.some((ic) => ic.name === comp),\n\t\t\t);\n\n\t\t\tif (componentsToRemove.length === 0) {\n\t\t\t\tp.log.warn(\"No valid components to remove\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t} else {\n\t\t\t// Show interactive prompt with installed components\n\t\t\tconst choices = installedComponents.map((comp) => ({\n\t\t\t\tvalue: comp.name,\n\t\t\t\tlabel: comp.name,\n\t\t\t}));\n\n\t\t\tconst selected = await p.multiselect({\n\t\t\t\tmessage: \"Select components to remove\",\n\t\t\t\toptions: choices,\n\t\t\t});\n\n\t\t\tif (p.isCancel(selected)) {\n\t\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\n\t\t\tcomponentsToRemove = selected as string[];\n\t\t}\n\n\t\tif (componentsToRemove.length === 0) {\n\t\t\tp.log.warn(\"No components selected for removal\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\t// Confirm removal\n\t\tconst confirmed = await p.confirm({\n\t\t\tmessage: `Remove ${componentsToRemove\n\t\t\t\t.map((comp) => highlighter.info(comp))\n\t\t\t\t.join(\", \")} ${componentsToRemove.length > 1 ? \"components\" : \"component\"}?`,\n\t\t});\n\n\t\tif (!confirmed || p.isCancel(confirmed)) {\n\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\tconst results = {\n\t\t\tremoved: [] as RemoveResult[],\n\t\t\tfailed: [] as RemoveResult[],\n\t\t};\n\n\t\t// ================================================================\n\t\t// Remove Components\n\t\t// ================================================================\n\t\tfor (const comp of componentsToRemove) {\n\t\t\tconst result = await removeComponent(comp, config.componentDir);\n\t\t\tif (result.status === \"removed\") {\n\t\t\t\tresults.removed.push(result);\n\t\t\t} else {\n\t\t\t\tresults.failed.push(result);\n\t\t\t}\n\t\t}\n\n\t\t// ================================================================\n\t\t// Update Config File\n\t\t// ================================================================\n\t\t// Update config file by writing the filtered components directly\n\t\tconst updatedComponents = config.components.filter(\n\t\t\t(comp) => !componentsToRemove.includes(comp.name),\n\t\t);\n\t\tawait updateConfig(\n\t\t\t{\n\t\t\t\t...config,\n\t\t\t\tcomponents: updatedComponents,\n\t\t\t},\n\t\t\t{ appendComponents: false },\n\t\t);\n\n\t\t// ================================================================\n\t\t// Removal summary\n\t\t// ================================================================\n\t\tp.log.message(`\\n\\n${highlighter.underline(\"Removal Summary\")}`);\n\n\t\tif (results.removed.length > 0) {\n\t\t\tp.log.success(\n\t\t\t\t`${highlighter.success(\"Successfully removed components:\")}\\n${results.removed\n\t\t\t\t\t.map((r) => ` ${r.name}`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tif (results.failed.length > 0) {\n\t\t\tp.log.error(\n\t\t\t\t`${highlighter.error(\"Failed to remove components:\")}\\n${results.failed\n\t\t\t\t\t.map((r) => ` ${r.name} - ${r.error}`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tawait sleep(1000);\n\n\t\tif (results.removed.length > 0) {\n\t\t\tp.outro(\"Components removed successfully 🗑️\");\n\t\t} else {\n\t\t\tp.cancel(\"Errors occurred while removing components\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tp.log.error(error instanceof Error ? error.message : \"Failed to remove components\");\n\t\tp.cancel(\"Operation cancelled\");\n\t\tprocess.exit(1);\n\t}\n}\n","import path from \"node:path\";\nimport { getConfig } from \"@/utils/config.js\";\nimport { PATHS } from \"@/utils/constants.js\";\nimport { fileExists, writeJsonFile } from \"@/utils/fs.js\";\nimport { highlighter } from \"@/utils/highlighter.js\";\nimport { sleep } from \"@/utils/sleep.js\";\nimport * as p from \"@clack/prompts\";\nimport { type UpdateResult, updateComponent } from \"@/utils/component.js\";\nimport { updateConfig } from \"@/utils/config.js\";\n\nexport async function update(components?: string[], options?: { all?: boolean }) {\n\ttry {\n\t\tp.intro(highlighter.title(\" Welcome to the Starwind CLI \"));\n\n\t\t// Check if starwind.config.json exists\n\t\tconst configExists = await fileExists(PATHS.LOCAL_CONFIG_FILE);\n\n\t\tif (!configExists) {\n\t\t\tp.log.error(\"No Starwind configuration found. Please run starwind init first.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Get current config and installed components\n\t\tconst config = await getConfig();\n\t\tconst installedComponents = config.components;\n\n\t\tif (installedComponents.length === 0) {\n\t\t\tp.log.warn(\"No components are currently installed.\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\tlet componentsToUpdate: string[] = [];\n\n\t\t// ================================================================\n\t\t// Get components to update\n\t\t// ================================================================\n\t\tif (options?.all) {\n\t\t\t// Update all installed components\n\t\t\tcomponentsToUpdate = installedComponents.map((comp) => comp.name);\n\t\t\tp.log.info(`Checking updates for all ${componentsToUpdate.length} installed components...`);\n\t\t} else if (components && components.length > 0) {\n\t\t\t// Validate that all specified components are installed\n\t\t\tconst invalid = components.filter(\n\t\t\t\t(comp) => !installedComponents.some((ic) => ic.name === comp),\n\t\t\t);\n\n\t\t\tif (invalid.length > 0) {\n\t\t\t\tp.log.warn(\n\t\t\t\t\t`${highlighter.warn(\"Components not found in project:\")}\\n${invalid\n\t\t\t\t\t\t.map((name) => ` ${name}`)\n\t\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcomponentsToUpdate = components.filter((comp) =>\n\t\t\t\tinstalledComponents.some((ic) => ic.name === comp),\n\t\t\t);\n\n\t\t\tif (componentsToUpdate.length === 0) {\n\t\t\t\tp.log.warn(\"No valid components to update\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t} else {\n\t\t\t// Show interactive prompt with installed components\n\t\t\tconst choices = installedComponents.map((comp) => ({\n\t\t\t\tvalue: comp.name,\n\t\t\t\tlabel: comp.name,\n\t\t\t}));\n\n\t\t\tconst selected = await p.multiselect({\n\t\t\t\tmessage: \"Select components to update\",\n\t\t\t\toptions: choices,\n\t\t\t});\n\n\t\t\tif (p.isCancel(selected)) {\n\t\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\n\t\t\tcomponentsToUpdate = selected as string[];\n\t\t}\n\n\t\tif (componentsToUpdate.length === 0) {\n\t\t\tp.log.warn(\"No components selected for update\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\t// Confirm update\n\t\tconst confirmed = await p.confirm({\n\t\t\tmessage: `Check for updates to ${componentsToUpdate\n\t\t\t\t.map((comp) => highlighter.info(comp))\n\t\t\t\t.join(\", \")} ${componentsToUpdate.length > 1 ? \"components\" : \"component\"}?`,\n\t\t});\n\n\t\tif (!confirmed || p.isCancel(confirmed)) {\n\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\tconst results = {\n\t\t\tupdated: [] as UpdateResult[],\n\t\t\tskipped: [] as UpdateResult[],\n\t\t\tfailed: [] as UpdateResult[],\n\t\t};\n\n\t\t// ================================================================\n\t\t// Update Components\n\t\t// ================================================================\n\t\tfor (const comp of componentsToUpdate) {\n\t\t\tconst currentVersion = installedComponents.find((ic) => ic.name === comp)?.version;\n\t\t\tif (!currentVersion) {\n\t\t\t\tresults.failed.push({\n\t\t\t\t\tname: comp,\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: \"Could not determine current version\",\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst result = await updateComponent(comp, currentVersion);\n\t\t\tswitch (result.status) {\n\t\t\t\tcase \"updated\":\n\t\t\t\t\tresults.updated.push(result);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"skipped\":\n\t\t\t\t\tresults.skipped.push(result);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"failed\":\n\t\t\t\t\tresults.failed.push(result);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// ================================================================\n\t\t// Update Config File\n\t\t// ================================================================\n\t\tif (results.updated.length > 0) {\n\t\t\ttry {\n\t\t\t\t// Create a map of current components, excluding updated ones\n\t\t\t\tconst updatedComponentNames = new Set(results.updated.map((r) => r.name));\n\t\t\t\tconst currentComponents = config.components.filter(\n\t\t\t\t\t(comp) => !updatedComponentNames.has(comp.name),\n\t\t\t\t);\n\n\t\t\t\t// Add the updated components with their new versions\n\t\t\t\tconst updatedComponents = [\n\t\t\t\t\t...currentComponents,\n\t\t\t\t\t...results.updated.map((r) => ({\n\t\t\t\t\t\tname: r.name,\n\t\t\t\t\t\tversion: r.newVersion!,\n\t\t\t\t\t})),\n\t\t\t\t];\n\n\t\t\t\tawait updateConfig(\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponents: updatedComponents,\n\t\t\t\t\t},\n\t\t\t\t\t{ appendComponents: false },\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tp.log.error(\n\t\t\t\t\t`Failed to update config: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\n\t\t// ================================================================\n\t\t// Update summary\n\t\t// ================================================================\n\t\tp.log.message(`\\n\\n${highlighter.underline(\"Update Summary\")}`);\n\n\t\tif (results.skipped.length > 0) {\n\t\t\tp.log.info(\n\t\t\t\t`${highlighter.info(\"Components already up to date:\")}\\n${results.skipped\n\t\t\t\t\t.map((r) => ` ${r.name} (${r.newVersion})`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tif (results.updated.length > 0) {\n\t\t\tp.log.success(\n\t\t\t\t`${highlighter.success(\"Successfully updated components:\")}\\n${results.updated\n\t\t\t\t\t.map((r) => ` ${r.name} (${r.oldVersion} → ${r.newVersion})`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tif (results.failed.length > 0) {\n\t\t\tp.log.error(\n\t\t\t\t`${highlighter.error(\"Failed to update components:\")}\\n${results.failed\n\t\t\t\t\t.map((r) => ` ${r.name} - ${r.error}`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tawait sleep(1000);\n\n\t\tif (results.updated.length > 0) {\n\t\t\tp.outro(\"Components updated successfully 🚀\");\n\t\t} else if (results.skipped.length > 0 && results.failed.length === 0) {\n\t\t\tp.outro(\"All components are up to date ✨\");\n\t\t} else {\n\t\t\tp.cancel(\"No components were updated\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tp.log.error(error instanceof Error ? error.message : \"Failed to update components\");\n\t\tp.cancel(\"Operation cancelled\");\n\t\tprocess.exit(1);\n\t}\n}\n"],"mappings":"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","names":["registry","registry","init","p","p"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/component.ts","../src/utils/registry.ts","../src/utils/prompts.ts","../src/utils/install.ts","../src/utils/validate.ts","../src/commands/add.ts","../src/commands/remove.ts","../src/commands/update.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\nimport { add } from \"./commands/add.js\";\nimport { init } from \"./commands/init.js\";\nimport { remove } from \"./commands/remove.js\";\nimport { update } from \"./commands/update.js\";\n\nconst program = new Command()\n\t.name(\"starwind\")\n\t.description(\"Add beautifully designed components to your Astro applications\")\n\t.version(\"0.0.1\");\n\nprogram\n\t.command(\"init\")\n\t.description(\"Initialize your project with Starwind\")\n\t.option(\"--no-install\", \"Skip dependency installation\")\n\t.action(() => init(false));\n\nprogram\n\t.command(\"add\")\n\t.description(\"Add Starwind components to your project\")\n\t.argument(\"[components...]\", \"The components to add (space separated)\")\n\t.allowExcessArguments()\n\t.option(\"-a, --all\", \"Add all available components\")\n\t.action(add);\n\nprogram\n\t.command(\"update\")\n\t.description(\"Update Starwind components to their latest versions\")\n\t.argument(\"[components...]\", \"The components to update (space separated)\")\n\t.allowExcessArguments()\n\t.option(\"-a, --all\", \"Update all installed components\")\n\t.action(update);\n\nprogram\n\t.command(\"remove\")\n\t.description(\"Remove Starwind components from your project\")\n\t.argument(\"[components...]\", \"The components to remove (space separated)\")\n\t.allowExcessArguments()\n\t.option(\"-a, --all\", \"Remove all installed components\")\n\t.action(remove);\n\nprogram.parse();\n","import * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport fs from \"fs-extra\";\nimport { getConfig, updateConfig } from \"./config.js\";\nimport { PATHS } from \"./constants.js\";\nimport { getRegistry, getComponent } from \"./registry.js\";\nimport semver from \"semver\";\nimport * as p from \"@clack/prompts\";\nimport { highlighter } from \"./highlighter.js\";\n\nexport type InstallResult = {\n\tstatus: \"installed\" | \"skipped\" | \"failed\";\n\tname: string;\n\tversion?: string;\n\terror?: string;\n};\n\nexport interface RemoveResult {\n\tname: string;\n\tstatus: \"removed\" | \"failed\";\n\terror?: string;\n}\n\nexport interface UpdateResult {\n\tname: string;\n\tstatus: \"updated\" | \"skipped\" | \"failed\";\n\toldVersion?: string;\n\tnewVersion?: string;\n\terror?: string;\n}\n\n/**\n * Copies a component from the core package to the local components directory\n * @param name - The name of the component to copy\n * @param overwrite - If true, will overwrite existing component instead of skipping\n * @returns A result object indicating the installation status\n */\nexport async function copyComponent(name: string, overwrite = false): Promise<InstallResult> {\n\tconst config = await getConfig();\n\n\t// Ensure components array exists\n\tconst currentComponents = Array.isArray(config.components) ? config.components : [];\n\n\t// Check if component already exists\n\tif (!overwrite && currentComponents.some((component) => component.name === name)) {\n\t\tconst existingComponent = currentComponents.find((c) => c.name === name);\n\t\treturn {\n\t\t\tstatus: \"skipped\",\n\t\t\tname,\n\t\t\tversion: existingComponent?.version,\n\t\t};\n\t}\n\n\tconst componentDir = path.join(config.componentDir, \"starwind\", name);\n\n\ttry {\n\t\tawait fs.ensureDir(componentDir);\n\n\t\t// Get the path to the installed @starwind/core package\n\t\tconst pkgUrl = import.meta.resolve?.(PATHS.STARWIND_CORE);\n\t\tif (!pkgUrl) {\n\t\t\tthrow new Error(`Could not resolve ${PATHS.STARWIND_CORE} package, is it installed?`);\n\t\t}\n\n\t\tconst coreDir = path.dirname(fileURLToPath(pkgUrl));\n\t\tconst sourceDir = path.join(coreDir, PATHS.STARWIND_CORE_COMPONENTS, name);\n\n\t\tconst files = await fs.readdir(sourceDir);\n\n\t\tfor (const file of files) {\n\t\t\tconst sourcePath = path.join(sourceDir, file);\n\t\t\tconst destPath = path.join(componentDir, file);\n\t\t\tawait fs.copy(sourcePath, destPath, { overwrite: true });\n\t\t}\n\n\t\t// Get component version from registry\n\t\tconst registry = await getRegistry();\n\t\tconst componentInfo = registry.find((c) => c.name === name);\n\t\tif (!componentInfo) {\n\t\t\tthrow new Error(`Component ${name} not found in registry`);\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: \"installed\",\n\t\t\tname,\n\t\t\tversion: componentInfo.version,\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tstatus: \"failed\",\n\t\t\tname,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n\n/**\n * Removes a component from the project's component directory\n * @param name - The name of the component to remove\n * @param componentDir - The base directory where components are installed\n * @returns A result object indicating the removal status and any errors\n */\nexport async function removeComponent(name: string, componentDir: string): Promise<RemoveResult> {\n\ttry {\n\t\tconst componentPath = path.join(componentDir, \"starwind\", name);\n\n\t\t// Check if component directory exists\n\t\tif (await fs.pathExists(componentPath)) {\n\t\t\t// Remove the component directory\n\t\t\tawait fs.remove(componentPath);\n\t\t\treturn { name, status: \"removed\" };\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: \"Component directory not found\",\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\treturn {\n\t\t\tname,\n\t\t\tstatus: \"failed\",\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n\n/**\n * Updates a component to its latest version from the registry\n * @param name - The name of the component to update\n * @param currentVersion - The currently installed version\n * @returns A result object indicating the update status\n */\nexport async function updateComponent(name: string, currentVersion: string): Promise<UpdateResult> {\n\ttry {\n\t\t// Get latest version from registry\n\t\tconst registryComponent = await getComponent(name);\n\t\tif (!registryComponent) {\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: \"Component not found in registry\",\n\t\t\t};\n\t\t}\n\n\t\t// Compare versions\n\t\tif (!semver.gt(registryComponent.version, currentVersion)) {\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tstatus: \"skipped\",\n\t\t\t\toldVersion: currentVersion,\n\t\t\t\tnewVersion: registryComponent.version,\n\t\t\t};\n\t\t}\n\n\t\t// Confirm the component update with warning about overriding\n\t\tconst confirmUpdate = await p.confirm({\n\t\t\tmessage: `Update component ${highlighter.info(name)} from ${highlighter.warn(`v${currentVersion}`)} to ${highlighter.success(`v${registryComponent.version}`)}? This will override the existing implementation.`,\n\t\t});\n\n\t\tif (!confirmUpdate || p.isCancel(confirmUpdate)) {\n\t\t\tp.log.info(`Skipping update for ${highlighter.info(name)}`);\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tstatus: \"skipped\",\n\t\t\t\toldVersion: currentVersion,\n\t\t\t\tnewVersion: registryComponent.version,\n\t\t\t};\n\t\t}\n\n\t\t// Remove and reinstall component with overwrite enabled\n\t\tconst result = await copyComponent(name, true);\n\n\t\tif (result.status === \"installed\") {\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tstatus: \"updated\",\n\t\t\t\toldVersion: currentVersion,\n\t\t\t\tnewVersion: result.version,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\terror: result.error || \"Failed to update component\",\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\treturn {\n\t\t\tname,\n\t\t\tstatus: \"failed\",\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n","import { registry } from \"@starwind-ui/core\";\nimport { z } from \"zod\";\n\nconst componentSchema = z.object({\n\tname: z.string(),\n\tversion: z.string(),\n\tdependencies: z.array(z.string()).default([]),\n\ttype: z.enum([\"component\"]),\n});\n\nexport type Component = z.infer<typeof componentSchema>;\n\nconst registrySchema = z.array(componentSchema);\n\nexport async function getRegistry(): Promise<Component[]> {\n\ttry {\n\t\treturn registrySchema.parse(registry);\n\t} catch (error) {\n\t\tconsole.error(\"Failed to load registry:\", error);\n\t\tthrow error;\n\t}\n}\n\nexport async function getComponent(name: string): Promise<Component | undefined> {\n\tconst registry = await getRegistry();\n\treturn registry.find((component) => component.name === name);\n}\n\nexport async function getAllComponents(): Promise<Component[]> {\n\treturn getRegistry();\n}\n","import { confirm, multiselect } from \"@clack/prompts\";\nimport { getAllComponents } from \"./registry.js\";\nimport type { Component } from \"./registry.js\";\n\nexport async function selectComponents(): Promise<string[]> {\n\tconst components = await getAllComponents();\n\n\tconst selected = await multiselect({\n\t\tmessage: \"Select components to add\",\n\t\toptions: components.map((component) => ({\n\t\t\tlabel: component.name,\n\t\t\tvalue: component.name,\n\t\t})),\n\t\trequired: false,\n\t});\n\n\t// Return empty array if user cancels selection\n\tif (typeof selected === \"symbol\") {\n\t\treturn [];\n\t}\n\n\treturn selected;\n}\n\nexport async function confirmInstall(component: Component): Promise<boolean> {\n\tif (component.dependencies.length === 0) return true;\n\n\tconst confirmed = await confirm({\n\t\tmessage: `This component requires the following dependencies: ${component.dependencies.join(\", \")}. Install them?`,\n\t});\n\n\tif (typeof confirmed === \"symbol\") {\n\t\treturn false;\n\t}\n\n\treturn confirmed;\n}\n","import { type InstallResult, copyComponent } from \"./component.js\";\nimport { installDependencies, requestPackageManager } from \"./package-manager.js\";\nimport { confirmInstall } from \"./prompts.js\";\nimport { getComponent } from \"./registry.js\";\n\nexport async function installComponent(name: string): Promise<InstallResult> {\n\tconst component = await getComponent(name);\n\n\tif (!component) {\n\t\treturn {\n\t\t\tstatus: \"failed\",\n\t\t\tname,\n\t\t\terror: \"Component not found in registry\",\n\t\t};\n\t}\n\n\t// Handle dependencies installation\n\tif (component.dependencies.length > 0) {\n\t\tconst confirmed = await confirmInstall(component);\n\t\tif (!confirmed) {\n\t\t\treturn {\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tname,\n\t\t\t\terror: \"Installation cancelled by user\",\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst pm = await requestPackageManager();\n\t\t\tawait installDependencies(component.dependencies, pm);\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tname,\n\t\t\t\terror: `Failed to install dependencies: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t};\n\t\t}\n\t}\n\n\t// Copy the component files\n\treturn await copyComponent(name);\n}\n","import { highlighter } from \"../utils/highlighter.js\";\nimport { type Component, getAllComponents } from \"./registry.js\";\n\n/**\n * Checks if a component name exists in the registry\n * @param component - The component name to validate\n * @param availableComponents - Optional array of available components from registry\n */\nexport async function isValidComponent(\n\tcomponent: string,\n\tavailableComponents?: Component[],\n): Promise<boolean> {\n\tconst components = availableComponents || (await getAllComponents());\n\treturn components.some((c) => c.name === component);\n}\n\n/**\n * Validates that a component exists in the registry\n * @param component - The component name to validate\n * @throws {Error} If the component is not found in the registry\n */\nexport async function validateComponent(component: string): Promise<void> {\n\tconst components = await getAllComponents();\n\tif (!(await isValidComponent(component, components))) {\n\t\tconst availableComponents = components.map((c) => highlighter.info(c.name));\n\t\tthrow new Error(\n\t\t\t`Invalid component: ${highlighter.error(component)}.\\nAvailable components:\\n ${availableComponents.join(\"\\n \")}`,\n\t\t);\n\t}\n}\n","import type { InstallResult } from \"@/utils/component.js\";\nimport { PATHS } from \"@/utils/constants.js\";\nimport { fileExists } from \"@/utils/fs.js\";\nimport { highlighter } from \"@/utils/highlighter.js\";\nimport { installComponent } from \"@/utils/install.js\";\nimport { selectComponents } from \"@/utils/prompts.js\";\nimport { getAllComponents } from \"@/utils/registry.js\";\nimport { sleep } from \"@/utils/sleep.js\";\nimport { isValidComponent } from \"@/utils/validate.js\";\nimport { updateConfig } from \"@/utils/config.js\";\nimport * as p from \"@clack/prompts\";\nconst { init } = await import(\"./init.js\");\n\nexport async function add(components?: string[], options?: { all?: boolean }) {\n\ttry {\n\t\tp.intro(highlighter.title(\" Welcome to the Starwind CLI \"));\n\n\t\t// Check if starwind.config.json exists\n\t\tconst configExists = await fileExists(PATHS.LOCAL_CONFIG_FILE);\n\n\t\tif (!configExists) {\n\t\t\tconst shouldInit = await p.confirm({\n\t\t\t\tmessage: `Starwind configuration not found. Would you like to run ${highlighter.info(\"starwind init\")} now?`,\n\t\t\t\tinitialValue: true,\n\t\t\t});\n\n\t\t\tif (p.isCancel(shouldInit)) {\n\t\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\n\t\t\tif (shouldInit) {\n\t\t\t\tawait init(true);\n\t\t\t} else {\n\t\t\t\tp.log.error(\n\t\t\t\t\t`Please initialize starwind with ${highlighter.info(\"starwind init\")} before adding components`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\n\t\tlet componentsToInstall: string[] = [];\n\n\t\t// ================================================================\n\t\t// Get components to install\n\t\t// ================================================================\n\t\tif (options?.all) {\n\t\t\t// Get all available components\n\t\t\tconst availableComponents = await getAllComponents();\n\t\t\tcomponentsToInstall = availableComponents.map((c) => c.name);\n\t\t\tp.log.info(`Adding all ${componentsToInstall.length} available components...`);\n\t\t} else if (components && components.length > 0) {\n\t\t\t// Get all available components once to avoid multiple registry calls\n\t\t\tconst availableComponents = await getAllComponents();\n\n\t\t\t// Filter valid components and collect invalid ones\n\t\t\tconst { valid, invalid } = await components.reduce<\n\t\t\t\tPromise<{ valid: string[]; invalid: string[] }>\n\t\t\t>(\n\t\t\t\tasync (accPromise, component) => {\n\t\t\t\t\tconst acc = await accPromise;\n\t\t\t\t\tconst isValid = await isValidComponent(component, availableComponents);\n\t\t\t\t\tif (isValid) {\n\t\t\t\t\t\tacc.valid.push(component);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tacc.invalid.push(component);\n\t\t\t\t\t}\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\tPromise.resolve({ valid: [], invalid: [] }),\n\t\t\t);\n\n\t\t\t// Warn about invalid components\n\t\t\tif (invalid.length > 0) {\n\t\t\t\tp.log.warn(\n\t\t\t\t\t`${highlighter.warn(\"Invalid components found:\")}\\n${invalid\n\t\t\t\t\t\t.map((name) => ` ${name}`)\n\t\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Proceed with valid components\n\t\t\tif (valid.length > 0) {\n\t\t\t\tcomponentsToInstall = valid;\n\t\t\t} else {\n\t\t\t\tp.log.warn(`${highlighter.warn(\"No valid components to install\")}`);\n\t\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\t\treturn process.exit(0);\n\t\t\t}\n\t\t} else {\n\t\t\t// If no components provided, show the interactive prompt\n\t\t\tconst selected = await selectComponents();\n\t\t\tif (!selected) {\n\t\t\t\tp.cancel(\"No components selected\");\n\t\t\t\treturn process.exit(0);\n\t\t\t}\n\t\t\tcomponentsToInstall = selected;\n\t\t}\n\n\t\tif (componentsToInstall.length === 0) {\n\t\t\tp.log.warn(`${highlighter.warn(\"No components selected\")}`);\n\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\treturn process.exit(0);\n\t\t}\n\n\t\tconst confirmed = await p.confirm({\n\t\t\tmessage: `Install ${componentsToInstall\n\t\t\t\t.map((comp) => highlighter.info(comp))\n\t\t\t\t.join(\", \")} ${componentsToInstall.length > 1 ? \"components\" : \"component\"}?`,\n\t\t});\n\n\t\tif (!confirmed || p.isCancel(confirmed)) {\n\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\treturn process.exit(0);\n\t\t}\n\n\t\tconst results = {\n\t\t\tinstalled: [] as InstallResult[],\n\t\t\tskipped: [] as InstallResult[],\n\t\t\tfailed: [] as InstallResult[],\n\t\t};\n\n\t\t// ================================================================\n\t\t// Install components\n\t\t// ================================================================\n\t\tconst installedComponents = [];\n\t\tfor (const comp of componentsToInstall) {\n\t\t\tconst result = await installComponent(comp);\n\t\t\tswitch (result.status) {\n\t\t\t\tcase \"installed\":\n\t\t\t\t\tresults.installed.push(result);\n\t\t\t\t\tinstalledComponents.push({ name: result.name, version: result.version! });\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"skipped\":\n\t\t\t\t\tresults.skipped.push(result);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"failed\":\n\t\t\t\t\tresults.failed.push(result);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// ================================================================\n\t\t// Update Config File\n\t\t// ================================================================\n\t\tif (installedComponents.length > 0) {\n\t\t\ttry {\n\t\t\t\tawait updateConfig({ components: installedComponents }, { appendComponents: true });\n\t\t\t} catch (error) {\n\t\t\t\tp.log.error(\n\t\t\t\t\t`Failed to update config: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\n\t\t// ================================================================\n\t\t// Installation summary\n\t\t// ================================================================\n\t\tp.log.message(`\\n\\n${highlighter.underline(\"Installation Summary\")}`);\n\n\t\tif (results.installed.length > 0) {\n\t\t\tp.log.success(\n\t\t\t\t`${highlighter.success(\"Successfully installed components:\")}\\n${results.installed\n\t\t\t\t\t.map((r) => ` ${r.name} v${r.version}`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tif (results.skipped.length > 0) {\n\t\t\tp.log.warn(\n\t\t\t\t`${highlighter.warn(\"Skipped components (already installed):\")}\\n${results.skipped\n\t\t\t\t\t.map((r) => ` ${r.name} v${r.version}`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tif (results.failed.length > 0) {\n\t\t\tp.log.error(\n\t\t\t\t`${highlighter.error(\"Failed to install components:\")}\\n${results.failed\n\t\t\t\t\t.map((r) => ` ${r.name} - ${r.error}`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tawait sleep(1000);\n\n\t\tp.outro(\"Enjoy using Starwind UI 🚀\");\n\t} catch (error) {\n\t\tp.log.error(error instanceof Error ? error.message : \"Failed to add components\");\n\t\tp.cancel(\"Operation cancelled\");\n\t\tprocess.exit(1);\n\t}\n}\n","import { getConfig, updateConfig } from \"@/utils/config.js\";\nimport { PATHS } from \"@/utils/constants.js\";\nimport { fileExists } from \"@/utils/fs.js\";\nimport { highlighter } from \"@/utils/highlighter.js\";\nimport { sleep } from \"@/utils/sleep.js\";\nimport * as p from \"@clack/prompts\";\nimport { type RemoveResult, removeComponent } from \"@/utils/component.js\";\n\nexport async function remove(components?: string[], options?: { all?: boolean }) {\n\ttry {\n\t\tp.intro(highlighter.title(\" Welcome to the Starwind CLI \"));\n\n\t\t// Check if starwind.config.json exists\n\t\tconst configExists = await fileExists(PATHS.LOCAL_CONFIG_FILE);\n\n\t\tif (!configExists) {\n\t\t\tp.log.error(\"No Starwind configuration found. Please run starwind init first.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Get current config and installed components\n\t\tconst config = await getConfig();\n\t\tconst installedComponents = config.components;\n\n\t\tif (installedComponents.length === 0) {\n\t\t\tp.log.warn(\"No components are currently installed.\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\tlet componentsToRemove: string[] = [];\n\n\t\t// ================================================================\n\t\t// Get components to remove\n\t\t// ================================================================\n\t\tif (options?.all) {\n\t\t\t// Remove all installed components\n\t\t\tcomponentsToRemove = installedComponents.map((comp) => comp.name);\n\t\t\tp.log.info(`Removing all ${componentsToRemove.length} installed components...`);\n\t\t} else if (components && components.length > 0) {\n\t\t\t// Validate that all specified components are installed\n\t\t\tconst invalid = components.filter(\n\t\t\t\t(comp) => !installedComponents.some((ic) => ic.name === comp),\n\t\t\t);\n\n\t\t\tif (invalid.length > 0) {\n\t\t\t\tp.log.warn(\n\t\t\t\t\t`${highlighter.warn(\"Components not found:\")}\\n${invalid\n\t\t\t\t\t\t.map((name) => ` ${name}`)\n\t\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcomponentsToRemove = components.filter((comp) =>\n\t\t\t\tinstalledComponents.some((ic) => ic.name === comp),\n\t\t\t);\n\n\t\t\tif (componentsToRemove.length === 0) {\n\t\t\t\tp.log.warn(\"No valid components to remove\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t} else {\n\t\t\t// Show interactive prompt with installed components\n\t\t\tconst choices = installedComponents.map((comp) => ({\n\t\t\t\tvalue: comp.name,\n\t\t\t\tlabel: comp.name,\n\t\t\t}));\n\n\t\t\tconst selected = await p.multiselect({\n\t\t\t\tmessage: \"Select components to remove\",\n\t\t\t\toptions: choices,\n\t\t\t});\n\n\t\t\tif (p.isCancel(selected)) {\n\t\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\n\t\t\tcomponentsToRemove = selected as string[];\n\t\t}\n\n\t\tif (componentsToRemove.length === 0) {\n\t\t\tp.log.warn(\"No components selected for removal\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\t// Confirm removal\n\t\tconst confirmed = await p.confirm({\n\t\t\tmessage: `Remove ${componentsToRemove\n\t\t\t\t.map((comp) => highlighter.info(comp))\n\t\t\t\t.join(\", \")} ${componentsToRemove.length > 1 ? \"components\" : \"component\"}?`,\n\t\t});\n\n\t\tif (!confirmed || p.isCancel(confirmed)) {\n\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\tconst results = {\n\t\t\tremoved: [] as RemoveResult[],\n\t\t\tfailed: [] as RemoveResult[],\n\t\t};\n\n\t\t// ================================================================\n\t\t// Remove Components\n\t\t// ================================================================\n\t\tfor (const comp of componentsToRemove) {\n\t\t\tconst result = await removeComponent(comp, config.componentDir);\n\t\t\tif (result.status === \"removed\") {\n\t\t\t\tresults.removed.push(result);\n\t\t\t} else {\n\t\t\t\tresults.failed.push(result);\n\t\t\t}\n\t\t}\n\n\t\t// ================================================================\n\t\t// Update Config File\n\t\t// ================================================================\n\t\t// Update config file by writing the filtered components directly\n\t\tconst updatedComponents = config.components.filter(\n\t\t\t(comp) => !componentsToRemove.includes(comp.name),\n\t\t);\n\t\tawait updateConfig(\n\t\t\t{\n\t\t\t\t...config,\n\t\t\t\tcomponents: updatedComponents,\n\t\t\t},\n\t\t\t{ appendComponents: false },\n\t\t);\n\n\t\t// ================================================================\n\t\t// Removal summary\n\t\t// ================================================================\n\t\tp.log.message(`\\n\\n${highlighter.underline(\"Removal Summary\")}`);\n\n\t\tif (results.removed.length > 0) {\n\t\t\tp.log.success(\n\t\t\t\t`${highlighter.success(\"Successfully removed components:\")}\\n${results.removed\n\t\t\t\t\t.map((r) => ` ${r.name}`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tif (results.failed.length > 0) {\n\t\t\tp.log.error(\n\t\t\t\t`${highlighter.error(\"Failed to remove components:\")}\\n${results.failed\n\t\t\t\t\t.map((r) => ` ${r.name} - ${r.error}`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tawait sleep(1000);\n\n\t\tif (results.removed.length > 0) {\n\t\t\tp.outro(\"Components removed successfully 🗑️\");\n\t\t} else {\n\t\t\tp.cancel(\"Errors occurred while removing components\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tp.log.error(error instanceof Error ? error.message : \"Failed to remove components\");\n\t\tp.cancel(\"Operation cancelled\");\n\t\tprocess.exit(1);\n\t}\n}\n","import path from \"node:path\";\nimport { getConfig } from \"@/utils/config.js\";\nimport { PATHS } from \"@/utils/constants.js\";\nimport { fileExists, writeJsonFile } from \"@/utils/fs.js\";\nimport { highlighter } from \"@/utils/highlighter.js\";\nimport { sleep } from \"@/utils/sleep.js\";\nimport * as p from \"@clack/prompts\";\nimport { type UpdateResult, updateComponent } from \"@/utils/component.js\";\nimport { updateConfig } from \"@/utils/config.js\";\n\nexport async function update(components?: string[], options?: { all?: boolean }) {\n\ttry {\n\t\tp.intro(highlighter.title(\" Welcome to the Starwind CLI \"));\n\n\t\t// Check if starwind.config.json exists\n\t\tconst configExists = await fileExists(PATHS.LOCAL_CONFIG_FILE);\n\n\t\tif (!configExists) {\n\t\t\tp.log.error(\"No Starwind configuration found. Please run starwind init first.\");\n\t\t\tprocess.exit(1);\n\t\t}\n\n\t\t// Get current config and installed components\n\t\tconst config = await getConfig();\n\t\tconst installedComponents = config.components;\n\n\t\tif (installedComponents.length === 0) {\n\t\t\tp.log.warn(\"No components are currently installed.\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\tlet componentsToUpdate: string[] = [];\n\n\t\t// ================================================================\n\t\t// Get components to update\n\t\t// ================================================================\n\t\tif (options?.all) {\n\t\t\t// Update all installed components\n\t\t\tcomponentsToUpdate = installedComponents.map((comp) => comp.name);\n\t\t\tp.log.info(`Checking updates for all ${componentsToUpdate.length} installed components...`);\n\t\t} else if (components && components.length > 0) {\n\t\t\t// Validate that all specified components are installed\n\t\t\tconst invalid = components.filter(\n\t\t\t\t(comp) => !installedComponents.some((ic) => ic.name === comp),\n\t\t\t);\n\n\t\t\tif (invalid.length > 0) {\n\t\t\t\tp.log.warn(\n\t\t\t\t\t`${highlighter.warn(\"Components not found in project:\")}\\n${invalid\n\t\t\t\t\t\t.map((name) => ` ${name}`)\n\t\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcomponentsToUpdate = components.filter((comp) =>\n\t\t\t\tinstalledComponents.some((ic) => ic.name === comp),\n\t\t\t);\n\n\t\t\tif (componentsToUpdate.length === 0) {\n\t\t\t\tp.log.warn(\"No valid components to update\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t} else {\n\t\t\t// Show interactive prompt with installed components\n\t\t\tconst choices = installedComponents.map((comp) => ({\n\t\t\t\tvalue: comp.name,\n\t\t\t\tlabel: comp.name,\n\t\t\t}));\n\n\t\t\tconst selected = await p.multiselect({\n\t\t\t\tmessage: \"Select components to update\",\n\t\t\t\toptions: choices,\n\t\t\t});\n\n\t\t\tif (p.isCancel(selected)) {\n\t\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\n\t\t\tcomponentsToUpdate = selected as string[];\n\t\t}\n\n\t\tif (componentsToUpdate.length === 0) {\n\t\t\tp.log.warn(\"No components selected for update\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\t// Confirm update\n\t\tconst confirmed = await p.confirm({\n\t\t\tmessage: `Check for updates to ${componentsToUpdate\n\t\t\t\t.map((comp) => highlighter.info(comp))\n\t\t\t\t.join(\", \")} ${componentsToUpdate.length > 1 ? \"components\" : \"component\"}?`,\n\t\t});\n\n\t\tif (!confirmed || p.isCancel(confirmed)) {\n\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\tprocess.exit(0);\n\t\t}\n\n\t\tconst results = {\n\t\t\tupdated: [] as UpdateResult[],\n\t\t\tskipped: [] as UpdateResult[],\n\t\t\tfailed: [] as UpdateResult[],\n\t\t};\n\n\t\t// ================================================================\n\t\t// Update Components\n\t\t// ================================================================\n\t\tfor (const comp of componentsToUpdate) {\n\t\t\tconst currentVersion = installedComponents.find((ic) => ic.name === comp)?.version;\n\t\t\tif (!currentVersion) {\n\t\t\t\tresults.failed.push({\n\t\t\t\t\tname: comp,\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\terror: \"Could not determine current version\",\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst result = await updateComponent(comp, currentVersion);\n\t\t\tswitch (result.status) {\n\t\t\t\tcase \"updated\":\n\t\t\t\t\tresults.updated.push(result);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"skipped\":\n\t\t\t\t\tresults.skipped.push(result);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"failed\":\n\t\t\t\t\tresults.failed.push(result);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// ================================================================\n\t\t// Update Config File\n\t\t// ================================================================\n\t\tif (results.updated.length > 0) {\n\t\t\ttry {\n\t\t\t\t// Create a map of current components, excluding updated ones\n\t\t\t\tconst updatedComponentNames = new Set(results.updated.map((r) => r.name));\n\t\t\t\tconst currentComponents = config.components.filter(\n\t\t\t\t\t(comp) => !updatedComponentNames.has(comp.name),\n\t\t\t\t);\n\n\t\t\t\t// Add the updated components with their new versions\n\t\t\t\tconst updatedComponents = [\n\t\t\t\t\t...currentComponents,\n\t\t\t\t\t...results.updated.map((r) => ({\n\t\t\t\t\t\tname: r.name,\n\t\t\t\t\t\tversion: r.newVersion!,\n\t\t\t\t\t})),\n\t\t\t\t];\n\n\t\t\t\tawait updateConfig(\n\t\t\t\t\t{\n\t\t\t\t\t\tcomponents: updatedComponents,\n\t\t\t\t\t},\n\t\t\t\t\t{ appendComponents: false },\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tp.log.error(\n\t\t\t\t\t`Failed to update config: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n\t\t\t\t);\n\t\t\t\tprocess.exit(1);\n\t\t\t}\n\t\t}\n\n\t\t// ================================================================\n\t\t// Update summary\n\t\t// ================================================================\n\t\tp.log.message(`\\n\\n${highlighter.underline(\"Update Summary\")}`);\n\n\t\tif (results.skipped.length > 0) {\n\t\t\tp.log.info(\n\t\t\t\t`${highlighter.info(\"Components already up to date or skipped:\")}\\n${results.skipped\n\t\t\t\t\t.map((r) => ` ${r.name} (${r.oldVersion})`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tif (results.updated.length > 0) {\n\t\t\tp.log.success(\n\t\t\t\t`${highlighter.success(\"Successfully updated components:\")}\\n${results.updated\n\t\t\t\t\t.map((r) => ` ${r.name} (${r.oldVersion} → ${r.newVersion})`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tif (results.failed.length > 0) {\n\t\t\tp.log.error(\n\t\t\t\t`${highlighter.error(\"Failed to update components:\")}\\n${results.failed\n\t\t\t\t\t.map((r) => ` ${r.name} - ${r.error}`)\n\t\t\t\t\t.join(\"\\n\")}`,\n\t\t\t);\n\t\t}\n\n\t\tawait sleep(1000);\n\n\t\tif (results.updated.length > 0) {\n\t\t\tp.outro(\"Components updated successfully 🚀\");\n\t\t} else if (results.skipped.length > 0 && results.failed.length === 0) {\n\t\t\tp.outro(\"Components already up to date or skipped ✨\");\n\t\t} else {\n\t\t\tp.cancel(\"No components were updated\");\n\t\t\tprocess.exit(1);\n\t\t}\n\t} catch (error) {\n\t\tp.log.error(error instanceof Error ? error.message : \"Failed to update components\");\n\t\tp.cancel(\"Operation cancelled\");\n\t\tprocess.exit(1);\n\t}\n}\n"],"mappings":"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","names":["registry","registry","confirm","confirm","p","init","p","p"]}
@@ -0,0 +1,7 @@
1
+ import {
2
+ init
3
+ } from "./chunk-V7BBFSQ4.js";
4
+ export {
5
+ init
6
+ };
7
+ //# sourceMappingURL=init-MD7ZEY5H.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "starwind",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Add beautifully designed components to your Astro applications",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/commands/init.ts","../src/templates/starwind.css.ts","../src/utils/highlighter.ts","../src/utils/astro-config.ts","../src/utils/fs.ts","../src/utils/constants.ts","../src/utils/config.ts","../src/utils/package-manager.ts","../src/utils/sleep.ts"],"sourcesContent":["import path from \"node:path\";\nimport { tailwindConfig } from \"@/templates/starwind.css.js\";\nimport { setupAstroConfig } from \"@/utils/astro-config.js\";\nimport { updateConfig } from \"@/utils/config.js\";\nimport { ASTRO_PACKAGES, MIN_ASTRO_VERSION, PATHS, getOtherPackages } from \"@/utils/constants.js\";\nimport { ensureDirectory, fileExists, readJsonFile, writeCssFile } from \"@/utils/fs.js\";\nimport { highlighter } from \"@/utils/highlighter.js\";\nimport { installDependencies, requestPackageManager } from \"@/utils/package-manager.js\";\nimport { sleep } from \"@/utils/sleep.js\";\nimport * as p from \"@clack/prompts\";\nimport semver from \"semver\";\n\nexport async function init(withinAdd: boolean = false) {\n\tif (!withinAdd) {\n\t\tp.intro(highlighter.title(\" Welcome to the Starwind CLI \"));\n\t}\n\n\ttry {\n\t\t// Validate project structure\n\t\tif (!(await fileExists(\"package.json\"))) {\n\t\t\tthrow new Error(\n\t\t\t\t\"No package.json found. Please run this command in the root of your project.\",\n\t\t\t);\n\t\t}\n\n\t\tconst pkg = await readJsonFile(\"package.json\");\n\n\t\t// Check Astro version compatibility\n\t\tconst installTasks = [];\n\t\tconst configTasks = [];\n\n\t\t// ================================================================\n\t\t// Prepare project structure and configuration tasks\n\t\t// ================================================================\n\t\tconst configChoices = await p.group(\n\t\t\t{\n\t\t\t\t// ask where to install components\n\t\t\t\tinstallLocation: () =>\n\t\t\t\t\tp.text({\n\t\t\t\t\t\tmessage: \"What is your components directory?\",\n\t\t\t\t\t\tplaceholder: PATHS.LOCAL_COMPONENTS_DIR,\n\t\t\t\t\t\tinitialValue: PATHS.LOCAL_COMPONENTS_DIR,\n\t\t\t\t\t\tvalidate(value) {\n\t\t\t\t\t\t\t// Check for empty value\n\t\t\t\t\t\t\tif (value.length === 0) return `Value is required!`;\n\n\t\t\t\t\t\t\t// Check for absolute paths\n\t\t\t\t\t\t\tif (path.isAbsolute(value)) return `Please use a relative path`;\n\n\t\t\t\t\t\t\t// Check for path traversal attempts\n\t\t\t\t\t\t\tif (value.includes(\"..\")) return `Path traversal is not allowed`;\n\n\t\t\t\t\t\t\t// Check for invalid characters in path\n\t\t\t\t\t\t\tconst invalidChars = /[<>:\"|?*]/;\n\t\t\t\t\t\t\tif (invalidChars.test(value)) return `Path contains invalid characters`;\n\n\t\t\t\t\t\t\t// Check if path starts with system directories\n\t\t\t\t\t\t\tconst systemDirs = [\"windows\", \"program files\", \"system32\"];\n\t\t\t\t\t\t\tif (systemDirs.some((dir) => value.toLowerCase().startsWith(dir))) {\n\t\t\t\t\t\t\t\treturn `Cannot install in system directories`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\t\t\t\t// ask where to add the css file\n\t\t\t\tcssFile: () =>\n\t\t\t\t\tp.text({\n\t\t\t\t\t\tmessage: `Where would you like to add the Tailwind ${highlighter.info(\".css\")} file?`,\n\t\t\t\t\t\tplaceholder: PATHS.LOCAL_CSS_FILE,\n\t\t\t\t\t\tinitialValue: PATHS.LOCAL_CSS_FILE,\n\t\t\t\t\t\tvalidate(value) {\n\t\t\t\t\t\t\t// Check for empty value\n\t\t\t\t\t\t\tif (value.length === 0) return `Value is required!`;\n\n\t\t\t\t\t\t\t// Must end with .css\n\t\t\t\t\t\t\tif (!value.endsWith(\".css\")) return `File must end with .css extension`;\n\n\t\t\t\t\t\t\t// Check for absolute paths\n\t\t\t\t\t\t\tif (path.isAbsolute(value)) return `Please use a relative path`;\n\n\t\t\t\t\t\t\t// Check for path traversal attempts\n\t\t\t\t\t\t\tif (value.includes(\"..\")) return `Path traversal is not allowed`;\n\n\t\t\t\t\t\t\t// Check for invalid characters in path\n\t\t\t\t\t\t\tconst invalidChars = /[<>:\"|?*]/;\n\t\t\t\t\t\t\tif (invalidChars.test(value)) return `Path contains invalid characters`;\n\n\t\t\t\t\t\t\t// Check if path starts with system directories\n\t\t\t\t\t\t\tconst systemDirs = [\"windows\", \"program files\", \"system32\"];\n\t\t\t\t\t\t\tif (systemDirs.some((dir) => value.toLowerCase().startsWith(dir))) {\n\t\t\t\t\t\t\t\treturn `Cannot use system directories`;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Ensure the path has a valid filename\n\t\t\t\t\t\t\tconst basename = path.basename(value, \".css\");\n\t\t\t\t\t\t\tif (!basename || basename.trim().length === 0) {\n\t\t\t\t\t\t\t\treturn `Invalid filename`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t}),\n\n\t\t\t\ttwBaseColor: () =>\n\t\t\t\t\tp.select({\n\t\t\t\t\t\tmessage: \"What Tailwind base color would you like to use?\",\n\t\t\t\t\t\tinitialValue: \"neutral\",\n\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t{ label: \"Neutral (default)\", value: \"neutral\" },\n\t\t\t\t\t\t\t{ label: \"Stone\", value: \"stone\" },\n\t\t\t\t\t\t\t{ label: \"Zinc\", value: \"zinc\" },\n\t\t\t\t\t\t\t{ label: \"Gray\", value: \"gray\" },\n\t\t\t\t\t\t\t{ label: \"Slate\", value: \"slate\" },\n\t\t\t\t\t\t],\n\t\t\t\t\t}),\n\t\t\t},\n\t\t\t{\n\t\t\t\t// On Cancel callback that wraps the group\n\t\t\t\t// So if the user cancels one of the prompts in the group this function will be called\n\t\t\t\tonCancel: () => {\n\t\t\t\t\tp.cancel(\"Operation cancelled.\");\n\t\t\t\t\tprocess.exit(0);\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\t// ================================================================\n\t\t// Make sure appropriate directories exist\n\t\t// ================================================================\n\t\tconst cssFileDir = path.dirname(configChoices.cssFile);\n\t\tconst componentInstallDir = path.join(configChoices.installLocation, \"starwind\");\n\t\tconfigTasks.push({\n\t\t\ttitle: \"Creating project structure\",\n\t\t\ttask: async () => {\n\t\t\t\tawait ensureDirectory(componentInstallDir);\n\t\t\t\tawait ensureDirectory(cssFileDir);\n\t\t\t\tawait sleep(250);\n\t\t\t\treturn \"Created project structure\";\n\t\t\t},\n\t\t});\n\n\t\t// ================================================================\n\t\t// Prepare Astro config file setup\n\t\t// ================================================================\n\t\tconfigTasks.push({\n\t\t\ttitle: \"Setup Astro config file\",\n\t\t\ttask: async () => {\n\t\t\t\tconst success = await setupAstroConfig();\n\t\t\t\tif (!success) {\n\t\t\t\t\tthrow new Error(\"Failed to setup Astro config\");\n\t\t\t\t}\n\t\t\t\tawait sleep(250);\n\t\t\t\treturn \"Astro config setup completed\";\n\t\t\t},\n\t\t});\n\n\t\t// ================================================================\n\t\t// Prepare CSS file\n\t\t// ================================================================\n\t\t// Check if CSS file already exists\n\t\tconst cssFileExists = await fileExists(configChoices.cssFile);\n\t\tlet updatedTailwindConfig = tailwindConfig;\n\n\t\tif (configChoices.twBaseColor !== \"gray\") {\n\t\t\t// replace all \"--color-neutral\" with \"--color-twBaseColor\"\n\t\t\tupdatedTailwindConfig = updatedTailwindConfig.replace(\n\t\t\t\t/--color-neutral-/g,\n\t\t\t\t`--color-${configChoices.twBaseColor}-`,\n\t\t\t);\n\t\t}\n\n\t\tif (cssFileExists) {\n\t\t\tconst shouldOverride = await p.confirm({\n\t\t\t\tmessage: `${highlighter.info(configChoices.cssFile)} already exists. Do you want to override it?`,\n\t\t\t});\n\n\t\t\tif (!shouldOverride) {\n\t\t\t\tp.log.info(\"Skipping Tailwind CSS configuration\");\n\t\t\t} else {\n\t\t\t\tconfigTasks.push({\n\t\t\t\t\ttitle: \"Creating Tailwind CSS configuration\",\n\t\t\t\t\ttask: async () => {\n\t\t\t\t\t\tawait writeCssFile(configChoices.cssFile, updatedTailwindConfig);\n\t\t\t\t\t\tawait sleep(250);\n\t\t\t\t\t\treturn \"Created Tailwind configuration\";\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tconfigTasks.push({\n\t\t\t\ttitle: \"Creating Tailwind CSS configuration\",\n\t\t\t\ttask: async () => {\n\t\t\t\t\tawait writeCssFile(configChoices.cssFile, updatedTailwindConfig);\n\t\t\t\t\tawait sleep(250);\n\t\t\t\t\treturn \"Created Tailwind configuration\";\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// ================================================================\n\t\t// Prepare project starwind configuration\n\t\t// ================================================================\n\t\tconfigTasks.push({\n\t\t\ttitle: \"Updating project configuration\",\n\t\t\ttask: async () => {\n\t\t\t\tawait updateConfig({\n\t\t\t\t\ttailwind: {\n\t\t\t\t\t\tcss: configChoices.cssFile,\n\t\t\t\t\t\tbaseColor: configChoices.twBaseColor as \"slate\" | \"gray\" | \"zinc\" | \"neutral\" | \"stone\",\n\t\t\t\t\t\tcssVariables: true,\n\t\t\t\t\t},\n\t\t\t\t\t// aliases: {\n\t\t\t\t\t// \tcomponents: \"@/components\",\n\t\t\t\t\t// },\n\t\t\t\t\tcomponentDir: configChoices.installLocation,\n\t\t\t\t\tcomponents: [],\n\t\t\t\t});\n\t\t\t\tawait sleep(250);\n\t\t\t\treturn \"Updated project starwind configuration\";\n\t\t\t},\n\t\t});\n\n\t\t// ================================================================\n\t\t// Prepare astro installation\n\t\t// ================================================================\n\t\t// Request package manager\n\t\tconst pm = await requestPackageManager();\n\n\t\tif (pkg.dependencies?.astro) {\n\t\t\tconst astroVersion = pkg.dependencies.astro.replace(/^\\^|~/, \"\");\n\t\t\tif (!semver.gte(astroVersion, MIN_ASTRO_VERSION)) {\n\t\t\t\tconst shouldUpgrade = await p.confirm({\n\t\t\t\t\tmessage: `Starwind requires Astro v${MIN_ASTRO_VERSION} or higher. Would you like to upgrade from v${astroVersion}?`,\n\t\t\t\t\tinitialValue: true,\n\t\t\t\t});\n\n\t\t\t\tif (p.isCancel(shouldUpgrade)) {\n\t\t\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\t\t\treturn process.exit(0);\n\t\t\t\t}\n\n\t\t\t\tif (!shouldUpgrade) {\n\t\t\t\t\tp.cancel(\"Astro v5 or higher is required to use Starwind\");\n\t\t\t\t\treturn process.exit(1);\n\t\t\t\t}\n\n\t\t\t\tinstallTasks.push({\n\t\t\t\t\ttitle: \"Upgrading Astro\",\n\t\t\t\t\ttask: async () => {\n\t\t\t\t\t\tawait installDependencies([ASTRO_PACKAGES.core], pm);\n\t\t\t\t\t\treturn \"Upgraded Astro successfully\";\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tconst shouldInstall = await p.confirm({\n\t\t\t\tmessage: `Starwind requires Astro v${MIN_ASTRO_VERSION} or higher. Would you like to install it?`,\n\t\t\t\tinitialValue: true,\n\t\t\t});\n\n\t\t\tif (p.isCancel(shouldInstall)) {\n\t\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\t\treturn process.exit(0);\n\t\t\t}\n\n\t\t\tif (!shouldInstall) {\n\t\t\t\tp.cancel(\"Astro is required to use Starwind\");\n\t\t\t\treturn process.exit(1);\n\t\t\t}\n\n\t\t\tinstallTasks.push({\n\t\t\t\ttitle: `Installing ${ASTRO_PACKAGES.core}`,\n\t\t\t\ttask: async () => {\n\t\t\t\t\tawait installDependencies([ASTRO_PACKAGES.core], pm);\n\t\t\t\t\treturn `Installed ${highlighter.info(ASTRO_PACKAGES.core)} successfully`;\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// ================================================================\n\t\t// Prepare tailwind and other package installation\n\t\t// ================================================================\n\t\tconst otherPackages = getOtherPackages();\n\n\t\tconst shouldInstall = await p.confirm({\n\t\t\tmessage: `Install ${highlighter.info(otherPackages.join(\", \"))} using ${highlighter.info(pm)}?`,\n\t\t});\n\n\t\tif (p.isCancel(shouldInstall)) {\n\t\t\tp.cancel(\"Operation cancelled\");\n\t\t\treturn process.exit(0);\n\t\t}\n\n\t\tif (shouldInstall) {\n\t\t\tinstallTasks.push({\n\t\t\t\ttitle: `Installing packages`,\n\t\t\t\ttask: async () => {\n\t\t\t\t\tawait installDependencies(getOtherPackages(), pm, false, false);\n\t\t\t\t\treturn `${highlighter.info(\"Packages installed successfully\")}`;\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\tp.log.warn(\n\t\t\t\thighlighter.warn(`Skipped installation of packages. Make sure to install them manually`),\n\t\t\t);\n\t\t}\n\n\t\t// ================================================================\n\t\t// Execute all tasks\n\t\t// ================================================================\n\t\tif (installTasks.length > 0) {\n\t\t\tawait p.tasks(installTasks);\n\t\t}\n\n\t\tif (configTasks.length > 0) {\n\t\t\tawait p.tasks(configTasks);\n\t\t}\n\n\t\tawait sleep(250);\n\n\t\tp.note(\n\t\t\t`Make sure your layout imports the ${highlighter.infoBright(configChoices.cssFile)} file`,\n\t\t\t\"Next steps\",\n\t\t);\n\n\t\tif (!withinAdd) {\n\t\t\tsleep(1000);\n\t\t\tp.outro(\"Enjoy using Starwind UI 🚀\");\n\t\t}\n\t} catch (error) {\n\t\tp.log.error(error instanceof Error ? error.message : \"Failed to add components\");\n\t\tp.cancel(\"Operation cancelled\");\n\t\tprocess.exit(1);\n\t}\n}\n","export const tailwindConfig = `@import \"tailwindcss\";\n@plugin \"tailwindcss-animate\";\n@plugin \"@tailwindcss/forms\";\n@variant dark (&:where(.dark, .dark *));\n\n@theme {\n\t--animate-accordion-down: accordion-down 0.2s ease-out;\n\t--animate-accordion-up: accordion-up 0.2s ease-out;\n\n\t@keyframes accordion-down {\n\t\tfrom {\n\t\t\theight: 0;\n\t\t}\n\t\tto {\n\t\t\theight: var(--starwind-accordion-content-height);\n\t\t}\n\t}\n\n\t@keyframes accordion-up {\n\t\tfrom {\n\t\t\theight: var(--starwind-accordion-content-height);\n\t\t}\n\t\tto {\n\t\t\theight: 0;\n\t\t}\n\t}\n}\n\n@theme inline {\n\t--color-background: var(--background);\n\t--color-foreground: var(--foreground);\n\t--color-card: var(--card);\n\t--color-card-foreground: var(--card-foreground);\n\t--color-popover: var(--popover);\n\t--color-popover-foreground: var(--popover-foreground);\n\t--color-primary: var(--primary);\n\t--color-primary-foreground: var(--primary-foreground);\n\t--color-secondary: var(--secondary);\n\t--color-secondary-foreground: var(--secondary-foreground);\n\t--color-muted: var(--muted);\n\t--color-muted-foreground: var(--muted-foreground);\n\t--color-accent: var(--accent);\n\t--color-accent-foreground: var(--accent-foreground);\n\t--color-info: var(--info);\n\t--color-info-foreground: var(--info-foreground);\n\t--color-success: var(--success);\n\t--color-success-foreground: var(--success-foreground);\n\t--color-warning: var(--warning);\n\t--color-warning-foreground: var(--warning-foreground);\n\t--color-error: var(--error);\n\t--color-error-foreground: var(--error-foreground);\n\t--color-border: var(--border);\n\t--color-input: var(--input);\n\t--color-outline: var(--outline);\n\n\t--radius-xs: calc(var(--radius) - 0.375rem);\n\t--radius-sm: calc(var(--radius) - 0.25rem);\n\t--radius-md: calc(var(--radius) - 0.125rem);\n\t--radius-lg: var(--radius);\n\t--radius-xl: calc(var(--radius) + 0.25rem);\n\t--radius-2xl: calc(var(--radius) + 0.5rem);\n\t--radius-3xl: calc(var(--radius) + 1rem);\n}\n\n@layer base {\n\t:root {\n\t\t--background: var(--color-neutral-50);\n\t\t--foreground: var(--color-neutral-950);\n\t\t--card: var(--color-neutral-50);\n\t\t--card-foreground: var(--color-neutral-950);\n\t\t--popover: var(--color-neutral-50);\n\t\t--popover-foreground: var(--color-neutral-950);\n\t\t--primary: var(--color-blue-700);\n\t\t--primary-foreground: var(--color-neutral-50);\n\t\t--secondary: var(--color-fuchsia-700);\n\t\t--secondary-foreground: var(--color-neutral-50);\n\t\t--muted: var(--color-neutral-100);\n\t\t--muted-foreground: var(--color-neutral-600);\n\t\t--accent: var(--color-neutral-200);\n\t\t--accent-foreground: var(--color-neutral-900);\n\t\t--info: var(--color-sky-300);\n\t\t--info-foreground: var(--color-sky-950);\n\t\t--success: var(--color-green-300);\n\t\t--success-foreground: var(--color-green-950);\n\t\t--warning: var(--color-amber-300);\n\t\t--warning-foreground: var(--color-amber-950);\n\t\t--error: var(--color-red-700);\n\t\t--error-foreground: var(--color-neutral-50);\n\t\t--border: var(--color-neutral-200);\n\t\t--input: var(--color-neutral-200);\n\t\t--outline: var(--color-blue-600);\n\t\t--radius: 0.5rem;\n\t}\n\n\t.dark {\n\t\t--background: var(--color-neutral-950);\n\t\t--foreground: var(--color-neutral-50);\n\t\t--card: var(--color-neutral-950);\n\t\t--card-foreground: var(--color-neutral-50);\n\t\t--popover: var(--color-neutral-950);\n\t\t--popover-foreground: var(--color-neutral-50);\n\t\t--primary: var(--color-blue-700);\n\t\t--primary-foreground: var(--color-neutral-50);\n\t\t--secondary: var(--color-fuchsia-300);\n\t\t--secondary-foreground: var(--color-neutral-950);\n\t\t--muted: var(--color-neutral-900);\n\t\t--muted-foreground: var(--color-neutral-400);\n\t\t--accent: var(--color-neutral-900);\n\t\t--accent-foreground: var(--color-neutral-100);\n\t\t--info: var(--color-sky-300);\n\t\t--info-foreground: var(--color-sky-950);\n\t\t--success: var(--color-green-300);\n\t\t--success-foreground: var(--color-green-950);\n\t\t--warning: var(--color-amber-300);\n\t\t--warning-foreground: var(--color-amber-950);\n\t\t--error: var(--color-red-800);\n\t\t--error-foreground: var(--color-neutral-50);\n\t\t--border: var(--color-neutral-800);\n\t\t--input: var(--color-neutral-800);\n\t\t--outline: var(--color-blue-600);\n\t\t--radius: 0.5rem;\n\t}\n\n\t* {\n\t\t@apply border-border;\n\t}\n\t*:focus-visible {\n\t\t@apply outline-outline;\n\t}\n\thtml {\n\t\t@apply bg-background text-foreground scheme-light dark:scheme-dark;\n\t}\n\tbutton {\n\t\t@apply cursor-pointer;\n\t}\n}\n\n@layer utilities {\n\t/* transition-colors but without outline-color transition property */\n\t.starwind-transition-colors {\n\t\ttransition-property: color, background-color, border-color, text-decoration-color, fill, stroke,\n\t\t\t--tw-gradient-from, --tw-gradient-via, --tw-gradient-to;\n\t\ttransition-timing-function: var(--default-transition-timing-function);\n\t\ttransition-duration: var(--default-transition-duration);\n\t}\n}\n`;\n","import chalk from \"chalk\";\n\nexport const highlighter = {\n\terror: chalk.red,\n\twarn: chalk.yellow,\n\tinfo: chalk.cyan,\n\tinfoBright: chalk.cyanBright,\n\tsuccess: chalk.greenBright,\n\tunderline: chalk.underline,\n\ttitle: chalk.bgBlue,\n};\n","import { highlighter } from \"@/utils/highlighter.js\";\nimport * as p from \"@clack/prompts\";\nimport fs from \"fs-extra\";\nimport { fileExists } from \"./fs.js\";\n\nconst CONFIG_EXTENSIONS = [\"ts\", \"js\", \"mjs\", \"cjs\"] as const;\n// type ConfigExtension = (typeof CONFIG_EXTENSIONS)[number];\n\n/**\n * Finds the Astro config file in the current directory\n * @returns The path to the config file if found, null otherwise\n */\nasync function findAstroConfig(): Promise<string | null> {\n\tfor (const ext of CONFIG_EXTENSIONS) {\n\t\tconst configPath = `astro.config.${ext}`;\n\t\tif (await fileExists(configPath)) {\n\t\t\treturn configPath;\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n * Updates or creates the Astro configuration file\n * @returns true if successful, false otherwise\n */\nexport async function setupAstroConfig(): Promise<boolean> {\n\ttry {\n\t\tlet configPath = await findAstroConfig();\n\t\tlet content = \"\";\n\n\t\tif (configPath) {\n\t\t\tcontent = await fs.readFile(configPath, \"utf-8\");\n\t\t} else {\n\t\t\tconfigPath = \"astro.config.ts\";\n\t\t\tcontent = `import { defineConfig } from \"astro/config\";\\n\\nexport default defineConfig({});\\n`;\n\t\t}\n\n\t\t// Add tailwindcss import if not present\n\t\tif (!content.includes('import tailwindcss from \"@tailwindcss/vite\"')) {\n\t\t\tcontent = `import tailwindcss from \"@tailwindcss/vite\";\\n${content}`;\n\t\t}\n\n\t\t// Parse the configuration object\n\t\tconst configStart = content.indexOf(\"defineConfig(\") + \"defineConfig(\".length;\n\t\tconst configEnd = content.lastIndexOf(\");\");\n\t\tlet config = content.slice(configStart, configEnd);\n\n\t\t// Remove outer braces and trim\n\t\tconfig = config.trim().replace(/^{|}$/g, \"\").trim();\n\n\t\t// Add experimental configuration\n\t\tif (!config.includes(\"experimental\")) {\n\t\t\tconfig += `\\n\\texperimental: {\n\t\tsvg: {\n\t\t\tmode: \"sprite\",\n\t\t},\n\t},`;\n\t\t} else if (!config.includes(\"svg: {\")) {\n\t\t\t// Insert svg config into existing experimental block\n\t\t\tconst expEnd = config.indexOf(\"experimental:\") + \"experimental:\".length;\n\t\t\tconst blockStart = config.indexOf(\"{\", expEnd) + 1;\n\t\t\tconfig =\n\t\t\t\tconfig.slice(0, blockStart) +\n\t\t\t\t`\\n\\t\\tsvg: {\\n\\t\\t\\tmode: \"sprite\",\\n\\t\\t},` +\n\t\t\t\tconfig.slice(blockStart);\n\t\t}\n\n\t\t// Add vite configuration\n\t\tif (!config.includes(\"vite:\")) {\n\t\t\tconfig += `\\n\\tvite: {\n\t\tplugins: [tailwindcss()],\n\t},`;\n\t\t} else if (!config.includes(\"plugins: [\")) {\n\t\t\t// Insert plugins into existing vite block\n\t\t\tconst viteEnd = config.indexOf(\"vite:\") + \"vite:\".length;\n\t\t\tconst blockStart = config.indexOf(\"{\", viteEnd) + 1;\n\t\t\tconfig =\n\t\t\t\tconfig.slice(0, blockStart) + `\\n\\t\\tplugins: [tailwindcss()],` + config.slice(blockStart);\n\t\t} else if (!config.includes(\"tailwindcss()\")) {\n\t\t\t// Add tailwindcss to existing plugins array\n\t\t\tconst pluginsStart = config.indexOf(\"plugins:\") + \"plugins:\".length;\n\t\t\tconst arrayStart = config.indexOf(\"[\", pluginsStart) + 1;\n\t\t\tconfig = config.slice(0, arrayStart) + `tailwindcss(), ` + config.slice(arrayStart);\n\t\t}\n\n\t\t// Reconstruct the file content\n\t\tconst newContent = `${content.slice(0, configStart)}{\\n\\t${config}\\n}${content.slice(configEnd)}`;\n\n\t\tawait fs.writeFile(configPath, newContent, \"utf-8\");\n\t\treturn true;\n\t} catch (error) {\n\t\tconst errorMessage = error instanceof Error ? error.message : \"An unknown error occurred\";\n\t\tp.log.error(highlighter.error(`Failed to setup Astro config: ${errorMessage}`));\n\t\treturn false;\n\t}\n}\n","import fs from \"fs-extra\";\n\n/**\n * Ensures a directory exists, creating it and its parents if necessary\n * @param dir - Directory path to ensure exists\n */\nexport async function ensureDirectory(dir: string) {\n\tawait fs.ensureDir(dir);\n}\n\n/**\n * Copies a file from source to destination\n * @param src - Source file path\n * @param dest - Destination file path\n */\nexport async function copyFile(src: string, dest: string) {\n\tawait fs.copy(src, dest);\n}\n\n/**\n * Reads and parses a JSON file\n * @param filePath - Path to the JSON file\n * @returns Parsed JSON content\n */\nexport async function readJsonFile(filePath: string) {\n\treturn fs.readJson(filePath);\n}\n\n/**\n * Writes data to a JSON file\n * @param filePath - Path to write the JSON file\n * @param data - Data to write to the file\n */\nexport async function writeJsonFile(filePath: string, data: unknown) {\n\tawait fs.writeJson(filePath, data, { spaces: 2 });\n}\n\n/**\n * Checks if a file exists\n * @param filePath - Path to check\n * @returns True if the file exists, false otherwise\n */\nexport async function fileExists(filePath: string) {\n\treturn fs.pathExists(filePath);\n}\n\n/**\n * Creates a CSS file with the provided content\n * @param filePath - Path to write the CSS file\n * @param content - CSS content to write\n */\nexport async function writeCssFile(filePath: string, content: string) {\n\tawait fs.writeFile(filePath, content, \"utf-8\");\n}\n","export const MIN_ASTRO_VERSION = \"5.0.0\";\n\n/**\n * File system paths used throughout the application\n */\nexport const PATHS = {\n\tSTARWIND_CORE: \"@starwind-ui/core\",\n\tSTARWIND_CORE_COMPONENTS: \"src/components\",\n\tSTARWIND_CORE_REGISTRY: \"registry.json\",\n\tLOCAL_CSS_FILE: \"src/styles/starwind.css\",\n\tLOCAL_CONFIG_FILE: \"starwind.config.json\",\n\tLOCAL_STYLES_DIR: \"src/styles\",\n\tLOCAL_COMPONENTS_DIR: \"src/components\",\n} as const;\n\n/**\n * Core framework dependencies\n */\nexport const ASTRO_PACKAGES = {\n\tcore: \"astro@latest\",\n} as const;\n\n/**\n * Tailwind CSS related dependencies\n */\nexport const OTHER_PACKAGES = {\n\ttailwindCore: \"tailwindcss@latest\",\n\ttailwindVite: \"@tailwindcss/vite@latest\",\n\ttailwindForms: \"@tailwindcss/forms@latest\",\n\ttailwindAnimate: \"tailwindcss-animate@latest\",\n\ttablerIcons: \"@tabler/icons@latest\",\n} as const;\n\n/**\n * Get all Tailwind CSS related packages as an array\n */\nexport function getOtherPackages(): string[] {\n\treturn Object.values(OTHER_PACKAGES);\n}\n\n/**\n * Get all Astro related packages as an array\n */\nexport function getAstroPackages(): string[] {\n\treturn Object.values(ASTRO_PACKAGES);\n}\n","import { PATHS } from \"./constants.js\";\nimport { fileExists, readJsonFile, writeJsonFile } from \"./fs.js\";\n\ninterface ComponentConfig {\n\tname: string;\n\tversion: string;\n}\n\ninterface TailwindConfig {\n\tcss: string;\n\tbaseColor: \"slate\" | \"gray\" | \"zinc\" | \"neutral\" | \"stone\";\n\tcssVariables: boolean;\n}\n\ninterface AliasConfig {\n\tcomponents: string;\n}\n\nexport interface StarwindConfig {\n\ttailwind: TailwindConfig;\n\t// aliases: AliasConfig;\n\tcomponentDir: string;\n\tcomponents: ComponentConfig[];\n}\n\nconst defaultConfig: StarwindConfig = {\n\ttailwind: {\n\t\tcss: \"src/styles/starwind.css\",\n\t\tbaseColor: \"gray\",\n\t\tcssVariables: true,\n\t},\n\t// aliases: {\n\t// \tcomponents: \"@/components\",\n\t// },\n\tcomponentDir: \"src/components/starwind\",\n\tcomponents: [],\n};\n\n/**\n * Get the current config, ensuring the file is fully read\n */\nexport async function getConfig(): Promise<StarwindConfig> {\n\ttry {\n\t\tif (await fileExists(PATHS.LOCAL_CONFIG_FILE)) {\n\t\t\tconst config = await readJsonFile(PATHS.LOCAL_CONFIG_FILE);\n\t\t\treturn {\n\t\t\t\t...defaultConfig,\n\t\t\t\t...config,\n\t\t\t\tcomponents: Array.isArray(config.components) ? config.components : [],\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(\"Error reading config:\", error);\n\t}\n\n\treturn defaultConfig;\n}\n\n/**\n * Options for updating the config file\n */\nexport interface UpdateConfigOptions {\n\t/** If true, append new components to existing array. If false, replace the components array. */\n\tappendComponents?: boolean;\n}\n\n/**\n * Update the config file, ensuring the write operation is completed\n * @param updates - Partial config object to update\n * @param options - Options for updating the config\n */\nexport async function updateConfig(\n\tupdates: Partial<StarwindConfig>,\n\toptions: UpdateConfigOptions = { appendComponents: true },\n): Promise<void> {\n\tconst currentConfig = await getConfig();\n\n\t// Ensure components array exists\n\tconst currentComponents = Array.isArray(currentConfig.components) ? currentConfig.components : [];\n\n\tconst newConfig = {\n\t\t...currentConfig,\n\t\ttailwind: {\n\t\t\t...currentConfig.tailwind,\n\t\t\t...(updates.tailwind || {}),\n\t\t},\n\t\tcomponentDir: updates.componentDir ? updates.componentDir : currentConfig.componentDir,\n\t\tcomponents: updates.components\n\t\t\t? options.appendComponents\n\t\t\t\t? [...currentComponents, ...updates.components]\n\t\t\t\t: updates.components\n\t\t\t: currentComponents,\n\t};\n\n\ttry {\n\t\tawait writeJsonFile(PATHS.LOCAL_CONFIG_FILE, newConfig);\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Failed to update config: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n\t\t);\n\t}\n}\n","import * as p from \"@clack/prompts\";\nimport { execa } from \"execa\";\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\n/**\n * Prompts the user to select their preferred package manager\n * @returns The selected package manager, defaults to npm if cancelled\n */\nexport async function requestPackageManager(): Promise<PackageManager> {\n\tconst pm = await p.select({\n\t\tmessage: \"Select your preferred package manager\",\n\t\toptions: [\n\t\t\t{ value: \"pnpm\", label: \"pnpm\", hint: \"Default\" },\n\t\t\t{ value: \"npm\", label: \"npm\" },\n\t\t\t{ value: \"yarn\", label: \"yarn\" },\n\t\t\t{ value: \"bun\", label: \"bun\" },\n\t\t],\n\t});\n\n\tif (p.isCancel(pm)) {\n\t\tp.log.warn(\"No package manager selected, defaulting to npm\");\n\t\treturn \"npm\";\n\t}\n\n\treturn pm as PackageManager;\n}\n\n/**\n * Installs the specified packages using the detected package manager\n * @param packages - Array of package names to install\n * @param pm - The package manager to use\n * @param dev - Whether to install as dev dependencies\n * @param force - Whether to force install packages\n */\nexport async function installDependencies(\n\tpackages: string[],\n\tpm: PackageManager,\n\tdev = false,\n\tforce = false,\n): Promise<void> {\n\tconst args = [\n\t\tpm === \"npm\" ? \"install\" : \"add\",\n\t\t...packages,\n\t\tdev ? (pm === \"npm\" || pm === \"pnpm\" ? \"-D\" : \"--dev\") : \"\",\n\t\tforce ? \"--force\" : \"\",\n\t].filter(Boolean);\n\n\tawait execa(pm, args);\n}\n","/**\n * Pauses execution for the specified number of milliseconds.\n * @param ms - The number of milliseconds to sleep\n */\nexport const sleep = async (ms: number): Promise<void> => {\n\tawait new Promise((resolve) => setTimeout(resolve, ms));\n};\n"],"mappings":"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","names":["fs","fs","p","p","shouldInstall"]}
@@ -1,7 +0,0 @@
1
- import {
2
- init
3
- } from "./chunk-JUEM67WU.js";
4
- export {
5
- init
6
- };
7
- //# sourceMappingURL=init-JA2KC6GS.js.map