starwind 1.6.2 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-ZRI4ZUYQ.js → chunk-NN3HLNWX.js} +9 -7
- package/dist/chunk-NN3HLNWX.js.map +1 -0
- package/dist/index.js +28 -26
- package/dist/index.js.map +1 -1
- package/dist/init-VWGSAZG5.js +7 -0
- package/package.json +14 -14
- package/dist/chunk-ZRI4ZUYQ.js.map +0 -1
- package/dist/init-AWXSW7UL.js +0 -7
- /package/dist/{init-AWXSW7UL.js.map → init-VWGSAZG5.js.map} +0 -0
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// src/commands/init.ts
|
|
2
|
-
import path from "
|
|
2
|
+
import path from "path";
|
|
3
|
+
import * as p3 from "@clack/prompts";
|
|
4
|
+
import semver2 from "semver";
|
|
3
5
|
|
|
4
6
|
// src/templates/starwind.css.ts
|
|
5
7
|
var tailwindConfig = `@import "tailwindcss";
|
|
@@ -150,6 +152,11 @@ var tailwindConfig = `@import "tailwindcss";
|
|
|
150
152
|
}
|
|
151
153
|
`;
|
|
152
154
|
|
|
155
|
+
// src/utils/astro-config.ts
|
|
156
|
+
import * as p from "@clack/prompts";
|
|
157
|
+
import fs2 from "fs-extra";
|
|
158
|
+
import semver from "semver";
|
|
159
|
+
|
|
153
160
|
// src/utils/fs.ts
|
|
154
161
|
import fs from "fs-extra";
|
|
155
162
|
async function ensureDirectory(dir) {
|
|
@@ -181,9 +188,6 @@ var highlighter = {
|
|
|
181
188
|
};
|
|
182
189
|
|
|
183
190
|
// src/utils/astro-config.ts
|
|
184
|
-
import * as p from "@clack/prompts";
|
|
185
|
-
import fs2 from "fs-extra";
|
|
186
|
-
import semver from "semver";
|
|
187
191
|
var CONFIG_EXTENSIONS = ["ts", "js", "mjs", "cjs"];
|
|
188
192
|
async function findAstroConfig() {
|
|
189
193
|
for (const ext of CONFIG_EXTENSIONS) {
|
|
@@ -395,8 +399,6 @@ var sleep = async (ms) => {
|
|
|
395
399
|
};
|
|
396
400
|
|
|
397
401
|
// src/commands/init.ts
|
|
398
|
-
import * as p3 from "@clack/prompts";
|
|
399
|
-
import semver2 from "semver";
|
|
400
402
|
async function init(withinAdd = false, options) {
|
|
401
403
|
if (!withinAdd) {
|
|
402
404
|
p3.intro(highlighter.title(" Welcome to the Starwind CLI "));
|
|
@@ -662,4 +664,4 @@ export {
|
|
|
662
664
|
sleep,
|
|
663
665
|
init
|
|
664
666
|
};
|
|
665
|
-
//# sourceMappingURL=chunk-
|
|
667
|
+
//# sourceMappingURL=chunk-NN3HLNWX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/init.ts","../src/templates/starwind.css.ts","../src/utils/astro-config.ts","../src/utils/fs.ts","../src/utils/highlighter.ts","../src/utils/constants.ts","../src/utils/config.ts","../src/utils/package-manager.ts","../src/utils/sleep.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport * as p from \"@clack/prompts\";\nimport semver from \"semver\";\n\nimport { tailwindConfig } from \"@/templates/starwind.css.js\";\nimport { setupAstroConfig } from \"@/utils/astro-config.js\";\nimport { updateConfig } from \"@/utils/config.js\";\nimport { ASTRO_PACKAGES, getOtherPackages, MIN_ASTRO_VERSION, PATHS } from \"@/utils/constants.js\";\nimport { ensureDirectory, fileExists, readJsonFile, writeCssFile } from \"@/utils/fs.js\";\nimport { highlighter } from \"@/utils/highlighter.js\";\nimport {\n getDefaultPackageManager,\n installDependencies,\n requestPackageManager,\n} from \"@/utils/package-manager.js\";\nimport { sleep } from \"@/utils/sleep.js\";\n\nexport async function init(withinAdd: boolean = false, options?: { defaults?: boolean }) {\n if (!withinAdd) {\n p.intro(highlighter.title(\" Welcome to the Starwind CLI \"));\n }\n\n try {\n // Validate project structure\n if (!(await fileExists(\"package.json\"))) {\n throw new Error(\n \"No package.json found. Please run this command in the root of your project.\",\n );\n }\n\n const pkg = await readJsonFile(\"package.json\");\n\n // Check Astro version compatibility\n const installTasks = [];\n const configTasks = [];\n\n // ================================================================\n // Prepare project structure and configuration tasks\n // ================================================================\n let configChoices;\n\n // Use defaults if specified, otherwise prompt user for choices\n if (options?.defaults) {\n configChoices = {\n installLocation: PATHS.LOCAL_COMPONENTS_DIR,\n cssFile: PATHS.LOCAL_CSS_FILE,\n twBaseColor: \"neutral\",\n };\n\n if (!withinAdd) {\n p.log.info(\"Using default configuration values\");\n }\n } else {\n configChoices = await p.group(\n {\n // ask where to install components\n installLocation: () =>\n p.text({\n message: \"What is your components directory?\",\n placeholder: PATHS.LOCAL_COMPONENTS_DIR,\n initialValue: PATHS.LOCAL_COMPONENTS_DIR,\n validate(value) {\n // Check for empty value\n if (value.length === 0) return `Value is required!`;\n\n // Check for absolute paths\n if (path.isAbsolute(value)) return `Please use a relative path`;\n\n // Check for path traversal attempts\n if (value.includes(\"..\")) return `Path traversal is not allowed`;\n\n // Check for invalid characters in path\n const invalidChars = /[<>:\"|?*]/;\n if (invalidChars.test(value)) return `Path contains invalid characters`;\n\n // Check if path starts with system directories\n const systemDirs = [\"windows\", \"program files\", \"system32\"];\n if (systemDirs.some((dir) => value.toLowerCase().startsWith(dir))) {\n return `Cannot install in system directories`;\n }\n },\n }),\n // ask where to add the css file\n cssFile: () =>\n p.text({\n message: `Where would you like to add the Tailwind ${highlighter.info(\".css\")} file?`,\n placeholder: PATHS.LOCAL_CSS_FILE,\n initialValue: PATHS.LOCAL_CSS_FILE,\n validate(value) {\n // Check for empty value\n if (value.length === 0) return `Value is required!`;\n\n // Must end with .css\n if (!value.endsWith(\".css\")) return `File must end with .css extension`;\n\n // Check for absolute paths\n if (path.isAbsolute(value)) return `Please use a relative path`;\n\n // Check for path traversal attempts\n if (value.includes(\"..\")) return `Path traversal is not allowed`;\n\n // Check for invalid characters in path\n const invalidChars = /[<>:\"|?*]/;\n if (invalidChars.test(value)) return `Path contains invalid characters`;\n\n // Check if path starts with system directories\n const systemDirs = [\"windows\", \"program files\", \"system32\"];\n if (systemDirs.some((dir) => value.toLowerCase().startsWith(dir))) {\n return `Cannot use system directories`;\n }\n\n // Ensure the path has a valid filename\n const basename = path.basename(value, \".css\");\n if (!basename || basename.trim().length === 0) {\n return `Invalid filename`;\n }\n },\n }),\n\n twBaseColor: () =>\n p.select({\n message: \"What Tailwind base color would you like to use?\",\n initialValue: \"neutral\",\n options: [\n { label: \"Neutral (default)\", value: \"neutral\" },\n { label: \"Stone\", value: \"stone\" },\n { label: \"Zinc\", value: \"zinc\" },\n { label: \"Gray\", value: \"gray\" },\n { label: \"Slate\", value: \"slate\" },\n ],\n }),\n },\n {\n // On Cancel callback that wraps the group\n // So if the user cancels one of the prompts in the group this function will be called\n onCancel: () => {\n p.cancel(\"Operation cancelled.\");\n process.exit(0);\n },\n },\n );\n }\n\n // ================================================================\n // Make sure appropriate directories exist\n // ================================================================\n const cssFileDir = path.dirname(configChoices.cssFile);\n const componentInstallDir = path.join(configChoices.installLocation, \"starwind\");\n configTasks.push({\n title: \"Creating project structure\",\n task: async () => {\n await ensureDirectory(componentInstallDir);\n await ensureDirectory(cssFileDir);\n await sleep(250);\n return \"Created project structure\";\n },\n });\n\n // ================================================================\n // Prepare Astro config file setup\n // ================================================================\n configTasks.push({\n title: \"Setup Astro config file\",\n task: async () => {\n const success = await setupAstroConfig();\n if (!success) {\n throw new Error(\"Failed to setup Astro config\");\n }\n await sleep(250);\n return \"Astro config setup completed\";\n },\n });\n\n // ================================================================\n // Prepare CSS file\n // ================================================================\n // Check if CSS file already exists\n const cssFileExists = await fileExists(configChoices.cssFile);\n let updatedTailwindConfig = tailwindConfig;\n\n if (configChoices.twBaseColor !== \"neutral\") {\n // replace all \"--color-neutral\" with \"--color-twBaseColor\"\n updatedTailwindConfig = updatedTailwindConfig.replace(\n /--color-neutral-/g,\n `--color-${configChoices.twBaseColor}-`,\n );\n }\n\n if (cssFileExists) {\n const shouldOverride = options?.defaults\n ? true\n : await p.confirm({\n message: `${highlighter.info(configChoices.cssFile)} already exists. Do you want to override it?`,\n });\n\n if (p.isCancel(shouldOverride)) {\n p.cancel(\"Operation cancelled\");\n return process.exit(0);\n }\n\n if (!shouldOverride) {\n p.log.info(\"Skipping Tailwind CSS configuration\");\n } else {\n configTasks.push({\n title: \"Creating Tailwind CSS configuration\",\n task: async () => {\n await writeCssFile(configChoices.cssFile, updatedTailwindConfig);\n await sleep(250);\n return \"Created Tailwind configuration\";\n },\n });\n }\n } else {\n configTasks.push({\n title: \"Creating Tailwind CSS configuration\",\n task: async () => {\n await writeCssFile(configChoices.cssFile, updatedTailwindConfig);\n await sleep(250);\n return \"Created Tailwind configuration\";\n },\n });\n }\n\n // ================================================================\n // Prepare project starwind configuration\n // ================================================================\n configTasks.push({\n title: \"Updating project configuration\",\n task: async () => {\n await updateConfig({\n tailwind: {\n css: configChoices.cssFile,\n baseColor: configChoices.twBaseColor as \"slate\" | \"gray\" | \"zinc\" | \"neutral\" | \"stone\",\n cssVariables: true,\n },\n // aliases: {\n // \tcomponents: \"@/components\",\n // },\n componentDir: configChoices.installLocation,\n components: [],\n });\n await sleep(250);\n return \"Updated project starwind configuration\";\n },\n });\n\n // ================================================================\n // Prepare astro installation\n // ================================================================\n // Request package manager\n const pm = options?.defaults ? await getDefaultPackageManager() : await requestPackageManager();\n\n if (pkg.dependencies?.astro) {\n const astroVersion = pkg.dependencies.astro.replace(/^\\^|~/, \"\");\n if (!semver.gte(astroVersion, MIN_ASTRO_VERSION)) {\n const shouldUpgrade = options?.defaults\n ? true\n : await p.confirm({\n message: `Starwind requires Astro v${MIN_ASTRO_VERSION} or higher. Would you like to upgrade from v${astroVersion}?`,\n initialValue: true,\n });\n\n if (p.isCancel(shouldUpgrade)) {\n p.cancel(\"Operation cancelled\");\n return process.exit(0);\n }\n\n if (!shouldUpgrade) {\n p.cancel(\"Astro v5 or higher is required to use Starwind\");\n return process.exit(1);\n }\n\n installTasks.push({\n title: \"Upgrading Astro\",\n task: async () => {\n await installDependencies([ASTRO_PACKAGES.core], pm);\n return \"Upgraded Astro successfully\";\n },\n });\n }\n } else {\n const shouldInstall = options?.defaults\n ? true\n : await p.confirm({\n message: `Starwind requires Astro v${MIN_ASTRO_VERSION} or higher. Would you like to install it?`,\n initialValue: true,\n });\n\n if (p.isCancel(shouldInstall)) {\n p.cancel(\"Operation cancelled\");\n return process.exit(0);\n }\n\n if (!shouldInstall) {\n p.cancel(\"Astro is required to use Starwind\");\n return process.exit(1);\n }\n\n installTasks.push({\n title: `Installing ${ASTRO_PACKAGES.core}`,\n task: async () => {\n await installDependencies([ASTRO_PACKAGES.core], pm);\n return `Installed ${highlighter.info(ASTRO_PACKAGES.core)} successfully`;\n },\n });\n }\n\n // ================================================================\n // Prepare tailwind and other package installation\n // ================================================================\n const otherPackages = getOtherPackages();\n\n const shouldInstall = options?.defaults\n ? true\n : await p.confirm({\n message: `Install ${highlighter.info(otherPackages.join(\", \"))} using ${highlighter.info(pm)}?`,\n });\n\n if (p.isCancel(shouldInstall)) {\n p.cancel(\"Operation cancelled\");\n return process.exit(0);\n }\n\n if (shouldInstall) {\n installTasks.push({\n title: `Installing packages`,\n task: async () => {\n await installDependencies(getOtherPackages(), pm, false, false);\n return `${highlighter.info(\"Packages installed successfully\")}`;\n },\n });\n } else {\n p.log.warn(\n highlighter.warn(`Skipped installation of packages. Make sure to install them manually`),\n );\n }\n\n // ================================================================\n // Execute all tasks\n // ================================================================\n if (installTasks.length > 0) {\n await p.tasks(installTasks);\n }\n\n if (configTasks.length > 0) {\n await p.tasks(configTasks);\n }\n\n await sleep(250);\n\n p.note(\n `Make sure your layout imports the ${highlighter.infoBright(configChoices.cssFile)} file`,\n \"Next steps\",\n );\n\n if (!withinAdd) {\n sleep(1000);\n p.outro(\"Enjoy using Starwind UI 🚀\");\n }\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : \"Failed to add components\");\n p.cancel(\"Operation cancelled\");\n process.exit(1);\n }\n}\n","export const tailwindConfig = `@import \"tailwindcss\";\n@import \"tw-animate-css\";\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 * as p from \"@clack/prompts\";\nimport fs from \"fs-extra\";\nimport semver from \"semver\";\n\nimport { readJsonFile } from \"@/utils/fs.js\";\nimport { highlighter } from \"@/utils/highlighter.js\";\n\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 for (const ext of CONFIG_EXTENSIONS) {\n const configPath = `astro.config.${ext}`;\n if (await fileExists(configPath)) {\n return configPath;\n }\n }\n return null;\n}\n\n/**\n * Gets the installed Astro version from the project's package.json\n * @returns The installed Astro version or null if not found\n */\nasync function getAstroVersion(): Promise<string | null> {\n try {\n const pkg = await readJsonFile(\"package.json\");\n if (pkg.dependencies?.astro) {\n const astroVersion = pkg.dependencies.astro.replace(/^\\^|~/, \"\");\n return astroVersion;\n }\n\n p.log.error(\n highlighter.error(\n \"Astro seems not installed in your project, please check your package.json\",\n ),\n );\n return null;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"An unknown error occurred\";\n p.log.error(highlighter.error(`Failed to check Astro version: ${errorMessage}`));\n return null;\n }\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 try {\n let configPath = await findAstroConfig();\n let content = \"\";\n\n if (configPath) {\n content = await fs.readFile(configPath, \"utf-8\");\n } else {\n configPath = \"astro.config.ts\";\n content = `import { defineConfig } from \"astro/config\";\\n\\nexport default defineConfig({});\\n`;\n }\n\n // Add tailwindcss import if not present\n if (!content.includes('import tailwindcss from \"@tailwindcss/vite\"')) {\n content = `import tailwindcss from \"@tailwindcss/vite\";\\n${content}`;\n }\n\n // Parse the configuration object\n const configStart = content.indexOf(\"defineConfig(\") + \"defineConfig(\".length;\n const configEnd = content.lastIndexOf(\");\");\n let config = content.slice(configStart, configEnd);\n\n // Remove outer braces and trim\n config = config.trim().replace(/^{|}$/g, \"\").trim();\n\n const astroVersion = await getAstroVersion();\n\n if (astroVersion && semver.lt(astroVersion, \"5.7.0\")) {\n // Add experimental configuration\n if (!config.includes(\"experimental\")) {\n config += `\\n\\texperimental: {\n\t\tsvg: true,\n\t},`;\n } else if (!config.includes(\"svg: true\") && !config.includes(\"svg: {\")) {\n // Insert svg config into existing experimental block\n const expEnd = config.indexOf(\"experimental:\") + \"experimental:\".length;\n const blockStart = config.indexOf(\"{\", expEnd) + 1;\n config = config.slice(0, blockStart) + `\\n\\t\\tsvg: true,` + config.slice(blockStart);\n }\n }\n\n // Add vite configuration\n if (!config.includes(\"vite:\")) {\n config += `\\n\\tvite: {\n\t\tplugins: [tailwindcss()],\n\t},`;\n } else if (!config.includes(\"plugins: [\")) {\n // Insert plugins into existing vite block\n const viteEnd = config.indexOf(\"vite:\") + \"vite:\".length;\n const blockStart = config.indexOf(\"{\", viteEnd) + 1;\n config =\n config.slice(0, blockStart) + `\\n\\t\\tplugins: [tailwindcss()],` + config.slice(blockStart);\n } else if (!config.includes(\"tailwindcss()\")) {\n // Add tailwindcss to existing plugins array\n const pluginsStart = config.indexOf(\"plugins:\") + \"plugins:\".length;\n const arrayStart = config.indexOf(\"[\", pluginsStart) + 1;\n config = config.slice(0, arrayStart) + `tailwindcss(), ` + config.slice(arrayStart);\n }\n\n // Reconstruct the file content\n const newContent = `${content.slice(0, configStart)}{\\n\\t${config}\\n}${content.slice(configEnd)}`;\n\n await fs.writeFile(configPath, newContent, \"utf-8\");\n return true;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"An unknown error occurred\";\n p.log.error(highlighter.error(`Failed to setup Astro config: ${errorMessage}`));\n return false;\n }\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 await 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 await 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 return 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 await 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 return 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 await fs.writeFile(filePath, content, \"utf-8\");\n}\n","import chalk from \"chalk\";\n\nexport const highlighter = {\n error: chalk.red,\n warn: chalk.yellow,\n info: chalk.cyan,\n infoBright: chalk.cyanBright,\n success: chalk.greenBright,\n underline: chalk.underline,\n title: chalk.bgBlue,\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 STARWIND_CORE: \"@starwind-ui/core\",\n STARWIND_CORE_COMPONENTS: \"src/components\",\n STARWIND_REMOTE_COMPONENT_REGISTRY: \"https://starwind.dev/registry.json\",\n LOCAL_CSS_FILE: \"src/styles/starwind.css\",\n LOCAL_CONFIG_FILE: \"starwind.config.json\",\n LOCAL_STYLES_DIR: \"src/styles\",\n LOCAL_COMPONENTS_DIR: \"src/components\",\n} as const;\n\n/**\n * Core framework dependencies\n */\nexport const ASTRO_PACKAGES = {\n core: \"astro@latest\",\n} as const;\n\n/**\n * Tailwind CSS related dependencies\n */\nexport const OTHER_PACKAGES = {\n tailwindCore: \"tailwindcss@latest\",\n tailwindVite: \"@tailwindcss/vite@latest\",\n tailwindForms: \"@tailwindcss/forms@latest\",\n tailwindAnimate: \"tw-animate-css@latest\",\n tailwindVariants: \"tailwind-variants@latest\",\n tablerIcons: \"@tabler/icons@latest\",\n} as const;\n\n/**\n * Get all Tailwind CSS related packages as an array\n */\nexport function getOtherPackages(): string[] {\n return Object.values(OTHER_PACKAGES);\n}\n\n/**\n * Get all Astro related packages as an array\n */\nexport function getAstroPackages(): string[] {\n return Object.values(ASTRO_PACKAGES);\n}\n","import { PATHS } from \"./constants.js\";\nimport { fileExists, readJsonFile, writeJsonFile } from \"./fs.js\";\n\ninterface ComponentConfig {\n name: string;\n version: string;\n}\n\ninterface TailwindConfig {\n css: string;\n baseColor: \"slate\" | \"gray\" | \"zinc\" | \"neutral\" | \"stone\";\n cssVariables: boolean;\n}\n\n// interface AliasConfig {\n// \tcomponents: string;\n// }\n\nexport interface StarwindConfig {\n $schema: string;\n tailwind: TailwindConfig;\n // aliases: AliasConfig;\n componentDir: string;\n components: ComponentConfig[];\n}\n\nconst defaultConfig: StarwindConfig = {\n $schema: \"https://starwind.dev/config-schema.json\",\n tailwind: {\n css: \"src/styles/starwind.css\",\n baseColor: \"neutral\",\n cssVariables: true,\n },\n // aliases: {\n // \tcomponents: \"@/components\",\n // },\n componentDir: \"src/components/starwind\",\n components: [],\n};\n\n/**\n * Get the current config, ensuring the file is fully read\n */\nexport async function getConfig(): Promise<StarwindConfig> {\n try {\n if (await fileExists(PATHS.LOCAL_CONFIG_FILE)) {\n const config = await readJsonFile(PATHS.LOCAL_CONFIG_FILE);\n return {\n ...defaultConfig,\n ...config,\n components: Array.isArray(config.components) ? config.components : [],\n };\n }\n } catch (error) {\n console.error(\"Error reading config:\", error);\n }\n\n return defaultConfig;\n}\n\n/**\n * Options for updating the config file\n */\nexport interface UpdateConfigOptions {\n /** If true, append new components to existing array. If false, replace the components array. */\n appendComponents?: 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 updates: Partial<StarwindConfig>,\n options: UpdateConfigOptions = { appendComponents: true },\n): Promise<void> {\n const currentConfig = await getConfig();\n\n // Ensure components array exists\n const currentComponents = Array.isArray(currentConfig.components) ? currentConfig.components : [];\n\n const newConfig = {\n ...currentConfig,\n tailwind: {\n ...currentConfig.tailwind,\n ...(updates.tailwind || {}),\n },\n componentDir: updates.componentDir ? updates.componentDir : currentConfig.componentDir,\n components: updates.components\n ? options.appendComponents\n ? [...currentComponents, ...updates.components]\n : updates.components\n : currentComponents,\n };\n\n try {\n await writeJsonFile(PATHS.LOCAL_CONFIG_FILE, newConfig);\n } catch (error) {\n throw new Error(\n `Failed to update config: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n}\n","import * as p from \"@clack/prompts\";\nimport { execa } from \"execa\";\n\nimport { fileExists } from \"./fs.js\";\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 const pm = await p.select({\n message: \"Select your preferred package manager\",\n options: [\n { value: \"pnpm\", label: \"pnpm\", hint: \"Default\" },\n { value: \"npm\", label: \"npm\" },\n { value: \"yarn\", label: \"yarn\" },\n { value: \"bun\", label: \"bun\" },\n ],\n });\n\n if (p.isCancel(pm)) {\n p.log.warn(\"No package manager selected, defaulting to npm\");\n return \"npm\";\n }\n\n return pm as PackageManager;\n}\n\n/**\n * Detects and returns the default package manager based on lock files\n * @returns The detected package manager, defaults to npm if no lock file is found\n */\nexport async function getDefaultPackageManager(): Promise<PackageManager> {\n // Check for yarn.lock, pnpm-lock.yaml, package-lock.json in order\n if (await fileExists(\"yarn.lock\")) {\n return \"yarn\";\n } else if (await fileExists(\"pnpm-lock.yaml\")) {\n return \"pnpm\";\n } else {\n return \"npm\";\n }\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 packages: string[],\n pm: PackageManager,\n dev = false,\n force = false,\n): Promise<void> {\n const args = [\n pm === \"npm\" ? \"install\" : \"add\",\n ...packages,\n dev ? (pm === \"npm\" || pm === \"pnpm\" ? \"-D\" : \"--dev\") : \"\",\n force ? \"--force\" : \"\",\n ].filter(Boolean);\n\n await 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 await new Promise((resolve) => setTimeout(resolve, ms));\n};\n"],"mappings":"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","names":["p","semver","fs","fs","p","semver","shouldInstall"]}
|
package/dist/index.js
CHANGED
|
@@ -9,14 +9,17 @@ import {
|
|
|
9
9
|
requestPackageManager,
|
|
10
10
|
sleep,
|
|
11
11
|
updateConfig
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-NN3HLNWX.js";
|
|
13
13
|
|
|
14
14
|
// src/index.ts
|
|
15
15
|
import { Command } from "commander";
|
|
16
16
|
|
|
17
|
+
// src/commands/add.ts
|
|
18
|
+
import * as p2 from "@clack/prompts";
|
|
19
|
+
|
|
17
20
|
// src/utils/component.ts
|
|
18
|
-
import * as path from "
|
|
19
|
-
import { fileURLToPath } from "
|
|
21
|
+
import * as path from "path";
|
|
22
|
+
import { fileURLToPath } from "url";
|
|
20
23
|
import * as p from "@clack/prompts";
|
|
21
24
|
import fs from "fs-extra";
|
|
22
25
|
import semver from "semver";
|
|
@@ -285,8 +288,7 @@ async function isValidComponent(component, availableComponents) {
|
|
|
285
288
|
}
|
|
286
289
|
|
|
287
290
|
// src/commands/add.ts
|
|
288
|
-
|
|
289
|
-
var { init: init2 } = await import("./init-AWXSW7UL.js");
|
|
291
|
+
var { init: init2 } = await import("./init-VWGSAZG5.js");
|
|
290
292
|
async function add(components, options) {
|
|
291
293
|
try {
|
|
292
294
|
p2.intro(highlighter.title(" Welcome to the Starwind CLI "));
|
|
@@ -389,10 +391,10 @@ ${invalid.map((name) => ` ${name}`).join("\n")}`
|
|
|
389
391
|
p2.log.message(`
|
|
390
392
|
|
|
391
393
|
${highlighter.underline("Installation Summary")}`);
|
|
392
|
-
if (results.
|
|
393
|
-
p2.log.
|
|
394
|
-
`${highlighter.
|
|
395
|
-
${results.
|
|
394
|
+
if (results.failed.length > 0) {
|
|
395
|
+
p2.log.error(
|
|
396
|
+
`${highlighter.error("Failed to install components:")}
|
|
397
|
+
${results.failed.map((r) => ` ${r.name} - ${r.error}`).join("\n")}`
|
|
396
398
|
);
|
|
397
399
|
}
|
|
398
400
|
if (results.skipped.length > 0) {
|
|
@@ -401,10 +403,10 @@ ${results.installed.map((r) => ` ${r.name} v${r.version}`).join("\n")}`
|
|
|
401
403
|
${results.skipped.map((r) => ` ${r.name} v${r.version}`).join("\n")}`
|
|
402
404
|
);
|
|
403
405
|
}
|
|
404
|
-
if (results.
|
|
405
|
-
p2.log.
|
|
406
|
-
`${highlighter.
|
|
407
|
-
${results.
|
|
406
|
+
if (results.installed.length > 0) {
|
|
407
|
+
p2.log.success(
|
|
408
|
+
`${highlighter.success("Successfully installed components:")}
|
|
409
|
+
${results.installed.map((r) => ` ${r.name} v${r.version}`).join("\n")}`
|
|
408
410
|
);
|
|
409
411
|
}
|
|
410
412
|
await sleep(1e3);
|
|
@@ -504,18 +506,18 @@ ${invalid.map((name) => ` ${name}`).join("\n")}`
|
|
|
504
506
|
p3.log.message(`
|
|
505
507
|
|
|
506
508
|
${highlighter.underline("Removal Summary")}`);
|
|
507
|
-
if (results.removed.length > 0) {
|
|
508
|
-
p3.log.success(
|
|
509
|
-
`${highlighter.success("Successfully removed components:")}
|
|
510
|
-
${results.removed.map((r) => ` ${r.name}`).join("\n")}`
|
|
511
|
-
);
|
|
512
|
-
}
|
|
513
509
|
if (results.failed.length > 0) {
|
|
514
510
|
p3.log.error(
|
|
515
511
|
`${highlighter.error("Failed to remove components:")}
|
|
516
512
|
${results.failed.map((r) => ` ${r.name} - ${r.error}`).join("\n")}`
|
|
517
513
|
);
|
|
518
514
|
}
|
|
515
|
+
if (results.removed.length > 0) {
|
|
516
|
+
p3.log.success(
|
|
517
|
+
`${highlighter.success("Successfully removed components:")}
|
|
518
|
+
${results.removed.map((r) => ` ${r.name}`).join("\n")}`
|
|
519
|
+
);
|
|
520
|
+
}
|
|
519
521
|
await sleep(1e3);
|
|
520
522
|
if (results.removed.length > 0) {
|
|
521
523
|
p3.outro("Components removed successfully \u{1F5D1}\uFE0F");
|
|
@@ -643,6 +645,12 @@ ${invalid.map((name) => ` ${name}`).join("\n")}`
|
|
|
643
645
|
p4.log.message(`
|
|
644
646
|
|
|
645
647
|
${highlighter.underline("Update Summary")}`);
|
|
648
|
+
if (results.failed.length > 0) {
|
|
649
|
+
p4.log.error(
|
|
650
|
+
`${highlighter.error("Failed to update components:")}
|
|
651
|
+
${results.failed.map((r) => ` ${r.name} - ${r.error}`).join("\n")}`
|
|
652
|
+
);
|
|
653
|
+
}
|
|
646
654
|
if (results.skipped.length > 0) {
|
|
647
655
|
p4.log.info(
|
|
648
656
|
`${highlighter.info("Components already up to date or skipped:")}
|
|
@@ -655,12 +663,6 @@ ${results.skipped.map((r) => ` ${r.name} (${r.oldVersion})`).join("\n")}`
|
|
|
655
663
|
${results.updated.map((r) => ` ${r.name} (${r.oldVersion} \u2192 ${r.newVersion})`).join("\n")}`
|
|
656
664
|
);
|
|
657
665
|
}
|
|
658
|
-
if (results.failed.length > 0) {
|
|
659
|
-
p4.log.error(
|
|
660
|
-
`${highlighter.error("Failed to update components:")}
|
|
661
|
-
${results.failed.map((r) => ` ${r.name} - ${r.error}`).join("\n")}`
|
|
662
|
-
);
|
|
663
|
-
}
|
|
664
666
|
await sleep(1e3);
|
|
665
667
|
if (results.updated.length > 0) {
|
|
666
668
|
p4.outro("Components updated successfully \u{1F680}");
|
|
@@ -678,7 +680,7 @@ ${results.failed.map((r) => ` ${r.name} - ${r.error}`).join("\n")}`
|
|
|
678
680
|
}
|
|
679
681
|
|
|
680
682
|
// src/index.ts
|
|
681
|
-
var program = new Command().name("starwind").description("Add beautifully designed components to your Astro applications").version("1.
|
|
683
|
+
var program = new Command().name("starwind").description("Add beautifully designed components to your Astro applications").version("1.7.1");
|
|
682
684
|
program.command("init").description("Initialize your project with Starwind").option("-d, --defaults", "Use default values for all prompts").action((options) => init(false, { defaults: options.defaults }));
|
|
683
685
|
program.command("add").description("Add Starwind components to your project").argument("[components...]", "The components to add (space separated)").allowExcessArguments().option("-a, --all", "Add all available components").action(add);
|
|
684
686
|
program.command("update").description("Update Starwind components to their latest versions").argument("[components...]", "The components to update (space separated)").allowExcessArguments().option("-a, --all", "Update all installed components").option("-y, --yes", "Skip confirmation prompts").action(update);
|
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(\"1.6.1\");\n\nprogram\n\t.command(\"init\")\n\t.description(\"Initialize your project with Starwind\")\n\t.option(\"-d, --defaults\", \"Use default values for all prompts\")\n\t.action((options) => init(false, { defaults: options.defaults }));\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.option(\"-y, --yes\", \"Skip confirmation prompts\")\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 * as p from \"@clack/prompts\";\nimport fs from \"fs-extra\";\nimport semver from \"semver\";\nimport { getConfig } from \"./config.js\";\nimport { PATHS } from \"./constants.js\";\nimport { highlighter } from \"./highlighter.js\";\nimport { getComponent, getRegistry } from \"./registry.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 * @param skipConfirm - If true, skips the confirmation prompt\n * @returns A result object indicating the update status\n */\nexport async function updateComponent(\n\tname: string,\n\tcurrentVersion: string,\n\tskipConfirm?: boolean,\n): 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, unless skipConfirm is true\n\t\tlet confirmUpdate = true; // Default to true if skipping confirmation\n\t\tif (!skipConfirm) {\n\t\t\t// Only prompt if skipConfirm is false or undefined\n\t\t\tconst confirmedResult = await p.confirm({\n\t\t\t\tmessage: `Update component ${highlighter.info(\n\t\t\t\t\tname,\n\t\t\t\t)} from ${highlighter.warn(`v${currentVersion}`)} to ${highlighter.success(\n\t\t\t\t\t`v${registryComponent.version}`,\n\t\t\t\t)}? This will override the existing implementation.`,\n\t\t\t});\n\n\t\t\t// Check for cancellation immediately\n\t\t\tif (p.isCancel(confirmedResult)) {\n\t\t\t\tp.cancel(\"Update cancelled.\");\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\tstatus: \"skipped\",\n\t\t\t\t\toldVersion: currentVersion,\n\t\t\t\t\tnewVersion: registryComponent.version, // Still useful to return the target version\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// If not cancelled, confirmedResult is boolean. Assign it.\n\t\t\tconfirmUpdate = confirmedResult;\n\t\t}\n\n\t\t// Now confirmUpdate is guaranteed to be boolean, proceed with the check\n\t\tif (!confirmUpdate) {\n\t\t\t// Handle non-confirmation ('No' was selected)\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 as localRegistry } from \"@starwind-ui/core\";\nimport { z } from \"zod\";\nimport { PATHS } from \"./constants.js\";\n\n// Configuration to select registry source\nconst REGISTRY_CONFIG = {\n\t// Set to 'remote' to fetch from remote server or 'local' to use the imported registry\n\tSOURCE: \"local\" as \"remote\" | \"local\",\n};\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\n// Schema for the root registry object\nconst registryRootSchema = z.object({\n\t$schema: z.string().optional(),\n\tcomponents: z.array(componentSchema),\n});\n\n// Cache for registry data - stores the promise of fetching to avoid multiple simultaneous requests\nconst registryCache = new Map<string, Promise<Component[]>>();\n\n/**\n * Fetches the component registry from either the remote server or the local import\n * @param forceRefresh Whether to force a refresh of the cache\n * @returns A promise that resolves to an array of Components\n */\nexport async function getRegistry(forceRefresh = false): Promise<Component[]> {\n\tconst cacheKey =\n\t\tREGISTRY_CONFIG.SOURCE === \"remote\"\n\t\t\t? PATHS.STARWIND_REMOTE_COMPONENT_REGISTRY\n\t\t\t: \"local-registry\";\n\n\t// Return cached promise if available and refresh not forced\n\tif (!forceRefresh && registryCache.has(cacheKey)) {\n\t\treturn registryCache.get(cacheKey)!;\n\t}\n\n\t// Create a new promise for the registry operation based on source\n\tconst registryPromise =\n\t\tREGISTRY_CONFIG.SOURCE === \"remote\"\n\t\t\t? fetchRemoteRegistry()\n\t\t\t: Promise.resolve(getLocalRegistry());\n\n\t// Cache the promise\n\tregistryCache.set(cacheKey, registryPromise);\n\n\treturn registryPromise;\n}\n\n/**\n * Internal function to fetch the registry from the remote server\n */\nasync function fetchRemoteRegistry(): Promise<Component[]> {\n\ttry {\n\t\tconst response = await fetch(PATHS.STARWIND_REMOTE_COMPONENT_REGISTRY);\n\n\t\tif (!response.ok) {\n\t\t\tthrow new Error(`Failed to fetch registry: ${response.status} ${response.statusText}`);\n\t\t}\n\n\t\tconst data = await response.json();\n\t\tconst parsedRegistry = registryRootSchema.parse(data);\n\n\t\treturn parsedRegistry.components;\n\t} catch (error) {\n\t\tconsole.error(\"Failed to load remote registry:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Internal function to get the registry from the local import\n */\nfunction getLocalRegistry(): Component[] {\n\ttry {\n\t\t// Validate the local registry with the schema\n\t\tconst components = localRegistry.map((comp) => componentSchema.parse(comp));\n\t\treturn components;\n\t} catch (error) {\n\t\tconsole.error(\"Failed to validate local registry:\", error);\n\t\tthrow error;\n\t}\n}\n\n/**\n * Clear the registry cache\n */\nexport function clearRegistryCache(): void {\n\tregistryCache.clear();\n}\n\n/**\n * Get a component by name from the registry\n * @param name The name of the component to find\n * @param forceRefresh Whether to force a refresh of the registry cache\n * @returns The component or undefined if not found\n */\nexport async function getComponent(\n\tname: string,\n\tforceRefresh = false,\n): Promise<Component | undefined> {\n\tconst registry = await getRegistry(forceRefresh);\n\treturn registry.find((component) => component.name === name);\n}\n\n/**\n * Get all components from the registry\n * @param forceRefresh Whether to force a refresh of the registry cache\n * @returns All components in the registry\n */\nexport async function getAllComponents(forceRefresh = false): Promise<Component[]> {\n\treturn getRegistry(forceRefresh);\n}\n\n/**\n * Set the registry source\n * @param source The source to use: 'remote' or 'local'\n */\nexport function setRegistrySource(source: \"remote\" | \"local\"): void {\n\tif (REGISTRY_CONFIG.SOURCE !== source) {\n\t\tREGISTRY_CONFIG.SOURCE = source;\n\t\tclearRegistryCache(); // Clear cache when changing sources\n\t}\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 { updateConfig } from \"@/utils/config.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 * 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\t// confirm installation\n\t\t// const 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\t// if (!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 { type RemoveResult, removeComponent } from \"@/utils/component.js\";\nimport { 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\";\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 { type UpdateResult, updateComponent } from \"@/utils/component.js\";\nimport { getConfig } from \"@/utils/config.js\";\nimport { 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\";\n\n// Define the type for options more explicitly\ninterface UpdateOptions {\n\tall?: boolean;\n\tyes?: boolean;\n}\n\nexport async function update(components?: string[], options?: UpdateOptions) {\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\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\t// Pass the 'yes' option down to updateComponent\n\t\t\tconst result = await updateComponent(comp, currentVersion, options?.yes);\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":["confirm","confirm","p","init","p","p"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/add.ts","../src/utils/component.ts","../src/utils/registry.ts","../src/utils/prompts.ts","../src/utils/install.ts","../src/utils/validate.ts","../src/commands/remove.ts","../src/commands/update.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\n\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 .name(\"starwind\")\n .description(\"Add beautifully designed components to your Astro applications\")\n .version(\"1.7.1\");\n\nprogram\n .command(\"init\")\n .description(\"Initialize your project with Starwind\")\n .option(\"-d, --defaults\", \"Use default values for all prompts\")\n .action((options) => init(false, { defaults: options.defaults }));\n\nprogram\n .command(\"add\")\n .description(\"Add Starwind components to your project\")\n .argument(\"[components...]\", \"The components to add (space separated)\")\n .allowExcessArguments()\n .option(\"-a, --all\", \"Add all available components\")\n .action(add);\n\nprogram\n .command(\"update\")\n .description(\"Update Starwind components to their latest versions\")\n .argument(\"[components...]\", \"The components to update (space separated)\")\n .allowExcessArguments()\n .option(\"-a, --all\", \"Update all installed components\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .action(update);\n\nprogram\n .command(\"remove\")\n .description(\"Remove Starwind components from your project\")\n .argument(\"[components...]\", \"The components to remove (space separated)\")\n .allowExcessArguments()\n .option(\"-a, --all\", \"Remove all installed components\")\n .action(remove);\n\nprogram.parse();\n","import * as p from \"@clack/prompts\";\n\nimport type { InstallResult } from \"@/utils/component.js\";\nimport { updateConfig } from \"@/utils/config.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\";\nconst { init } = await import(\"./init.js\");\n\nexport async function add(components?: string[], options?: { all?: boolean }) {\n try {\n p.intro(highlighter.title(\" Welcome to the Starwind CLI \"));\n\n // Check if starwind.config.json exists\n const configExists = await fileExists(PATHS.LOCAL_CONFIG_FILE);\n\n if (!configExists) {\n const shouldInit = await p.confirm({\n message: `Starwind configuration not found. Would you like to run ${highlighter.info(\"starwind init\")} now?`,\n initialValue: true,\n });\n\n if (p.isCancel(shouldInit)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n if (shouldInit) {\n await init(true);\n } else {\n p.log.error(\n `Please initialize starwind with ${highlighter.info(\"starwind init\")} before adding components`,\n );\n process.exit(1);\n }\n }\n\n let componentsToInstall: string[] = [];\n\n // ================================================================\n // Get components to install\n // ================================================================\n if (options?.all) {\n // Get all available components\n const availableComponents = await getAllComponents();\n componentsToInstall = availableComponents.map((c) => c.name);\n p.log.info(`Adding all ${componentsToInstall.length} available components...`);\n } else if (components && components.length > 0) {\n // Get all available components once to avoid multiple registry calls\n const availableComponents = await getAllComponents();\n\n // Filter valid components and collect invalid ones\n const { valid, invalid } = await components.reduce<\n Promise<{ valid: string[]; invalid: string[] }>\n >(\n async (accPromise, component) => {\n const acc = await accPromise;\n const isValid = await isValidComponent(component, availableComponents);\n if (isValid) {\n acc.valid.push(component);\n } else {\n acc.invalid.push(component);\n }\n return acc;\n },\n Promise.resolve({ valid: [], invalid: [] }),\n );\n\n // Warn about invalid components\n if (invalid.length > 0) {\n p.log.warn(\n `${highlighter.warn(\"Invalid components found:\")}\\n${invalid\n .map((name) => ` ${name}`)\n .join(\"\\n\")}`,\n );\n }\n\n // Proceed with valid components\n if (valid.length > 0) {\n componentsToInstall = valid;\n } else {\n p.log.warn(`${highlighter.warn(\"No valid components to install\")}`);\n p.cancel(\"Operation cancelled\");\n return process.exit(0);\n }\n } else {\n // If no components provided, show the interactive prompt\n const selected = await selectComponents();\n if (!selected) {\n p.cancel(\"No components selected\");\n return process.exit(0);\n }\n componentsToInstall = selected;\n }\n\n if (componentsToInstall.length === 0) {\n p.log.warn(`${highlighter.warn(\"No components selected\")}`);\n p.cancel(\"Operation cancelled\");\n return process.exit(0);\n }\n\n // confirm installation\n // const confirmed = await p.confirm({\n // \tmessage: `Install ${componentsToInstall\n // \t\t.map((comp) => highlighter.info(comp))\n // \t\t.join(\", \")} ${componentsToInstall.length > 1 ? \"components\" : \"component\"}?`,\n // });\n\n // if (!confirmed || p.isCancel(confirmed)) {\n // \tp.cancel(\"Operation cancelled\");\n // \treturn process.exit(0);\n // }\n\n const results = {\n installed: [] as InstallResult[],\n skipped: [] as InstallResult[],\n failed: [] as InstallResult[],\n };\n\n // ================================================================\n // Install components\n // ================================================================\n const installedComponents = [];\n for (const comp of componentsToInstall) {\n const result = await installComponent(comp);\n switch (result.status) {\n case \"installed\":\n results.installed.push(result);\n installedComponents.push({ name: result.name, version: result.version! });\n break;\n case \"skipped\":\n results.skipped.push(result);\n break;\n case \"failed\":\n results.failed.push(result);\n break;\n }\n }\n\n // ================================================================\n // Update Config File\n // ================================================================\n if (installedComponents.length > 0) {\n try {\n await updateConfig({ components: installedComponents }, { appendComponents: true });\n } catch (error) {\n p.log.error(\n `Failed to update config: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n process.exit(1);\n }\n }\n\n // ================================================================\n // Installation summary\n // ================================================================\n p.log.message(`\\n\\n${highlighter.underline(\"Installation Summary\")}`);\n\n if (results.failed.length > 0) {\n p.log.error(\n `${highlighter.error(\"Failed to install components:\")}\\n${results.failed\n .map((r) => ` ${r.name} - ${r.error}`)\n .join(\"\\n\")}`,\n );\n }\n\n if (results.skipped.length > 0) {\n p.log.warn(\n `${highlighter.warn(\"Skipped components (already installed):\")}\\n${results.skipped\n .map((r) => ` ${r.name} v${r.version}`)\n .join(\"\\n\")}`,\n );\n }\n\n if (results.installed.length > 0) {\n p.log.success(\n `${highlighter.success(\"Successfully installed components:\")}\\n${results.installed\n .map((r) => ` ${r.name} v${r.version}`)\n .join(\"\\n\")}`,\n );\n }\n\n await sleep(1000);\n\n p.outro(\"Enjoy using Starwind UI 🚀\");\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : \"Failed to add components\");\n p.cancel(\"Operation cancelled\");\n process.exit(1);\n }\n}\n","import * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport * as p from \"@clack/prompts\";\nimport fs from \"fs-extra\";\nimport semver from \"semver\";\n\nimport { getConfig } from \"./config.js\";\nimport { PATHS } from \"./constants.js\";\nimport { highlighter } from \"./highlighter.js\";\nimport { getComponent, getRegistry } from \"./registry.js\";\n\nexport type InstallResult = {\n status: \"installed\" | \"skipped\" | \"failed\";\n name: string;\n version?: string;\n error?: string;\n};\n\nexport interface RemoveResult {\n name: string;\n status: \"removed\" | \"failed\";\n error?: string;\n}\n\nexport interface UpdateResult {\n name: string;\n status: \"updated\" | \"skipped\" | \"failed\";\n oldVersion?: string;\n newVersion?: string;\n error?: 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 const config = await getConfig();\n\n // Ensure components array exists\n const currentComponents = Array.isArray(config.components) ? config.components : [];\n\n // Check if component already exists\n if (!overwrite && currentComponents.some((component) => component.name === name)) {\n const existingComponent = currentComponents.find((c) => c.name === name);\n return {\n status: \"skipped\",\n name,\n version: existingComponent?.version,\n };\n }\n\n const componentDir = path.join(config.componentDir, \"starwind\", name);\n\n try {\n await fs.ensureDir(componentDir);\n\n // Get the path to the installed @starwind/core package\n const pkgUrl = import.meta.resolve?.(PATHS.STARWIND_CORE);\n if (!pkgUrl) {\n throw new Error(`Could not resolve ${PATHS.STARWIND_CORE} package, is it installed?`);\n }\n\n const coreDir = path.dirname(fileURLToPath(pkgUrl));\n const sourceDir = path.join(coreDir, PATHS.STARWIND_CORE_COMPONENTS, name);\n\n const files = await fs.readdir(sourceDir);\n\n for (const file of files) {\n const sourcePath = path.join(sourceDir, file);\n const destPath = path.join(componentDir, file);\n await fs.copy(sourcePath, destPath, { overwrite: true });\n }\n\n // Get component version from registry\n const registry = await getRegistry();\n const componentInfo = registry.find((c) => c.name === name);\n if (!componentInfo) {\n throw new Error(`Component ${name} not found in registry`);\n }\n\n return {\n status: \"installed\",\n name,\n version: componentInfo.version,\n };\n } catch (error) {\n return {\n status: \"failed\",\n name,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\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 try {\n const componentPath = path.join(componentDir, \"starwind\", name);\n\n // Check if component directory exists\n if (await fs.pathExists(componentPath)) {\n // Remove the component directory\n await fs.remove(componentPath);\n return { name, status: \"removed\" };\n } else {\n return {\n name,\n status: \"failed\",\n error: \"Component directory not found\",\n };\n }\n } catch (error) {\n return {\n name,\n status: \"failed\",\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\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 * @param skipConfirm - If true, skips the confirmation prompt\n * @returns A result object indicating the update status\n */\nexport async function updateComponent(\n name: string,\n currentVersion: string,\n skipConfirm?: boolean,\n): Promise<UpdateResult> {\n try {\n // Get latest version from registry\n const registryComponent = await getComponent(name);\n if (!registryComponent) {\n return {\n name,\n status: \"failed\",\n error: \"Component not found in registry\",\n };\n }\n\n // Compare versions\n if (!semver.gt(registryComponent.version, currentVersion)) {\n return {\n name,\n status: \"skipped\",\n oldVersion: currentVersion,\n newVersion: registryComponent.version,\n };\n }\n\n // Confirm the component update with warning about overriding, unless skipConfirm is true\n let confirmUpdate = true; // Default to true if skipping confirmation\n if (!skipConfirm) {\n // Only prompt if skipConfirm is false or undefined\n const confirmedResult = await p.confirm({\n message: `Update component ${highlighter.info(\n name,\n )} from ${highlighter.warn(`v${currentVersion}`)} to ${highlighter.success(\n `v${registryComponent.version}`,\n )}? This will override the existing implementation.`,\n });\n\n // Check for cancellation immediately\n if (p.isCancel(confirmedResult)) {\n p.cancel(\"Update cancelled.\");\n return {\n name,\n status: \"skipped\",\n oldVersion: currentVersion,\n newVersion: registryComponent.version, // Still useful to return the target version\n };\n }\n\n // If not cancelled, confirmedResult is boolean. Assign it.\n confirmUpdate = confirmedResult;\n }\n\n // Now confirmUpdate is guaranteed to be boolean, proceed with the check\n if (!confirmUpdate) {\n // Handle non-confirmation ('No' was selected)\n p.log.info(`Skipping update for ${highlighter.info(name)}`);\n return {\n name,\n status: \"skipped\",\n oldVersion: currentVersion,\n newVersion: registryComponent.version,\n };\n }\n\n // Remove and reinstall component with overwrite enabled\n const result = await copyComponent(name, true);\n\n if (result.status === \"installed\") {\n return {\n name,\n status: \"updated\",\n oldVersion: currentVersion,\n newVersion: result.version,\n };\n } else {\n return {\n name,\n status: \"failed\",\n error: result.error || \"Failed to update component\",\n };\n }\n } catch (error) {\n return {\n name,\n status: \"failed\",\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n","import { registry as localRegistry } from \"@starwind-ui/core\";\nimport { z } from \"zod\";\n\nimport { PATHS } from \"./constants.js\";\n\n// Configuration to select registry source\nconst REGISTRY_CONFIG = {\n // Set to 'remote' to fetch from remote server or 'local' to use the imported registry\n SOURCE: \"local\" as \"remote\" | \"local\",\n};\n\nconst componentSchema = z.object({\n name: z.string(),\n version: z.string(),\n dependencies: z.array(z.string()).default([]),\n type: z.enum([\"component\"]),\n});\n\nexport type Component = z.infer<typeof componentSchema>;\n\n// Schema for the root registry object\nconst registryRootSchema = z.object({\n $schema: z.string().optional(),\n components: z.array(componentSchema),\n});\n\n// Cache for registry data - stores the promise of fetching to avoid multiple simultaneous requests\nconst registryCache = new Map<string, Promise<Component[]>>();\n\n/**\n * Fetches the component registry from either the remote server or the local import\n * @param forceRefresh Whether to force a refresh of the cache\n * @returns A promise that resolves to an array of Components\n */\nexport async function getRegistry(forceRefresh = false): Promise<Component[]> {\n const cacheKey =\n REGISTRY_CONFIG.SOURCE === \"remote\"\n ? PATHS.STARWIND_REMOTE_COMPONENT_REGISTRY\n : \"local-registry\";\n\n // Return cached promise if available and refresh not forced\n if (!forceRefresh && registryCache.has(cacheKey)) {\n return registryCache.get(cacheKey)!;\n }\n\n // Create a new promise for the registry operation based on source\n const registryPromise =\n REGISTRY_CONFIG.SOURCE === \"remote\"\n ? fetchRemoteRegistry()\n : Promise.resolve(getLocalRegistry());\n\n // Cache the promise\n registryCache.set(cacheKey, registryPromise);\n\n return registryPromise;\n}\n\n/**\n * Internal function to fetch the registry from the remote server\n */\nasync function fetchRemoteRegistry(): Promise<Component[]> {\n try {\n const response = await fetch(PATHS.STARWIND_REMOTE_COMPONENT_REGISTRY);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch registry: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n const parsedRegistry = registryRootSchema.parse(data);\n\n return parsedRegistry.components;\n } catch (error) {\n console.error(\"Failed to load remote registry:\", error);\n throw error;\n }\n}\n\n/**\n * Internal function to get the registry from the local import\n */\nfunction getLocalRegistry(): Component[] {\n try {\n // Validate the local registry with the schema\n const components = localRegistry.map((comp) => componentSchema.parse(comp));\n return components;\n } catch (error) {\n console.error(\"Failed to validate local registry:\", error);\n throw error;\n }\n}\n\n/**\n * Clear the registry cache\n */\nexport function clearRegistryCache(): void {\n registryCache.clear();\n}\n\n/**\n * Get a component by name from the registry\n * @param name The name of the component to find\n * @param forceRefresh Whether to force a refresh of the registry cache\n * @returns The component or undefined if not found\n */\nexport async function getComponent(\n name: string,\n forceRefresh = false,\n): Promise<Component | undefined> {\n const registry = await getRegistry(forceRefresh);\n return registry.find((component) => component.name === name);\n}\n\n/**\n * Get all components from the registry\n * @param forceRefresh Whether to force a refresh of the registry cache\n * @returns All components in the registry\n */\nexport async function getAllComponents(forceRefresh = false): Promise<Component[]> {\n return getRegistry(forceRefresh);\n}\n\n/**\n * Set the registry source\n * @param source The source to use: 'remote' or 'local'\n */\nexport function setRegistrySource(source: \"remote\" | \"local\"): void {\n if (REGISTRY_CONFIG.SOURCE !== source) {\n REGISTRY_CONFIG.SOURCE = source;\n clearRegistryCache(); // Clear cache when changing sources\n }\n}\n","import { confirm, multiselect } from \"@clack/prompts\";\n\nimport type { Component } from \"./registry.js\";\nimport { getAllComponents } from \"./registry.js\";\n\nexport async function selectComponents(): Promise<string[]> {\n const components = await getAllComponents();\n\n const selected = await multiselect({\n message: \"Select components to add\",\n options: components.map((component) => ({\n label: component.name,\n value: component.name,\n })),\n required: false,\n });\n\n // Return empty array if user cancels selection\n if (typeof selected === \"symbol\") {\n return [];\n }\n\n return selected;\n}\n\nexport async function confirmInstall(component: Component): Promise<boolean> {\n if (component.dependencies.length === 0) return true;\n\n const confirmed = await confirm({\n message: `This component requires the following dependencies: ${component.dependencies.join(\", \")}. Install them?`,\n });\n\n if (typeof confirmed === \"symbol\") {\n return false;\n }\n\n return confirmed;\n}\n","import { copyComponent, type InstallResult } 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 const component = await getComponent(name);\n\n if (!component) {\n return {\n status: \"failed\",\n name,\n error: \"Component not found in registry\",\n };\n }\n\n // Handle dependencies installation\n if (component.dependencies.length > 0) {\n const confirmed = await confirmInstall(component);\n if (!confirmed) {\n return {\n status: \"failed\",\n name,\n error: \"Installation cancelled by user\",\n };\n }\n\n try {\n const pm = await requestPackageManager();\n await installDependencies(component.dependencies, pm);\n } catch (error) {\n return {\n status: \"failed\",\n name,\n error: `Failed to install dependencies: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n // Copy the component files\n return 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 component: string,\n availableComponents?: Component[],\n): Promise<boolean> {\n const components = availableComponents || (await getAllComponents());\n return 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 const components = await getAllComponents();\n if (!(await isValidComponent(component, components))) {\n const availableComponents = components.map((c) => highlighter.info(c.name));\n throw new Error(\n `Invalid component: ${highlighter.error(component)}.\\nAvailable components:\\n ${availableComponents.join(\"\\n \")}`,\n );\n }\n}\n","import * as p from \"@clack/prompts\";\n\nimport { removeComponent, type RemoveResult } from \"@/utils/component.js\";\nimport { 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\";\n\nexport async function remove(components?: string[], options?: { all?: boolean }) {\n try {\n p.intro(highlighter.title(\" Welcome to the Starwind CLI \"));\n\n // Check if starwind.config.json exists\n const configExists = await fileExists(PATHS.LOCAL_CONFIG_FILE);\n\n if (!configExists) {\n p.log.error(\"No Starwind configuration found. Please run starwind init first.\");\n process.exit(1);\n }\n\n // Get current config and installed components\n const config = await getConfig();\n const installedComponents = config.components;\n\n if (installedComponents.length === 0) {\n p.log.warn(\"No components are currently installed.\");\n process.exit(0);\n }\n\n let componentsToRemove: string[] = [];\n\n // ================================================================\n // Get components to remove\n // ================================================================\n if (options?.all) {\n // Remove all installed components\n componentsToRemove = installedComponents.map((comp) => comp.name);\n p.log.info(`Removing all ${componentsToRemove.length} installed components...`);\n } else if (components && components.length > 0) {\n // Validate that all specified components are installed\n const invalid = components.filter(\n (comp) => !installedComponents.some((ic) => ic.name === comp),\n );\n\n if (invalid.length > 0) {\n p.log.warn(\n `${highlighter.warn(\"Components not found:\")}\\n${invalid\n .map((name) => ` ${name}`)\n .join(\"\\n\")}`,\n );\n }\n\n componentsToRemove = components.filter((comp) =>\n installedComponents.some((ic) => ic.name === comp),\n );\n\n if (componentsToRemove.length === 0) {\n p.log.warn(\"No valid components to remove\");\n process.exit(0);\n }\n } else {\n // Show interactive prompt with installed components\n const choices = installedComponents.map((comp) => ({\n value: comp.name,\n label: comp.name,\n }));\n\n const selected = await p.multiselect({\n message: \"Select components to remove\",\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n componentsToRemove = selected as string[];\n }\n\n if (componentsToRemove.length === 0) {\n p.log.warn(\"No components selected for removal\");\n process.exit(0);\n }\n\n // Confirm removal\n const confirmed = await p.confirm({\n message: `Remove ${componentsToRemove\n .map((comp) => highlighter.info(comp))\n .join(\", \")} ${componentsToRemove.length > 1 ? \"components\" : \"component\"}?`,\n });\n\n if (!confirmed || p.isCancel(confirmed)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n const results = {\n removed: [] as RemoveResult[],\n failed: [] as RemoveResult[],\n };\n\n // ================================================================\n // Remove Components\n // ================================================================\n for (const comp of componentsToRemove) {\n const result = await removeComponent(comp, config.componentDir);\n if (result.status === \"removed\") {\n results.removed.push(result);\n } else {\n results.failed.push(result);\n }\n }\n\n // ================================================================\n // Update Config File\n // ================================================================\n // Update config file by writing the filtered components directly\n const updatedComponents = config.components.filter(\n (comp) => !componentsToRemove.includes(comp.name),\n );\n await updateConfig(\n {\n ...config,\n components: updatedComponents,\n },\n { appendComponents: false },\n );\n\n // ================================================================\n // Removal summary\n // ================================================================\n p.log.message(`\\n\\n${highlighter.underline(\"Removal Summary\")}`);\n\n if (results.failed.length > 0) {\n p.log.error(\n `${highlighter.error(\"Failed to remove components:\")}\\n${results.failed\n .map((r) => ` ${r.name} - ${r.error}`)\n .join(\"\\n\")}`,\n );\n }\n\n if (results.removed.length > 0) {\n p.log.success(\n `${highlighter.success(\"Successfully removed components:\")}\\n${results.removed\n .map((r) => ` ${r.name}`)\n .join(\"\\n\")}`,\n );\n }\n\n await sleep(1000);\n\n if (results.removed.length > 0) {\n p.outro(\"Components removed successfully 🗑️\");\n } else {\n p.cancel(\"Errors occurred while removing components\");\n process.exit(1);\n }\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : \"Failed to remove components\");\n p.cancel(\"Operation cancelled\");\n process.exit(1);\n }\n}\n","import * as p from \"@clack/prompts\";\n\nimport { updateComponent, type UpdateResult } from \"@/utils/component.js\";\nimport { getConfig } from \"@/utils/config.js\";\nimport { 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\";\n\n// Define the type for options more explicitly\ninterface UpdateOptions {\n all?: boolean;\n yes?: boolean;\n}\n\nexport async function update(components?: string[], options?: UpdateOptions) {\n try {\n p.intro(highlighter.title(\" Welcome to the Starwind CLI \"));\n\n // Check if starwind.config.json exists\n const configExists = await fileExists(PATHS.LOCAL_CONFIG_FILE);\n\n if (!configExists) {\n p.log.error(\"No Starwind configuration found. Please run starwind init first.\");\n process.exit(1);\n }\n\n // Get current config and installed components\n const config = await getConfig();\n const installedComponents = config.components;\n\n if (installedComponents.length === 0) {\n p.log.warn(\"No components are currently installed.\");\n process.exit(0);\n }\n\n let componentsToUpdate: string[] = [];\n\n // ================================================================\n // Get components to update\n // ================================================================\n if (options?.all) {\n // Update all installed components\n componentsToUpdate = installedComponents.map((comp) => comp.name);\n p.log.info(`Checking updates for all ${componentsToUpdate.length} installed components...`);\n } else if (components && components.length > 0) {\n // Validate that all specified components are installed\n const invalid = components.filter(\n (comp) => !installedComponents.some((ic) => ic.name === comp),\n );\n\n if (invalid.length > 0) {\n p.log.warn(\n `${highlighter.warn(\"Components not found in project:\")}\\n${invalid\n .map((name) => ` ${name}`)\n .join(\"\\n\")}`,\n );\n }\n\n componentsToUpdate = components.filter((comp) =>\n installedComponents.some((ic) => ic.name === comp),\n );\n\n if (componentsToUpdate.length === 0) {\n p.log.warn(\"No valid components to update\");\n process.exit(0);\n }\n } else {\n // Show interactive prompt with installed components\n const choices = installedComponents.map((comp) => ({\n value: comp.name,\n label: comp.name,\n }));\n\n const selected = await p.multiselect({\n message: \"Select components to update\",\n options: choices,\n });\n\n if (p.isCancel(selected)) {\n p.cancel(\"Operation cancelled\");\n process.exit(0);\n }\n\n componentsToUpdate = selected as string[];\n }\n\n if (componentsToUpdate.length === 0) {\n p.log.warn(\"No components selected for update\");\n process.exit(0);\n }\n\n const results = {\n updated: [] as UpdateResult[],\n skipped: [] as UpdateResult[],\n failed: [] as UpdateResult[],\n };\n\n // ================================================================\n // Update Components\n // ================================================================\n for (const comp of componentsToUpdate) {\n const currentVersion = installedComponents.find((ic) => ic.name === comp)?.version;\n if (!currentVersion) {\n results.failed.push({\n name: comp,\n status: \"failed\",\n error: \"Could not determine current version\",\n });\n continue;\n }\n\n // Pass the 'yes' option down to updateComponent\n const result = await updateComponent(comp, currentVersion, options?.yes);\n switch (result.status) {\n case \"updated\":\n results.updated.push(result);\n break;\n case \"skipped\":\n results.skipped.push(result);\n break;\n case \"failed\":\n results.failed.push(result);\n break;\n }\n }\n\n // ================================================================\n // Update Config File\n // ================================================================\n if (results.updated.length > 0) {\n try {\n // Create a map of current components, excluding updated ones\n const updatedComponentNames = new Set(results.updated.map((r) => r.name));\n const currentComponents = config.components.filter(\n (comp) => !updatedComponentNames.has(comp.name),\n );\n\n // Add the updated components with their new versions\n const updatedComponents = [\n ...currentComponents,\n ...results.updated.map((r) => ({\n name: r.name,\n version: r.newVersion!,\n })),\n ];\n\n await updateConfig(\n {\n components: updatedComponents,\n },\n { appendComponents: false },\n );\n } catch (error) {\n p.log.error(\n `Failed to update config: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n process.exit(1);\n }\n }\n\n // ================================================================\n // Update summary\n // ================================================================\n p.log.message(`\\n\\n${highlighter.underline(\"Update Summary\")}`);\n\n if (results.failed.length > 0) {\n p.log.error(\n `${highlighter.error(\"Failed to update components:\")}\\n${results.failed\n .map((r) => ` ${r.name} - ${r.error}`)\n .join(\"\\n\")}`,\n );\n }\n\n if (results.skipped.length > 0) {\n p.log.info(\n `${highlighter.info(\"Components already up to date or skipped:\")}\\n${results.skipped\n .map((r) => ` ${r.name} (${r.oldVersion})`)\n .join(\"\\n\")}`,\n );\n }\n\n if (results.updated.length > 0) {\n p.log.success(\n `${highlighter.success(\"Successfully updated components:\")}\\n${results.updated\n .map((r) => ` ${r.name} (${r.oldVersion} → ${r.newVersion})`)\n .join(\"\\n\")}`,\n );\n }\n\n await sleep(1000);\n\n if (results.updated.length > 0) {\n p.outro(\"Components updated successfully 🚀\");\n } else if (results.skipped.length > 0 && results.failed.length === 0) {\n p.outro(\"Components already up to date or skipped ✨\");\n } else {\n p.cancel(\"No components were updated\");\n process.exit(1);\n }\n } catch (error) {\n p.log.error(error instanceof Error ? error.message : \"Failed to update components\");\n p.cancel(\"Operation cancelled\");\n process.exit(1);\n }\n}\n"],"mappings":"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","names":["p","confirm","confirm","init","p","p"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "starwind",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.1",
|
|
4
4
|
"description": "Add beautifully designed components to your Astro applications",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": {
|
|
@@ -32,21 +32,21 @@
|
|
|
32
32
|
"dist"
|
|
33
33
|
],
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"@clack/prompts": "
|
|
36
|
-
"@starwind-ui/core": "1.
|
|
37
|
-
"chalk": "
|
|
38
|
-
"commander": "
|
|
39
|
-
"execa": "
|
|
40
|
-
"fs-extra": "
|
|
41
|
-
"semver": "
|
|
42
|
-
"zod": "
|
|
35
|
+
"@clack/prompts": "0.11.0",
|
|
36
|
+
"@starwind-ui/core": "1.7.1",
|
|
37
|
+
"chalk": "5.4.1",
|
|
38
|
+
"commander": "14.0.0",
|
|
39
|
+
"execa": "9.6.0",
|
|
40
|
+
"fs-extra": "11.2.0",
|
|
41
|
+
"semver": "7.7.2",
|
|
42
|
+
"zod": "3.25.74"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@types/fs-extra": "
|
|
46
|
-
"@types/node": "
|
|
47
|
-
"@types/prompts": "
|
|
48
|
-
"@types/semver": "
|
|
49
|
-
"tsup": "
|
|
45
|
+
"@types/fs-extra": "11.0.4",
|
|
46
|
+
"@types/node": "24.0.10",
|
|
47
|
+
"@types/prompts": "2.4.9",
|
|
48
|
+
"@types/semver": "7.5.8",
|
|
49
|
+
"tsup": "8.5.0"
|
|
50
50
|
},
|
|
51
51
|
"engines": {
|
|
52
52
|
"node": "^20.6.0 || >=22.0.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/init.ts","../src/templates/starwind.css.ts","../src/utils/fs.ts","../src/utils/highlighter.ts","../src/utils/astro-config.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 {\n\tgetDefaultPackageManager,\n\tinstallDependencies,\n\trequestPackageManager,\n} 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, options?: { defaults?: boolean }) {\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\tlet configChoices;\n\n\t\t// Use defaults if specified, otherwise prompt user for choices\n\t\tif (options?.defaults) {\n\t\t\tconfigChoices = {\n\t\t\t\tinstallLocation: PATHS.LOCAL_COMPONENTS_DIR,\n\t\t\t\tcssFile: PATHS.LOCAL_CSS_FILE,\n\t\t\t\ttwBaseColor: \"neutral\",\n\t\t\t};\n\n\t\t\tif (!withinAdd) {\n\t\t\t\tp.log.info(\"Using default configuration values\");\n\t\t\t}\n\t\t} else {\n\t\t\tconfigChoices = await p.group(\n\t\t\t\t{\n\t\t\t\t\t// ask where to install components\n\t\t\t\t\tinstallLocation: () =>\n\t\t\t\t\t\tp.text({\n\t\t\t\t\t\t\tmessage: \"What is your components directory?\",\n\t\t\t\t\t\t\tplaceholder: PATHS.LOCAL_COMPONENTS_DIR,\n\t\t\t\t\t\t\tinitialValue: PATHS.LOCAL_COMPONENTS_DIR,\n\t\t\t\t\t\t\tvalidate(value) {\n\t\t\t\t\t\t\t\t// Check for empty value\n\t\t\t\t\t\t\t\tif (value.length === 0) return `Value is required!`;\n\n\t\t\t\t\t\t\t\t// Check for absolute paths\n\t\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\t// Check for path traversal attempts\n\t\t\t\t\t\t\t\tif (value.includes(\"..\")) return `Path traversal is not allowed`;\n\n\t\t\t\t\t\t\t\t// Check for invalid characters in path\n\t\t\t\t\t\t\t\tconst invalidChars = /[<>:\"|?*]/;\n\t\t\t\t\t\t\t\tif (invalidChars.test(value)) return `Path contains invalid characters`;\n\n\t\t\t\t\t\t\t\t// Check if path starts with system directories\n\t\t\t\t\t\t\t\tconst systemDirs = [\"windows\", \"program files\", \"system32\"];\n\t\t\t\t\t\t\t\tif (systemDirs.some((dir) => value.toLowerCase().startsWith(dir))) {\n\t\t\t\t\t\t\t\t\treturn `Cannot install in system directories`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t// ask where to add the css file\n\t\t\t\t\tcssFile: () =>\n\t\t\t\t\t\tp.text({\n\t\t\t\t\t\t\tmessage: `Where would you like to add the Tailwind ${highlighter.info(\".css\")} file?`,\n\t\t\t\t\t\t\tplaceholder: PATHS.LOCAL_CSS_FILE,\n\t\t\t\t\t\t\tinitialValue: PATHS.LOCAL_CSS_FILE,\n\t\t\t\t\t\t\tvalidate(value) {\n\t\t\t\t\t\t\t\t// Check for empty value\n\t\t\t\t\t\t\t\tif (value.length === 0) return `Value is required!`;\n\n\t\t\t\t\t\t\t\t// Must end with .css\n\t\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\t// Check for absolute paths\n\t\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\t// Check for path traversal attempts\n\t\t\t\t\t\t\t\tif (value.includes(\"..\")) return `Path traversal is not allowed`;\n\n\t\t\t\t\t\t\t\t// Check for invalid characters in path\n\t\t\t\t\t\t\t\tconst invalidChars = /[<>:\"|?*]/;\n\t\t\t\t\t\t\t\tif (invalidChars.test(value)) return `Path contains invalid characters`;\n\n\t\t\t\t\t\t\t\t// Check if path starts with system directories\n\t\t\t\t\t\t\t\tconst systemDirs = [\"windows\", \"program files\", \"system32\"];\n\t\t\t\t\t\t\t\tif (systemDirs.some((dir) => value.toLowerCase().startsWith(dir))) {\n\t\t\t\t\t\t\t\t\treturn `Cannot use system directories`;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Ensure the path has a valid filename\n\t\t\t\t\t\t\t\tconst basename = path.basename(value, \".css\");\n\t\t\t\t\t\t\t\tif (!basename || basename.trim().length === 0) {\n\t\t\t\t\t\t\t\t\treturn `Invalid filename`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\n\t\t\t\t\ttwBaseColor: () =>\n\t\t\t\t\t\tp.select({\n\t\t\t\t\t\t\tmessage: \"What Tailwind base color would you like to use?\",\n\t\t\t\t\t\t\tinitialValue: \"neutral\",\n\t\t\t\t\t\t\toptions: [\n\t\t\t\t\t\t\t\t{ label: \"Neutral (default)\", value: \"neutral\" },\n\t\t\t\t\t\t\t\t{ label: \"Stone\", value: \"stone\" },\n\t\t\t\t\t\t\t\t{ label: \"Zinc\", value: \"zinc\" },\n\t\t\t\t\t\t\t\t{ label: \"Gray\", value: \"gray\" },\n\t\t\t\t\t\t\t\t{ label: \"Slate\", value: \"slate\" },\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t// On Cancel callback that wraps the group\n\t\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\t\tonCancel: () => {\n\t\t\t\t\t\tp.cancel(\"Operation cancelled.\");\n\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t},\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 = options?.defaults\n\t\t\t\t? true\n\t\t\t\t: await p.confirm({\n\t\t\t\t\t\tmessage: `${highlighter.info(configChoices.cssFile)} already exists. Do you want to override it?`,\n\t\t\t\t\t});\n\n\t\t\tif (p.isCancel(shouldOverride)) {\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 (!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 = options?.defaults ? await getDefaultPackageManager() : 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 = options?.defaults\n\t\t\t\t\t? true\n\t\t\t\t\t: await p.confirm({\n\t\t\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\t\t\tinitialValue: true,\n\t\t\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 = options?.defaults\n\t\t\t\t? true\n\t\t\t\t: await p.confirm({\n\t\t\t\t\t\tmessage: `Starwind requires Astro v${MIN_ASTRO_VERSION} or higher. Would you like to install it?`,\n\t\t\t\t\t\tinitialValue: true,\n\t\t\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 = options?.defaults\n\t\t\t? true\n\t\t\t: await p.confirm({\n\t\t\t\t\tmessage: `Install ${highlighter.info(otherPackages.join(\", \"))} using ${highlighter.info(pm)}?`,\n\t\t\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@import \"tw-animate-css\";\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 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","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 { readJsonFile } from \"@/utils/fs.js\";\nimport { highlighter } from \"@/utils/highlighter.js\";\nimport * as p from \"@clack/prompts\";\nimport fs from \"fs-extra\";\nimport semver from \"semver\";\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 * Gets the installed Astro version from the project's package.json\n * @returns The installed Astro version or null if not found\n */\nasync function getAstroVersion(): Promise<string | null> {\n\ttry {\n\t\tconst pkg = await readJsonFile(\"package.json\");\n\t\tif (pkg.dependencies?.astro) {\n\t\t\tconst astroVersion = pkg.dependencies.astro.replace(/^\\^|~/, \"\");\n\t\t\treturn astroVersion;\n\t\t}\n\n\t\tp.log.error(\n\t\t\thighlighter.error(\n\t\t\t\t\"Astro seems not installed in your project, please check your package.json\",\n\t\t\t),\n\t\t);\n\t\treturn null;\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 check Astro version: ${errorMessage}`));\n\t\treturn null;\n\t}\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\tconst astroVersion = await getAstroVersion();\n\n\t\tif (astroVersion && semver.lt(astroVersion, \"5.7.0\")) {\n\t\t\t// Add experimental configuration\n\t\t\tif (!config.includes(\"experimental\")) {\n\t\t\t\tconfig += `\\n\\texperimental: {\n\t\tsvg: true,\n\t},`;\n\t\t\t} else if (!config.includes(\"svg: true\") && !config.includes(\"svg: {\")) {\n\t\t\t\t// Insert svg config into existing experimental block\n\t\t\t\tconst expEnd = config.indexOf(\"experimental:\") + \"experimental:\".length;\n\t\t\t\tconst blockStart = config.indexOf(\"{\", expEnd) + 1;\n\t\t\t\tconfig = config.slice(0, blockStart) + `\\n\\t\\tsvg: true,` + config.slice(blockStart);\n\t\t\t}\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","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_REMOTE_COMPONENT_REGISTRY: \"https://starwind.dev/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: \"tw-animate-css@latest\",\n\ttailwindVariants: \"tailwind-variants@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\n// interface AliasConfig {\n// \tcomponents: string;\n// }\n\nexport interface StarwindConfig {\n\t$schema: string;\n\ttailwind: TailwindConfig;\n\t// aliases: AliasConfig;\n\tcomponentDir: string;\n\tcomponents: ComponentConfig[];\n}\n\nconst defaultConfig: StarwindConfig = {\n\t$schema: \"https://starwind.dev/config-schema.json\",\n\ttailwind: {\n\t\tcss: \"src/styles/starwind.css\",\n\t\tbaseColor: \"neutral\",\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\";\nimport { fileExists } from \"./fs.js\";\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 * Detects and returns the default package manager based on lock files\n * @returns The detected package manager, defaults to npm if no lock file is found\n */\nexport async function getDefaultPackageManager(): Promise<PackageManager> {\n\t// Check for yarn.lock, pnpm-lock.yaml, package-lock.json in order\n\tif (await fileExists(\"yarn.lock\")) {\n\t\treturn \"yarn\";\n\t} else if (await fileExists(\"pnpm-lock.yaml\")) {\n\t\treturn \"pnpm\";\n\t} else {\n\t\treturn \"npm\";\n\t}\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":";AAAA,OAAO,UAAU;;;ACAV,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACA9B,OAAO,QAAQ;AAMf,eAAsB,gBAAgB,KAAa;AAClD,QAAM,GAAG,UAAU,GAAG;AACvB;AAgBA,eAAsB,aAAa,UAAkB;AACpD,SAAO,GAAG,SAAS,QAAQ;AAC5B;AAOA,eAAsB,cAAc,UAAkB,MAAe;AACpE,QAAM,GAAG,UAAU,UAAU,MAAM,EAAE,QAAQ,EAAE,CAAC;AACjD;AAOA,eAAsB,WAAW,UAAkB;AAClD,SAAO,GAAG,WAAW,QAAQ;AAC9B;AAOA,eAAsB,aAAa,UAAkB,SAAiB;AACrE,QAAM,GAAG,UAAU,UAAU,SAAS,OAAO;AAC9C;;;ACrDA,OAAO,WAAW;AAEX,IAAM,cAAc;AAAA,EAC1B,OAAO,MAAM;AAAA,EACb,MAAM,MAAM;AAAA,EACZ,MAAM,MAAM;AAAA,EACZ,YAAY,MAAM;AAAA,EAClB,SAAS,MAAM;AAAA,EACf,WAAW,MAAM;AAAA,EACjB,OAAO,MAAM;AACd;;;ACRA,YAAY,OAAO;AACnB,OAAOA,SAAQ;AACf,OAAO,YAAY;AAGnB,IAAM,oBAAoB,CAAC,MAAM,MAAM,OAAO,KAAK;AAOnD,eAAe,kBAA0C;AACxD,aAAW,OAAO,mBAAmB;AACpC,UAAM,aAAa,gBAAgB,GAAG;AACtC,QAAI,MAAM,WAAW,UAAU,GAAG;AACjC,aAAO;AAAA,IACR;AAAA,EACD;AACA,SAAO;AACR;AAMA,eAAe,kBAA0C;AACxD,MAAI;AACH,UAAM,MAAM,MAAM,aAAa,cAAc;AAC7C,QAAI,IAAI,cAAc,OAAO;AAC5B,YAAM,eAAe,IAAI,aAAa,MAAM,QAAQ,SAAS,EAAE;AAC/D,aAAO;AAAA,IACR;AAEA,IAAE,MAAI;AAAA,MACL,YAAY;AAAA,QACX;AAAA,MACD;AAAA,IACD;AACA,WAAO;AAAA,EACR,SAAS,OAAO;AACf,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,IAAE,MAAI,MAAM,YAAY,MAAM,kCAAkC,YAAY,EAAE,CAAC;AAC/E,WAAO;AAAA,EACR;AACD;AAMA,eAAsB,mBAAqC;AAC1D,MAAI;AACH,QAAI,aAAa,MAAM,gBAAgB;AACvC,QAAI,UAAU;AAEd,QAAI,YAAY;AACf,gBAAU,MAAMC,IAAG,SAAS,YAAY,OAAO;AAAA,IAChD,OAAO;AACN,mBAAa;AACb,gBAAU;AAAA;AAAA;AAAA;AAAA,IACX;AAGA,QAAI,CAAC,QAAQ,SAAS,6CAA6C,GAAG;AACrE,gBAAU;AAAA,EAAiD,OAAO;AAAA,IACnE;AAGA,UAAM,cAAc,QAAQ,QAAQ,eAAe,IAAI,gBAAgB;AACvE,UAAM,YAAY,QAAQ,YAAY,IAAI;AAC1C,QAAI,SAAS,QAAQ,MAAM,aAAa,SAAS;AAGjD,aAAS,OAAO,KAAK,EAAE,QAAQ,UAAU,EAAE,EAAE,KAAK;AAElD,UAAM,eAAe,MAAM,gBAAgB;AAE3C,QAAI,gBAAgB,OAAO,GAAG,cAAc,OAAO,GAAG;AAErD,UAAI,CAAC,OAAO,SAAS,cAAc,GAAG;AACrC,kBAAU;AAAA;AAAA;AAAA;AAAA,MAGX,WAAW,CAAC,OAAO,SAAS,WAAW,KAAK,CAAC,OAAO,SAAS,QAAQ,GAAG;AAEvE,cAAM,SAAS,OAAO,QAAQ,eAAe,IAAI,gBAAgB;AACjE,cAAM,aAAa,OAAO,QAAQ,KAAK,MAAM,IAAI;AACjD,iBAAS,OAAO,MAAM,GAAG,UAAU,IAAI;AAAA,gBAAqB,OAAO,MAAM,UAAU;AAAA,MACpF;AAAA,IACD;AAGA,QAAI,CAAC,OAAO,SAAS,OAAO,GAAG;AAC9B,gBAAU;AAAA;AAAA;AAAA;AAAA,IAGX,WAAW,CAAC,OAAO,SAAS,YAAY,GAAG;AAE1C,YAAM,UAAU,OAAO,QAAQ,OAAO,IAAI,QAAQ;AAClD,YAAM,aAAa,OAAO,QAAQ,KAAK,OAAO,IAAI;AAClD,eACC,OAAO,MAAM,GAAG,UAAU,IAAI;AAAA,+BAAoC,OAAO,MAAM,UAAU;AAAA,IAC3F,WAAW,CAAC,OAAO,SAAS,eAAe,GAAG;AAE7C,YAAM,eAAe,OAAO,QAAQ,UAAU,IAAI,WAAW;AAC7D,YAAM,aAAa,OAAO,QAAQ,KAAK,YAAY,IAAI;AACvD,eAAS,OAAO,MAAM,GAAG,UAAU,IAAI,oBAAoB,OAAO,MAAM,UAAU;AAAA,IACnF;AAGA,UAAM,aAAa,GAAG,QAAQ,MAAM,GAAG,WAAW,CAAC;AAAA,GAAQ,MAAM;AAAA,GAAM,QAAQ,MAAM,SAAS,CAAC;AAE/F,UAAMA,IAAG,UAAU,YAAY,YAAY,OAAO;AAClD,WAAO;AAAA,EACR,SAAS,OAAO;AACf,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,IAAE,MAAI,MAAM,YAAY,MAAM,iCAAiC,YAAY,EAAE,CAAC;AAC9E,WAAO;AAAA,EACR;AACD;;;AC1HO,IAAM,oBAAoB;AAK1B,IAAM,QAAQ;AAAA,EACpB,eAAe;AAAA,EACf,0BAA0B;AAAA,EAC1B,oCAAoC;AAAA,EACpC,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,sBAAsB;AACvB;AAKO,IAAM,iBAAiB;AAAA,EAC7B,MAAM;AACP;AAKO,IAAM,iBAAiB;AAAA,EAC7B,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,aAAa;AACd;AAKO,SAAS,mBAA6B;AAC5C,SAAO,OAAO,OAAO,cAAc;AACpC;;;ACbA,IAAM,gBAAgC;AAAA,EACrC,SAAS;AAAA,EACT,UAAU;AAAA,IACT,KAAK;AAAA,IACL,WAAW;AAAA,IACX,cAAc;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAIA,cAAc;AAAA,EACd,YAAY,CAAC;AACd;AAKA,eAAsB,YAAqC;AAC1D,MAAI;AACH,QAAI,MAAM,WAAW,MAAM,iBAAiB,GAAG;AAC9C,YAAM,SAAS,MAAM,aAAa,MAAM,iBAAiB;AACzD,aAAO;AAAA,QACN,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY,MAAM,QAAQ,OAAO,UAAU,IAAI,OAAO,aAAa,CAAC;AAAA,MACrE;AAAA,IACD;AAAA,EACD,SAAS,OAAO;AACf,YAAQ,MAAM,yBAAyB,KAAK;AAAA,EAC7C;AAEA,SAAO;AACR;AAeA,eAAsB,aACrB,SACA,UAA+B,EAAE,kBAAkB,KAAK,GACxC;AAChB,QAAM,gBAAgB,MAAM,UAAU;AAGtC,QAAM,oBAAoB,MAAM,QAAQ,cAAc,UAAU,IAAI,cAAc,aAAa,CAAC;AAEhG,QAAM,YAAY;AAAA,IACjB,GAAG;AAAA,IACH,UAAU;AAAA,MACT,GAAG,cAAc;AAAA,MACjB,GAAI,QAAQ,YAAY,CAAC;AAAA,IAC1B;AAAA,IACA,cAAc,QAAQ,eAAe,QAAQ,eAAe,cAAc;AAAA,IAC1E,YAAY,QAAQ,aACjB,QAAQ,mBACP,CAAC,GAAG,mBAAmB,GAAG,QAAQ,UAAU,IAC5C,QAAQ,aACT;AAAA,EACJ;AAEA,MAAI;AACH,UAAM,cAAc,MAAM,mBAAmB,SAAS;AAAA,EACvD,SAAS,OAAO;AACf,UAAM,IAAI;AAAA,MACT,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,IACrF;AAAA,EACD;AACD;;;ACvGA,YAAYC,QAAO;AACnB,SAAS,aAAa;AAStB,eAAsB,wBAAiD;AACtE,QAAM,KAAK,MAAQ,UAAO;AAAA,IACzB,SAAS;AAAA,IACT,SAAS;AAAA,MACR,EAAE,OAAO,QAAQ,OAAO,QAAQ,MAAM,UAAU;AAAA,MAChD,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,MAC7B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,MAC/B,EAAE,OAAO,OAAO,OAAO,MAAM;AAAA,IAC9B;AAAA,EACD,CAAC;AAED,MAAM,YAAS,EAAE,GAAG;AACnB,IAAE,OAAI,KAAK,gDAAgD;AAC3D,WAAO;AAAA,EACR;AAEA,SAAO;AACR;AAMA,eAAsB,2BAAoD;AAEzE,MAAI,MAAM,WAAW,WAAW,GAAG;AAClC,WAAO;AAAA,EACR,WAAW,MAAM,WAAW,gBAAgB,GAAG;AAC9C,WAAO;AAAA,EACR,OAAO;AACN,WAAO;AAAA,EACR;AACD;AASA,eAAsB,oBACrB,UACA,IACA,MAAM,OACN,QAAQ,OACQ;AAChB,QAAM,OAAO;AAAA,IACZ,OAAO,QAAQ,YAAY;AAAA,IAC3B,GAAG;AAAA,IACH,MAAO,OAAO,SAAS,OAAO,SAAS,OAAO,UAAW;AAAA,IACzD,QAAQ,YAAY;AAAA,EACrB,EAAE,OAAO,OAAO;AAEhB,QAAM,MAAM,IAAI,IAAI;AACrB;;;AC7DO,IAAM,QAAQ,OAAO,OAA8B;AACzD,QAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACvD;;;AROA,YAAYC,QAAO;AACnB,OAAOC,aAAY;AAEnB,eAAsB,KAAK,YAAqB,OAAO,SAAkC;AACxF,MAAI,CAAC,WAAW;AACf,IAAE,SAAM,YAAY,MAAM,+BAA+B,CAAC;AAAA,EAC3D;AAEA,MAAI;AAEH,QAAI,CAAE,MAAM,WAAW,cAAc,GAAI;AACxC,YAAM,IAAI;AAAA,QACT;AAAA,MACD;AAAA,IACD;AAEA,UAAM,MAAM,MAAM,aAAa,cAAc;AAG7C,UAAM,eAAe,CAAC;AACtB,UAAM,cAAc,CAAC;AAKrB,QAAI;AAGJ,QAAI,SAAS,UAAU;AACtB,sBAAgB;AAAA,QACf,iBAAiB,MAAM;AAAA,QACvB,SAAS,MAAM;AAAA,QACf,aAAa;AAAA,MACd;AAEA,UAAI,CAAC,WAAW;AACf,QAAE,OAAI,KAAK,oCAAoC;AAAA,MAChD;AAAA,IACD,OAAO;AACN,sBAAgB,MAAQ;AAAA,QACvB;AAAA;AAAA,UAEC,iBAAiB,MACd,QAAK;AAAA,YACN,SAAS;AAAA,YACT,aAAa,MAAM;AAAA,YACnB,cAAc,MAAM;AAAA,YACpB,SAAS,OAAO;AAEf,kBAAI,MAAM,WAAW,EAAG,QAAO;AAG/B,kBAAI,KAAK,WAAW,KAAK,EAAG,QAAO;AAGnC,kBAAI,MAAM,SAAS,IAAI,EAAG,QAAO;AAGjC,oBAAM,eAAe;AACrB,kBAAI,aAAa,KAAK,KAAK,EAAG,QAAO;AAGrC,oBAAM,aAAa,CAAC,WAAW,iBAAiB,UAAU;AAC1D,kBAAI,WAAW,KAAK,CAAC,QAAQ,MAAM,YAAY,EAAE,WAAW,GAAG,CAAC,GAAG;AAClE,uBAAO;AAAA,cACR;AAAA,YACD;AAAA,UACD,CAAC;AAAA;AAAA,UAEF,SAAS,MACN,QAAK;AAAA,YACN,SAAS,4CAA4C,YAAY,KAAK,MAAM,CAAC;AAAA,YAC7E,aAAa,MAAM;AAAA,YACnB,cAAc,MAAM;AAAA,YACpB,SAAS,OAAO;AAEf,kBAAI,MAAM,WAAW,EAAG,QAAO;AAG/B,kBAAI,CAAC,MAAM,SAAS,MAAM,EAAG,QAAO;AAGpC,kBAAI,KAAK,WAAW,KAAK,EAAG,QAAO;AAGnC,kBAAI,MAAM,SAAS,IAAI,EAAG,QAAO;AAGjC,oBAAM,eAAe;AACrB,kBAAI,aAAa,KAAK,KAAK,EAAG,QAAO;AAGrC,oBAAM,aAAa,CAAC,WAAW,iBAAiB,UAAU;AAC1D,kBAAI,WAAW,KAAK,CAAC,QAAQ,MAAM,YAAY,EAAE,WAAW,GAAG,CAAC,GAAG;AAClE,uBAAO;AAAA,cACR;AAGA,oBAAM,WAAW,KAAK,SAAS,OAAO,MAAM;AAC5C,kBAAI,CAAC,YAAY,SAAS,KAAK,EAAE,WAAW,GAAG;AAC9C,uBAAO;AAAA,cACR;AAAA,YACD;AAAA,UACD,CAAC;AAAA,UAEF,aAAa,MACV,UAAO;AAAA,YACR,SAAS;AAAA,YACT,cAAc;AAAA,YACd,SAAS;AAAA,cACR,EAAE,OAAO,qBAAqB,OAAO,UAAU;AAAA,cAC/C,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,cACjC,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,cAC/B,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,cAC/B,EAAE,OAAO,SAAS,OAAO,QAAQ;AAAA,YAClC;AAAA,UACD,CAAC;AAAA,QACH;AAAA,QACA;AAAA;AAAA;AAAA,UAGC,UAAU,MAAM;AACf,YAAE,UAAO,sBAAsB;AAC/B,oBAAQ,KAAK,CAAC;AAAA,UACf;AAAA,QACD;AAAA,MACD;AAAA,IACD;AAKA,UAAM,aAAa,KAAK,QAAQ,cAAc,OAAO;AACrD,UAAM,sBAAsB,KAAK,KAAK,cAAc,iBAAiB,UAAU;AAC/E,gBAAY,KAAK;AAAA,MAChB,OAAO;AAAA,MACP,MAAM,YAAY;AACjB,cAAM,gBAAgB,mBAAmB;AACzC,cAAM,gBAAgB,UAAU;AAChC,cAAM,MAAM,GAAG;AACf,eAAO;AAAA,MACR;AAAA,IACD,CAAC;AAKD,gBAAY,KAAK;AAAA,MAChB,OAAO;AAAA,MACP,MAAM,YAAY;AACjB,cAAM,UAAU,MAAM,iBAAiB;AACvC,YAAI,CAAC,SAAS;AACb,gBAAM,IAAI,MAAM,8BAA8B;AAAA,QAC/C;AACA,cAAM,MAAM,GAAG;AACf,eAAO;AAAA,MACR;AAAA,IACD,CAAC;AAMD,UAAM,gBAAgB,MAAM,WAAW,cAAc,OAAO;AAC5D,QAAI,wBAAwB;AAE5B,QAAI,cAAc,gBAAgB,WAAW;AAE5C,8BAAwB,sBAAsB;AAAA,QAC7C;AAAA,QACA,WAAW,cAAc,WAAW;AAAA,MACrC;AAAA,IACD;AAEA,QAAI,eAAe;AAClB,YAAM,iBAAiB,SAAS,WAC7B,OACA,MAAQ,WAAQ;AAAA,QAChB,SAAS,GAAG,YAAY,KAAK,cAAc,OAAO,CAAC;AAAA,MACpD,CAAC;AAEH,UAAM,YAAS,cAAc,GAAG;AAC/B,QAAE,UAAO,qBAAqB;AAC9B,eAAO,QAAQ,KAAK,CAAC;AAAA,MACtB;AAEA,UAAI,CAAC,gBAAgB;AACpB,QAAE,OAAI,KAAK,qCAAqC;AAAA,MACjD,OAAO;AACN,oBAAY,KAAK;AAAA,UAChB,OAAO;AAAA,UACP,MAAM,YAAY;AACjB,kBAAM,aAAa,cAAc,SAAS,qBAAqB;AAC/D,kBAAM,MAAM,GAAG;AACf,mBAAO;AAAA,UACR;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD,OAAO;AACN,kBAAY,KAAK;AAAA,QAChB,OAAO;AAAA,QACP,MAAM,YAAY;AACjB,gBAAM,aAAa,cAAc,SAAS,qBAAqB;AAC/D,gBAAM,MAAM,GAAG;AACf,iBAAO;AAAA,QACR;AAAA,MACD,CAAC;AAAA,IACF;AAKA,gBAAY,KAAK;AAAA,MAChB,OAAO;AAAA,MACP,MAAM,YAAY;AACjB,cAAM,aAAa;AAAA,UAClB,UAAU;AAAA,YACT,KAAK,cAAc;AAAA,YACnB,WAAW,cAAc;AAAA,YACzB,cAAc;AAAA,UACf;AAAA;AAAA;AAAA;AAAA,UAIA,cAAc,cAAc;AAAA,UAC5B,YAAY,CAAC;AAAA,QACd,CAAC;AACD,cAAM,MAAM,GAAG;AACf,eAAO;AAAA,MACR;AAAA,IACD,CAAC;AAMD,UAAM,KAAK,SAAS,WAAW,MAAM,yBAAyB,IAAI,MAAM,sBAAsB;AAE9F,QAAI,IAAI,cAAc,OAAO;AAC5B,YAAM,eAAe,IAAI,aAAa,MAAM,QAAQ,SAAS,EAAE;AAC/D,UAAI,CAACA,QAAO,IAAI,cAAc,iBAAiB,GAAG;AACjD,cAAM,gBAAgB,SAAS,WAC5B,OACA,MAAQ,WAAQ;AAAA,UAChB,SAAS,4BAA4B,iBAAiB,+CAA+C,YAAY;AAAA,UACjH,cAAc;AAAA,QACf,CAAC;AAEH,YAAM,YAAS,aAAa,GAAG;AAC9B,UAAE,UAAO,qBAAqB;AAC9B,iBAAO,QAAQ,KAAK,CAAC;AAAA,QACtB;AAEA,YAAI,CAAC,eAAe;AACnB,UAAE,UAAO,gDAAgD;AACzD,iBAAO,QAAQ,KAAK,CAAC;AAAA,QACtB;AAEA,qBAAa,KAAK;AAAA,UACjB,OAAO;AAAA,UACP,MAAM,YAAY;AACjB,kBAAM,oBAAoB,CAAC,eAAe,IAAI,GAAG,EAAE;AACnD,mBAAO;AAAA,UACR;AAAA,QACD,CAAC;AAAA,MACF;AAAA,IACD,OAAO;AACN,YAAMC,iBAAgB,SAAS,WAC5B,OACA,MAAQ,WAAQ;AAAA,QAChB,SAAS,4BAA4B,iBAAiB;AAAA,QACtD,cAAc;AAAA,MACf,CAAC;AAEH,UAAM,YAASA,cAAa,GAAG;AAC9B,QAAE,UAAO,qBAAqB;AAC9B,eAAO,QAAQ,KAAK,CAAC;AAAA,MACtB;AAEA,UAAI,CAACA,gBAAe;AACnB,QAAE,UAAO,mCAAmC;AAC5C,eAAO,QAAQ,KAAK,CAAC;AAAA,MACtB;AAEA,mBAAa,KAAK;AAAA,QACjB,OAAO,cAAc,eAAe,IAAI;AAAA,QACxC,MAAM,YAAY;AACjB,gBAAM,oBAAoB,CAAC,eAAe,IAAI,GAAG,EAAE;AACnD,iBAAO,aAAa,YAAY,KAAK,eAAe,IAAI,CAAC;AAAA,QAC1D;AAAA,MACD,CAAC;AAAA,IACF;AAKA,UAAM,gBAAgB,iBAAiB;AAEvC,UAAM,gBAAgB,SAAS,WAC5B,OACA,MAAQ,WAAQ;AAAA,MAChB,SAAS,WAAW,YAAY,KAAK,cAAc,KAAK,IAAI,CAAC,CAAC,UAAU,YAAY,KAAK,EAAE,CAAC;AAAA,IAC7F,CAAC;AAEH,QAAM,YAAS,aAAa,GAAG;AAC9B,MAAE,UAAO,qBAAqB;AAC9B,aAAO,QAAQ,KAAK,CAAC;AAAA,IACtB;AAEA,QAAI,eAAe;AAClB,mBAAa,KAAK;AAAA,QACjB,OAAO;AAAA,QACP,MAAM,YAAY;AACjB,gBAAM,oBAAoB,iBAAiB,GAAG,IAAI,OAAO,KAAK;AAC9D,iBAAO,GAAG,YAAY,KAAK,iCAAiC,CAAC;AAAA,QAC9D;AAAA,MACD,CAAC;AAAA,IACF,OAAO;AACN,MAAE,OAAI;AAAA,QACL,YAAY,KAAK,sEAAsE;AAAA,MACxF;AAAA,IACD;AAKA,QAAI,aAAa,SAAS,GAAG;AAC5B,YAAQ,SAAM,YAAY;AAAA,IAC3B;AAEA,QAAI,YAAY,SAAS,GAAG;AAC3B,YAAQ,SAAM,WAAW;AAAA,IAC1B;AAEA,UAAM,MAAM,GAAG;AAEf,IAAE;AAAA,MACD,qCAAqC,YAAY,WAAW,cAAc,OAAO,CAAC;AAAA,MAClF;AAAA,IACD;AAEA,QAAI,CAAC,WAAW;AACf,YAAM,GAAI;AACV,MAAE,SAAM,mCAA4B;AAAA,IACrC;AAAA,EACD,SAAS,OAAO;AACf,IAAE,OAAI,MAAM,iBAAiB,QAAQ,MAAM,UAAU,0BAA0B;AAC/E,IAAE,UAAO,qBAAqB;AAC9B,YAAQ,KAAK,CAAC;AAAA,EACf;AACD;","names":["fs","fs","p","p","semver","shouldInstall"]}
|
package/dist/init-AWXSW7UL.js
DELETED
|
File without changes
|