strapi2front 0.3.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,9 +3,9 @@ import { Command } from 'commander';
3
3
  import pc4 from 'picocolors';
4
4
  import * as p from '@clack/prompts';
5
5
  import fs4 from 'fs/promises';
6
- import path5 from 'path';
6
+ import path6 from 'path';
7
7
  import { spawn, execSync } from 'child_process';
8
- import fs5 from 'fs';
8
+ import fs6 from 'fs';
9
9
  import { loadConfig, detectStrapiVersion, fetchSchema, parseSchema } from '@strapi2front/core';
10
10
  import { generateByFeature, generateTypes, generateClient, generateLocales, generateServices, generateActions } from '@strapi2front/generators';
11
11
 
@@ -24,7 +24,7 @@ var FRAMEWORK_DETECTORS = {
24
24
  }
25
25
  };
26
26
  async function detectFramework(cwd = process.cwd()) {
27
- const pkgPath = path5.join(cwd, "package.json");
27
+ const pkgPath = path6.join(cwd, "package.json");
28
28
  try {
29
29
  const pkgContent = await fs4.readFile(pkgPath, "utf-8");
30
30
  const pkg = JSON.parse(pkgContent);
@@ -32,7 +32,7 @@ async function detectFramework(cwd = process.cwd()) {
32
32
  for (const [pkgName, detector] of Object.entries(FRAMEWORK_DETECTORS)) {
33
33
  if (deps[pkgName]) {
34
34
  for (const configFile of detector.configFiles) {
35
- const configPath = path5.join(cwd, configFile);
35
+ const configPath = path6.join(cwd, configFile);
36
36
  try {
37
37
  await fs4.access(configPath);
38
38
  return {
@@ -70,10 +70,10 @@ function getFrameworkDisplayName(framework) {
70
70
  var TS_CONFIG_FILES = ["tsconfig.json", "tsconfig.app.json"];
71
71
  async function detectTypeScript(cwd = process.cwd()) {
72
72
  for (const configFile of TS_CONFIG_FILES) {
73
- const configPath = path5.join(cwd, configFile);
73
+ const configPath = path6.join(cwd, configFile);
74
74
  try {
75
75
  await fs4.access(configPath);
76
- const pkgPath = path5.join(cwd, "package.json");
76
+ const pkgPath = path6.join(cwd, "package.json");
77
77
  try {
78
78
  const pkgContent = await fs4.readFile(pkgPath, "utf-8");
79
79
  const pkg = JSON.parse(pkgContent);
@@ -107,7 +107,7 @@ var LOCK_FILES = {
107
107
  };
108
108
  async function detectPackageManager(cwd = process.cwd()) {
109
109
  for (const [lockFile, pm] of Object.entries(LOCK_FILES)) {
110
- const lockPath = path5.join(cwd, lockFile);
110
+ const lockPath = path6.join(cwd, lockFile);
111
111
  try {
112
112
  await fs4.access(lockPath);
113
113
  return {
@@ -360,14 +360,14 @@ async function initCommand(_options) {
360
360
  generateActions: answers.generateActions,
361
361
  generateServices: answers.generateServices
362
362
  });
363
- const configPath = path5.join(cwd, `strapi.config.${configExtension}`);
363
+ const configPath = path6.join(cwd, `strapi.config.${configExtension}`);
364
364
  await fs4.writeFile(configPath, configContent, "utf-8");
365
- const envPath = path5.join(cwd, ".env");
365
+ const envPath = path6.join(cwd, ".env");
366
366
  await appendToEnvFile(envPath, {
367
367
  STRAPI_URL: answers.strapiUrl,
368
368
  STRAPI_TOKEN: answers.strapiToken
369
369
  });
370
- const outputPath = path5.join(cwd, answers.outputDir);
370
+ const outputPath = path6.join(cwd, answers.outputDir);
371
371
  await fs4.mkdir(outputPath, { recursive: true });
372
372
  s.stop("Configuration files created");
373
373
  const installDeps = await p.confirm({
@@ -519,6 +519,36 @@ async function appendToEnvFile(envPath, variables) {
519
519
  await fs4.writeFile(envPath, newContent, "utf-8");
520
520
  }
521
521
  }
522
+ async function detectModuleType(cwd = process.cwd()) {
523
+ try {
524
+ const packageJsonPath = path6.join(cwd, "package.json");
525
+ const content = await fs4.readFile(packageJsonPath, "utf-8");
526
+ const packageJson = JSON.parse(content);
527
+ if (packageJson.type === "module") {
528
+ return { type: "esm", reason: 'package.json has "type": "module"' };
529
+ }
530
+ if (packageJson.type === "commonjs") {
531
+ return { type: "commonjs", reason: 'package.json has "type": "commonjs"' };
532
+ }
533
+ } catch {
534
+ }
535
+ const esmIndicators = [
536
+ "next.config.mjs",
537
+ "nuxt.config.mjs",
538
+ "vite.config.mjs",
539
+ "astro.config.mjs"
540
+ ];
541
+ for (const file of esmIndicators) {
542
+ try {
543
+ await fs4.access(path6.join(cwd, file));
544
+ return { type: "esm", reason: `Found ${file} (ESM config file)` };
545
+ } catch {
546
+ }
547
+ }
548
+ return { type: "commonjs", reason: "Default (no ESM indicators found)" };
549
+ }
550
+
551
+ // src/commands/sync.ts
522
552
  var BLOCKS_RENDERER_PACKAGE = "@strapi/blocks-react-renderer";
523
553
  function schemaHasBlocks(schema) {
524
554
  const fieldsFound = [];
@@ -542,9 +572,9 @@ function schemaHasBlocks(schema) {
542
572
  }
543
573
  function isPackageInstalled(packageName, cwd) {
544
574
  try {
545
- const packageJsonPath = path5.join(cwd, "package.json");
546
- if (!fs5.existsSync(packageJsonPath)) return false;
547
- const packageJson = JSON.parse(fs5.readFileSync(packageJsonPath, "utf-8"));
575
+ const packageJsonPath = path6.join(cwd, "package.json");
576
+ if (!fs6.existsSync(packageJsonPath)) return false;
577
+ const packageJson = JSON.parse(fs6.readFileSync(packageJsonPath, "utf-8"));
548
578
  const deps = {
549
579
  ...packageJson.dependencies,
550
580
  ...packageJson.devDependencies
@@ -555,9 +585,9 @@ function isPackageInstalled(packageName, cwd) {
555
585
  }
556
586
  }
557
587
  function detectPackageManager2(cwd) {
558
- if (fs5.existsSync(path5.join(cwd, "bun.lockb"))) return "bun";
559
- if (fs5.existsSync(path5.join(cwd, "pnpm-lock.yaml"))) return "pnpm";
560
- if (fs5.existsSync(path5.join(cwd, "yarn.lock"))) return "yarn";
588
+ if (fs6.existsSync(path6.join(cwd, "bun.lockb"))) return "bun";
589
+ if (fs6.existsSync(path6.join(cwd, "pnpm-lock.yaml"))) return "pnpm";
590
+ if (fs6.existsSync(path6.join(cwd, "yarn.lock"))) return "yarn";
561
591
  return "npm";
562
592
  }
563
593
  function installPackage(packageName, cwd) {
@@ -575,22 +605,22 @@ function getOrphanedFolders(outputPath, currentStructure) {
575
605
  if (currentStructure === "by-feature") {
576
606
  const byLayerFolders = ["types", "services", "actions"];
577
607
  for (const folder of byLayerFolders) {
578
- const folderPath = path5.join(outputPath, folder);
579
- if (fs5.existsSync(folderPath)) {
608
+ const folderPath = path6.join(outputPath, folder);
609
+ if (fs6.existsSync(folderPath)) {
580
610
  orphanedFolders.push(folder);
581
611
  }
582
612
  }
583
- if (fs5.existsSync(path5.join(outputPath, "client.ts"))) {
613
+ if (fs6.existsSync(path6.join(outputPath, "client.ts"))) {
584
614
  orphanedFolders.push("client.ts");
585
615
  }
586
- if (fs5.existsSync(path5.join(outputPath, "locales.ts"))) {
616
+ if (fs6.existsSync(path6.join(outputPath, "locales.ts"))) {
587
617
  orphanedFolders.push("locales.ts");
588
618
  }
589
619
  } else {
590
620
  const byFeatureFolders = ["collections", "singles", "shared", "components"];
591
621
  for (const folder of byFeatureFolders) {
592
- const folderPath = path5.join(outputPath, folder);
593
- if (fs5.existsSync(folderPath)) {
622
+ const folderPath = path6.join(outputPath, folder);
623
+ if (fs6.existsSync(folderPath)) {
594
624
  orphanedFolders.push(folder);
595
625
  }
596
626
  }
@@ -599,13 +629,13 @@ function getOrphanedFolders(outputPath, currentStructure) {
599
629
  }
600
630
  function cleanOrphanedFiles(outputPath, orphanedItems) {
601
631
  for (const item of orphanedItems) {
602
- const itemPath = path5.join(outputPath, item);
603
- if (fs5.existsSync(itemPath)) {
604
- const stat = fs5.statSync(itemPath);
632
+ const itemPath = path6.join(outputPath, item);
633
+ if (fs6.existsSync(itemPath)) {
634
+ const stat = fs6.statSync(itemPath);
605
635
  if (stat.isDirectory()) {
606
- fs5.rmSync(itemPath, { recursive: true, force: true });
636
+ fs6.rmSync(itemPath, { recursive: true, force: true });
607
637
  } else {
608
- fs5.unlinkSync(itemPath);
638
+ fs6.unlinkSync(itemPath);
609
639
  }
610
640
  }
611
641
  }
@@ -672,12 +702,12 @@ async function syncCommand(options) {
672
702
  p.log.info(pc4.dim(`Skipping ${BLOCKS_RENDERER_PACKAGE}. BlocksContent will be typed as unknown[]`));
673
703
  }
674
704
  }
675
- const outputPath = path5.join(cwd, config.output.path);
705
+ const outputPath = path6.join(cwd, config.output.path);
676
706
  const generatedFiles = [];
677
707
  const generateAll = !options.typesOnly && !options.servicesOnly && !options.actionsOnly;
678
708
  const isByFeature = config.output.structure === "by-feature";
679
709
  const currentStructure = isByFeature ? "by-feature" : "by-layer";
680
- if (fs5.existsSync(outputPath)) {
710
+ if (fs6.existsSync(outputPath)) {
681
711
  const orphanedFolders = getOrphanedFolders(outputPath, currentStructure);
682
712
  if (orphanedFolders.length > 0) {
683
713
  const otherStructure = isByFeature ? "by-layer" : "by-feature";
@@ -707,6 +737,17 @@ async function syncCommand(options) {
707
737
  }
708
738
  }
709
739
  const outputFormat = config.outputFormat || "typescript";
740
+ let moduleType = "commonjs";
741
+ if (outputFormat === "jsdoc") {
742
+ if (config.moduleType) {
743
+ moduleType = config.moduleType;
744
+ p.log.info(`Module type: ${pc4.cyan(moduleType)} (from config)`);
745
+ } else {
746
+ const detected = await detectModuleType(cwd);
747
+ moduleType = detected.type;
748
+ p.log.info(`Module type: ${pc4.cyan(moduleType)} (${detected.reason})`);
749
+ }
750
+ }
710
751
  if (isByFeature) {
711
752
  s.start(`Generating files (by-feature, ${outputFormat})...`);
712
753
  const files = await generateByFeature(schema, rawSchema.locales, {
@@ -719,7 +760,8 @@ async function syncCommand(options) {
719
760
  blocksRendererInstalled,
720
761
  strapiVersion: config.strapiVersion,
721
762
  apiPrefix: config.apiPrefix,
722
- outputFormat
763
+ outputFormat,
764
+ moduleType
723
765
  });
724
766
  generatedFiles.push(...files);
725
767
  s.stop(`Generated ${files.length} files`);
@@ -727,7 +769,7 @@ async function syncCommand(options) {
727
769
  if (generateAll || options.typesOnly) {
728
770
  if (config.features.types) {
729
771
  s.start(`Generating types (${outputFormat})...`);
730
- const typesPath = path5.join(outputPath, config.output.types);
772
+ const typesPath = path6.join(outputPath, config.output.types);
731
773
  const files = await generateTypes(schema, {
732
774
  outputDir: typesPath,
733
775
  blocksRendererInstalled,
@@ -757,8 +799,8 @@ async function syncCommand(options) {
757
799
  if (generateAll || options.servicesOnly) {
758
800
  if (config.features.services) {
759
801
  s.start(`Generating services (${outputFormat})...`);
760
- const servicesPath = path5.join(outputPath, config.output.services);
761
- const typesImportPath = path5.relative(servicesPath, path5.join(outputPath, config.output.types)).replace(/\\/g, "/") || ".";
802
+ const servicesPath = path6.join(outputPath, config.output.services);
803
+ const typesImportPath = path6.relative(servicesPath, path6.join(outputPath, config.output.types)).replace(/\\/g, "/") || ".";
762
804
  const files = await generateServices(schema, {
763
805
  outputDir: servicesPath,
764
806
  typesImportPath: typesImportPath.startsWith(".") ? typesImportPath : "./" + typesImportPath,
@@ -772,9 +814,9 @@ async function syncCommand(options) {
772
814
  if ((generateAll || options.actionsOnly) && outputFormat === "typescript") {
773
815
  if (config.features.actions) {
774
816
  s.start("Generating Astro actions...");
775
- const actionsPath = path5.join(outputPath, config.output.actions);
776
- const servicesPath = path5.join(outputPath, config.output.services);
777
- const servicesImportPath = path5.relative(actionsPath, servicesPath).replace(/\\/g, "/") || ".";
817
+ const actionsPath = path6.join(outputPath, config.output.actions);
818
+ const servicesPath = path6.join(outputPath, config.output.services);
819
+ const servicesImportPath = path6.relative(actionsPath, servicesPath).replace(/\\/g, "/") || ".";
778
820
  const files = await generateActions(schema, {
779
821
  outputDir: actionsPath,
780
822
  servicesImportPath: servicesImportPath.startsWith(".") ? servicesImportPath : "./" + servicesImportPath,
@@ -790,7 +832,7 @@ async function syncCommand(options) {
790
832
  `Generated ${generatedFiles.length} files in ${pc4.cyan(config.output.path)}`,
791
833
  "",
792
834
  "Files generated:",
793
- ...generatedFiles.slice(0, 10).map((f) => ` ${pc4.dim(path5.relative(cwd, f))}`),
835
+ ...generatedFiles.slice(0, 10).map((f) => ` ${pc4.dim(path6.relative(cwd, f))}`),
794
836
  generatedFiles.length > 10 ? ` ${pc4.dim(`... and ${generatedFiles.length - 10} more`)}` : ""
795
837
  ].filter(Boolean).join("\n"),
796
838
  "Sync complete!"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/detectors/framework.ts","../../src/lib/detectors/typescript.ts","../../src/lib/detectors/package-manager.ts","../../src/lib/prompts/init.prompts.ts","../../src/lib/utils/logger.ts","../../src/commands/init.ts","../../src/commands/sync.ts","../../src/bin/strapi2front.ts"],"names":["path","fs","commands","pc","args","p2","detectPackageManager","p3"],"mappings":"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","file":"strapi2front.js","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type Framework = \"astro\" | \"nextjs\" | \"nuxt\" | \"unknown\";\n\nexport interface FrameworkInfo {\n name: Framework;\n version: string | null;\n configFile: string | null;\n}\n\nconst FRAMEWORK_DETECTORS: Record<\n string,\n { name: Framework; configFiles: string[] }\n> = {\n astro: {\n name: \"astro\",\n configFiles: [\"astro.config.mjs\", \"astro.config.ts\", \"astro.config.js\"],\n },\n next: {\n name: \"nextjs\",\n configFiles: [\"next.config.mjs\", \"next.config.ts\", \"next.config.js\"],\n },\n nuxt: {\n name: \"nuxt\",\n configFiles: [\"nuxt.config.ts\", \"nuxt.config.js\"],\n },\n};\n\nexport async function detectFramework(cwd: string = process.cwd()): Promise<FrameworkInfo> {\n // Read package.json to check dependencies\n const pkgPath = path.join(cwd, \"package.json\");\n\n try {\n const pkgContent = await fs.readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n // Check each framework\n for (const [pkgName, detector] of Object.entries(FRAMEWORK_DETECTORS)) {\n if (deps[pkgName]) {\n // Check for config file\n for (const configFile of detector.configFiles) {\n const configPath = path.join(cwd, configFile);\n try {\n await fs.access(configPath);\n return {\n name: detector.name,\n version: deps[pkgName],\n configFile,\n };\n } catch {\n // Config file not found, continue\n }\n }\n\n // Package found but no config file\n return {\n name: detector.name,\n version: deps[pkgName],\n configFile: null,\n };\n }\n }\n } catch {\n // package.json not found\n }\n\n return {\n name: \"unknown\",\n version: null,\n configFile: null,\n };\n}\n\nexport function getFrameworkDisplayName(framework: Framework): string {\n const names: Record<Framework, string> = {\n astro: \"Astro\",\n nextjs: \"Next.js\",\n nuxt: \"Nuxt\",\n unknown: \"Unknown\",\n };\n return names[framework];\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface TypeScriptInfo {\n enabled: boolean;\n configFile: string | null;\n version: string | null;\n}\n\nconst TS_CONFIG_FILES = [\"tsconfig.json\", \"tsconfig.app.json\"];\n\nexport async function detectTypeScript(cwd: string = process.cwd()): Promise<TypeScriptInfo> {\n // Check for tsconfig\n for (const configFile of TS_CONFIG_FILES) {\n const configPath = path.join(cwd, configFile);\n try {\n await fs.access(configPath);\n\n // Check package.json for typescript version\n const pkgPath = path.join(cwd, \"package.json\");\n try {\n const pkgContent = await fs.readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n return {\n enabled: true,\n configFile,\n version: deps.typescript || null,\n };\n } catch {\n return {\n enabled: true,\n configFile,\n version: null,\n };\n }\n } catch {\n // Config not found, continue\n }\n }\n\n return {\n enabled: false,\n configFile: null,\n version: null,\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type PackageManager = \"pnpm\" | \"npm\" | \"yarn\" | \"bun\";\n\nexport interface PackageManagerInfo {\n name: PackageManager;\n lockFile: string | null;\n}\n\nconst LOCK_FILES: Record<string, PackageManager> = {\n \"pnpm-lock.yaml\": \"pnpm\",\n \"package-lock.json\": \"npm\",\n \"yarn.lock\": \"yarn\",\n \"bun.lockb\": \"bun\",\n};\n\nexport async function detectPackageManager(cwd: string = process.cwd()): Promise<PackageManagerInfo> {\n // Check for lock files\n for (const [lockFile, pm] of Object.entries(LOCK_FILES)) {\n const lockPath = path.join(cwd, lockFile);\n try {\n await fs.access(lockPath);\n return {\n name: pm,\n lockFile,\n };\n } catch {\n // Lock file not found, continue\n }\n }\n\n // Default to npm if no lock file found\n return {\n name: \"npm\",\n lockFile: null,\n };\n}\n\nexport function getInstallCommand(pm: PackageManager, pkg: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm add ${pkg}`,\n npm: `npm install ${pkg}`,\n yarn: `yarn add ${pkg}`,\n bun: `bun add ${pkg}`,\n };\n return commands[pm];\n}\n\nexport function getInstallDevCommand(pm: PackageManager, pkg: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm add -D ${pkg}`,\n npm: `npm install -D ${pkg}`,\n yarn: `yarn add -D ${pkg}`,\n bun: `bun add -d ${pkg}`,\n };\n return commands[pm];\n}\n\nexport function getRunCommand(pm: PackageManager, script: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm ${script}`,\n npm: `npm run ${script}`,\n yarn: `yarn ${script}`,\n bun: `bun run ${script}`,\n };\n return commands[pm];\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getFrameworkDisplayName, type FrameworkInfo } from \"../detectors/framework.js\";\nimport type { TypeScriptInfo } from \"../detectors/typescript.js\";\nimport type { PackageManagerInfo } from \"../detectors/package-manager.js\";\n\nexport interface DetectionResults {\n framework: FrameworkInfo;\n typescript: TypeScriptInfo;\n packageManager: PackageManagerInfo;\n}\n\nexport interface InitPromptAnswers {\n strapiUrl: string;\n strapiToken: string;\n strapiVersion: \"v4\" | \"v5\";\n apiPrefix: string;\n outputFormat: \"typescript\" | \"jsdoc\";\n outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}\n\n/**\n * Parse version string to get major version number\n */\nfunction getMajorVersion(version: string | null): number | null {\n if (!version) return null;\n // Remove ^ or ~ prefix and get first number\n const match = version.replace(/^[\\^~]/, \"\").match(/^(\\d+)/);\n return match ? parseInt(match[1], 10) : null;\n}\n\nexport async function runInitPrompts(detection: DetectionResults): Promise<InitPromptAnswers | null> {\n p.intro(pc.cyan(\"strapi2front setup\"));\n\n // Show detected info\n p.note(\n [\n `Framework: ${pc.green(getFrameworkDisplayName(detection.framework.name))} ${detection.framework.version ? pc.dim(`v${detection.framework.version}`) : \"\"}`,\n `TypeScript: ${detection.typescript.enabled ? pc.green(\"enabled\") : pc.yellow(\"disabled\")}`,\n `Package Manager: ${pc.green(detection.packageManager.name)}`,\n ].join(\"\\n\"),\n \"Detected Configuration\"\n );\n\n // Track feature availability\n let canGenerateActions = true;\n\n // Check framework support for additional features\n if (detection.framework.name === \"unknown\") {\n // Unknown framework - generate types and services only\n canGenerateActions = false;\n } else if (detection.framework.name !== \"astro\") {\n // Non-Astro framework - generate types and services only (for now)\n canGenerateActions = false;\n } else {\n // Astro - check version for Actions support (requires v4+)\n const majorVersion = getMajorVersion(detection.framework.version);\n if (majorVersion !== null && majorVersion < 4) {\n p.log.warn(pc.yellow(`Astro v${majorVersion} detected. Upgrade to v4+ to enable Actions.`));\n canGenerateActions = false;\n }\n }\n\n // Determine output format based on TypeScript support\n let outputFormat: \"typescript\" | \"jsdoc\" = \"typescript\";\n\n if (!detection.typescript.enabled) {\n p.log.info(pc.dim(\"TypeScript not detected. Files will be generated as JavaScript with JSDoc annotations.\"));\n outputFormat = \"jsdoc\";\n }\n\n // Prompt for Strapi connection\n const defaultUrl = \"http://localhost:1337\";\n const strapiUrlInput = await p.text({\n message: \"What is your Strapi URL?\",\n placeholder: `${defaultUrl} (press Enter for default)`,\n validate: (value): string | undefined => {\n const trimmed = (value || \"\").trim();\n // Allow empty (will use default)\n if (trimmed === \"\") return undefined;\n try {\n new URL(trimmed);\n return undefined;\n } catch {\n return \"Please enter a valid URL\";\n }\n },\n });\n\n if (p.isCancel(strapiUrlInput)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Use default if empty or whitespace only\n const strapiUrl = ((strapiUrlInput as string) || \"\").trim() || defaultUrl;\n\n const strapiToken = await p.text({\n message: \"What is your Strapi API token?\",\n placeholder: \"Press Enter to skip (you can add it later in .env)\",\n });\n\n if (p.isCancel(strapiToken)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Trim and check if empty\n const trimmedToken = ((strapiToken as string) || \"\").trim();\n\n // Show hint if token is empty\n if (trimmedToken === \"\") {\n p.log.info(pc.dim(\"Token skipped. Remember to add STRAPI_TOKEN to your .env file later.\"));\n }\n\n // Strapi version\n const strapiVersion = await p.select({\n message: \"What version of Strapi are you using?\",\n options: [\n { value: \"v5\", label: \"Strapi v5\", hint: \"Recommended - Latest version\" },\n { value: \"v4\", label: \"Strapi v4\", hint: \"Legacy version\" },\n ],\n initialValue: \"v5\",\n });\n\n if (p.isCancel(strapiVersion)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n p.log.info(pc.dim(`Using Strapi ${strapiVersion}. This can be changed later in strapi.config.ts`));\n\n // API Prefix\n const defaultPrefix = \"/api\";\n const apiPrefixInput = await p.text({\n message: \"What is your Strapi API prefix?\",\n placeholder: `${defaultPrefix} (press Enter for default)`,\n validate: (value): string | undefined => {\n const trimmed = (value || \"\").trim();\n if (trimmed === \"\") return undefined;\n if (!trimmed.startsWith(\"/\")) {\n return \"API prefix must start with /\";\n }\n return undefined;\n },\n });\n\n if (p.isCancel(apiPrefixInput)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n const apiPrefix = ((apiPrefixInput as string) || \"\").trim() || defaultPrefix;\n\n if (apiPrefix !== defaultPrefix) {\n p.log.info(pc.dim(`Using custom API prefix: ${apiPrefix}`));\n }\n\n // Output directory\n const outputDir = await p.text({\n message: \"Where should we generate the Strapi files?\",\n placeholder: \"src/strapi\",\n defaultValue: \"src/strapi\",\n });\n\n if (p.isCancel(outputDir)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Features to generate - labels depend on output format\n const isTypeScript = outputFormat === \"typescript\";\n const featureOptions = [\n {\n value: \"types\",\n label: isTypeScript ? \"Types\" : \"Type Definitions\",\n hint: isTypeScript\n ? \"TypeScript interfaces for your content types\"\n : \"JSDoc type definitions for your content types\"\n },\n {\n value: \"services\",\n label: \"Services\",\n hint: isTypeScript\n ? \"Typed service functions for data fetching\"\n : \"Service functions with JSDoc annotations\"\n },\n ];\n\n // Only show Astro Actions if available (requires TypeScript)\n if (canGenerateActions && isTypeScript) {\n featureOptions.push({ value: \"actions\", label: \"Astro Actions\", hint: \"Type-safe actions for client/server\" });\n }\n\n const initialFeatures = (canGenerateActions && isTypeScript)\n ? [\"types\", \"services\", \"actions\"]\n : [\"types\", \"services\"];\n\n const features = await p.multiselect({\n message: \"What would you like to generate?\",\n options: featureOptions,\n initialValues: initialFeatures,\n required: true,\n });\n\n if (p.isCancel(features)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n return {\n strapiUrl: strapiUrl,\n strapiToken: trimmedToken,\n strapiVersion: strapiVersion as \"v4\" | \"v5\",\n apiPrefix: apiPrefix,\n outputFormat: outputFormat,\n outputDir: ((outputDir as string) || \"\").trim() || \"src/strapi\",\n generateActions: canGenerateActions && isTypeScript && (features as string[]).includes(\"actions\"),\n generateServices: (features as string[]).includes(\"services\"),\n };\n}\n\nexport async function confirmOverwrite(files: string[]): Promise<boolean> {\n const confirm = await p.confirm({\n message: `The following files will be overwritten:\\n${files.map((f) => ` - ${f}`).join(\"\\n\")}\\n\\nContinue?`,\n initialValue: true,\n });\n\n return !p.isCancel(confirm) && confirm === true;\n}\n","import pc from 'picocolors';\n\nexport const logger = {\n info: (message: string) => {\n console.log(pc.blue(\"i\"), message);\n },\n\n success: (message: string) => {\n console.log(pc.green(\"v\"), message);\n },\n\n warn: (message: string) => {\n console.log(pc.yellow(\"!\"), message);\n },\n\n error: (message: string) => {\n console.log(pc.red(\"x\"), message);\n },\n\n step: (message: string) => {\n console.log(pc.cyan(\">\"), message);\n },\n\n dim: (message: string) => {\n console.log(pc.dim(message));\n },\n\n newLine: () => {\n console.log(\"\");\n },\n};\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { detectFramework } from \"../lib/detectors/framework.js\";\nimport { detectTypeScript } from \"../lib/detectors/typescript.js\";\nimport { detectPackageManager, getInstallCommand, getInstallDevCommand } from \"../lib/detectors/package-manager.js\";\nimport { runInitPrompts } from \"../lib/prompts/init.prompts.js\";\nimport { logger } from \"../lib/utils/logger.js\";\n\n/**\n * Execute a shell command asynchronously\n * This allows spinners to animate while the command runs\n */\nfunction execAsync(command: string, cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const [cmd, ...args] = command.split(\" \");\n const child = spawn(cmd, args, {\n cwd,\n stdio: \"ignore\",\n shell: true,\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n });\n}\n\nexport interface InitCommandOptions {\n yes?: boolean;\n url?: string;\n token?: string;\n framework?: string;\n}\n\nexport async function initCommand(_options: InitCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Detect project configuration\n const s = p.spinner();\n s.start(\"Detecting project configuration...\");\n\n const [framework, typescript, packageManager] = await Promise.all([\n detectFramework(cwd),\n detectTypeScript(cwd),\n detectPackageManager(cwd),\n ]);\n\n s.stop(\"Project configuration detected\");\n\n // Run interactive prompts\n const answers = await runInitPrompts({\n framework,\n typescript,\n packageManager,\n });\n\n if (!answers) {\n return;\n }\n\n // Create configuration\n s.start(\"Creating configuration files...\");\n\n try {\n // Create config file (use .js extension for JSDoc projects)\n const configExtension = answers.outputFormat === \"jsdoc\" ? \"js\" : \"ts\";\n const configContent = generateConfigFile({\n strapiUrl: answers.strapiUrl,\n strapiVersion: answers.strapiVersion,\n apiPrefix: answers.apiPrefix,\n outputFormat: answers.outputFormat,\n outputDir: answers.outputDir,\n generateActions: answers.generateActions,\n generateServices: answers.generateServices,\n });\n const configPath = path.join(cwd, `strapi.config.${configExtension}`);\n await fs.writeFile(configPath, configContent, \"utf-8\");\n\n // Update .env file\n const envPath = path.join(cwd, \".env\");\n await appendToEnvFile(envPath, {\n STRAPI_URL: answers.strapiUrl,\n STRAPI_TOKEN: answers.strapiToken,\n });\n\n // Create output directory\n const outputPath = path.join(cwd, answers.outputDir);\n await fs.mkdir(outputPath, { recursive: true });\n\n s.stop(\"Configuration files created\");\n\n // Install dependencies\n const installDeps = await p.confirm({\n message: \"Install required dependencies (strapi2front, strapi-sdk-js)?\",\n initialValue: true,\n });\n\n if (p.isCancel(installDeps)) {\n p.cancel(\"Setup cancelled\");\n process.exit(0);\n }\n\n if (installDeps) {\n // Install strapi2front as dev dependency (needed for config file)\n const installStrapi2frontCmd = getInstallDevCommand(packageManager.name, \"strapi2front\");\n s.start(`Installing strapi2front... (${pc.dim(installStrapi2frontCmd)})`);\n try {\n await execAsync(installStrapi2frontCmd, cwd);\n s.stop(`${pc.green(\"✓\")} strapi2front installed`);\n } catch {\n s.stop(`${pc.red(\"✗\")} Failed to install strapi2front`);\n logger.warn(`Please install manually: ${installStrapi2frontCmd}`);\n }\n\n // Install strapi-sdk-js as regular dependency\n const installSdkCmd = getInstallCommand(packageManager.name, \"strapi-sdk-js\");\n s.start(`Installing strapi-sdk-js... (${pc.dim(installSdkCmd)})`);\n try {\n await execAsync(installSdkCmd, cwd);\n s.stop(`${pc.green(\"✓\")} strapi-sdk-js installed`);\n } catch {\n s.stop(`${pc.red(\"✗\")} Failed to install strapi-sdk-js`);\n logger.warn(`Please install manually: ${installSdkCmd}`);\n }\n } else {\n p.log.info(pc.dim(\"Remember to install dependencies manually:\"));\n p.log.info(pc.dim(` ${getInstallDevCommand(packageManager.name, \"strapi2front\")}`));\n p.log.info(pc.dim(` ${getInstallCommand(packageManager.name, \"strapi-sdk-js\")}`));\n }\n\n // Show success message\n const configFileName = `strapi.config.${configExtension}`;\n const fileExt = answers.outputFormat === \"jsdoc\" ? \".js\" : \".ts\";\n p.note(\n [\n `${pc.green(\"✓\")} Created ${pc.cyan(configFileName)}`,\n `${pc.green(\"✓\")} Updated ${pc.cyan(\".env\")} with Strapi credentials`,\n `${pc.green(\"✓\")} Created output directory ${pc.cyan(answers.outputDir)}`,\n \"\",\n `Output format: ${pc.cyan(answers.outputFormat === \"jsdoc\" ? \"JavaScript (JSDoc)\" : \"TypeScript\")}`,\n \"\",\n `Next steps:`,\n ` 1. Run ${pc.cyan(\"npx strapi2front sync\")} to generate files`,\n ` 2. Import from ${pc.cyan(answers.outputDir + \"/collections/*\" + fileExt)}`,\n ` 3. Import services from ${pc.cyan(answers.outputDir + \"/collections/*.service\" + fileExt)}`,\n ].join(\"\\n\"),\n \"Setup complete!\"\n );\n\n p.outro(pc.green(\"Happy coding!\"));\n } catch (error) {\n s.stop(\"Failed to create configuration files\");\n logger.error(error instanceof Error ? error.message : \"Unknown error\");\n process.exit(1);\n }\n}\n\nfunction generateConfigFile(answers: {\n strapiUrl: string;\n strapiVersion: \"v4\" | \"v5\";\n apiPrefix: string;\n outputFormat: \"typescript\" | \"jsdoc\";\n outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}): string {\n const isTypeScript = answers.outputFormat === \"typescript\";\n\n if (isTypeScript) {\n return `import { defineConfig } from \"strapi2front\";\n\nexport default defineConfig({\n // Strapi connection\n url: process.env.STRAPI_URL || \"${answers.strapiUrl}\",\n token: process.env.STRAPI_TOKEN,\n\n // API prefix (default: \"/api\")\n apiPrefix: \"${answers.apiPrefix}\",\n\n // Output format: \"typescript\" (.ts) or \"jsdoc\" (.js with JSDoc)\n outputFormat: \"typescript\",\n\n // Output configuration\n output: {\n path: \"${answers.outputDir}\",\n types: \"types\",\n services: \"services\",\n actions: \"actions/strapi\",\n structure: 'by-feature' // or 'by-layer'\n },\n\n // Features to generate\n features: {\n types: true,\n services: ${answers.generateServices},\n actions: ${answers.generateActions},\n },\n\n // Strapi version\n strapiVersion: \"${answers.strapiVersion}\",\n});\n`;\n }\n\n // JSDoc config (JavaScript)\n return `// @ts-check\nconst { defineConfig } = require(\"strapi2front\");\n\nmodule.exports = defineConfig({\n // Strapi connection\n url: process.env.STRAPI_URL || \"${answers.strapiUrl}\",\n token: process.env.STRAPI_TOKEN,\n\n // API prefix (default: \"/api\")\n apiPrefix: \"${answers.apiPrefix}\",\n\n // Output format: \"typescript\" (.ts) or \"jsdoc\" (.js with JSDoc)\n outputFormat: \"jsdoc\",\n\n // Output configuration\n output: {\n path: \"${answers.outputDir}\",\n types: \"types\",\n services: \"services\",\n structure: 'by-feature' // or 'by-layer'\n },\n\n // Features to generate\n features: {\n types: true,\n services: ${answers.generateServices},\n actions: false, // Actions require TypeScript\n },\n\n // Strapi version\n strapiVersion: \"${answers.strapiVersion}\",\n});\n`;\n}\n\nasync function appendToEnvFile(\n envPath: string,\n variables: Record<string, string>\n): Promise<void> {\n let content = \"\";\n\n try {\n content = await fs.readFile(envPath, \"utf-8\");\n } catch {\n // File does not exist, create new\n }\n\n const lines = content.split(\"\\n\");\n const existingKeys = new Set(\n lines\n .filter((line) => line.includes(\"=\"))\n .map((line) => line.split(\"=\")[0].trim())\n );\n\n const newLines: string[] = [];\n\n for (const [key, value] of Object.entries(variables)) {\n if (!existingKeys.has(key)) {\n newLines.push(`${key}=${value}`);\n }\n }\n\n if (newLines.length > 0) {\n const separator = content.endsWith(\"\\n\") || content === \"\" ? \"\" : \"\\n\";\n const newContent = content + separator + newLines.join(\"\\n\") + \"\\n\";\n await fs.writeFile(envPath, newContent, \"utf-8\");\n }\n}\n\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { loadConfig } from \"@strapi2front/core\";\nimport { fetchSchema, detectStrapiVersion } from \"@strapi2front/core\";\nimport { parseSchema } from \"@strapi2front/core\";\nimport type { StrapiVersion } from \"@strapi2front/core\";\nimport type { ParsedSchema, Attribute } from \"@strapi2front/core\";\nimport { generateTypes } from \"@strapi2front/generators\";\nimport { generateServices } from \"@strapi2front/generators\";\nimport { generateActions } from \"@strapi2front/generators\";\nimport { generateClient } from \"@strapi2front/generators\";\nimport { generateLocales } from \"@strapi2front/generators\";\nimport { generateByFeature } from \"@strapi2front/generators\";\nimport { logger } from \"../lib/utils/logger.js\";\n\nconst BLOCKS_RENDERER_PACKAGE = \"@strapi/blocks-react-renderer\";\n\n/**\n * Check if schema contains any blocks fields\n */\nfunction schemaHasBlocks(schema: ParsedSchema): { hasBlocks: boolean; fieldsFound: string[] } {\n const fieldsFound: string[] = [];\n\n const checkAttributes = (typeName: string, attributes: Record<string, Attribute>): void => {\n for (const [fieldName, attr] of Object.entries(attributes)) {\n if (attr.type === \"blocks\") {\n fieldsFound.push(`${typeName}.${fieldName}`);\n }\n }\n };\n\n for (const collection of schema.collections) {\n checkAttributes(collection.singularName, collection.attributes);\n }\n\n for (const single of schema.singles) {\n checkAttributes(single.singularName, single.attributes);\n }\n\n for (const component of schema.components) {\n checkAttributes(`component:${component.name}`, component.attributes);\n }\n\n return { hasBlocks: fieldsFound.length > 0, fieldsFound };\n}\n\n/**\n * Check if a package is installed\n */\nfunction isPackageInstalled(packageName: string, cwd: string): boolean {\n try {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) return false;\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n return packageName in deps;\n } catch {\n return false;\n }\n}\n\n/**\n * Detect package manager\n */\nfunction detectPackageManager(cwd: string): \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" {\n if (fs.existsSync(path.join(cwd, \"bun.lockb\"))) return \"bun\";\n if (fs.existsSync(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (fs.existsSync(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\n/**\n * Install a package\n */\nfunction installPackage(packageName: string, cwd: string): void {\n const pm = detectPackageManager(cwd);\n const commands: Record<string, string> = {\n npm: `npm install ${packageName}`,\n yarn: `yarn add ${packageName}`,\n pnpm: `pnpm add ${packageName}`,\n bun: `bun add ${packageName}`,\n };\n\n execSync(commands[pm], { cwd, stdio: \"inherit\" });\n}\n\n/**\n * Structure type for output organization\n */\ntype OutputStructure = \"by-layer\" | \"by-feature\";\n\n/**\n * Get orphaned folders from the opposite structure\n */\nfunction getOrphanedFolders(outputPath: string, currentStructure: OutputStructure): string[] {\n const orphanedFolders: string[] = [];\n\n if (currentStructure === \"by-feature\") {\n // If using by-feature, check for by-layer folders\n const byLayerFolders = [\"types\", \"services\", \"actions\"];\n for (const folder of byLayerFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n // Also check for root-level client.ts and locales.ts (by-layer puts them at root)\n if (fs.existsSync(path.join(outputPath, \"client.ts\"))) {\n orphanedFolders.push(\"client.ts\");\n }\n if (fs.existsSync(path.join(outputPath, \"locales.ts\"))) {\n orphanedFolders.push(\"locales.ts\");\n }\n } else {\n // If using by-layer, check for by-feature folders\n const byFeatureFolders = [\"collections\", \"singles\", \"shared\", \"components\"];\n for (const folder of byFeatureFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n }\n\n return orphanedFolders;\n}\n\n/**\n * Remove orphaned folders/files\n */\nfunction cleanOrphanedFiles(outputPath: string, orphanedItems: string[]): void {\n for (const item of orphanedItems) {\n const itemPath = path.join(outputPath, item);\n if (fs.existsSync(itemPath)) {\n const stat = fs.statSync(itemPath);\n if (stat.isDirectory()) {\n fs.rmSync(itemPath, { recursive: true, force: true });\n } else {\n fs.unlinkSync(itemPath);\n }\n }\n }\n}\n\nexport interface SyncCommandOptions {\n force?: boolean;\n typesOnly?: boolean;\n servicesOnly?: boolean;\n actionsOnly?: boolean;\n clean?: boolean;\n}\n\nexport async function syncCommand(options: SyncCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n p.intro(pc.cyan(\"strapi2front sync\"));\n\n const s = p.spinner();\n\n try {\n // Load configuration\n s.start(\"Loading configuration...\");\n let config = await loadConfig(cwd);\n s.stop(\"Configuration loaded\");\n\n // Detect and validate Strapi version\n s.start(\"Detecting Strapi version...\");\n const versionResult = await detectStrapiVersion(config.url, config.token, config.apiPrefix);\n s.stop(\"Version detection complete\");\n\n let effectiveVersion: StrapiVersion = config.strapiVersion;\n\n if (versionResult.detected) {\n if (versionResult.detected !== config.strapiVersion) {\n // Version mismatch detected\n if (versionResult.detected === \"v5\" && config.strapiVersion === \"v4\") {\n p.log.warn(\n pc.yellow(`Detected Strapi ${pc.bold(\"v5\")} but config has ${pc.bold(\"v4\")}. Using v5.`)\n );\n effectiveVersion = \"v5\";\n } else if (versionResult.detected === \"v4\" && config.strapiVersion === \"v5\") {\n p.log.warn(\n pc.yellow(`Detected Strapi ${pc.bold(\"v4\")} but config has ${pc.bold(\"v5\")}. Using v4.`)\n );\n effectiveVersion = \"v4\";\n }\n } else {\n p.log.info(`Strapi ${pc.green(pc.bold(config.strapiVersion))}`);\n }\n } else {\n p.log.warn(pc.yellow(`Could not detect Strapi version. Using ${pc.bold(config.strapiVersion)}`));\n }\n\n // Update config with effective version for this sync\n config = { ...config, strapiVersion: effectiveVersion };\n\n // Fetch schema from Strapi\n s.start(\"Fetching schema from Strapi...\");\n const rawSchema = await fetchSchema(config.url, config.token, config.apiPrefix);\n const schema = parseSchema(rawSchema);\n s.stop(`Schema fetched: ${schema.collections.length} collections, ${schema.singles.length} singles, ${schema.components.length} components`);\n\n // Check for Blocks fields and prompt for renderer package\n let blocksRendererInstalled = isPackageInstalled(BLOCKS_RENDERER_PACKAGE, cwd);\n const { hasBlocks: hasBlocksFields, fieldsFound: blocksFieldsFound } = schemaHasBlocks(schema);\n\n if (hasBlocksFields && !blocksRendererInstalled) {\n p.log.info(`Blocks fields detected: ${pc.cyan(blocksFieldsFound.join(\", \"))}`);\n\n const installBlocks = await p.confirm({\n message: `Install ${pc.cyan(BLOCKS_RENDERER_PACKAGE)} for proper type support and rendering?`,\n initialValue: true,\n });\n\n if (p.isCancel(installBlocks)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n\n if (installBlocks) {\n s.start(`Installing ${BLOCKS_RENDERER_PACKAGE}...`);\n try {\n installPackage(BLOCKS_RENDERER_PACKAGE, cwd);\n blocksRendererInstalled = true;\n s.stop(`${BLOCKS_RENDERER_PACKAGE} installed`);\n } catch (error) {\n s.stop(`Failed to install ${BLOCKS_RENDERER_PACKAGE}`);\n logger.warn(\"You can install it manually later and re-run sync\");\n }\n } else {\n p.log.info(pc.dim(`Skipping ${BLOCKS_RENDERER_PACKAGE}. BlocksContent will be typed as unknown[]`));\n }\n }\n\n const outputPath = path.join(cwd, config.output.path);\n const generatedFiles: string[] = [];\n\n // Determine what to generate\n const generateAll = !options.typesOnly && !options.servicesOnly && !options.actionsOnly;\n\n // Check structure mode\n const isByFeature = config.output.structure === 'by-feature';\n const currentStructure: OutputStructure = isByFeature ? \"by-feature\" : \"by-layer\";\n\n // Check for orphaned files from previous structure\n if (fs.existsSync(outputPath)) {\n const orphanedFolders = getOrphanedFolders(outputPath, currentStructure);\n\n if (orphanedFolders.length > 0) {\n const otherStructure = isByFeature ? \"by-layer\" : \"by-feature\";\n p.log.warn(\n pc.yellow(`Found files from previous ${pc.bold(otherStructure)} structure:`)\n );\n p.log.message(pc.dim(` ${orphanedFolders.join(\", \")}`));\n\n let shouldClean = options.clean;\n\n if (!shouldClean) {\n const cleanResponse = await p.confirm({\n message: `Remove orphaned ${otherStructure} files?`,\n initialValue: true,\n });\n\n if (p.isCancel(cleanResponse)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n\n shouldClean = cleanResponse;\n }\n\n if (shouldClean) {\n s.start(\"Cleaning orphaned files...\");\n cleanOrphanedFiles(outputPath, orphanedFolders);\n s.stop(`Removed: ${orphanedFolders.join(\", \")}`);\n } else {\n p.log.info(pc.dim(\"Keeping orphaned files. You can clean them manually or use --clean flag.\"));\n }\n }\n }\n\n // Get output format from config (default to typescript)\n const outputFormat = config.outputFormat || \"typescript\";\n\n if (isByFeature) {\n // Generate using by-feature structure (screaming architecture)\n s.start(`Generating files (by-feature, ${outputFormat})...`);\n const files = await generateByFeature(schema, rawSchema.locales, {\n outputDir: outputPath,\n features: {\n types: config.features.types && (generateAll || Boolean(options.typesOnly)),\n services: config.features.services && (generateAll || Boolean(options.servicesOnly)),\n actions: config.features.actions && outputFormat === \"typescript\" && (generateAll || Boolean(options.actionsOnly)),\n },\n blocksRendererInstalled,\n strapiVersion: config.strapiVersion,\n apiPrefix: config.apiPrefix,\n outputFormat,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} files`);\n } else {\n // Generate using by-layer structure (default)\n\n // Generate types\n if (generateAll || options.typesOnly) {\n if (config.features.types) {\n s.start(`Generating types (${outputFormat})...`);\n const typesPath = path.join(outputPath, config.output.types);\n const files = await generateTypes(schema, {\n outputDir: typesPath,\n blocksRendererInstalled,\n strapiVersion: config.strapiVersion,\n outputFormat,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} type files`);\n }\n }\n\n // Generate client (needed by services)\n if (generateAll || options.servicesOnly) {\n if (config.features.services) {\n s.start(\"Generating client...\");\n const clientFiles = await generateClient({ outputDir: outputPath, strapiVersion: config.strapiVersion, apiPrefix: config.apiPrefix });\n generatedFiles.push(...clientFiles);\n s.stop(\"Generated client\");\n\n // Generate locales (for i18n support)\n s.start(\"Generating locales...\");\n const localesFiles = await generateLocales(rawSchema.locales, { outputDir: outputPath });\n generatedFiles.push(...localesFiles);\n if (rawSchema.locales.length > 0) {\n s.stop(`Generated locales: ${rawSchema.locales.map(l => l.code).join(\", \")}`);\n } else {\n s.stop(\"Generated locales (i18n not enabled in Strapi)\");\n }\n }\n }\n\n // Generate services\n if (generateAll || options.servicesOnly) {\n if (config.features.services) {\n s.start(`Generating services (${outputFormat})...`);\n const servicesPath = path.join(outputPath, config.output.services);\n const typesImportPath = path.relative(servicesPath, path.join(outputPath, config.output.types)).replace(/\\\\/g, \"/\") || \".\";\n const files = await generateServices(schema, {\n outputDir: servicesPath,\n typesImportPath: typesImportPath.startsWith(\".\") ? typesImportPath : \"./\" + typesImportPath,\n strapiVersion: config.strapiVersion,\n outputFormat,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} service files`);\n }\n }\n\n // Generate actions (only for TypeScript projects)\n if ((generateAll || options.actionsOnly) && outputFormat === \"typescript\") {\n if (config.features.actions) {\n s.start(\"Generating Astro actions...\");\n const actionsPath = path.join(outputPath, config.output.actions);\n const servicesPath = path.join(outputPath, config.output.services);\n\n const servicesImportPath = path.relative(actionsPath, servicesPath).replace(/\\\\/g, \"/\") || \".\";\n\n const files = await generateActions(schema, {\n outputDir: actionsPath,\n servicesImportPath: servicesImportPath.startsWith(\".\") ? servicesImportPath : \"./\" + servicesImportPath,\n strapiVersion: config.strapiVersion,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} action files`);\n }\n }\n }\n\n // Show summary\n p.note(\n [\n `Generated ${generatedFiles.length} files in ${pc.cyan(config.output.path)}`,\n \"\",\n \"Files generated:\",\n ...generatedFiles.slice(0, 10).map((f) => ` ${pc.dim(path.relative(cwd, f))}`),\n generatedFiles.length > 10 ? ` ${pc.dim(`... and ${generatedFiles.length - 10} more`)}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n \"Sync complete!\"\n );\n\n p.outro(pc.green(\"Types and services are ready to use!\"));\n } catch (error) {\n s.stop(\"Sync failed\");\n\n if (error instanceof Error) {\n logger.error(error.message);\n\n if (error.message.includes(\"Could not find strapi.config\")) {\n logger.info(\"Run \\\"npx strapi2front init\\\" first to set up your project.\");\n }\n } else {\n logger.error(\"An unknown error occurred\");\n }\n\n process.exit(1);\n }\n}\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { initCommand } from '../commands/init.js';\nimport { syncCommand } from '../commands/sync.js';\n\nconst program = new Command();\n\n// ASCII Art Logo\nconst logo = `\n _ _ ___ __ _\n ___| |_ _ __ __ _ _ __ (_)__ \\\\ / _|_ __ ___ _ __ | |_\n/ __| __| '__/ _\\` | '_ \\\\| | / /| |_| '__/ _ \\\\| '_ \\\\| __|\n\\\\__ \\\\ |_| | | (_| | |_) | ||_| | _| | | (_) | | | | |_\n|___/\\\\__|_| \\\\__,_| .__/|_|(_) |_| |_| \\\\___/|_| |_|\\\\__|\n |_|\n`;\n\nprogram\n .name('strapi2front')\n .description('Generate TypeScript types, services, and framework actions from your Strapi schema')\n .version('0.1.0')\n .addHelpText('beforeAll', pc.cyan(logo));\n\n// Init command\nprogram\n .command('init')\n .description('Initialize strapi2front in your project')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .option('--url <url>', 'Strapi URL')\n .option('--token <token>', 'Strapi API token')\n .option('--framework <framework>', 'Framework to use (astro)')\n .action(initCommand);\n\n// Sync command\nprogram\n .command('sync')\n .description('Sync types, services, and actions from Strapi schema')\n .option('-f, --force', 'Force regeneration of all files')\n .option('--types-only', 'Only generate types')\n .option('--services-only', 'Only generate services')\n .option('--actions-only', 'Only generate actions')\n .option('--clean', 'Automatically remove orphaned files from previous structure')\n .action(syncCommand);\n\n// If no command is provided, run init by default\nconst args = process.argv.slice(2);\nconst commands = ['init', 'sync', 'help', '--help', '-h', '--version', '-V'];\nconst hasCommand = args.some((arg) => commands.includes(arg));\n\nif (args.length === 0 || !hasCommand) {\n // Show logo and run init\n console.log(pc.cyan(logo));\n initCommand({});\n} else {\n // Parse args normally\n program.parse();\n}\n"]}
1
+ {"version":3,"sources":["../../src/lib/detectors/framework.ts","../../src/lib/detectors/typescript.ts","../../src/lib/detectors/package-manager.ts","../../src/lib/prompts/init.prompts.ts","../../src/lib/utils/logger.ts","../../src/commands/init.ts","../../src/lib/detectors/module-type.ts","../../src/commands/sync.ts","../../src/bin/strapi2front.ts"],"names":["path","fs","commands","pc","args","p2","detectPackageManager","p3"],"mappings":"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","file":"strapi2front.js","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type Framework = \"astro\" | \"nextjs\" | \"nuxt\" | \"unknown\";\n\nexport interface FrameworkInfo {\n name: Framework;\n version: string | null;\n configFile: string | null;\n}\n\nconst FRAMEWORK_DETECTORS: Record<\n string,\n { name: Framework; configFiles: string[] }\n> = {\n astro: {\n name: \"astro\",\n configFiles: [\"astro.config.mjs\", \"astro.config.ts\", \"astro.config.js\"],\n },\n next: {\n name: \"nextjs\",\n configFiles: [\"next.config.mjs\", \"next.config.ts\", \"next.config.js\"],\n },\n nuxt: {\n name: \"nuxt\",\n configFiles: [\"nuxt.config.ts\", \"nuxt.config.js\"],\n },\n};\n\nexport async function detectFramework(cwd: string = process.cwd()): Promise<FrameworkInfo> {\n // Read package.json to check dependencies\n const pkgPath = path.join(cwd, \"package.json\");\n\n try {\n const pkgContent = await fs.readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n // Check each framework\n for (const [pkgName, detector] of Object.entries(FRAMEWORK_DETECTORS)) {\n if (deps[pkgName]) {\n // Check for config file\n for (const configFile of detector.configFiles) {\n const configPath = path.join(cwd, configFile);\n try {\n await fs.access(configPath);\n return {\n name: detector.name,\n version: deps[pkgName],\n configFile,\n };\n } catch {\n // Config file not found, continue\n }\n }\n\n // Package found but no config file\n return {\n name: detector.name,\n version: deps[pkgName],\n configFile: null,\n };\n }\n }\n } catch {\n // package.json not found\n }\n\n return {\n name: \"unknown\",\n version: null,\n configFile: null,\n };\n}\n\nexport function getFrameworkDisplayName(framework: Framework): string {\n const names: Record<Framework, string> = {\n astro: \"Astro\",\n nextjs: \"Next.js\",\n nuxt: \"Nuxt\",\n unknown: \"Unknown\",\n };\n return names[framework];\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface TypeScriptInfo {\n enabled: boolean;\n configFile: string | null;\n version: string | null;\n}\n\nconst TS_CONFIG_FILES = [\"tsconfig.json\", \"tsconfig.app.json\"];\n\nexport async function detectTypeScript(cwd: string = process.cwd()): Promise<TypeScriptInfo> {\n // Check for tsconfig\n for (const configFile of TS_CONFIG_FILES) {\n const configPath = path.join(cwd, configFile);\n try {\n await fs.access(configPath);\n\n // Check package.json for typescript version\n const pkgPath = path.join(cwd, \"package.json\");\n try {\n const pkgContent = await fs.readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n return {\n enabled: true,\n configFile,\n version: deps.typescript || null,\n };\n } catch {\n return {\n enabled: true,\n configFile,\n version: null,\n };\n }\n } catch {\n // Config not found, continue\n }\n }\n\n return {\n enabled: false,\n configFile: null,\n version: null,\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type PackageManager = \"pnpm\" | \"npm\" | \"yarn\" | \"bun\";\n\nexport interface PackageManagerInfo {\n name: PackageManager;\n lockFile: string | null;\n}\n\nconst LOCK_FILES: Record<string, PackageManager> = {\n \"pnpm-lock.yaml\": \"pnpm\",\n \"package-lock.json\": \"npm\",\n \"yarn.lock\": \"yarn\",\n \"bun.lockb\": \"bun\",\n};\n\nexport async function detectPackageManager(cwd: string = process.cwd()): Promise<PackageManagerInfo> {\n // Check for lock files\n for (const [lockFile, pm] of Object.entries(LOCK_FILES)) {\n const lockPath = path.join(cwd, lockFile);\n try {\n await fs.access(lockPath);\n return {\n name: pm,\n lockFile,\n };\n } catch {\n // Lock file not found, continue\n }\n }\n\n // Default to npm if no lock file found\n return {\n name: \"npm\",\n lockFile: null,\n };\n}\n\nexport function getInstallCommand(pm: PackageManager, pkg: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm add ${pkg}`,\n npm: `npm install ${pkg}`,\n yarn: `yarn add ${pkg}`,\n bun: `bun add ${pkg}`,\n };\n return commands[pm];\n}\n\nexport function getInstallDevCommand(pm: PackageManager, pkg: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm add -D ${pkg}`,\n npm: `npm install -D ${pkg}`,\n yarn: `yarn add -D ${pkg}`,\n bun: `bun add -d ${pkg}`,\n };\n return commands[pm];\n}\n\nexport function getRunCommand(pm: PackageManager, script: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm ${script}`,\n npm: `npm run ${script}`,\n yarn: `yarn ${script}`,\n bun: `bun run ${script}`,\n };\n return commands[pm];\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getFrameworkDisplayName, type FrameworkInfo } from \"../detectors/framework.js\";\nimport type { TypeScriptInfo } from \"../detectors/typescript.js\";\nimport type { PackageManagerInfo } from \"../detectors/package-manager.js\";\n\nexport interface DetectionResults {\n framework: FrameworkInfo;\n typescript: TypeScriptInfo;\n packageManager: PackageManagerInfo;\n}\n\nexport interface InitPromptAnswers {\n strapiUrl: string;\n strapiToken: string;\n strapiVersion: \"v4\" | \"v5\";\n apiPrefix: string;\n outputFormat: \"typescript\" | \"jsdoc\";\n outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}\n\n/**\n * Parse version string to get major version number\n */\nfunction getMajorVersion(version: string | null): number | null {\n if (!version) return null;\n // Remove ^ or ~ prefix and get first number\n const match = version.replace(/^[\\^~]/, \"\").match(/^(\\d+)/);\n return match ? parseInt(match[1], 10) : null;\n}\n\nexport async function runInitPrompts(detection: DetectionResults): Promise<InitPromptAnswers | null> {\n p.intro(pc.cyan(\"strapi2front setup\"));\n\n // Show detected info\n p.note(\n [\n `Framework: ${pc.green(getFrameworkDisplayName(detection.framework.name))} ${detection.framework.version ? pc.dim(`v${detection.framework.version}`) : \"\"}`,\n `TypeScript: ${detection.typescript.enabled ? pc.green(\"enabled\") : pc.yellow(\"disabled\")}`,\n `Package Manager: ${pc.green(detection.packageManager.name)}`,\n ].join(\"\\n\"),\n \"Detected Configuration\"\n );\n\n // Track feature availability\n let canGenerateActions = true;\n\n // Check framework support for additional features\n if (detection.framework.name === \"unknown\") {\n // Unknown framework - generate types and services only\n canGenerateActions = false;\n } else if (detection.framework.name !== \"astro\") {\n // Non-Astro framework - generate types and services only (for now)\n canGenerateActions = false;\n } else {\n // Astro - check version for Actions support (requires v4+)\n const majorVersion = getMajorVersion(detection.framework.version);\n if (majorVersion !== null && majorVersion < 4) {\n p.log.warn(pc.yellow(`Astro v${majorVersion} detected. Upgrade to v4+ to enable Actions.`));\n canGenerateActions = false;\n }\n }\n\n // Determine output format based on TypeScript support\n let outputFormat: \"typescript\" | \"jsdoc\" = \"typescript\";\n\n if (!detection.typescript.enabled) {\n p.log.info(pc.dim(\"TypeScript not detected. Files will be generated as JavaScript with JSDoc annotations.\"));\n outputFormat = \"jsdoc\";\n }\n\n // Prompt for Strapi connection\n const defaultUrl = \"http://localhost:1337\";\n const strapiUrlInput = await p.text({\n message: \"What is your Strapi URL?\",\n placeholder: `${defaultUrl} (press Enter for default)`,\n validate: (value): string | undefined => {\n const trimmed = (value || \"\").trim();\n // Allow empty (will use default)\n if (trimmed === \"\") return undefined;\n try {\n new URL(trimmed);\n return undefined;\n } catch {\n return \"Please enter a valid URL\";\n }\n },\n });\n\n if (p.isCancel(strapiUrlInput)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Use default if empty or whitespace only\n const strapiUrl = ((strapiUrlInput as string) || \"\").trim() || defaultUrl;\n\n const strapiToken = await p.text({\n message: \"What is your Strapi API token?\",\n placeholder: \"Press Enter to skip (you can add it later in .env)\",\n });\n\n if (p.isCancel(strapiToken)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Trim and check if empty\n const trimmedToken = ((strapiToken as string) || \"\").trim();\n\n // Show hint if token is empty\n if (trimmedToken === \"\") {\n p.log.info(pc.dim(\"Token skipped. Remember to add STRAPI_TOKEN to your .env file later.\"));\n }\n\n // Strapi version\n const strapiVersion = await p.select({\n message: \"What version of Strapi are you using?\",\n options: [\n { value: \"v5\", label: \"Strapi v5\", hint: \"Recommended - Latest version\" },\n { value: \"v4\", label: \"Strapi v4\", hint: \"Legacy version\" },\n ],\n initialValue: \"v5\",\n });\n\n if (p.isCancel(strapiVersion)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n p.log.info(pc.dim(`Using Strapi ${strapiVersion}. This can be changed later in strapi.config.ts`));\n\n // API Prefix\n const defaultPrefix = \"/api\";\n const apiPrefixInput = await p.text({\n message: \"What is your Strapi API prefix?\",\n placeholder: `${defaultPrefix} (press Enter for default)`,\n validate: (value): string | undefined => {\n const trimmed = (value || \"\").trim();\n if (trimmed === \"\") return undefined;\n if (!trimmed.startsWith(\"/\")) {\n return \"API prefix must start with /\";\n }\n return undefined;\n },\n });\n\n if (p.isCancel(apiPrefixInput)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n const apiPrefix = ((apiPrefixInput as string) || \"\").trim() || defaultPrefix;\n\n if (apiPrefix !== defaultPrefix) {\n p.log.info(pc.dim(`Using custom API prefix: ${apiPrefix}`));\n }\n\n // Output directory\n const outputDir = await p.text({\n message: \"Where should we generate the Strapi files?\",\n placeholder: \"src/strapi\",\n defaultValue: \"src/strapi\",\n });\n\n if (p.isCancel(outputDir)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Features to generate - labels depend on output format\n const isTypeScript = outputFormat === \"typescript\";\n const featureOptions = [\n {\n value: \"types\",\n label: isTypeScript ? \"Types\" : \"Type Definitions\",\n hint: isTypeScript\n ? \"TypeScript interfaces for your content types\"\n : \"JSDoc type definitions for your content types\"\n },\n {\n value: \"services\",\n label: \"Services\",\n hint: isTypeScript\n ? \"Typed service functions for data fetching\"\n : \"Service functions with JSDoc annotations\"\n },\n ];\n\n // Only show Astro Actions if available (requires TypeScript)\n if (canGenerateActions && isTypeScript) {\n featureOptions.push({ value: \"actions\", label: \"Astro Actions\", hint: \"Type-safe actions for client/server\" });\n }\n\n const initialFeatures = (canGenerateActions && isTypeScript)\n ? [\"types\", \"services\", \"actions\"]\n : [\"types\", \"services\"];\n\n const features = await p.multiselect({\n message: \"What would you like to generate?\",\n options: featureOptions,\n initialValues: initialFeatures,\n required: true,\n });\n\n if (p.isCancel(features)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n return {\n strapiUrl: strapiUrl,\n strapiToken: trimmedToken,\n strapiVersion: strapiVersion as \"v4\" | \"v5\",\n apiPrefix: apiPrefix,\n outputFormat: outputFormat,\n outputDir: ((outputDir as string) || \"\").trim() || \"src/strapi\",\n generateActions: canGenerateActions && isTypeScript && (features as string[]).includes(\"actions\"),\n generateServices: (features as string[]).includes(\"services\"),\n };\n}\n\nexport async function confirmOverwrite(files: string[]): Promise<boolean> {\n const confirm = await p.confirm({\n message: `The following files will be overwritten:\\n${files.map((f) => ` - ${f}`).join(\"\\n\")}\\n\\nContinue?`,\n initialValue: true,\n });\n\n return !p.isCancel(confirm) && confirm === true;\n}\n","import pc from 'picocolors';\n\nexport const logger = {\n info: (message: string) => {\n console.log(pc.blue(\"i\"), message);\n },\n\n success: (message: string) => {\n console.log(pc.green(\"v\"), message);\n },\n\n warn: (message: string) => {\n console.log(pc.yellow(\"!\"), message);\n },\n\n error: (message: string) => {\n console.log(pc.red(\"x\"), message);\n },\n\n step: (message: string) => {\n console.log(pc.cyan(\">\"), message);\n },\n\n dim: (message: string) => {\n console.log(pc.dim(message));\n },\n\n newLine: () => {\n console.log(\"\");\n },\n};\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { detectFramework } from \"../lib/detectors/framework.js\";\nimport { detectTypeScript } from \"../lib/detectors/typescript.js\";\nimport { detectPackageManager, getInstallCommand, getInstallDevCommand } from \"../lib/detectors/package-manager.js\";\nimport { runInitPrompts } from \"../lib/prompts/init.prompts.js\";\nimport { logger } from \"../lib/utils/logger.js\";\n\n/**\n * Execute a shell command asynchronously\n * This allows spinners to animate while the command runs\n */\nfunction execAsync(command: string, cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const [cmd, ...args] = command.split(\" \");\n const child = spawn(cmd, args, {\n cwd,\n stdio: \"ignore\",\n shell: true,\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n });\n}\n\nexport interface InitCommandOptions {\n yes?: boolean;\n url?: string;\n token?: string;\n framework?: string;\n}\n\nexport async function initCommand(_options: InitCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Detect project configuration\n const s = p.spinner();\n s.start(\"Detecting project configuration...\");\n\n const [framework, typescript, packageManager] = await Promise.all([\n detectFramework(cwd),\n detectTypeScript(cwd),\n detectPackageManager(cwd),\n ]);\n\n s.stop(\"Project configuration detected\");\n\n // Run interactive prompts\n const answers = await runInitPrompts({\n framework,\n typescript,\n packageManager,\n });\n\n if (!answers) {\n return;\n }\n\n // Create configuration\n s.start(\"Creating configuration files...\");\n\n try {\n // Create config file (use .js extension for JSDoc projects)\n const configExtension = answers.outputFormat === \"jsdoc\" ? \"js\" : \"ts\";\n const configContent = generateConfigFile({\n strapiUrl: answers.strapiUrl,\n strapiVersion: answers.strapiVersion,\n apiPrefix: answers.apiPrefix,\n outputFormat: answers.outputFormat,\n outputDir: answers.outputDir,\n generateActions: answers.generateActions,\n generateServices: answers.generateServices,\n });\n const configPath = path.join(cwd, `strapi.config.${configExtension}`);\n await fs.writeFile(configPath, configContent, \"utf-8\");\n\n // Update .env file\n const envPath = path.join(cwd, \".env\");\n await appendToEnvFile(envPath, {\n STRAPI_URL: answers.strapiUrl,\n STRAPI_TOKEN: answers.strapiToken,\n });\n\n // Create output directory\n const outputPath = path.join(cwd, answers.outputDir);\n await fs.mkdir(outputPath, { recursive: true });\n\n s.stop(\"Configuration files created\");\n\n // Install dependencies\n const installDeps = await p.confirm({\n message: \"Install required dependencies (strapi2front, strapi-sdk-js)?\",\n initialValue: true,\n });\n\n if (p.isCancel(installDeps)) {\n p.cancel(\"Setup cancelled\");\n process.exit(0);\n }\n\n if (installDeps) {\n // Install strapi2front as dev dependency (needed for config file)\n const installStrapi2frontCmd = getInstallDevCommand(packageManager.name, \"strapi2front\");\n s.start(`Installing strapi2front... (${pc.dim(installStrapi2frontCmd)})`);\n try {\n await execAsync(installStrapi2frontCmd, cwd);\n s.stop(`${pc.green(\"✓\")} strapi2front installed`);\n } catch {\n s.stop(`${pc.red(\"✗\")} Failed to install strapi2front`);\n logger.warn(`Please install manually: ${installStrapi2frontCmd}`);\n }\n\n // Install strapi-sdk-js as regular dependency\n const installSdkCmd = getInstallCommand(packageManager.name, \"strapi-sdk-js\");\n s.start(`Installing strapi-sdk-js... (${pc.dim(installSdkCmd)})`);\n try {\n await execAsync(installSdkCmd, cwd);\n s.stop(`${pc.green(\"✓\")} strapi-sdk-js installed`);\n } catch {\n s.stop(`${pc.red(\"✗\")} Failed to install strapi-sdk-js`);\n logger.warn(`Please install manually: ${installSdkCmd}`);\n }\n } else {\n p.log.info(pc.dim(\"Remember to install dependencies manually:\"));\n p.log.info(pc.dim(` ${getInstallDevCommand(packageManager.name, \"strapi2front\")}`));\n p.log.info(pc.dim(` ${getInstallCommand(packageManager.name, \"strapi-sdk-js\")}`));\n }\n\n // Show success message\n const configFileName = `strapi.config.${configExtension}`;\n const fileExt = answers.outputFormat === \"jsdoc\" ? \".js\" : \".ts\";\n p.note(\n [\n `${pc.green(\"✓\")} Created ${pc.cyan(configFileName)}`,\n `${pc.green(\"✓\")} Updated ${pc.cyan(\".env\")} with Strapi credentials`,\n `${pc.green(\"✓\")} Created output directory ${pc.cyan(answers.outputDir)}`,\n \"\",\n `Output format: ${pc.cyan(answers.outputFormat === \"jsdoc\" ? \"JavaScript (JSDoc)\" : \"TypeScript\")}`,\n \"\",\n `Next steps:`,\n ` 1. Run ${pc.cyan(\"npx strapi2front sync\")} to generate files`,\n ` 2. Import from ${pc.cyan(answers.outputDir + \"/collections/*\" + fileExt)}`,\n ` 3. Import services from ${pc.cyan(answers.outputDir + \"/collections/*.service\" + fileExt)}`,\n ].join(\"\\n\"),\n \"Setup complete!\"\n );\n\n p.outro(pc.green(\"Happy coding!\"));\n } catch (error) {\n s.stop(\"Failed to create configuration files\");\n logger.error(error instanceof Error ? error.message : \"Unknown error\");\n process.exit(1);\n }\n}\n\nfunction generateConfigFile(answers: {\n strapiUrl: string;\n strapiVersion: \"v4\" | \"v5\";\n apiPrefix: string;\n outputFormat: \"typescript\" | \"jsdoc\";\n outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}): string {\n const isTypeScript = answers.outputFormat === \"typescript\";\n\n if (isTypeScript) {\n return `import { defineConfig } from \"strapi2front\";\n\nexport default defineConfig({\n // Strapi connection\n url: process.env.STRAPI_URL || \"${answers.strapiUrl}\",\n token: process.env.STRAPI_TOKEN,\n\n // API prefix (default: \"/api\")\n apiPrefix: \"${answers.apiPrefix}\",\n\n // Output format: \"typescript\" (.ts) or \"jsdoc\" (.js with JSDoc)\n outputFormat: \"typescript\",\n\n // Output configuration\n output: {\n path: \"${answers.outputDir}\",\n types: \"types\",\n services: \"services\",\n actions: \"actions/strapi\",\n structure: 'by-feature' // or 'by-layer'\n },\n\n // Features to generate\n features: {\n types: true,\n services: ${answers.generateServices},\n actions: ${answers.generateActions},\n },\n\n // Strapi version\n strapiVersion: \"${answers.strapiVersion}\",\n});\n`;\n }\n\n // JSDoc config (JavaScript)\n return `// @ts-check\nconst { defineConfig } = require(\"strapi2front\");\n\nmodule.exports = defineConfig({\n // Strapi connection\n url: process.env.STRAPI_URL || \"${answers.strapiUrl}\",\n token: process.env.STRAPI_TOKEN,\n\n // API prefix (default: \"/api\")\n apiPrefix: \"${answers.apiPrefix}\",\n\n // Output format: \"typescript\" (.ts) or \"jsdoc\" (.js with JSDoc)\n outputFormat: \"jsdoc\",\n\n // Output configuration\n output: {\n path: \"${answers.outputDir}\",\n types: \"types\",\n services: \"services\",\n structure: 'by-feature' // or 'by-layer'\n },\n\n // Features to generate\n features: {\n types: true,\n services: ${answers.generateServices},\n actions: false, // Actions require TypeScript\n },\n\n // Strapi version\n strapiVersion: \"${answers.strapiVersion}\",\n});\n`;\n}\n\nasync function appendToEnvFile(\n envPath: string,\n variables: Record<string, string>\n): Promise<void> {\n let content = \"\";\n\n try {\n content = await fs.readFile(envPath, \"utf-8\");\n } catch {\n // File does not exist, create new\n }\n\n const lines = content.split(\"\\n\");\n const existingKeys = new Set(\n lines\n .filter((line) => line.includes(\"=\"))\n .map((line) => line.split(\"=\")[0].trim())\n );\n\n const newLines: string[] = [];\n\n for (const [key, value] of Object.entries(variables)) {\n if (!existingKeys.has(key)) {\n newLines.push(`${key}=${value}`);\n }\n }\n\n if (newLines.length > 0) {\n const separator = content.endsWith(\"\\n\") || content === \"\" ? \"\" : \"\\n\";\n const newContent = content + separator + newLines.join(\"\\n\") + \"\\n\";\n await fs.writeFile(envPath, newContent, \"utf-8\");\n }\n}\n\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type ModuleType = \"esm\" | \"commonjs\";\n\nexport interface ModuleTypeInfo {\n type: ModuleType;\n reason: string;\n}\n\n/**\n * Detect if the project uses ES Modules or CommonJS\n *\n * Detection order:\n * 1. Check package.json \"type\" field\n * 2. Check for .mjs config files (next.config.mjs, etc.)\n * 3. Default to CommonJS\n */\nexport async function detectModuleType(cwd: string = process.cwd()): Promise<ModuleTypeInfo> {\n // Check package.json \"type\" field\n try {\n const packageJsonPath = path.join(cwd, \"package.json\");\n const content = await fs.readFile(packageJsonPath, \"utf-8\");\n const packageJson = JSON.parse(content);\n\n if (packageJson.type === \"module\") {\n return { type: \"esm\", reason: 'package.json has \"type\": \"module\"' };\n }\n\n if (packageJson.type === \"commonjs\") {\n return { type: \"commonjs\", reason: 'package.json has \"type\": \"commonjs\"' };\n }\n } catch {\n // package.json not found or invalid\n }\n\n // Check for .mjs config files (indicates ESM preference)\n const esmIndicators = [\n \"next.config.mjs\",\n \"nuxt.config.mjs\",\n \"vite.config.mjs\",\n \"astro.config.mjs\",\n ];\n\n for (const file of esmIndicators) {\n try {\n await fs.access(path.join(cwd, file));\n return { type: \"esm\", reason: `Found ${file} (ESM config file)` };\n } catch {\n // File doesn't exist\n }\n }\n\n // Default to CommonJS (Node.js default)\n return { type: \"commonjs\", reason: \"Default (no ESM indicators found)\" };\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { loadConfig } from \"@strapi2front/core\";\nimport { fetchSchema, detectStrapiVersion } from \"@strapi2front/core\";\nimport { parseSchema } from \"@strapi2front/core\";\nimport type { StrapiVersion } from \"@strapi2front/core\";\nimport type { ParsedSchema, Attribute } from \"@strapi2front/core\";\nimport { generateTypes } from \"@strapi2front/generators\";\nimport { generateServices } from \"@strapi2front/generators\";\nimport { generateActions } from \"@strapi2front/generators\";\nimport { generateClient } from \"@strapi2front/generators\";\nimport { generateLocales } from \"@strapi2front/generators\";\nimport { generateByFeature } from \"@strapi2front/generators\";\nimport { logger } from \"../lib/utils/logger.js\";\nimport { detectModuleType } from \"../lib/detectors/module-type.js\";\n\nconst BLOCKS_RENDERER_PACKAGE = \"@strapi/blocks-react-renderer\";\n\n/**\n * Check if schema contains any blocks fields\n */\nfunction schemaHasBlocks(schema: ParsedSchema): { hasBlocks: boolean; fieldsFound: string[] } {\n const fieldsFound: string[] = [];\n\n const checkAttributes = (typeName: string, attributes: Record<string, Attribute>): void => {\n for (const [fieldName, attr] of Object.entries(attributes)) {\n if (attr.type === \"blocks\") {\n fieldsFound.push(`${typeName}.${fieldName}`);\n }\n }\n };\n\n for (const collection of schema.collections) {\n checkAttributes(collection.singularName, collection.attributes);\n }\n\n for (const single of schema.singles) {\n checkAttributes(single.singularName, single.attributes);\n }\n\n for (const component of schema.components) {\n checkAttributes(`component:${component.name}`, component.attributes);\n }\n\n return { hasBlocks: fieldsFound.length > 0, fieldsFound };\n}\n\n/**\n * Check if a package is installed\n */\nfunction isPackageInstalled(packageName: string, cwd: string): boolean {\n try {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) return false;\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n return packageName in deps;\n } catch {\n return false;\n }\n}\n\n/**\n * Detect package manager\n */\nfunction detectPackageManager(cwd: string): \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" {\n if (fs.existsSync(path.join(cwd, \"bun.lockb\"))) return \"bun\";\n if (fs.existsSync(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (fs.existsSync(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\n/**\n * Install a package\n */\nfunction installPackage(packageName: string, cwd: string): void {\n const pm = detectPackageManager(cwd);\n const commands: Record<string, string> = {\n npm: `npm install ${packageName}`,\n yarn: `yarn add ${packageName}`,\n pnpm: `pnpm add ${packageName}`,\n bun: `bun add ${packageName}`,\n };\n\n execSync(commands[pm], { cwd, stdio: \"inherit\" });\n}\n\n/**\n * Structure type for output organization\n */\ntype OutputStructure = \"by-layer\" | \"by-feature\";\n\n/**\n * Get orphaned folders from the opposite structure\n */\nfunction getOrphanedFolders(outputPath: string, currentStructure: OutputStructure): string[] {\n const orphanedFolders: string[] = [];\n\n if (currentStructure === \"by-feature\") {\n // If using by-feature, check for by-layer folders\n const byLayerFolders = [\"types\", \"services\", \"actions\"];\n for (const folder of byLayerFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n // Also check for root-level client.ts and locales.ts (by-layer puts them at root)\n if (fs.existsSync(path.join(outputPath, \"client.ts\"))) {\n orphanedFolders.push(\"client.ts\");\n }\n if (fs.existsSync(path.join(outputPath, \"locales.ts\"))) {\n orphanedFolders.push(\"locales.ts\");\n }\n } else {\n // If using by-layer, check for by-feature folders\n const byFeatureFolders = [\"collections\", \"singles\", \"shared\", \"components\"];\n for (const folder of byFeatureFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n }\n\n return orphanedFolders;\n}\n\n/**\n * Remove orphaned folders/files\n */\nfunction cleanOrphanedFiles(outputPath: string, orphanedItems: string[]): void {\n for (const item of orphanedItems) {\n const itemPath = path.join(outputPath, item);\n if (fs.existsSync(itemPath)) {\n const stat = fs.statSync(itemPath);\n if (stat.isDirectory()) {\n fs.rmSync(itemPath, { recursive: true, force: true });\n } else {\n fs.unlinkSync(itemPath);\n }\n }\n }\n}\n\nexport interface SyncCommandOptions {\n force?: boolean;\n typesOnly?: boolean;\n servicesOnly?: boolean;\n actionsOnly?: boolean;\n clean?: boolean;\n}\n\nexport async function syncCommand(options: SyncCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n p.intro(pc.cyan(\"strapi2front sync\"));\n\n const s = p.spinner();\n\n try {\n // Load configuration\n s.start(\"Loading configuration...\");\n let config = await loadConfig(cwd);\n s.stop(\"Configuration loaded\");\n\n // Detect and validate Strapi version\n s.start(\"Detecting Strapi version...\");\n const versionResult = await detectStrapiVersion(config.url, config.token, config.apiPrefix);\n s.stop(\"Version detection complete\");\n\n let effectiveVersion: StrapiVersion = config.strapiVersion;\n\n if (versionResult.detected) {\n if (versionResult.detected !== config.strapiVersion) {\n // Version mismatch detected\n if (versionResult.detected === \"v5\" && config.strapiVersion === \"v4\") {\n p.log.warn(\n pc.yellow(`Detected Strapi ${pc.bold(\"v5\")} but config has ${pc.bold(\"v4\")}. Using v5.`)\n );\n effectiveVersion = \"v5\";\n } else if (versionResult.detected === \"v4\" && config.strapiVersion === \"v5\") {\n p.log.warn(\n pc.yellow(`Detected Strapi ${pc.bold(\"v4\")} but config has ${pc.bold(\"v5\")}. Using v4.`)\n );\n effectiveVersion = \"v4\";\n }\n } else {\n p.log.info(`Strapi ${pc.green(pc.bold(config.strapiVersion))}`);\n }\n } else {\n p.log.warn(pc.yellow(`Could not detect Strapi version. Using ${pc.bold(config.strapiVersion)}`));\n }\n\n // Update config with effective version for this sync\n config = { ...config, strapiVersion: effectiveVersion };\n\n // Fetch schema from Strapi\n s.start(\"Fetching schema from Strapi...\");\n const rawSchema = await fetchSchema(config.url, config.token, config.apiPrefix);\n const schema = parseSchema(rawSchema);\n s.stop(`Schema fetched: ${schema.collections.length} collections, ${schema.singles.length} singles, ${schema.components.length} components`);\n\n // Check for Blocks fields and prompt for renderer package\n let blocksRendererInstalled = isPackageInstalled(BLOCKS_RENDERER_PACKAGE, cwd);\n const { hasBlocks: hasBlocksFields, fieldsFound: blocksFieldsFound } = schemaHasBlocks(schema);\n\n if (hasBlocksFields && !blocksRendererInstalled) {\n p.log.info(`Blocks fields detected: ${pc.cyan(blocksFieldsFound.join(\", \"))}`);\n\n const installBlocks = await p.confirm({\n message: `Install ${pc.cyan(BLOCKS_RENDERER_PACKAGE)} for proper type support and rendering?`,\n initialValue: true,\n });\n\n if (p.isCancel(installBlocks)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n\n if (installBlocks) {\n s.start(`Installing ${BLOCKS_RENDERER_PACKAGE}...`);\n try {\n installPackage(BLOCKS_RENDERER_PACKAGE, cwd);\n blocksRendererInstalled = true;\n s.stop(`${BLOCKS_RENDERER_PACKAGE} installed`);\n } catch (error) {\n s.stop(`Failed to install ${BLOCKS_RENDERER_PACKAGE}`);\n logger.warn(\"You can install it manually later and re-run sync\");\n }\n } else {\n p.log.info(pc.dim(`Skipping ${BLOCKS_RENDERER_PACKAGE}. BlocksContent will be typed as unknown[]`));\n }\n }\n\n const outputPath = path.join(cwd, config.output.path);\n const generatedFiles: string[] = [];\n\n // Determine what to generate\n const generateAll = !options.typesOnly && !options.servicesOnly && !options.actionsOnly;\n\n // Check structure mode\n const isByFeature = config.output.structure === 'by-feature';\n const currentStructure: OutputStructure = isByFeature ? \"by-feature\" : \"by-layer\";\n\n // Check for orphaned files from previous structure\n if (fs.existsSync(outputPath)) {\n const orphanedFolders = getOrphanedFolders(outputPath, currentStructure);\n\n if (orphanedFolders.length > 0) {\n const otherStructure = isByFeature ? \"by-layer\" : \"by-feature\";\n p.log.warn(\n pc.yellow(`Found files from previous ${pc.bold(otherStructure)} structure:`)\n );\n p.log.message(pc.dim(` ${orphanedFolders.join(\", \")}`));\n\n let shouldClean = options.clean;\n\n if (!shouldClean) {\n const cleanResponse = await p.confirm({\n message: `Remove orphaned ${otherStructure} files?`,\n initialValue: true,\n });\n\n if (p.isCancel(cleanResponse)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n\n shouldClean = cleanResponse;\n }\n\n if (shouldClean) {\n s.start(\"Cleaning orphaned files...\");\n cleanOrphanedFiles(outputPath, orphanedFolders);\n s.stop(`Removed: ${orphanedFolders.join(\", \")}`);\n } else {\n p.log.info(pc.dim(\"Keeping orphaned files. You can clean them manually or use --clean flag.\"));\n }\n }\n }\n\n // Get output format from config (default to typescript)\n const outputFormat = config.outputFormat || \"typescript\";\n\n // Detect module type for JSDoc output (ESM vs CommonJS)\n let moduleType: \"esm\" | \"commonjs\" = \"commonjs\";\n if (outputFormat === \"jsdoc\") {\n if (config.moduleType) {\n moduleType = config.moduleType;\n p.log.info(`Module type: ${pc.cyan(moduleType)} (from config)`);\n } else {\n const detected = await detectModuleType(cwd);\n moduleType = detected.type;\n p.log.info(`Module type: ${pc.cyan(moduleType)} (${detected.reason})`);\n }\n }\n\n if (isByFeature) {\n // Generate using by-feature structure (screaming architecture)\n s.start(`Generating files (by-feature, ${outputFormat})...`);\n const files = await generateByFeature(schema, rawSchema.locales, {\n outputDir: outputPath,\n features: {\n types: config.features.types && (generateAll || Boolean(options.typesOnly)),\n services: config.features.services && (generateAll || Boolean(options.servicesOnly)),\n actions: config.features.actions && outputFormat === \"typescript\" && (generateAll || Boolean(options.actionsOnly)),\n },\n blocksRendererInstalled,\n strapiVersion: config.strapiVersion,\n apiPrefix: config.apiPrefix,\n outputFormat,\n moduleType,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} files`);\n } else {\n // Generate using by-layer structure (default)\n\n // Generate types\n if (generateAll || options.typesOnly) {\n if (config.features.types) {\n s.start(`Generating types (${outputFormat})...`);\n const typesPath = path.join(outputPath, config.output.types);\n const files = await generateTypes(schema, {\n outputDir: typesPath,\n blocksRendererInstalled,\n strapiVersion: config.strapiVersion,\n outputFormat,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} type files`);\n }\n }\n\n // Generate client (needed by services)\n if (generateAll || options.servicesOnly) {\n if (config.features.services) {\n s.start(\"Generating client...\");\n const clientFiles = await generateClient({ outputDir: outputPath, strapiVersion: config.strapiVersion, apiPrefix: config.apiPrefix });\n generatedFiles.push(...clientFiles);\n s.stop(\"Generated client\");\n\n // Generate locales (for i18n support)\n s.start(\"Generating locales...\");\n const localesFiles = await generateLocales(rawSchema.locales, { outputDir: outputPath });\n generatedFiles.push(...localesFiles);\n if (rawSchema.locales.length > 0) {\n s.stop(`Generated locales: ${rawSchema.locales.map(l => l.code).join(\", \")}`);\n } else {\n s.stop(\"Generated locales (i18n not enabled in Strapi)\");\n }\n }\n }\n\n // Generate services\n if (generateAll || options.servicesOnly) {\n if (config.features.services) {\n s.start(`Generating services (${outputFormat})...`);\n const servicesPath = path.join(outputPath, config.output.services);\n const typesImportPath = path.relative(servicesPath, path.join(outputPath, config.output.types)).replace(/\\\\/g, \"/\") || \".\";\n const files = await generateServices(schema, {\n outputDir: servicesPath,\n typesImportPath: typesImportPath.startsWith(\".\") ? typesImportPath : \"./\" + typesImportPath,\n strapiVersion: config.strapiVersion,\n outputFormat,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} service files`);\n }\n }\n\n // Generate actions (only for TypeScript projects)\n if ((generateAll || options.actionsOnly) && outputFormat === \"typescript\") {\n if (config.features.actions) {\n s.start(\"Generating Astro actions...\");\n const actionsPath = path.join(outputPath, config.output.actions);\n const servicesPath = path.join(outputPath, config.output.services);\n\n const servicesImportPath = path.relative(actionsPath, servicesPath).replace(/\\\\/g, \"/\") || \".\";\n\n const files = await generateActions(schema, {\n outputDir: actionsPath,\n servicesImportPath: servicesImportPath.startsWith(\".\") ? servicesImportPath : \"./\" + servicesImportPath,\n strapiVersion: config.strapiVersion,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} action files`);\n }\n }\n }\n\n // Show summary\n p.note(\n [\n `Generated ${generatedFiles.length} files in ${pc.cyan(config.output.path)}`,\n \"\",\n \"Files generated:\",\n ...generatedFiles.slice(0, 10).map((f) => ` ${pc.dim(path.relative(cwd, f))}`),\n generatedFiles.length > 10 ? ` ${pc.dim(`... and ${generatedFiles.length - 10} more`)}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n \"Sync complete!\"\n );\n\n p.outro(pc.green(\"Types and services are ready to use!\"));\n } catch (error) {\n s.stop(\"Sync failed\");\n\n if (error instanceof Error) {\n logger.error(error.message);\n\n if (error.message.includes(\"Could not find strapi.config\")) {\n logger.info(\"Run \\\"npx strapi2front init\\\" first to set up your project.\");\n }\n } else {\n logger.error(\"An unknown error occurred\");\n }\n\n process.exit(1);\n }\n}\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { initCommand } from '../commands/init.js';\nimport { syncCommand } from '../commands/sync.js';\n\nconst program = new Command();\n\n// ASCII Art Logo\nconst logo = `\n _ _ ___ __ _\n ___| |_ _ __ __ _ _ __ (_)__ \\\\ / _|_ __ ___ _ __ | |_\n/ __| __| '__/ _\\` | '_ \\\\| | / /| |_| '__/ _ \\\\| '_ \\\\| __|\n\\\\__ \\\\ |_| | | (_| | |_) | ||_| | _| | | (_) | | | | |_\n|___/\\\\__|_| \\\\__,_| .__/|_|(_) |_| |_| \\\\___/|_| |_|\\\\__|\n |_|\n`;\n\nprogram\n .name('strapi2front')\n .description('Generate TypeScript types, services, and framework actions from your Strapi schema')\n .version('0.1.0')\n .addHelpText('beforeAll', pc.cyan(logo));\n\n// Init command\nprogram\n .command('init')\n .description('Initialize strapi2front in your project')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .option('--url <url>', 'Strapi URL')\n .option('--token <token>', 'Strapi API token')\n .option('--framework <framework>', 'Framework to use (astro)')\n .action(initCommand);\n\n// Sync command\nprogram\n .command('sync')\n .description('Sync types, services, and actions from Strapi schema')\n .option('-f, --force', 'Force regeneration of all files')\n .option('--types-only', 'Only generate types')\n .option('--services-only', 'Only generate services')\n .option('--actions-only', 'Only generate actions')\n .option('--clean', 'Automatically remove orphaned files from previous structure')\n .action(syncCommand);\n\n// If no command is provided, run init by default\nconst args = process.argv.slice(2);\nconst commands = ['init', 'sync', 'help', '--help', '-h', '--version', '-V'];\nconst hasCommand = args.some((arg) => commands.includes(arg));\n\nif (args.length === 0 || !hasCommand) {\n // Show logo and run init\n console.log(pc.cyan(logo));\n initCommand({});\n} else {\n // Parse args normally\n program.parse();\n}\n"]}