strapi2front 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  <div align="center">
2
- <a href="https://strapi2front.dev">
2
+ <!-- <a href="https://strapi2front.dev">
3
3
  <picture>
4
4
  <source media="(prefers-color-scheme: dark)" srcset="https://strapi2front.dev/logo-dark.svg">
5
5
  <img alt="strapi2front logo" src="https://strapi2front.dev/logo-light.svg" height="128">
6
6
  </picture>
7
- </a>
7
+ </a> -->
8
8
  <h1>strapi2front</h1>
9
9
 
10
10
  <a href="https://elevenestudio.com"><img alt="Made by Eleven Estudio" src="https://img.shields.io/badge/MADE%20BY%20Eleven%20Estudio-000000.svg?style=for-the-badge&labelColor=000"></a>
@@ -36,6 +36,7 @@ npx strapi2front sync
36
36
  ⊹ **Type Generation** - Auto-generate TypeScript interfaces from your Strapi schema\
37
37
  ⊹ **Service Generation** - Create typed service functions for all content types\
38
38
  ⊹ **Astro Actions** - Generate type-safe Astro Actions for client/server data fetching\
39
+ ⊹ **JSDoc Support** - Generate JavaScript files with JSDoc annotations (no TypeScript required)\
39
40
  ⊹ **Smart Detection** - Automatically detects framework, TypeScript, and package manager\
40
41
  ⊹ **Strapi v4 & v5** - Full support for both Strapi versions\
41
42
  ⊹ **By-Feature Structure** - Organize generated code by feature (screaming architecture)
@@ -65,16 +66,105 @@ src/strapi/
65
66
 
66
67
  - Node.js 18+
67
68
  - Strapi v4 or v5
68
- - Astro 4+ (more frameworks coming soon)
69
+ - Astro 4+ (for Astro Actions, more frameworks coming soon)
69
70
 
70
- ## Learn more
71
+ ---
72
+
73
+ ## Quick Setup
74
+
75
+ ### 1. Create a Strapi API Token
76
+
77
+ You need an API token with **read-only access** to the Content-Type Builder:
78
+
79
+ 1. Go to **Strapi Admin** → **Settings** → **API Tokens**
80
+ 2. Create a new **Custom** token
81
+ 3. Enable these permissions:
82
+ - **Content-type-builder**: `getComponents`, `getComponent`, `getContentTypes`, `getContentType`
83
+ - **I18n** (optional): `listLocales`
84
+ 4. Add the token to your `.env`:
85
+
86
+ ```env
87
+ STRAPI_TOKEN=your-token-here
88
+ ```
89
+
90
+ > This token only reads schema structure, not your content data.
91
+
92
+ ### 2. Initialize
93
+
94
+ ```bash
95
+ npx strapi2front@latest init
96
+ ```
97
+
98
+ ### 3. Sync Types
99
+
100
+ ```bash
101
+ npx strapi2front sync
102
+ ```
103
+
104
+ ---
105
+
106
+ ## Configuration
107
+
108
+ After init, a `strapi.config.ts` is created:
109
+
110
+ ```typescript
111
+ import { defineConfig } from "strapi2front";
112
+
113
+ export default defineConfig({
114
+ url: "http://localhost:1337",
115
+ strapiVersion: "v5",
116
+ apiPrefix: "/api",
117
+ output: {
118
+ path: "src/strapi",
119
+ },
120
+ features: {
121
+ types: true,
122
+ services: true,
123
+ actions: true,
124
+ },
125
+ });
126
+ ```
127
+
128
+ ### Key Options
129
+
130
+ | Option | Description |
131
+ |--------|-------------|
132
+ | `url` | Your Strapi instance URL |
133
+ | `strapiVersion` | `"v4"` or `"v5"` |
134
+ | `apiPrefix` | API prefix (default: `/api`) |
135
+ | `outputFormat` | `"typescript"` or `"jsdoc"` |
136
+ | `moduleType` | `"esm"` or `"commonjs"` (auto-detected) |
137
+ | `output.path` | Where to generate files |
138
+ | `output.structure` | `"by-feature"` or `"by-layer"` |
139
+
140
+ ### Environment Variables
141
+
142
+ ```env
143
+ STRAPI_URL=http://localhost:1337
144
+ STRAPI_TOKEN=your-api-token
145
+ STRAPI_API_PREFIX=/api
146
+ ```
147
+
148
+ ---
149
+
150
+ ## Framework Support
151
+
152
+ | Framework | Types | Services | Actions |
153
+ |-----------|-------|----------|---------|
154
+ | Astro 4+ | ✅ | ✅ | ✅ |
155
+ | Next.js | ✅ | ✅ | 🔜 Soon |
156
+ | Nuxt | ✅ | ✅ | 🔜 Soon |
157
+ | Other | ✅ | ✅ | ❌ |
158
+
159
+ ---
160
+
161
+ ## Full Documentation
71
162
 
