{"version":3,"file":"setup-vscode.cjs","sources":["../../../src/cli/commands/setup-vscode.ts"],"sourcesContent":["import fs from \"fs/promises\";\nimport path from \"path\";\nimport cjson from \"comment-json\";\nimport { vscodeDir } from \"../consts\";\n\n/**\n * Sets up the VSCode configuration for the project.\n *\n * This function checks if the `.vscode` directory exists and creates it if it does not.\n * It then sets up the `settings.json` and `extensions.json` files with the necessary configuration for Flowbite React.\n */\nexport async function setupVSCode() {\n  try {\n    await fs.access(vscodeDir);\n  } catch {\n    console.log(`Creating ${vscodeDir} directory...`);\n    await fs.mkdir(vscodeDir);\n  }\n\n  await setupVSCodeSettings();\n  await setupVSCodeExtensions();\n}\n\n/**\n * Sets up the VSCode settings for the project.\n *\n * This function checks if the `settings.json` file exists and creates it if it does not.\n * It then sets up the `files.associations`, `tailwindCSS.classAttributes`, and `tailwindCSS.experimental.classRegex` settings.\n */\nasync function setupVSCodeSettings() {\n  try {\n    const vscodeSettingsFilePath = path.join(vscodeDir, \"settings.json\");\n\n    let settings: {\n      \"files.associations\"?: Record<string, string>;\n      \"tailwindCSS.classAttributes\"?: string[];\n      \"tailwindCSS.experimental.classRegex\"?: string[][];\n    } = {};\n\n    let exists = true;\n\n    try {\n      const content = await fs.readFile(vscodeSettingsFilePath, \"utf-8\");\n      settings = cjson.parse(content) as typeof settings;\n    } catch {\n      exists = false;\n    }\n\n    const flowbiteReactSettings = {\n      \"files.associations\": {\n        \"*.css\": \"tailwindcss\",\n      },\n      \"tailwindCSS.classAttributes\": [\"class\", \"className\", \"theme\"],\n      \"tailwindCSS.experimental.classRegex\": [\n        [\"twMerge\\\\(([^)]*)\\\\)\", \"[\\\"'`]([^\\\"'`]*).*?[\\\"'`]\"],\n        [\"createTheme(?:<\\\\w+>)?\\\\s*\\\\(([^)]*)\\\\)\", \"{?\\\\s?[\\\\w].*:\\\\s*?[\\\"'`]([^\\\"'`]*).*?,?\\\\s?}?\"],\n      ],\n    };\n\n    let needsUpdate = false;\n\n    if (settings?.[\"files.associations\"]) {\n      if (!settings[\"files.associations\"][\"*.css\"]) {\n        settings[\"files.associations\"][\"*.css\"] = flowbiteReactSettings[\"files.associations\"][\"*.css\"];\n        needsUpdate = true;\n      }\n    } else {\n      settings[\"files.associations\"] = flowbiteReactSettings[\"files.associations\"];\n      needsUpdate = true;\n    }\n    if (settings?.[\"tailwindCSS.classAttributes\"]) {\n      if (!settings[\"tailwindCSS.classAttributes\"].includes(\"theme\")) {\n        settings[\"tailwindCSS.classAttributes\"].push(\"theme\");\n        needsUpdate = true;\n      }\n    } else {\n      settings[\"tailwindCSS.classAttributes\"] = flowbiteReactSettings[\"tailwindCSS.classAttributes\"];\n      needsUpdate = true;\n    }\n    if (settings?.[\"tailwindCSS.experimental.classRegex\"]) {\n      for (const pattern of flowbiteReactSettings[\"tailwindCSS.experimental.classRegex\"]) {\n        if (\n          !settings[\"tailwindCSS.experimental.classRegex\"].some(\n            (existing: string[]) => JSON.stringify(existing) === JSON.stringify(pattern),\n          )\n        ) {\n          settings[\"tailwindCSS.experimental.classRegex\"].push(pattern);\n          needsUpdate = true;\n        }\n      }\n    } else {\n      settings[\"tailwindCSS.experimental.classRegex\"] = flowbiteReactSettings[\"tailwindCSS.experimental.classRegex\"];\n      needsUpdate = true;\n    }\n\n    if (!needsUpdate) {\n      return;\n    }\n\n    console.log(`${exists ? \"Updating\" : \"Creating\"} ${vscodeSettingsFilePath} with flowbite-react configuration...`);\n    await fs.writeFile(vscodeSettingsFilePath, cjson.stringify(settings, null, 2));\n  } catch (error) {\n    console.error(\"Failed to setup VSCode settings:\", error);\n  }\n}\n\nasync function setupVSCodeExtensions() {\n  try {\n    const vscodeExtensionsFilePath = path.join(vscodeDir, \"extensions.json\");\n\n    let extensions: {\n      recommendations?: string[];\n    } = {};\n\n    let exists = true;\n\n    try {\n      const content = await fs.readFile(vscodeExtensionsFilePath, \"utf-8\");\n      extensions = cjson.parse(content) as typeof extensions;\n    } catch {\n      exists = false;\n    }\n\n    if (extensions?.recommendations?.includes(\"bradlc.vscode-tailwindcss\")) {\n      return;\n    }\n\n    const flowbiteReactExtensions = {\n      recommendations: [\n        \"bradlc.vscode-tailwindcss\",\n        // TODO: only if eslint is installed\n        // \"dbaeumer.vscode-eslint\",\n        // TODO: only if prettier is installed\n        // \"esbenp.prettier-vscode\",\n      ],\n    };\n\n    if (extensions?.recommendations) {\n      for (const recommendation of flowbiteReactExtensions.recommendations) {\n        if (!extensions.recommendations.includes(recommendation)) {\n          extensions.recommendations.push(recommendation);\n        }\n      }\n    } else {\n      extensions.recommendations = flowbiteReactExtensions.recommendations;\n    }\n\n    console.log(`${exists ? \"Updating\" : \"Creating\"} ${vscodeExtensionsFilePath} with flowbite-react configuration...`);\n    await fs.writeFile(vscodeExtensionsFilePath, cjson.stringify(extensions, null, 2));\n  } catch (error) {\n    console.error(\"Failed to setup VSCode extensions:\", error);\n  }\n}\n"],"names":["vscodeDir"],"mappings":"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"}