strapi2front 0.1.0 → 0.1.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/dist/bin/strapi2front.js +48 -18
- package/dist/bin/strapi2front.js.map +1 -1
- package/dist/index.js +35 -13
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/bin/strapi2front.js
CHANGED
|
@@ -123,16 +123,25 @@ async function detectPackageManager(cwd = process.cwd()) {
|
|
|
123
123
|
};
|
|
124
124
|
}
|
|
125
125
|
function getInstallCommand(pm, pkg) {
|
|
126
|
-
const
|
|
126
|
+
const commands2 = {
|
|
127
127
|
pnpm: `pnpm add ${pkg}`,
|
|
128
128
|
npm: `npm install ${pkg}`,
|
|
129
129
|
yarn: `yarn add ${pkg}`,
|
|
130
130
|
bun: `bun add ${pkg}`
|
|
131
131
|
};
|
|
132
|
-
return
|
|
132
|
+
return commands2[pm];
|
|
133
|
+
}
|
|
134
|
+
function getInstallDevCommand(pm, pkg) {
|
|
135
|
+
const commands2 = {
|
|
136
|
+
pnpm: `pnpm add -D ${pkg}`,
|
|
137
|
+
npm: `npm install -D ${pkg}`,
|
|
138
|
+
yarn: `yarn add -D ${pkg}`,
|
|
139
|
+
bun: `bun add -d ${pkg}`
|
|
140
|
+
};
|
|
141
|
+
return commands2[pm];
|
|
133
142
|
}
|
|
134
143
|
async function runInitPrompts(detection) {
|
|
135
|
-
p.intro(pc4.cyan("
|
|
144
|
+
p.intro(pc4.cyan("strapi2front setup"));
|
|
136
145
|
p.note(
|
|
137
146
|
[
|
|
138
147
|
`Framework: ${pc4.green(getFrameworkDisplayName(detection.framework.name))} ${detection.framework.version ? pc4.dim(`v${detection.framework.version}`) : ""}`,
|
|
@@ -288,24 +297,37 @@ async function initCommand(_options) {
|
|
|
288
297
|
const outputPath = path5.join(cwd, answers.outputDir);
|
|
289
298
|
await fs4.mkdir(outputPath, { recursive: true });
|
|
290
299
|
s.stop("Configuration files created");
|
|
291
|
-
const
|
|
292
|
-
message: "Install strapi-sdk-js
|
|
300
|
+
const installDeps = await p.confirm({
|
|
301
|
+
message: "Install required dependencies (strapi2front, strapi-sdk-js)?",
|
|
293
302
|
initialValue: true
|
|
294
303
|
});
|
|
295
|
-
if (p.isCancel(
|
|
304
|
+
if (p.isCancel(installDeps)) {
|
|
296
305
|
p.cancel("Setup cancelled");
|
|
297
306
|
process.exit(0);
|
|
298
307
|
}
|
|
299
|
-
if (
|
|
308
|
+
if (installDeps) {
|
|
309
|
+
s.start("Installing strapi2front...");
|
|
310
|
+
try {
|
|
311
|
+
const installStrapi2frontCmd = getInstallDevCommand(packageManager.name, "strapi2front");
|
|
312
|
+
execSync(installStrapi2frontCmd, { cwd, stdio: "ignore" });
|
|
313
|
+
s.stop("strapi2front installed");
|
|
314
|
+
} catch {
|
|
315
|
+
s.stop("Failed to install strapi2front");
|
|
316
|
+
logger.warn(`Please install manually: ${getInstallDevCommand(packageManager.name, "strapi2front")}`);
|
|
317
|
+
}
|
|
300
318
|
s.start("Installing strapi-sdk-js...");
|
|
301
319
|
try {
|
|
302
|
-
const
|
|
303
|
-
execSync(
|
|
304
|
-
s.stop("
|
|
320
|
+
const installSdkCmd = getInstallCommand(packageManager.name, "strapi-sdk-js");
|
|
321
|
+
execSync(installSdkCmd, { cwd, stdio: "ignore" });
|
|
322
|
+
s.stop("strapi-sdk-js installed");
|
|
305
323
|
} catch {
|
|
306
|
-
s.stop("Failed to install
|
|
324
|
+
s.stop("Failed to install strapi-sdk-js");
|
|
307
325
|
logger.warn(`Please install manually: ${getInstallCommand(packageManager.name, "strapi-sdk-js")}`);
|
|
308
326
|
}
|
|
327
|
+
} else {
|
|
328
|
+
p.log.info(pc4.dim("Remember to install dependencies manually:"));
|
|
329
|
+
p.log.info(pc4.dim(` ${getInstallDevCommand(packageManager.name, "strapi2front")}`));
|
|
330
|
+
p.log.info(pc4.dim(` ${getInstallCommand(packageManager.name, "strapi-sdk-js")}`));
|
|
309
331
|
}
|
|
310
332
|
p.note(
|
|
311
333
|
[
|
|
@@ -314,7 +336,7 @@ async function initCommand(_options) {
|
|
|
314
336
|
`${pc4.green("v")} Created output directory ${pc4.cyan(answers.outputDir)}`,
|
|
315
337
|
"",
|
|
316
338
|
`Next steps:`,
|
|
317
|
-
` 1. Run ${pc4.cyan("npx
|
|
339
|
+
` 1. Run ${pc4.cyan("npx strapi2front sync")} to generate types`,
|
|
318
340
|
` 2. Import types from ${pc4.cyan(answers.outputDir + "/types")}`,
|
|
319
341
|
` 3. Import services from ${pc4.cyan(answers.outputDir + "/services")}`
|
|
320
342
|
].join("\n"),
|
|
@@ -328,7 +350,7 @@ async function initCommand(_options) {
|
|
|
328
350
|
}
|
|
329
351
|
}
|
|
330
352
|
function generateConfigFile(answers) {
|
|
331
|
-
return `import { defineConfig } from "
|
|
353
|
+
return `import { defineConfig } from "strapi2front";
|
|
332
354
|
|
|
333
355
|
export default defineConfig({
|
|
334
356
|
// Strapi connection
|
|
@@ -421,13 +443,13 @@ function detectPackageManager2(cwd) {
|
|
|
421
443
|
}
|
|
422
444
|
function installPackage(packageName, cwd) {
|
|
423
445
|
const pm = detectPackageManager2(cwd);
|
|
424
|
-
const
|
|
446
|
+
const commands2 = {
|
|
425
447
|
npm: `npm install ${packageName}`,
|
|
426
448
|
yarn: `yarn add ${packageName}`,
|
|
427
449
|
pnpm: `pnpm add ${packageName}`,
|
|
428
450
|
bun: `bun add ${packageName}`
|
|
429
451
|
};
|
|
430
|
-
execSync(
|
|
452
|
+
execSync(commands2[pm], { cwd, stdio: "inherit" });
|
|
431
453
|
}
|
|
432
454
|
function getOrphanedFolders(outputPath, currentStructure) {
|
|
433
455
|
const orphanedFolders = [];
|
|
@@ -471,7 +493,7 @@ function cleanOrphanedFiles(outputPath, orphanedItems) {
|
|
|
471
493
|
}
|
|
472
494
|
async function syncCommand(options) {
|
|
473
495
|
const cwd = process.cwd();
|
|
474
|
-
p.intro(pc4.cyan("
|
|
496
|
+
p.intro(pc4.cyan("strapi2front sync"));
|
|
475
497
|
const s = p.spinner();
|
|
476
498
|
try {
|
|
477
499
|
s.start("Loading configuration...");
|
|
@@ -655,7 +677,7 @@ async function syncCommand(options) {
|
|
|
655
677
|
if (error instanceof Error) {
|
|
656
678
|
logger.error(error.message);
|
|
657
679
|
if (error.message.includes("Could not find strapi.config")) {
|
|
658
|
-
logger.info('Run "npx
|
|
680
|
+
logger.info('Run "npx strapi2front init" first to set up your project.');
|
|
659
681
|
}
|
|
660
682
|
} else {
|
|
661
683
|
logger.error("An unknown error occurred");
|
|
@@ -677,6 +699,14 @@ var logo = `
|
|
|
677
699
|
program.name("strapi2front").description("Generate TypeScript types, services, and framework actions from your Strapi schema").version("0.1.0").addHelpText("beforeAll", pc4.cyan(logo));
|
|
678
700
|
program.command("init").description("Initialize strapi2front in your project").option("-y, --yes", "Skip prompts and use defaults").option("--url <url>", "Strapi URL").option("--token <token>", "Strapi API token").option("--framework <framework>", "Framework to use (astro)").action(initCommand);
|
|
679
701
|
program.command("sync").description("Sync types, services, and actions from Strapi schema").option("-f, --force", "Force regeneration of all files").option("--types-only", "Only generate types").option("--services-only", "Only generate services").option("--actions-only", "Only generate actions").option("--clean", "Automatically remove orphaned files from previous structure").action(syncCommand);
|
|
680
|
-
|
|
702
|
+
var args = process.argv.slice(2);
|
|
703
|
+
var commands = ["init", "sync", "help", "--help", "-h", "--version", "-V"];
|
|
704
|
+
var hasCommand = args.some((arg) => commands.includes(arg));
|
|
705
|
+
if (args.length === 0 || !hasCommand) {
|
|
706
|
+
console.log(pc4.cyan(logo));
|
|
707
|
+
initCommand();
|
|
708
|
+
} else {
|
|
709
|
+
program.parse();
|
|
710
|
+
}
|
|
681
711
|
//# sourceMappingURL=strapi2front.js.map
|
|
682
712
|
//# sourceMappingURL=strapi2front.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/detectors/framework.ts","../../src/lib/detectors/typescript.ts","../../src/lib/detectors/package-manager.ts","../../src/lib/prompts/init.prompts.ts","../../src/lib/utils/logger.ts","../../src/commands/init.ts","../../src/commands/sync.ts","../../src/bin/strapi2front.ts"],"names":["path","fs","pc","p2","detectPackageManager","execSync","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 getRunCommand(pm: PackageManager, script: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm ${script}`,\n npm: `npm run ${script}`,\n yarn: `yarn ${script}`,\n bun: `bun run ${script}`,\n };\n return commands[pm];\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getFrameworkDisplayName, type FrameworkInfo } from \"../detectors/framework.js\";\nimport type { TypeScriptInfo } from \"../detectors/typescript.js\";\nimport type { PackageManagerInfo } from \"../detectors/package-manager.js\";\n\nexport interface DetectionResults {\n framework: FrameworkInfo;\n typescript: TypeScriptInfo;\n packageManager: PackageManagerInfo;\n}\n\nexport interface InitPromptAnswers {\n strapiUrl: string;\n strapiToken: string;\n strapiVersion: \"v4\" | \"v5\";\n outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}\n\nexport async function runInitPrompts(detection: DetectionResults): Promise<InitPromptAnswers | null> {\n p.intro(pc.cyan(\"strapi-integrate 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 // Check framework support\n if (detection.framework.name === \"unknown\") {\n p.cancel(\"Could not detect a supported framework. Currently only Astro is supported.\");\n return null;\n }\n\n if (detection.framework.name !== \"astro\") {\n p.cancel(`${detection.framework.name} is not yet supported. Currently only Astro is supported.`);\n return null;\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 // 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\n const features = await p.multiselect({\n message: \"What would you like to generate?\",\n options: [\n { value: \"types\", label: \"Types\", hint: \"TypeScript interfaces for your content types\" },\n { value: \"services\", label: \"Services\", hint: \"Typed service functions for data fetching\" },\n { value: \"actions\", label: \"Astro Actions\", hint: \"Type-safe actions for client/server\" },\n ],\n initialValues: [\"types\", \"services\", \"actions\"],\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 outputDir: ((outputDir as string) || \"\").trim() || \"src/strapi\",\n generateActions: (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 { execSync } from \"node:child_process\";\nimport { detectFramework } from \"../lib/detectors/framework.js\";\nimport { detectTypeScript } from \"../lib/detectors/typescript.js\";\nimport { detectPackageManager, getInstallCommand } from \"../lib/detectors/package-manager.js\";\nimport { runInitPrompts } from \"../lib/prompts/init.prompts.js\";\nimport { logger } from \"../lib/utils/logger.js\";\n\nexport interface InitCommandOptions {\n yes?: boolean;\n url?: string;\n token?: string;\n framework?: string;\n}\n\nexport async function initCommand(_options: InitCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Detect project configuration\n const s = p.spinner();\n s.start(\"Detecting project configuration...\");\n\n const [framework, typescript, packageManager] = await Promise.all([\n detectFramework(cwd),\n detectTypeScript(cwd),\n detectPackageManager(cwd),\n ]);\n\n s.stop(\"Project configuration detected\");\n\n // Run interactive prompts\n const answers = await runInitPrompts({\n framework,\n typescript,\n packageManager,\n });\n\n if (!answers) {\n return;\n }\n\n // Create configuration\n s.start(\"Creating configuration files...\");\n\n try {\n // Create strapi.config.ts\n const configContent = generateConfigFile({\n strapiUrl: answers.strapiUrl,\n strapiVersion: answers.strapiVersion,\n outputDir: answers.outputDir,\n generateActions: answers.generateActions,\n generateServices: answers.generateServices,\n });\n const configPath = path.join(cwd, \"strapi.config.ts\");\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 strapi-sdk-js dependency\n const installDep = await p.confirm({\n message: \"Install strapi-sdk-js dependency?\",\n initialValue: true,\n });\n\n if (p.isCancel(installDep)) {\n p.cancel(\"Setup cancelled\");\n process.exit(0);\n }\n\n if (installDep) {\n s.start(\"Installing strapi-sdk-js...\");\n try {\n const installCmd = getInstallCommand(packageManager.name, \"strapi-sdk-js\");\n execSync(installCmd, { cwd, stdio: \"ignore\" });\n s.stop(\"Dependency installed\");\n } catch {\n s.stop(\"Failed to install dependency\");\n logger.warn(`Please install manually: ${getInstallCommand(packageManager.name, \"strapi-sdk-js\")}`);\n }\n }\n\n // Show success message\n p.note(\n [\n `${pc.green(\"v\")} Created ${pc.cyan(\"strapi.config.ts\")}`,\n `${pc.green(\"v\")} Updated ${pc.cyan(\".env\")} with Strapi credentials`,\n `${pc.green(\"v\")} Created output directory ${pc.cyan(answers.outputDir)}`,\n \"\",\n `Next steps:`,\n ` 1. Run ${pc.cyan(\"npx strapi-integrate sync\")} to generate types`,\n ` 2. Import types from ${pc.cyan(answers.outputDir + \"/types\")}`,\n ` 3. Import services from ${pc.cyan(answers.outputDir + \"/services\")}`,\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 outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}): string {\n return `import { defineConfig } from \"strapi-integrate\";\n\nexport default defineConfig({\n // Strapi connection\n url: process.env.STRAPI_URL || \"${answers.strapiUrl}\",\n token: process.env.STRAPI_TOKEN,\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\nasync function appendToEnvFile(\n envPath: string,\n variables: Record<string, string>\n): Promise<void> {\n let content = \"\";\n\n try {\n content = await fs.readFile(envPath, \"utf-8\");\n } catch {\n // File does not exist, create new\n }\n\n const lines = content.split(\"\\n\");\n const existingKeys = new Set(\n lines\n .filter((line) => line.includes(\"=\"))\n .map((line) => line.split(\"=\")[0].trim())\n );\n\n const newLines: string[] = [];\n\n for (const [key, value] of Object.entries(variables)) {\n if (!existingKeys.has(key)) {\n newLines.push(`${key}=${value}`);\n }\n }\n\n if (newLines.length > 0) {\n const separator = content.endsWith(\"\\n\") || content === \"\" ? \"\" : \"\\n\";\n const newContent = content + separator + newLines.join(\"\\n\") + \"\\n\";\n await fs.writeFile(envPath, newContent, \"utf-8\");\n }\n}\n\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { loadConfig } from \"@strapi2front/core\";\nimport { fetchSchema, detectStrapiVersion } from \"@strapi2front/core\";\nimport { parseSchema } from \"@strapi2front/core\";\nimport type { StrapiVersion } from \"@strapi2front/core\";\nimport type { ParsedSchema, Attribute } from \"@strapi2front/core\";\nimport { generateTypes } from \"@strapi2front/generators\";\nimport { generateServices } from \"@strapi2front/generators\";\nimport { generateActions } from \"@strapi2front/generators\";\nimport { generateClient } from \"@strapi2front/generators\";\nimport { generateLocales } from \"@strapi2front/generators\";\nimport { generateByFeature } from \"@strapi2front/generators\";\nimport { logger } from \"../lib/utils/logger.js\";\n\nconst BLOCKS_RENDERER_PACKAGE = \"@strapi/blocks-react-renderer\";\n\n/**\n * Check if schema contains any blocks fields\n */\nfunction schemaHasBlocks(schema: ParsedSchema): { hasBlocks: boolean; fieldsFound: string[] } {\n const fieldsFound: string[] = [];\n\n const checkAttributes = (typeName: string, attributes: Record<string, Attribute>): void => {\n for (const [fieldName, attr] of Object.entries(attributes)) {\n if (attr.type === \"blocks\") {\n fieldsFound.push(`${typeName}.${fieldName}`);\n }\n }\n };\n\n for (const collection of schema.collections) {\n checkAttributes(collection.singularName, collection.attributes);\n }\n\n for (const single of schema.singles) {\n checkAttributes(single.singularName, single.attributes);\n }\n\n for (const component of schema.components) {\n checkAttributes(`component:${component.name}`, component.attributes);\n }\n\n return { hasBlocks: fieldsFound.length > 0, fieldsFound };\n}\n\n/**\n * Check if a package is installed\n */\nfunction isPackageInstalled(packageName: string, cwd: string): boolean {\n try {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) return false;\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n return packageName in deps;\n } catch {\n return false;\n }\n}\n\n/**\n * Detect package manager\n */\nfunction detectPackageManager(cwd: string): \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" {\n if (fs.existsSync(path.join(cwd, \"bun.lockb\"))) return \"bun\";\n if (fs.existsSync(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (fs.existsSync(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\n/**\n * Install a package\n */\nfunction installPackage(packageName: string, cwd: string): void {\n const pm = detectPackageManager(cwd);\n const commands: Record<string, string> = {\n npm: `npm install ${packageName}`,\n yarn: `yarn add ${packageName}`,\n pnpm: `pnpm add ${packageName}`,\n bun: `bun add ${packageName}`,\n };\n\n execSync(commands[pm], { cwd, stdio: \"inherit\" });\n}\n\n/**\n * Structure type for output organization\n */\ntype OutputStructure = \"by-layer\" | \"by-feature\";\n\n/**\n * Get orphaned folders from the opposite structure\n */\nfunction getOrphanedFolders(outputPath: string, currentStructure: OutputStructure): string[] {\n const orphanedFolders: string[] = [];\n\n if (currentStructure === \"by-feature\") {\n // If using by-feature, check for by-layer folders\n const byLayerFolders = [\"types\", \"services\", \"actions\"];\n for (const folder of byLayerFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n // Also check for root-level client.ts and locales.ts (by-layer puts them at root)\n if (fs.existsSync(path.join(outputPath, \"client.ts\"))) {\n orphanedFolders.push(\"client.ts\");\n }\n if (fs.existsSync(path.join(outputPath, \"locales.ts\"))) {\n orphanedFolders.push(\"locales.ts\");\n }\n } else {\n // If using by-layer, check for by-feature folders\n const byFeatureFolders = [\"collections\", \"singles\", \"shared\", \"components\"];\n for (const folder of byFeatureFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n }\n\n return orphanedFolders;\n}\n\n/**\n * Remove orphaned folders/files\n */\nfunction cleanOrphanedFiles(outputPath: string, orphanedItems: string[]): void {\n for (const item of orphanedItems) {\n const itemPath = path.join(outputPath, item);\n if (fs.existsSync(itemPath)) {\n const stat = fs.statSync(itemPath);\n if (stat.isDirectory()) {\n fs.rmSync(itemPath, { recursive: true, force: true });\n } else {\n fs.unlinkSync(itemPath);\n }\n }\n }\n}\n\nexport interface SyncCommandOptions {\n force?: boolean;\n typesOnly?: boolean;\n servicesOnly?: boolean;\n actionsOnly?: boolean;\n clean?: boolean;\n}\n\nexport async function syncCommand(options: SyncCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n p.intro(pc.cyan(\"strapi-integrate 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);\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);\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 if (isByFeature) {\n // Generate using by-feature structure (screaming architecture)\n s.start(\"Generating files (by-feature structure)...\");\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 && (generateAll || Boolean(options.actionsOnly)),\n },\n blocksRendererInstalled,\n strapiVersion: config.strapiVersion,\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...\");\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 });\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 });\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...\");\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 });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} service files`);\n }\n }\n\n // Generate actions\n if (generateAll || options.actionsOnly) {\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 strapi-integrate 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// Parse args\nprogram.parse();\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/detectors/framework.ts","../../src/lib/detectors/typescript.ts","../../src/lib/detectors/package-manager.ts","../../src/lib/prompts/init.prompts.ts","../../src/lib/utils/logger.ts","../../src/commands/init.ts","../../src/commands/sync.ts","../../src/bin/strapi2front.ts"],"names":["path","fs","commands","pc","p2","detectPackageManager","execSync","p3"],"mappings":"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","file":"strapi2front.js","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type Framework = \"astro\" | \"nextjs\" | \"nuxt\" | \"unknown\";\n\nexport interface FrameworkInfo {\n name: Framework;\n version: string | null;\n configFile: string | null;\n}\n\nconst FRAMEWORK_DETECTORS: Record<\n string,\n { name: Framework; configFiles: string[] }\n> = {\n astro: {\n name: \"astro\",\n configFiles: [\"astro.config.mjs\", \"astro.config.ts\", \"astro.config.js\"],\n },\n next: {\n name: \"nextjs\",\n configFiles: [\"next.config.mjs\", \"next.config.ts\", \"next.config.js\"],\n },\n nuxt: {\n name: \"nuxt\",\n configFiles: [\"nuxt.config.ts\", \"nuxt.config.js\"],\n },\n};\n\nexport async function detectFramework(cwd: string = process.cwd()): Promise<FrameworkInfo> {\n // Read package.json to check dependencies\n const pkgPath = path.join(cwd, \"package.json\");\n\n try {\n const pkgContent = await fs.readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n // Check each framework\n for (const [pkgName, detector] of Object.entries(FRAMEWORK_DETECTORS)) {\n if (deps[pkgName]) {\n // Check for config file\n for (const configFile of detector.configFiles) {\n const configPath = path.join(cwd, configFile);\n try {\n await fs.access(configPath);\n return {\n name: detector.name,\n version: deps[pkgName],\n configFile,\n };\n } catch {\n // Config file not found, continue\n }\n }\n\n // Package found but no config file\n return {\n name: detector.name,\n version: deps[pkgName],\n configFile: null,\n };\n }\n }\n } catch {\n // package.json not found\n }\n\n return {\n name: \"unknown\",\n version: null,\n configFile: null,\n };\n}\n\nexport function getFrameworkDisplayName(framework: Framework): string {\n const names: Record<Framework, string> = {\n astro: \"Astro\",\n nextjs: \"Next.js\",\n nuxt: \"Nuxt\",\n unknown: \"Unknown\",\n };\n return names[framework];\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface TypeScriptInfo {\n enabled: boolean;\n configFile: string | null;\n version: string | null;\n}\n\nconst TS_CONFIG_FILES = [\"tsconfig.json\", \"tsconfig.app.json\"];\n\nexport async function detectTypeScript(cwd: string = process.cwd()): Promise<TypeScriptInfo> {\n // Check for tsconfig\n for (const configFile of TS_CONFIG_FILES) {\n const configPath = path.join(cwd, configFile);\n try {\n await fs.access(configPath);\n\n // Check package.json for typescript version\n const pkgPath = path.join(cwd, \"package.json\");\n try {\n const pkgContent = await fs.readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n return {\n enabled: true,\n configFile,\n version: deps.typescript || null,\n };\n } catch {\n return {\n enabled: true,\n configFile,\n version: null,\n };\n }\n } catch {\n // Config not found, continue\n }\n }\n\n return {\n enabled: false,\n configFile: null,\n version: null,\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type PackageManager = \"pnpm\" | \"npm\" | \"yarn\" | \"bun\";\n\nexport interface PackageManagerInfo {\n name: PackageManager;\n lockFile: string | null;\n}\n\nconst LOCK_FILES: Record<string, PackageManager> = {\n \"pnpm-lock.yaml\": \"pnpm\",\n \"package-lock.json\": \"npm\",\n \"yarn.lock\": \"yarn\",\n \"bun.lockb\": \"bun\",\n};\n\nexport async function detectPackageManager(cwd: string = process.cwd()): Promise<PackageManagerInfo> {\n // Check for lock files\n for (const [lockFile, pm] of Object.entries(LOCK_FILES)) {\n const lockPath = path.join(cwd, lockFile);\n try {\n await fs.access(lockPath);\n return {\n name: pm,\n lockFile,\n };\n } catch {\n // Lock file not found, continue\n }\n }\n\n // Default to npm if no lock file found\n return {\n name: \"npm\",\n lockFile: null,\n };\n}\n\nexport function getInstallCommand(pm: PackageManager, pkg: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm add ${pkg}`,\n npm: `npm install ${pkg}`,\n yarn: `yarn add ${pkg}`,\n bun: `bun add ${pkg}`,\n };\n return commands[pm];\n}\n\nexport function getInstallDevCommand(pm: PackageManager, pkg: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm add -D ${pkg}`,\n npm: `npm install -D ${pkg}`,\n yarn: `yarn add -D ${pkg}`,\n bun: `bun add -d ${pkg}`,\n };\n return commands[pm];\n}\n\nexport function getRunCommand(pm: PackageManager, script: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm ${script}`,\n npm: `npm run ${script}`,\n yarn: `yarn ${script}`,\n bun: `bun run ${script}`,\n };\n return commands[pm];\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getFrameworkDisplayName, type FrameworkInfo } from \"../detectors/framework.js\";\nimport type { TypeScriptInfo } from \"../detectors/typescript.js\";\nimport type { PackageManagerInfo } from \"../detectors/package-manager.js\";\n\nexport interface DetectionResults {\n framework: FrameworkInfo;\n typescript: TypeScriptInfo;\n packageManager: PackageManagerInfo;\n}\n\nexport interface InitPromptAnswers {\n strapiUrl: string;\n strapiToken: string;\n strapiVersion: \"v4\" | \"v5\";\n outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\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 // Check framework support\n if (detection.framework.name === \"unknown\") {\n p.cancel(\"Could not detect a supported framework. Currently only Astro is supported.\");\n return null;\n }\n\n if (detection.framework.name !== \"astro\") {\n p.cancel(`${detection.framework.name} is not yet supported. Currently only Astro is supported.`);\n return null;\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 // 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\n const features = await p.multiselect({\n message: \"What would you like to generate?\",\n options: [\n { value: \"types\", label: \"Types\", hint: \"TypeScript interfaces for your content types\" },\n { value: \"services\", label: \"Services\", hint: \"Typed service functions for data fetching\" },\n { value: \"actions\", label: \"Astro Actions\", hint: \"Type-safe actions for client/server\" },\n ],\n initialValues: [\"types\", \"services\", \"actions\"],\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 outputDir: ((outputDir as string) || \"\").trim() || \"src/strapi\",\n generateActions: (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 { execSync } from \"node:child_process\";\nimport { detectFramework } from \"../lib/detectors/framework.js\";\nimport { detectTypeScript } from \"../lib/detectors/typescript.js\";\nimport { detectPackageManager, getInstallCommand, getInstallDevCommand } from \"../lib/detectors/package-manager.js\";\nimport { runInitPrompts } from \"../lib/prompts/init.prompts.js\";\nimport { logger } from \"../lib/utils/logger.js\";\n\nexport interface InitCommandOptions {\n yes?: boolean;\n url?: string;\n token?: string;\n framework?: string;\n}\n\nexport async function initCommand(_options: InitCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Detect project configuration\n const s = p.spinner();\n s.start(\"Detecting project configuration...\");\n\n const [framework, typescript, packageManager] = await Promise.all([\n detectFramework(cwd),\n detectTypeScript(cwd),\n detectPackageManager(cwd),\n ]);\n\n s.stop(\"Project configuration detected\");\n\n // Run interactive prompts\n const answers = await runInitPrompts({\n framework,\n typescript,\n packageManager,\n });\n\n if (!answers) {\n return;\n }\n\n // Create configuration\n s.start(\"Creating configuration files...\");\n\n try {\n // Create strapi.config.ts\n const configContent = generateConfigFile({\n strapiUrl: answers.strapiUrl,\n strapiVersion: answers.strapiVersion,\n outputDir: answers.outputDir,\n generateActions: answers.generateActions,\n generateServices: answers.generateServices,\n });\n const configPath = path.join(cwd, \"strapi.config.ts\");\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 s.start(\"Installing strapi2front...\");\n try {\n const installStrapi2frontCmd = getInstallDevCommand(packageManager.name, \"strapi2front\");\n execSync(installStrapi2frontCmd, { cwd, stdio: \"ignore\" });\n s.stop(\"strapi2front installed\");\n } catch {\n s.stop(\"Failed to install strapi2front\");\n logger.warn(`Please install manually: ${getInstallDevCommand(packageManager.name, \"strapi2front\")}`);\n }\n\n // Install strapi-sdk-js as regular dependency\n s.start(\"Installing strapi-sdk-js...\");\n try {\n const installSdkCmd = getInstallCommand(packageManager.name, \"strapi-sdk-js\");\n execSync(installSdkCmd, { cwd, stdio: \"ignore\" });\n s.stop(\"strapi-sdk-js installed\");\n } catch {\n s.stop(\"Failed to install strapi-sdk-js\");\n logger.warn(`Please install manually: ${getInstallCommand(packageManager.name, \"strapi-sdk-js\")}`);\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 p.note(\n [\n `${pc.green(\"v\")} Created ${pc.cyan(\"strapi.config.ts\")}`,\n `${pc.green(\"v\")} Updated ${pc.cyan(\".env\")} with Strapi credentials`,\n `${pc.green(\"v\")} Created output directory ${pc.cyan(answers.outputDir)}`,\n \"\",\n `Next steps:`,\n ` 1. Run ${pc.cyan(\"npx strapi2front sync\")} to generate types`,\n ` 2. Import types from ${pc.cyan(answers.outputDir + \"/types\")}`,\n ` 3. Import services from ${pc.cyan(answers.outputDir + \"/services\")}`,\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 outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}): string {\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 // 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\nasync function appendToEnvFile(\n envPath: string,\n variables: Record<string, string>\n): Promise<void> {\n let content = \"\";\n\n try {\n content = await fs.readFile(envPath, \"utf-8\");\n } catch {\n // File does not exist, create new\n }\n\n const lines = content.split(\"\\n\");\n const existingKeys = new Set(\n lines\n .filter((line) => line.includes(\"=\"))\n .map((line) => line.split(\"=\")[0].trim())\n );\n\n const newLines: string[] = [];\n\n for (const [key, value] of Object.entries(variables)) {\n if (!existingKeys.has(key)) {\n newLines.push(`${key}=${value}`);\n }\n }\n\n if (newLines.length > 0) {\n const separator = content.endsWith(\"\\n\") || content === \"\" ? \"\" : \"\\n\";\n const newContent = content + separator + newLines.join(\"\\n\") + \"\\n\";\n await fs.writeFile(envPath, newContent, \"utf-8\");\n }\n}\n\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { loadConfig } from \"@strapi2front/core\";\nimport { fetchSchema, detectStrapiVersion } from \"@strapi2front/core\";\nimport { parseSchema } from \"@strapi2front/core\";\nimport type { StrapiVersion } from \"@strapi2front/core\";\nimport type { ParsedSchema, Attribute } from \"@strapi2front/core\";\nimport { generateTypes } from \"@strapi2front/generators\";\nimport { generateServices } from \"@strapi2front/generators\";\nimport { generateActions } from \"@strapi2front/generators\";\nimport { generateClient } from \"@strapi2front/generators\";\nimport { generateLocales } from \"@strapi2front/generators\";\nimport { generateByFeature } from \"@strapi2front/generators\";\nimport { logger } from \"../lib/utils/logger.js\";\n\nconst BLOCKS_RENDERER_PACKAGE = \"@strapi/blocks-react-renderer\";\n\n/**\n * Check if schema contains any blocks fields\n */\nfunction schemaHasBlocks(schema: ParsedSchema): { hasBlocks: boolean; fieldsFound: string[] } {\n const fieldsFound: string[] = [];\n\n const checkAttributes = (typeName: string, attributes: Record<string, Attribute>): void => {\n for (const [fieldName, attr] of Object.entries(attributes)) {\n if (attr.type === \"blocks\") {\n fieldsFound.push(`${typeName}.${fieldName}`);\n }\n }\n };\n\n for (const collection of schema.collections) {\n checkAttributes(collection.singularName, collection.attributes);\n }\n\n for (const single of schema.singles) {\n checkAttributes(single.singularName, single.attributes);\n }\n\n for (const component of schema.components) {\n checkAttributes(`component:${component.name}`, component.attributes);\n }\n\n return { hasBlocks: fieldsFound.length > 0, fieldsFound };\n}\n\n/**\n * Check if a package is installed\n */\nfunction isPackageInstalled(packageName: string, cwd: string): boolean {\n try {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) return false;\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n return packageName in deps;\n } catch {\n return false;\n }\n}\n\n/**\n * Detect package manager\n */\nfunction detectPackageManager(cwd: string): \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" {\n if (fs.existsSync(path.join(cwd, \"bun.lockb\"))) return \"bun\";\n if (fs.existsSync(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (fs.existsSync(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\n/**\n * Install a package\n */\nfunction installPackage(packageName: string, cwd: string): void {\n const pm = detectPackageManager(cwd);\n const commands: Record<string, string> = {\n npm: `npm install ${packageName}`,\n yarn: `yarn add ${packageName}`,\n pnpm: `pnpm add ${packageName}`,\n bun: `bun add ${packageName}`,\n };\n\n execSync(commands[pm], { cwd, stdio: \"inherit\" });\n}\n\n/**\n * Structure type for output organization\n */\ntype OutputStructure = \"by-layer\" | \"by-feature\";\n\n/**\n * Get orphaned folders from the opposite structure\n */\nfunction getOrphanedFolders(outputPath: string, currentStructure: OutputStructure): string[] {\n const orphanedFolders: string[] = [];\n\n if (currentStructure === \"by-feature\") {\n // If using by-feature, check for by-layer folders\n const byLayerFolders = [\"types\", \"services\", \"actions\"];\n for (const folder of byLayerFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n // Also check for root-level client.ts and locales.ts (by-layer puts them at root)\n if (fs.existsSync(path.join(outputPath, \"client.ts\"))) {\n orphanedFolders.push(\"client.ts\");\n }\n if (fs.existsSync(path.join(outputPath, \"locales.ts\"))) {\n orphanedFolders.push(\"locales.ts\");\n }\n } else {\n // If using by-layer, check for by-feature folders\n const byFeatureFolders = [\"collections\", \"singles\", \"shared\", \"components\"];\n for (const folder of byFeatureFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n }\n\n return orphanedFolders;\n}\n\n/**\n * Remove orphaned folders/files\n */\nfunction cleanOrphanedFiles(outputPath: string, orphanedItems: string[]): void {\n for (const item of orphanedItems) {\n const itemPath = path.join(outputPath, item);\n if (fs.existsSync(itemPath)) {\n const stat = fs.statSync(itemPath);\n if (stat.isDirectory()) {\n fs.rmSync(itemPath, { recursive: true, force: true });\n } else {\n fs.unlinkSync(itemPath);\n }\n }\n }\n}\n\nexport interface SyncCommandOptions {\n force?: boolean;\n typesOnly?: boolean;\n servicesOnly?: boolean;\n actionsOnly?: boolean;\n clean?: boolean;\n}\n\nexport async function syncCommand(options: SyncCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n p.intro(pc.cyan(\"strapi2front sync\"));\n\n const s = p.spinner();\n\n try {\n // Load configuration\n s.start(\"Loading configuration...\");\n let config = await loadConfig(cwd);\n s.stop(\"Configuration loaded\");\n\n // Detect and validate Strapi version\n s.start(\"Detecting Strapi version...\");\n const versionResult = await detectStrapiVersion(config.url, config.token);\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);\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 if (isByFeature) {\n // Generate using by-feature structure (screaming architecture)\n s.start(\"Generating files (by-feature structure)...\");\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 && (generateAll || Boolean(options.actionsOnly)),\n },\n blocksRendererInstalled,\n strapiVersion: config.strapiVersion,\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...\");\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 });\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 });\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...\");\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 });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} service files`);\n }\n }\n\n // Generate actions\n if (generateAll || options.actionsOnly) {\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
|
@@ -131,8 +131,17 @@ function getInstallCommand(pm, pkg) {
|
|
|
131
131
|
};
|
|
132
132
|
return commands[pm];
|
|
133
133
|
}
|
|
134
|
+
function getInstallDevCommand(pm, pkg) {
|
|
135
|
+
const commands = {
|
|
136
|
+
pnpm: `pnpm add -D ${pkg}`,
|
|
137
|
+
npm: `npm install -D ${pkg}`,
|
|
138
|
+
yarn: `yarn add -D ${pkg}`,
|
|
139
|
+
bun: `bun add -d ${pkg}`
|
|
140
|
+
};
|
|
141
|
+
return commands[pm];
|
|
142
|
+
}
|
|
134
143
|
async function runInitPrompts(detection) {
|
|
135
|
-
p.intro(pc4.cyan("
|
|
144
|
+
p.intro(pc4.cyan("strapi2front setup"));
|
|
136
145
|
p.note(
|
|
137
146
|
[
|
|
138
147
|
`Framework: ${pc4.green(getFrameworkDisplayName(detection.framework.name))} ${detection.framework.version ? pc4.dim(`v${detection.framework.version}`) : ""}`,
|
|
@@ -288,24 +297,37 @@ async function initCommand(_options) {
|
|
|
288
297
|
const outputPath = path5.join(cwd, answers.outputDir);
|
|
289
298
|
await fs4.mkdir(outputPath, { recursive: true });
|
|
290
299
|
s.stop("Configuration files created");
|
|
291
|
-
const
|
|
292
|
-
message: "Install strapi-sdk-js
|
|
300
|
+
const installDeps = await p.confirm({
|
|
301
|
+
message: "Install required dependencies (strapi2front, strapi-sdk-js)?",
|
|
293
302
|
initialValue: true
|
|
294
303
|
});
|
|
295
|
-
if (p.isCancel(
|
|
304
|
+
if (p.isCancel(installDeps)) {
|
|
296
305
|
p.cancel("Setup cancelled");
|
|
297
306
|
process.exit(0);
|
|
298
307
|
}
|
|
299
|
-
if (
|
|
308
|
+
if (installDeps) {
|
|
309
|
+
s.start("Installing strapi2front...");
|
|
310
|
+
try {
|
|
311
|
+
const installStrapi2frontCmd = getInstallDevCommand(packageManager.name, "strapi2front");
|
|
312
|
+
execSync(installStrapi2frontCmd, { cwd, stdio: "ignore" });
|
|
313
|
+
s.stop("strapi2front installed");
|
|
314
|
+
} catch {
|
|
315
|
+
s.stop("Failed to install strapi2front");
|
|
316
|
+
logger.warn(`Please install manually: ${getInstallDevCommand(packageManager.name, "strapi2front")}`);
|
|
317
|
+
}
|
|
300
318
|
s.start("Installing strapi-sdk-js...");
|
|
301
319
|
try {
|
|
302
|
-
const
|
|
303
|
-
execSync(
|
|
304
|
-
s.stop("
|
|
320
|
+
const installSdkCmd = getInstallCommand(packageManager.name, "strapi-sdk-js");
|
|
321
|
+
execSync(installSdkCmd, { cwd, stdio: "ignore" });
|
|
322
|
+
s.stop("strapi-sdk-js installed");
|
|
305
323
|
} catch {
|
|
306
|
-
s.stop("Failed to install
|
|
324
|
+
s.stop("Failed to install strapi-sdk-js");
|
|
307
325
|
logger.warn(`Please install manually: ${getInstallCommand(packageManager.name, "strapi-sdk-js")}`);
|
|
308
326
|
}
|
|
327
|
+
} else {
|
|
328
|
+
p.log.info(pc4.dim("Remember to install dependencies manually:"));
|
|
329
|
+
p.log.info(pc4.dim(` ${getInstallDevCommand(packageManager.name, "strapi2front")}`));
|
|
330
|
+
p.log.info(pc4.dim(` ${getInstallCommand(packageManager.name, "strapi-sdk-js")}`));
|
|
309
331
|
}
|
|
310
332
|
p.note(
|
|
311
333
|
[
|
|
@@ -314,7 +336,7 @@ async function initCommand(_options) {
|
|
|
314
336
|
`${pc4.green("v")} Created output directory ${pc4.cyan(answers.outputDir)}`,
|
|
315
337
|
"",
|
|
316
338
|
`Next steps:`,
|
|
317
|
-
` 1. Run ${pc4.cyan("npx
|
|
339
|
+
` 1. Run ${pc4.cyan("npx strapi2front sync")} to generate types`,
|
|
318
340
|
` 2. Import types from ${pc4.cyan(answers.outputDir + "/types")}`,
|
|
319
341
|
` 3. Import services from ${pc4.cyan(answers.outputDir + "/services")}`
|
|
320
342
|
].join("\n"),
|
|
@@ -328,7 +350,7 @@ async function initCommand(_options) {
|
|
|
328
350
|
}
|
|
329
351
|
}
|
|
330
352
|
function generateConfigFile(answers) {
|
|
331
|
-
return `import { defineConfig } from "
|
|
353
|
+
return `import { defineConfig } from "strapi2front";
|
|
332
354
|
|
|
333
355
|
export default defineConfig({
|
|
334
356
|
// Strapi connection
|
|
@@ -471,7 +493,7 @@ function cleanOrphanedFiles(outputPath, orphanedItems) {
|
|
|
471
493
|
}
|
|
472
494
|
async function syncCommand(options) {
|
|
473
495
|
const cwd = process.cwd();
|
|
474
|
-
p.intro(pc4.cyan("
|
|
496
|
+
p.intro(pc4.cyan("strapi2front sync"));
|
|
475
497
|
const s = p.spinner();
|
|
476
498
|
try {
|
|
477
499
|
s.start("Loading configuration...");
|
|
@@ -655,7 +677,7 @@ async function syncCommand(options) {
|
|
|
655
677
|
if (error instanceof Error) {
|
|
656
678
|
logger.error(error.message);
|
|
657
679
|
if (error.message.includes("Could not find strapi.config")) {
|
|
658
|
-
logger.info('Run "npx
|
|
680
|
+
logger.info('Run "npx strapi2front init" first to set up your project.');
|
|
659
681
|
}
|
|
660
682
|
} else {
|
|
661
683
|
logger.error("An unknown error occurred");
|
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/prompts/init.prompts.ts","../src/lib/utils/logger.ts","../src/commands/init.ts","../src/commands/sync.ts"],"names":["path","fs","pc","p2","detectPackageManager","execSync","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 getRunCommand(pm: PackageManager, script: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm ${script}`,\n npm: `npm run ${script}`,\n yarn: `yarn ${script}`,\n bun: `bun run ${script}`,\n };\n return commands[pm];\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getFrameworkDisplayName, type FrameworkInfo } from \"../detectors/framework.js\";\nimport type { TypeScriptInfo } from \"../detectors/typescript.js\";\nimport type { PackageManagerInfo } from \"../detectors/package-manager.js\";\n\nexport interface DetectionResults {\n framework: FrameworkInfo;\n typescript: TypeScriptInfo;\n packageManager: PackageManagerInfo;\n}\n\nexport interface InitPromptAnswers {\n strapiUrl: string;\n strapiToken: string;\n strapiVersion: \"v4\" | \"v5\";\n outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}\n\nexport async function runInitPrompts(detection: DetectionResults): Promise<InitPromptAnswers | null> {\n p.intro(pc.cyan(\"strapi-integrate 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 // Check framework support\n if (detection.framework.name === \"unknown\") {\n p.cancel(\"Could not detect a supported framework. Currently only Astro is supported.\");\n return null;\n }\n\n if (detection.framework.name !== \"astro\") {\n p.cancel(`${detection.framework.name} is not yet supported. Currently only Astro is supported.`);\n return null;\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 // 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\n const features = await p.multiselect({\n message: \"What would you like to generate?\",\n options: [\n { value: \"types\", label: \"Types\", hint: \"TypeScript interfaces for your content types\" },\n { value: \"services\", label: \"Services\", hint: \"Typed service functions for data fetching\" },\n { value: \"actions\", label: \"Astro Actions\", hint: \"Type-safe actions for client/server\" },\n ],\n initialValues: [\"types\", \"services\", \"actions\"],\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 outputDir: ((outputDir as string) || \"\").trim() || \"src/strapi\",\n generateActions: (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 { execSync } from \"node:child_process\";\nimport { detectFramework } from \"../lib/detectors/framework.js\";\nimport { detectTypeScript } from \"../lib/detectors/typescript.js\";\nimport { detectPackageManager, getInstallCommand } from \"../lib/detectors/package-manager.js\";\nimport { runInitPrompts } from \"../lib/prompts/init.prompts.js\";\nimport { logger } from \"../lib/utils/logger.js\";\n\nexport interface InitCommandOptions {\n yes?: boolean;\n url?: string;\n token?: string;\n framework?: string;\n}\n\nexport async function initCommand(_options: InitCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Detect project configuration\n const s = p.spinner();\n s.start(\"Detecting project configuration...\");\n\n const [framework, typescript, packageManager] = await Promise.all([\n detectFramework(cwd),\n detectTypeScript(cwd),\n detectPackageManager(cwd),\n ]);\n\n s.stop(\"Project configuration detected\");\n\n // Run interactive prompts\n const answers = await runInitPrompts({\n framework,\n typescript,\n packageManager,\n });\n\n if (!answers) {\n return;\n }\n\n // Create configuration\n s.start(\"Creating configuration files...\");\n\n try {\n // Create strapi.config.ts\n const configContent = generateConfigFile({\n strapiUrl: answers.strapiUrl,\n strapiVersion: answers.strapiVersion,\n outputDir: answers.outputDir,\n generateActions: answers.generateActions,\n generateServices: answers.generateServices,\n });\n const configPath = path.join(cwd, \"strapi.config.ts\");\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 strapi-sdk-js dependency\n const installDep = await p.confirm({\n message: \"Install strapi-sdk-js dependency?\",\n initialValue: true,\n });\n\n if (p.isCancel(installDep)) {\n p.cancel(\"Setup cancelled\");\n process.exit(0);\n }\n\n if (installDep) {\n s.start(\"Installing strapi-sdk-js...\");\n try {\n const installCmd = getInstallCommand(packageManager.name, \"strapi-sdk-js\");\n execSync(installCmd, { cwd, stdio: \"ignore\" });\n s.stop(\"Dependency installed\");\n } catch {\n s.stop(\"Failed to install dependency\");\n logger.warn(`Please install manually: ${getInstallCommand(packageManager.name, \"strapi-sdk-js\")}`);\n }\n }\n\n // Show success message\n p.note(\n [\n `${pc.green(\"v\")} Created ${pc.cyan(\"strapi.config.ts\")}`,\n `${pc.green(\"v\")} Updated ${pc.cyan(\".env\")} with Strapi credentials`,\n `${pc.green(\"v\")} Created output directory ${pc.cyan(answers.outputDir)}`,\n \"\",\n `Next steps:`,\n ` 1. Run ${pc.cyan(\"npx strapi-integrate sync\")} to generate types`,\n ` 2. Import types from ${pc.cyan(answers.outputDir + \"/types\")}`,\n ` 3. Import services from ${pc.cyan(answers.outputDir + \"/services\")}`,\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 outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}): string {\n return `import { defineConfig } from \"strapi-integrate\";\n\nexport default defineConfig({\n // Strapi connection\n url: process.env.STRAPI_URL || \"${answers.strapiUrl}\",\n token: process.env.STRAPI_TOKEN,\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\nasync function appendToEnvFile(\n envPath: string,\n variables: Record<string, string>\n): Promise<void> {\n let content = \"\";\n\n try {\n content = await fs.readFile(envPath, \"utf-8\");\n } catch {\n // File does not exist, create new\n }\n\n const lines = content.split(\"\\n\");\n const existingKeys = new Set(\n lines\n .filter((line) => line.includes(\"=\"))\n .map((line) => line.split(\"=\")[0].trim())\n );\n\n const newLines: string[] = [];\n\n for (const [key, value] of Object.entries(variables)) {\n if (!existingKeys.has(key)) {\n newLines.push(`${key}=${value}`);\n }\n }\n\n if (newLines.length > 0) {\n const separator = content.endsWith(\"\\n\") || content === \"\" ? \"\" : \"\\n\";\n const newContent = content + separator + newLines.join(\"\\n\") + \"\\n\";\n await fs.writeFile(envPath, newContent, \"utf-8\");\n }\n}\n\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { loadConfig } from \"@strapi2front/core\";\nimport { fetchSchema, detectStrapiVersion } from \"@strapi2front/core\";\nimport { parseSchema } from \"@strapi2front/core\";\nimport type { StrapiVersion } from \"@strapi2front/core\";\nimport type { ParsedSchema, Attribute } from \"@strapi2front/core\";\nimport { generateTypes } from \"@strapi2front/generators\";\nimport { generateServices } from \"@strapi2front/generators\";\nimport { generateActions } from \"@strapi2front/generators\";\nimport { generateClient } from \"@strapi2front/generators\";\nimport { generateLocales } from \"@strapi2front/generators\";\nimport { generateByFeature } from \"@strapi2front/generators\";\nimport { logger } from \"../lib/utils/logger.js\";\n\nconst BLOCKS_RENDERER_PACKAGE = \"@strapi/blocks-react-renderer\";\n\n/**\n * Check if schema contains any blocks fields\n */\nfunction schemaHasBlocks(schema: ParsedSchema): { hasBlocks: boolean; fieldsFound: string[] } {\n const fieldsFound: string[] = [];\n\n const checkAttributes = (typeName: string, attributes: Record<string, Attribute>): void => {\n for (const [fieldName, attr] of Object.entries(attributes)) {\n if (attr.type === \"blocks\") {\n fieldsFound.push(`${typeName}.${fieldName}`);\n }\n }\n };\n\n for (const collection of schema.collections) {\n checkAttributes(collection.singularName, collection.attributes);\n }\n\n for (const single of schema.singles) {\n checkAttributes(single.singularName, single.attributes);\n }\n\n for (const component of schema.components) {\n checkAttributes(`component:${component.name}`, component.attributes);\n }\n\n return { hasBlocks: fieldsFound.length > 0, fieldsFound };\n}\n\n/**\n * Check if a package is installed\n */\nfunction isPackageInstalled(packageName: string, cwd: string): boolean {\n try {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) return false;\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n return packageName in deps;\n } catch {\n return false;\n }\n}\n\n/**\n * Detect package manager\n */\nfunction detectPackageManager(cwd: string): \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" {\n if (fs.existsSync(path.join(cwd, \"bun.lockb\"))) return \"bun\";\n if (fs.existsSync(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (fs.existsSync(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\n/**\n * Install a package\n */\nfunction installPackage(packageName: string, cwd: string): void {\n const pm = detectPackageManager(cwd);\n const commands: Record<string, string> = {\n npm: `npm install ${packageName}`,\n yarn: `yarn add ${packageName}`,\n pnpm: `pnpm add ${packageName}`,\n bun: `bun add ${packageName}`,\n };\n\n execSync(commands[pm], { cwd, stdio: \"inherit\" });\n}\n\n/**\n * Structure type for output organization\n */\ntype OutputStructure = \"by-layer\" | \"by-feature\";\n\n/**\n * Get orphaned folders from the opposite structure\n */\nfunction getOrphanedFolders(outputPath: string, currentStructure: OutputStructure): string[] {\n const orphanedFolders: string[] = [];\n\n if (currentStructure === \"by-feature\") {\n // If using by-feature, check for by-layer folders\n const byLayerFolders = [\"types\", \"services\", \"actions\"];\n for (const folder of byLayerFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n // Also check for root-level client.ts and locales.ts (by-layer puts them at root)\n if (fs.existsSync(path.join(outputPath, \"client.ts\"))) {\n orphanedFolders.push(\"client.ts\");\n }\n if (fs.existsSync(path.join(outputPath, \"locales.ts\"))) {\n orphanedFolders.push(\"locales.ts\");\n }\n } else {\n // If using by-layer, check for by-feature folders\n const byFeatureFolders = [\"collections\", \"singles\", \"shared\", \"components\"];\n for (const folder of byFeatureFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n }\n\n return orphanedFolders;\n}\n\n/**\n * Remove orphaned folders/files\n */\nfunction cleanOrphanedFiles(outputPath: string, orphanedItems: string[]): void {\n for (const item of orphanedItems) {\n const itemPath = path.join(outputPath, item);\n if (fs.existsSync(itemPath)) {\n const stat = fs.statSync(itemPath);\n if (stat.isDirectory()) {\n fs.rmSync(itemPath, { recursive: true, force: true });\n } else {\n fs.unlinkSync(itemPath);\n }\n }\n }\n}\n\nexport interface SyncCommandOptions {\n force?: boolean;\n typesOnly?: boolean;\n servicesOnly?: boolean;\n actionsOnly?: boolean;\n clean?: boolean;\n}\n\nexport async function syncCommand(options: SyncCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n p.intro(pc.cyan(\"strapi-integrate 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);\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);\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 if (isByFeature) {\n // Generate using by-feature structure (screaming architecture)\n s.start(\"Generating files (by-feature structure)...\");\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 && (generateAll || Boolean(options.actionsOnly)),\n },\n blocksRendererInstalled,\n strapiVersion: config.strapiVersion,\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...\");\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 });\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 });\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...\");\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 });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} service files`);\n }\n }\n\n // Generate actions\n if (generateAll || options.actionsOnly) {\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 strapi-integrate 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/prompts/init.prompts.ts","../src/lib/utils/logger.ts","../src/commands/init.ts","../src/commands/sync.ts"],"names":["path","fs","pc","p2","detectPackageManager","execSync","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 * 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 outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\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 // Check framework support\n if (detection.framework.name === \"unknown\") {\n p.cancel(\"Could not detect a supported framework. Currently only Astro is supported.\");\n return null;\n }\n\n if (detection.framework.name !== \"astro\") {\n p.cancel(`${detection.framework.name} is not yet supported. Currently only Astro is supported.`);\n return null;\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 // 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\n const features = await p.multiselect({\n message: \"What would you like to generate?\",\n options: [\n { value: \"types\", label: \"Types\", hint: \"TypeScript interfaces for your content types\" },\n { value: \"services\", label: \"Services\", hint: \"Typed service functions for data fetching\" },\n { value: \"actions\", label: \"Astro Actions\", hint: \"Type-safe actions for client/server\" },\n ],\n initialValues: [\"types\", \"services\", \"actions\"],\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 outputDir: ((outputDir as string) || \"\").trim() || \"src/strapi\",\n generateActions: (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 { execSync } from \"node:child_process\";\nimport { detectFramework } from \"../lib/detectors/framework.js\";\nimport { detectTypeScript } from \"../lib/detectors/typescript.js\";\nimport { detectPackageManager, getInstallCommand, getInstallDevCommand } from \"../lib/detectors/package-manager.js\";\nimport { runInitPrompts } from \"../lib/prompts/init.prompts.js\";\nimport { logger } from \"../lib/utils/logger.js\";\n\nexport interface InitCommandOptions {\n yes?: boolean;\n url?: string;\n token?: string;\n framework?: string;\n}\n\nexport async function initCommand(_options: InitCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Detect project configuration\n const s = p.spinner();\n s.start(\"Detecting project configuration...\");\n\n const [framework, typescript, packageManager] = await Promise.all([\n detectFramework(cwd),\n detectTypeScript(cwd),\n detectPackageManager(cwd),\n ]);\n\n s.stop(\"Project configuration detected\");\n\n // Run interactive prompts\n const answers = await runInitPrompts({\n framework,\n typescript,\n packageManager,\n });\n\n if (!answers) {\n return;\n }\n\n // Create configuration\n s.start(\"Creating configuration files...\");\n\n try {\n // Create strapi.config.ts\n const configContent = generateConfigFile({\n strapiUrl: answers.strapiUrl,\n strapiVersion: answers.strapiVersion,\n outputDir: answers.outputDir,\n generateActions: answers.generateActions,\n generateServices: answers.generateServices,\n });\n const configPath = path.join(cwd, \"strapi.config.ts\");\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 s.start(\"Installing strapi2front...\");\n try {\n const installStrapi2frontCmd = getInstallDevCommand(packageManager.name, \"strapi2front\");\n execSync(installStrapi2frontCmd, { cwd, stdio: \"ignore\" });\n s.stop(\"strapi2front installed\");\n } catch {\n s.stop(\"Failed to install strapi2front\");\n logger.warn(`Please install manually: ${getInstallDevCommand(packageManager.name, \"strapi2front\")}`);\n }\n\n // Install strapi-sdk-js as regular dependency\n s.start(\"Installing strapi-sdk-js...\");\n try {\n const installSdkCmd = getInstallCommand(packageManager.name, \"strapi-sdk-js\");\n execSync(installSdkCmd, { cwd, stdio: \"ignore\" });\n s.stop(\"strapi-sdk-js installed\");\n } catch {\n s.stop(\"Failed to install strapi-sdk-js\");\n logger.warn(`Please install manually: ${getInstallCommand(packageManager.name, \"strapi-sdk-js\")}`);\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 p.note(\n [\n `${pc.green(\"v\")} Created ${pc.cyan(\"strapi.config.ts\")}`,\n `${pc.green(\"v\")} Updated ${pc.cyan(\".env\")} with Strapi credentials`,\n `${pc.green(\"v\")} Created output directory ${pc.cyan(answers.outputDir)}`,\n \"\",\n `Next steps:`,\n ` 1. Run ${pc.cyan(\"npx strapi2front sync\")} to generate types`,\n ` 2. Import types from ${pc.cyan(answers.outputDir + \"/types\")}`,\n ` 3. Import services from ${pc.cyan(answers.outputDir + \"/services\")}`,\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 outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}): string {\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 // 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\nasync function appendToEnvFile(\n envPath: string,\n variables: Record<string, string>\n): Promise<void> {\n let content = \"\";\n\n try {\n content = await fs.readFile(envPath, \"utf-8\");\n } catch {\n // File does not exist, create new\n }\n\n const lines = content.split(\"\\n\");\n const existingKeys = new Set(\n lines\n .filter((line) => line.includes(\"=\"))\n .map((line) => line.split(\"=\")[0].trim())\n );\n\n const newLines: string[] = [];\n\n for (const [key, value] of Object.entries(variables)) {\n if (!existingKeys.has(key)) {\n newLines.push(`${key}=${value}`);\n }\n }\n\n if (newLines.length > 0) {\n const separator = content.endsWith(\"\\n\") || content === \"\" ? \"\" : \"\\n\";\n const newContent = content + separator + newLines.join(\"\\n\") + \"\\n\";\n await fs.writeFile(envPath, newContent, \"utf-8\");\n }\n}\n\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { loadConfig } from \"@strapi2front/core\";\nimport { fetchSchema, detectStrapiVersion } from \"@strapi2front/core\";\nimport { parseSchema } from \"@strapi2front/core\";\nimport type { StrapiVersion } from \"@strapi2front/core\";\nimport type { ParsedSchema, Attribute } from \"@strapi2front/core\";\nimport { generateTypes } from \"@strapi2front/generators\";\nimport { generateServices } from \"@strapi2front/generators\";\nimport { generateActions } from \"@strapi2front/generators\";\nimport { generateClient } from \"@strapi2front/generators\";\nimport { generateLocales } from \"@strapi2front/generators\";\nimport { generateByFeature } from \"@strapi2front/generators\";\nimport { logger } from \"../lib/utils/logger.js\";\n\nconst BLOCKS_RENDERER_PACKAGE = \"@strapi/blocks-react-renderer\";\n\n/**\n * Check if schema contains any blocks fields\n */\nfunction schemaHasBlocks(schema: ParsedSchema): { hasBlocks: boolean; fieldsFound: string[] } {\n const fieldsFound: string[] = [];\n\n const checkAttributes = (typeName: string, attributes: Record<string, Attribute>): void => {\n for (const [fieldName, attr] of Object.entries(attributes)) {\n if (attr.type === \"blocks\") {\n fieldsFound.push(`${typeName}.${fieldName}`);\n }\n }\n };\n\n for (const collection of schema.collections) {\n checkAttributes(collection.singularName, collection.attributes);\n }\n\n for (const single of schema.singles) {\n checkAttributes(single.singularName, single.attributes);\n }\n\n for (const component of schema.components) {\n checkAttributes(`component:${component.name}`, component.attributes);\n }\n\n return { hasBlocks: fieldsFound.length > 0, fieldsFound };\n}\n\n/**\n * Check if a package is installed\n */\nfunction isPackageInstalled(packageName: string, cwd: string): boolean {\n try {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) return false;\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n return packageName in deps;\n } catch {\n return false;\n }\n}\n\n/**\n * Detect package manager\n */\nfunction detectPackageManager(cwd: string): \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" {\n if (fs.existsSync(path.join(cwd, \"bun.lockb\"))) return \"bun\";\n if (fs.existsSync(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (fs.existsSync(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\n/**\n * Install a package\n */\nfunction installPackage(packageName: string, cwd: string): void {\n const pm = detectPackageManager(cwd);\n const commands: Record<string, string> = {\n npm: `npm install ${packageName}`,\n yarn: `yarn add ${packageName}`,\n pnpm: `pnpm add ${packageName}`,\n bun: `bun add ${packageName}`,\n };\n\n execSync(commands[pm], { cwd, stdio: \"inherit\" });\n}\n\n/**\n * Structure type for output organization\n */\ntype OutputStructure = \"by-layer\" | \"by-feature\";\n\n/**\n * Get orphaned folders from the opposite structure\n */\nfunction getOrphanedFolders(outputPath: string, currentStructure: OutputStructure): string[] {\n const orphanedFolders: string[] = [];\n\n if (currentStructure === \"by-feature\") {\n // If using by-feature, check for by-layer folders\n const byLayerFolders = [\"types\", \"services\", \"actions\"];\n for (const folder of byLayerFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n // Also check for root-level client.ts and locales.ts (by-layer puts them at root)\n if (fs.existsSync(path.join(outputPath, \"client.ts\"))) {\n orphanedFolders.push(\"client.ts\");\n }\n if (fs.existsSync(path.join(outputPath, \"locales.ts\"))) {\n orphanedFolders.push(\"locales.ts\");\n }\n } else {\n // If using by-layer, check for by-feature folders\n const byFeatureFolders = [\"collections\", \"singles\", \"shared\", \"components\"];\n for (const folder of byFeatureFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n }\n\n return orphanedFolders;\n}\n\n/**\n * Remove orphaned folders/files\n */\nfunction cleanOrphanedFiles(outputPath: string, orphanedItems: string[]): void {\n for (const item of orphanedItems) {\n const itemPath = path.join(outputPath, item);\n if (fs.existsSync(itemPath)) {\n const stat = fs.statSync(itemPath);\n if (stat.isDirectory()) {\n fs.rmSync(itemPath, { recursive: true, force: true });\n } else {\n fs.unlinkSync(itemPath);\n }\n }\n }\n}\n\nexport interface SyncCommandOptions {\n force?: boolean;\n typesOnly?: boolean;\n servicesOnly?: boolean;\n actionsOnly?: boolean;\n clean?: boolean;\n}\n\nexport async function syncCommand(options: SyncCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n p.intro(pc.cyan(\"strapi2front sync\"));\n\n const s = p.spinner();\n\n try {\n // Load configuration\n s.start(\"Loading configuration...\");\n let config = await loadConfig(cwd);\n s.stop(\"Configuration loaded\");\n\n // Detect and validate Strapi version\n s.start(\"Detecting Strapi version...\");\n const versionResult = await detectStrapiVersion(config.url, config.token);\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);\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 if (isByFeature) {\n // Generate using by-feature structure (screaming architecture)\n s.start(\"Generating files (by-feature structure)...\");\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 && (generateAll || Boolean(options.actionsOnly)),\n },\n blocksRendererInstalled,\n strapiVersion: config.strapiVersion,\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...\");\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 });\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 });\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...\");\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 });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} service files`);\n }\n }\n\n // Generate actions\n if (generateAll || options.actionsOnly) {\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.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Generate TypeScript types, services, and framework actions from your Strapi schema",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"picocolors": "^1.0.0",
|
|
27
27
|
"pkg-types": "^1.0.0",
|
|
28
28
|
"@strapi2front/client": "0.1.0",
|
|
29
|
-
"@strapi2front/core": "0.1.
|
|
30
|
-
"@strapi2front/generators": "0.1.
|
|
29
|
+
"@strapi2front/core": "0.1.2",
|
|
30
|
+
"@strapi2front/generators": "0.1.2"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"tsup": "^8.0.0",
|