72
- Visit [strapi2front.dev](https://strapi2front.dev) to learn more about the project.\
73
- ⊹ Visit [strapi2front.dev/docs](https://strapi2front.dev/docs) to view the full documentation.
163
+ For complete documentation including troubleshooting, advanced configuration, and examples, see the [main README](https://github.com/eleven-estudio/strapi2front#readme).
74
164
 
75
165
  ## Contributing
76
166
 
77
- We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
167
+ We welcome contributions! Please see our [Contributing Guide](../../CONTRIBUTING.md) for details.
78
168
 
79
169
  ## Security
80
170
 
@@ -84,7 +174,7 @@ Please report any issues to [hello@elevenestudio.com](mailto:hello@elevenestudio
84
174
 
85
175
  ## License
86
176
 
87
- MIT - see [LICENSE](LICENSE) for details.
177
+ MIT - see [LICENSE](../../LICENSE) for details.
88
178
 
89
179
  ## Disclaimer
90
180
 
@@ -220,6 +220,19 @@ async function runInitPrompts(detection) {
220
220
  return null;
221
221
  }
222
222
  const strapiUrl = (strapiUrlInput || "").trim() || defaultUrl;
223
+ p.log.message(
224
+ pc4.dim(
225
+ `
226
+ To generate a token: Strapi Admin > Settings > API Tokens > Create new API Token
227
+ Required permissions:
228
+ Content-type-builder:
229
+ - Components: getComponents, getComponent
230
+ - Content-types: getContentTypes, getContentType
231
+ I18n (if using localization):
232
+ - Locales: listLocales
233
+ `
234
+ )
235
+ );
223
236
  const strapiToken = await p.text({
224
237
  message: "What is your Strapi API token?",
225
238
  placeholder: "Press Enter to skip (you can add it later in .env)"
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/detectors/framework.ts","../../src/lib/detectors/typescript.ts","../../src/lib/detectors/package-manager.ts","../../src/lib/detectors/module-type.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 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 { 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 { detectModuleType } from \"../lib/detectors/module-type.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 // Detect module type for JSDoc projects\n let moduleType: \"esm\" | \"commonjs\" = \"commonjs\";\n if (answers.outputFormat === \"jsdoc\") {\n const detected = await detectModuleType(cwd);\n moduleType = detected.type;\n }\n\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 moduleType,\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 moduleType: \"esm\" | \"commonjs\";\n}): string {\n const isTypeScript = answers.outputFormat === \"typescript\";\n const useESM = answers.moduleType === \"esm\";\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) - ESM or CommonJS based on project type\n if (useESM) {\n return `// @ts-check\nimport { 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: \"jsdoc\",\n\n // Module type: auto-detected as ESM\n moduleType: \"esm\",\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\n // CommonJS config\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\";\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"]}
1
+ {"version":3,"sources":["../../src/lib/detectors/framework.ts","../../src/lib/detectors/typescript.ts","../../src/lib/detectors/package-manager.ts","../../src/lib/detectors/module-type.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 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 { 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 // Show token permissions hint\n p.log.message(\n pc.dim(\n `\\n To generate a token: Strapi Admin > Settings > API Tokens > Create new API Token\\n` +\n ` Required permissions:\\n` +\n ` Content-type-builder:\\n` +\n ` - Components: getComponents, getComponent\\n` +\n ` - Content-types: getContentTypes, getContentType\\n` +\n ` I18n (if using localization):\\n` +\n ` - Locales: listLocales\\n`\n )\n );\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 { detectModuleType } from \"../lib/detectors/module-type.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 // Detect module type for JSDoc projects\n let moduleType: \"esm\" | \"commonjs\" = \"commonjs\";\n if (answers.outputFormat === \"jsdoc\") {\n const detected = await detectModuleType(cwd);\n moduleType = detected.type;\n }\n\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 moduleType,\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 moduleType: \"esm\" | \"commonjs\";\n}): string {\n const isTypeScript = answers.outputFormat === \"typescript\";\n const useESM = answers.moduleType === \"esm\";\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) - ESM or CommonJS based on project type\n if (useESM) {\n return `// @ts-check\nimport { 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: \"jsdoc\",\n\n // Module type: auto-detected as ESM\n moduleType: \"esm\",\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\n // CommonJS config\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\";\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"]}
package/dist/index.js CHANGED
@@ -220,6 +220,19 @@ async function runInitPrompts(detection) {
220
220
  return null;
221
221
  }
222
222
  const strapiUrl = (strapiUrlInput || "").trim() || defaultUrl;
223
+ p.log.message(
224
+ pc4.dim(
225
+ `
226
+ To generate a token: Strapi Admin > Settings > API Tokens > Create new API Token
227
+ Required permissions:
228
+ Content-type-builder:
229
+ - Components: getComponents, getComponent
230
+ - Content-types: getContentTypes, getContentType
231
+ I18n (if using localization):
232
+ - Locales: listLocales
233
+ `
234
+ )
235
+ );
223
236
  const strapiToken = await p.text({
224
237
  message: "What is your Strapi API token?",
225
238
  placeholder: "Press Enter to skip (you can add it later in .env)"
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/detectors/framework.ts","../src/lib/detectors/typescript.ts","../src/lib/detectors/package-manager.ts","../src/lib/detectors/module-type.ts","../src/lib/prompts/init.prompts.ts","../src/lib/utils/logger.ts","../src/commands/init.ts","../src/commands/sync.ts"],"names":["path","fs","pc","p2","detectPackageManager","p3"],"mappings":"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","file":"index.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 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 { 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 { detectModuleType } from \"../lib/detectors/module-type.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 // Detect module type for JSDoc projects\n let moduleType: \"esm\" | \"commonjs\" = \"commonjs\";\n if (answers.outputFormat === \"jsdoc\") {\n const detected = await detectModuleType(cwd);\n moduleType = detected.type;\n }\n\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 moduleType,\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 moduleType: \"esm\" | \"commonjs\";\n}): string {\n const isTypeScript = answers.outputFormat === \"typescript\";\n const useESM = answers.moduleType === \"esm\";\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) - ESM or CommonJS based on project type\n if (useESM) {\n return `// @ts-check\nimport { 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: \"jsdoc\",\n\n // Module type: auto-detected as ESM\n moduleType: \"esm\",\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\n // CommonJS config\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\";\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"]}
1
+ {"version":3,"sources":["../src/lib/detectors/framework.ts","../src/lib/detectors/typescript.ts","../src/lib/detectors/package-manager.ts","../src/lib/detectors/module-type.ts","../src/lib/prompts/init.prompts.ts","../src/lib/utils/logger.ts","../src/commands/init.ts","../src/commands/sync.ts"],"names":["path","fs","pc","p2","detectPackageManager","p3"],"mappings":"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","file":"index.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 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 { 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 // Show token permissions hint\n p.log.message(\n pc.dim(\n `\\n To generate a token: Strapi Admin > Settings > API Tokens > Create new API Token\\n` +\n ` Required permissions:\\n` +\n ` Content-type-builder:\\n` +\n ` - Components: getComponents, getComponent\\n` +\n ` - Content-types: getContentTypes, getContentType\\n` +\n ` I18n (if using localization):\\n` +\n ` - Locales: listLocales\\n`\n )\n );\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 { detectModuleType } from \"../lib/detectors/module-type.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 // Detect module type for JSDoc projects\n let moduleType: \"esm\" | \"commonjs\" = \"commonjs\";\n if (answers.outputFormat === \"jsdoc\") {\n const detected = await detectModuleType(cwd);\n moduleType = detected.type;\n }\n\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 moduleType,\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 moduleType: \"esm\" | \"commonjs\";\n}): string {\n const isTypeScript = answers.outputFormat === \"typescript\";\n const useESM = answers.moduleType === \"esm\";\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) - ESM or CommonJS based on project type\n if (useESM) {\n return `// @ts-check\nimport { 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: \"jsdoc\",\n\n // Module type: auto-detected as ESM\n moduleType: \"esm\",\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\n // CommonJS config\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\";\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strapi2front",
3
- "version": "0.4.1",
3
+ "version": "0.4.2",
4
4
  "description": "Generate TypeScript types, services, and framework actions from your Strapi schema",
5
5
  "type": "module",
6
6
  "bin": {
@@ -27,8 +27,8 @@
27
27
  "picocolors": "^1.0.0",
28
28
  "pkg-types": "^1.0.0",
29
29
  "@strapi2front/client": "0.1.0",
30
- "@strapi2front/generators": "0.4.1",
31
- "@strapi2front/core": "0.4.1"
30
+ "@strapi2front/core": "0.4.1",
31
+ "@strapi2front/generators": "0.4.1"
32
32
  },
33
33
  "devDependencies": {
34
34
  "tsup": "^8.0.0",