strapi2front 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/strapi2front.js +109 -33
- package/dist/bin/strapi2front.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +109 -33
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/bin/strapi2front.js
CHANGED
|
@@ -140,6 +140,11 @@ function getInstallDevCommand(pm, pkg) {
|
|
|
140
140
|
};
|
|
141
141
|
return commands2[pm];
|
|
142
142
|
}
|
|
143
|
+
function getMajorVersion(version) {
|
|
144
|
+
if (!version) return null;
|
|
145
|
+
const match = version.replace(/^[\^~]/, "").match(/^(\d+)/);
|
|
146
|
+
return match ? parseInt(match[1], 10) : null;
|
|
147
|
+
}
|
|
143
148
|
async function runInitPrompts(detection) {
|
|
144
149
|
p.intro(pc4.cyan("strapi2front setup"));
|
|
145
150
|
p.note(
|
|
@@ -150,13 +155,22 @@ async function runInitPrompts(detection) {
|
|
|
150
155
|
].join("\n"),
|
|
151
156
|
"Detected Configuration"
|
|
152
157
|
);
|
|
158
|
+
let canGenerateActions = true;
|
|
153
159
|
if (detection.framework.name === "unknown") {
|
|
154
|
-
|
|
155
|
-
|
|
160
|
+
canGenerateActions = false;
|
|
161
|
+
} else if (detection.framework.name !== "astro") {
|
|
162
|
+
canGenerateActions = false;
|
|
163
|
+
} else {
|
|
164
|
+
const majorVersion = getMajorVersion(detection.framework.version);
|
|
165
|
+
if (majorVersion !== null && majorVersion < 4) {
|
|
166
|
+
p.log.warn(pc4.yellow(`Astro v${majorVersion} detected. Upgrade to v4+ to enable Actions.`));
|
|
167
|
+
canGenerateActions = false;
|
|
168
|
+
}
|
|
156
169
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
170
|
+
let outputFormat = "typescript";
|
|
171
|
+
if (!detection.typescript.enabled) {
|
|
172
|
+
p.log.info(pc4.dim("TypeScript not detected. Files will be generated as JavaScript with JSDoc annotations."));
|
|
173
|
+
outputFormat = "jsdoc";
|
|
160
174
|
}
|
|
161
175
|
const defaultUrl = "http://localhost:1337";
|
|
162
176
|
const strapiUrlInput = await p.text({
|
|
@@ -233,14 +247,27 @@ async function runInitPrompts(detection) {
|
|
|
233
247
|
p.cancel("Setup cancelled");
|
|
234
248
|
return null;
|
|
235
249
|
}
|
|
250
|
+
const isTypeScript = outputFormat === "typescript";
|
|
251
|
+
const featureOptions = [
|
|
252
|
+
{
|
|
253
|
+
value: "types",
|
|
254
|
+
label: isTypeScript ? "Types" : "Type Definitions",
|
|
255
|
+
hint: isTypeScript ? "TypeScript interfaces for your content types" : "JSDoc type definitions for your content types"
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
value: "services",
|
|
259
|
+
label: "Services",
|
|
260
|
+
hint: isTypeScript ? "Typed service functions for data fetching" : "Service functions with JSDoc annotations"
|
|
261
|
+
}
|
|
262
|
+
];
|
|
263
|
+
if (canGenerateActions && isTypeScript) {
|
|
264
|
+
featureOptions.push({ value: "actions", label: "Astro Actions", hint: "Type-safe actions for client/server" });
|
|
265
|
+
}
|
|
266
|
+
const initialFeatures = canGenerateActions && isTypeScript ? ["types", "services", "actions"] : ["types", "services"];
|
|
236
267
|
const features = await p.multiselect({
|
|
237
268
|
message: "What would you like to generate?",
|
|
238
|
-
options:
|
|
239
|
-
|
|
240
|
-
{ value: "services", label: "Services", hint: "Typed service functions for data fetching" },
|
|
241
|
-
{ value: "actions", label: "Astro Actions", hint: "Type-safe actions for client/server" }
|
|
242
|
-
],
|
|
243
|
-
initialValues: ["types", "services", "actions"],
|
|
269
|
+
options: featureOptions,
|
|
270
|
+
initialValues: initialFeatures,
|
|
244
271
|
required: true
|
|
245
272
|
});
|
|
246
273
|
if (p.isCancel(features)) {
|
|
@@ -252,8 +279,9 @@ async function runInitPrompts(detection) {
|
|
|
252
279
|
strapiToken: trimmedToken,
|
|
253
280
|
strapiVersion,
|
|
254
281
|
apiPrefix,
|
|
282
|
+
outputFormat,
|
|
255
283
|
outputDir: (outputDir || "").trim() || "src/strapi",
|
|
256
|
-
generateActions: features.includes("actions"),
|
|
284
|
+
generateActions: canGenerateActions && isTypeScript && features.includes("actions"),
|
|
257
285
|
generateServices: features.includes("services")
|
|
258
286
|
};
|
|
259
287
|
}
|
|
@@ -322,15 +350,17 @@ async function initCommand(_options) {
|
|
|
322
350
|
}
|
|
323
351
|
s.start("Creating configuration files...");
|
|
324
352
|
try {
|
|
353
|
+
const configExtension = answers.outputFormat === "jsdoc" ? "js" : "ts";
|
|
325
354
|
const configContent = generateConfigFile({
|
|
326
355
|
strapiUrl: answers.strapiUrl,
|
|
327
356
|
strapiVersion: answers.strapiVersion,
|
|
328
357
|
apiPrefix: answers.apiPrefix,
|
|
358
|
+
outputFormat: answers.outputFormat,
|
|
329
359
|
outputDir: answers.outputDir,
|
|
330
360
|
generateActions: answers.generateActions,
|
|
331
361
|
generateServices: answers.generateServices
|
|
332
362
|
});
|
|
333
|
-
const configPath = path5.join(cwd,
|
|
363
|
+
const configPath = path5.join(cwd, `strapi.config.${configExtension}`);
|
|
334
364
|
await fs4.writeFile(configPath, configContent, "utf-8");
|
|
335
365
|
const envPath = path5.join(cwd, ".env");
|
|
336
366
|
await appendToEnvFile(envPath, {
|
|
@@ -372,16 +402,20 @@ async function initCommand(_options) {
|
|
|
372
402
|
p.log.info(pc4.dim(` ${getInstallDevCommand(packageManager.name, "strapi2front")}`));
|
|
373
403
|
p.log.info(pc4.dim(` ${getInstallCommand(packageManager.name, "strapi-sdk-js")}`));
|
|
374
404
|
}
|
|
405
|
+
const configFileName = `strapi.config.${configExtension}`;
|
|
406
|
+
const fileExt = answers.outputFormat === "jsdoc" ? ".js" : ".ts";
|
|
375
407
|
p.note(
|
|
376
408
|
[
|
|
377
|
-
`${pc4.green("
|
|
378
|
-
`${pc4.green("
|
|
379
|
-
`${pc4.green("
|
|
409
|
+
`${pc4.green("\u2713")} Created ${pc4.cyan(configFileName)}`,
|
|
410
|
+
`${pc4.green("\u2713")} Updated ${pc4.cyan(".env")} with Strapi credentials`,
|
|
411
|
+
`${pc4.green("\u2713")} Created output directory ${pc4.cyan(answers.outputDir)}`,
|
|
412
|
+
"",
|
|
413
|
+
`Output format: ${pc4.cyan(answers.outputFormat === "jsdoc" ? "JavaScript (JSDoc)" : "TypeScript")}`,
|
|
380
414
|
"",
|
|
381
415
|
`Next steps:`,
|
|
382
|
-
` 1. Run ${pc4.cyan("npx strapi2front sync")} to generate
|
|
383
|
-
` 2. Import
|
|
384
|
-
` 3. Import services from ${pc4.cyan(answers.outputDir + "/
|
|
416
|
+
` 1. Run ${pc4.cyan("npx strapi2front sync")} to generate files`,
|
|
417
|
+
` 2. Import from ${pc4.cyan(answers.outputDir + "/collections/*" + fileExt)}`,
|
|
418
|
+
` 3. Import services from ${pc4.cyan(answers.outputDir + "/collections/*.service" + fileExt)}`
|
|
385
419
|
].join("\n"),
|
|
386
420
|
"Setup complete!"
|
|
387
421
|
);
|
|
@@ -393,17 +427,21 @@ async function initCommand(_options) {
|
|
|
393
427
|
}
|
|
394
428
|
}
|
|
395
429
|
function generateConfigFile(answers) {
|
|
396
|
-
const
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
` : "";
|
|
400
|
-
return `import { defineConfig } from "strapi2front";
|
|
430
|
+
const isTypeScript = answers.outputFormat === "typescript";
|
|
431
|
+
if (isTypeScript) {
|
|
432
|
+
return `import { defineConfig } from "strapi2front";
|
|
401
433
|
|
|
402
434
|
export default defineConfig({
|
|
403
435
|
// Strapi connection
|
|
404
436
|
url: process.env.STRAPI_URL || "${answers.strapiUrl}",
|
|
405
437
|
token: process.env.STRAPI_TOKEN,
|
|
406
|
-
|
|
438
|
+
|
|
439
|
+
// API prefix (default: "/api")
|
|
440
|
+
apiPrefix: "${answers.apiPrefix}",
|
|
441
|
+
|
|
442
|
+
// Output format: "typescript" (.ts) or "jsdoc" (.js with JSDoc)
|
|
443
|
+
outputFormat: "typescript",
|
|
444
|
+
|
|
407
445
|
// Output configuration
|
|
408
446
|
output: {
|
|
409
447
|
path: "${answers.outputDir}",
|
|
@@ -423,6 +461,40 @@ ${apiPrefixLine}
|
|
|
423
461
|
// Strapi version
|
|
424
462
|
strapiVersion: "${answers.strapiVersion}",
|
|
425
463
|
});
|
|
464
|
+
`;
|
|
465
|
+
}
|
|
466
|
+
return `// @ts-check
|
|
467
|
+
const { defineConfig } = require("strapi2front");
|
|
468
|
+
|
|
469
|
+
module.exports = defineConfig({
|
|
470
|
+
// Strapi connection
|
|
471
|
+
url: process.env.STRAPI_URL || "${answers.strapiUrl}",
|
|
472
|
+
token: process.env.STRAPI_TOKEN,
|
|
473
|
+
|
|
474
|
+
// API prefix (default: "/api")
|
|
475
|
+
apiPrefix: "${answers.apiPrefix}",
|
|
476
|
+
|
|
477
|
+
// Output format: "typescript" (.ts) or "jsdoc" (.js with JSDoc)
|
|
478
|
+
outputFormat: "jsdoc",
|
|
479
|
+
|
|
480
|
+
// Output configuration
|
|
481
|
+
output: {
|
|
482
|
+
path: "${answers.outputDir}",
|
|
483
|
+
types: "types",
|
|
484
|
+
services: "services",
|
|
485
|
+
structure: 'by-feature' // or 'by-layer'
|
|
486
|
+
},
|
|
487
|
+
|
|
488
|
+
// Features to generate
|
|
489
|
+
features: {
|
|
490
|
+
types: true,
|
|
491
|
+
services: ${answers.generateServices},
|
|
492
|
+
actions: false, // Actions require TypeScript
|
|
493
|
+
},
|
|
494
|
+
|
|
495
|
+
// Strapi version
|
|
496
|
+
strapiVersion: "${answers.strapiVersion}",
|
|
497
|
+
});
|
|
426
498
|
`;
|
|
427
499
|
}
|
|
428
500
|
async function appendToEnvFile(envPath, variables) {
|
|
@@ -634,30 +706,33 @@ async function syncCommand(options) {
|
|
|
634
706
|
}
|
|
635
707
|
}
|
|
636
708
|
}
|
|
709
|
+
const outputFormat = config.outputFormat || "typescript";
|
|
637
710
|
if (isByFeature) {
|
|
638
|
-
s.start(
|
|
711
|
+
s.start(`Generating files (by-feature, ${outputFormat})...`);
|
|
639
712
|
const files = await generateByFeature(schema, rawSchema.locales, {
|
|
640
713
|
outputDir: outputPath,
|
|
641
714
|
features: {
|
|
642
715
|
types: config.features.types && (generateAll || Boolean(options.typesOnly)),
|
|
643
716
|
services: config.features.services && (generateAll || Boolean(options.servicesOnly)),
|
|
644
|
-
actions: config.features.actions && (generateAll || Boolean(options.actionsOnly))
|
|
717
|
+
actions: config.features.actions && outputFormat === "typescript" && (generateAll || Boolean(options.actionsOnly))
|
|
645
718
|
},
|
|
646
719
|
blocksRendererInstalled,
|
|
647
720
|
strapiVersion: config.strapiVersion,
|
|
648
|
-
apiPrefix: config.apiPrefix
|
|
721
|
+
apiPrefix: config.apiPrefix,
|
|
722
|
+
outputFormat
|
|
649
723
|
});
|
|
650
724
|
generatedFiles.push(...files);
|
|
651
725
|
s.stop(`Generated ${files.length} files`);
|
|
652
726
|
} else {
|
|
653
727
|
if (generateAll || options.typesOnly) {
|
|
654
728
|
if (config.features.types) {
|
|
655
|
-
s.start(
|
|
729
|
+
s.start(`Generating types (${outputFormat})...`);
|
|
656
730
|
const typesPath = path5.join(outputPath, config.output.types);
|
|
657
731
|
const files = await generateTypes(schema, {
|
|
658
732
|
outputDir: typesPath,
|
|
659
733
|
blocksRendererInstalled,
|
|
660
|
-
strapiVersion: config.strapiVersion
|
|
734
|
+
strapiVersion: config.strapiVersion,
|
|
735
|
+
outputFormat
|
|
661
736
|
});
|
|
662
737
|
generatedFiles.push(...files);
|
|
663
738
|
s.stop(`Generated ${files.length} type files`);
|
|
@@ -681,19 +756,20 @@ async function syncCommand(options) {
|
|
|
681
756
|
}
|
|
682
757
|
if (generateAll || options.servicesOnly) {
|
|
683
758
|
if (config.features.services) {
|
|
684
|
-
s.start(
|
|
759
|
+
s.start(`Generating services (${outputFormat})...`);
|
|
685
760
|
const servicesPath = path5.join(outputPath, config.output.services);
|
|
686
761
|
const typesImportPath = path5.relative(servicesPath, path5.join(outputPath, config.output.types)).replace(/\\/g, "/") || ".";
|
|
687
762
|
const files = await generateServices(schema, {
|
|
688
763
|
outputDir: servicesPath,
|
|
689
764
|
typesImportPath: typesImportPath.startsWith(".") ? typesImportPath : "./" + typesImportPath,
|
|
690
|
-
strapiVersion: config.strapiVersion
|
|
765
|
+
strapiVersion: config.strapiVersion,
|
|
766
|
+
outputFormat
|
|
691
767
|
});
|
|
692
768
|
generatedFiles.push(...files);
|
|
693
769
|
s.stop(`Generated ${files.length} service files`);
|
|
694
770
|
}
|
|
695
771
|
}
|
|
696
|
-
if (generateAll || options.actionsOnly) {
|
|
772
|
+
if ((generateAll || options.actionsOnly) && outputFormat === "typescript") {
|
|
697
773
|
if (config.features.actions) {
|
|
698
774
|
s.start("Generating Astro actions...");
|
|
699
775
|
const actionsPath = path5.join(outputPath, config.output.actions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/detectors/framework.ts","../../src/lib/detectors/typescript.ts","../../src/lib/detectors/package-manager.ts","../../src/lib/prompts/init.prompts.ts","../../src/lib/utils/logger.ts","../../src/commands/init.ts","../../src/commands/sync.ts","../../src/bin/strapi2front.ts"],"names":["path","fs","commands","pc","args","p2","detectPackageManager","p3"],"mappings":"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","file":"strapi2front.js","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type Framework = \"astro\" | \"nextjs\" | \"nuxt\" | \"unknown\";\n\nexport interface FrameworkInfo {\n name: Framework;\n version: string | null;\n configFile: string | null;\n}\n\nconst FRAMEWORK_DETECTORS: Record<\n string,\n { name: Framework; configFiles: string[] }\n> = {\n astro: {\n name: \"astro\",\n configFiles: [\"astro.config.mjs\", \"astro.config.ts\", \"astro.config.js\"],\n },\n next: {\n name: \"nextjs\",\n configFiles: [\"next.config.mjs\", \"next.config.ts\", \"next.config.js\"],\n },\n nuxt: {\n name: \"nuxt\",\n configFiles: [\"nuxt.config.ts\", \"nuxt.config.js\"],\n },\n};\n\nexport async function detectFramework(cwd: string = process.cwd()): Promise<FrameworkInfo> {\n // Read package.json to check dependencies\n const pkgPath = path.join(cwd, \"package.json\");\n\n try {\n const pkgContent = await fs.readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n // Check each framework\n for (const [pkgName, detector] of Object.entries(FRAMEWORK_DETECTORS)) {\n if (deps[pkgName]) {\n // Check for config file\n for (const configFile of detector.configFiles) {\n const configPath = path.join(cwd, configFile);\n try {\n await fs.access(configPath);\n return {\n name: detector.name,\n version: deps[pkgName],\n configFile,\n };\n } catch {\n // Config file not found, continue\n }\n }\n\n // Package found but no config file\n return {\n name: detector.name,\n version: deps[pkgName],\n configFile: null,\n };\n }\n }\n } catch {\n // package.json not found\n }\n\n return {\n name: \"unknown\",\n version: null,\n configFile: null,\n };\n}\n\nexport function getFrameworkDisplayName(framework: Framework): string {\n const names: Record<Framework, string> = {\n astro: \"Astro\",\n nextjs: \"Next.js\",\n nuxt: \"Nuxt\",\n unknown: \"Unknown\",\n };\n return names[framework];\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface TypeScriptInfo {\n enabled: boolean;\n configFile: string | null;\n version: string | null;\n}\n\nconst TS_CONFIG_FILES = [\"tsconfig.json\", \"tsconfig.app.json\"];\n\nexport async function detectTypeScript(cwd: string = process.cwd()): Promise<TypeScriptInfo> {\n // Check for tsconfig\n for (const configFile of TS_CONFIG_FILES) {\n const configPath = path.join(cwd, configFile);\n try {\n await fs.access(configPath);\n\n // Check package.json for typescript version\n const pkgPath = path.join(cwd, \"package.json\");\n try {\n const pkgContent = await fs.readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n return {\n enabled: true,\n configFile,\n version: deps.typescript || null,\n };\n } catch {\n return {\n enabled: true,\n configFile,\n version: null,\n };\n }\n } catch {\n // Config not found, continue\n }\n }\n\n return {\n enabled: false,\n configFile: null,\n version: null,\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type PackageManager = \"pnpm\" | \"npm\" | \"yarn\" | \"bun\";\n\nexport interface PackageManagerInfo {\n name: PackageManager;\n lockFile: string | null;\n}\n\nconst LOCK_FILES: Record<string, PackageManager> = {\n \"pnpm-lock.yaml\": \"pnpm\",\n \"package-lock.json\": \"npm\",\n \"yarn.lock\": \"yarn\",\n \"bun.lockb\": \"bun\",\n};\n\nexport async function detectPackageManager(cwd: string = process.cwd()): Promise<PackageManagerInfo> {\n // Check for lock files\n for (const [lockFile, pm] of Object.entries(LOCK_FILES)) {\n const lockPath = path.join(cwd, lockFile);\n try {\n await fs.access(lockPath);\n return {\n name: pm,\n lockFile,\n };\n } catch {\n // Lock file not found, continue\n }\n }\n\n // Default to npm if no lock file found\n return {\n name: \"npm\",\n lockFile: null,\n };\n}\n\nexport function getInstallCommand(pm: PackageManager, pkg: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm add ${pkg}`,\n npm: `npm install ${pkg}`,\n yarn: `yarn add ${pkg}`,\n bun: `bun add ${pkg}`,\n };\n return commands[pm];\n}\n\nexport function getInstallDevCommand(pm: PackageManager, pkg: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm add -D ${pkg}`,\n npm: `npm install -D ${pkg}`,\n yarn: `yarn add -D ${pkg}`,\n bun: `bun add -d ${pkg}`,\n };\n return commands[pm];\n}\n\nexport function getRunCommand(pm: PackageManager, script: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm ${script}`,\n npm: `npm run ${script}`,\n yarn: `yarn ${script}`,\n bun: `bun run ${script}`,\n };\n return commands[pm];\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getFrameworkDisplayName, type FrameworkInfo } from \"../detectors/framework.js\";\nimport type { TypeScriptInfo } from \"../detectors/typescript.js\";\nimport type { PackageManagerInfo } from \"../detectors/package-manager.js\";\n\nexport interface DetectionResults {\n framework: FrameworkInfo;\n typescript: TypeScriptInfo;\n packageManager: PackageManagerInfo;\n}\n\nexport interface InitPromptAnswers {\n strapiUrl: string;\n strapiToken: string;\n strapiVersion: \"v4\" | \"v5\";\n apiPrefix: string;\n 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 // API Prefix\n const defaultPrefix = \"/api\";\n const apiPrefixInput = await p.text({\n message: \"What is your Strapi API prefix?\",\n placeholder: `${defaultPrefix} (press Enter for default)`,\n validate: (value): string | undefined => {\n const trimmed = (value || \"\").trim();\n if (trimmed === \"\") return undefined;\n if (!trimmed.startsWith(\"/\")) {\n return \"API prefix must start with /\";\n }\n return undefined;\n },\n });\n\n if (p.isCancel(apiPrefixInput)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n const apiPrefix = ((apiPrefixInput as string) || \"\").trim() || defaultPrefix;\n\n if (apiPrefix !== defaultPrefix) {\n p.log.info(pc.dim(`Using custom API prefix: ${apiPrefix}`));\n }\n\n // Output directory\n const outputDir = await p.text({\n message: \"Where should we generate the Strapi files?\",\n placeholder: \"src/strapi\",\n defaultValue: \"src/strapi\",\n });\n\n if (p.isCancel(outputDir)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Features to generate\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 apiPrefix: apiPrefix,\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 { spawn } from \"node:child_process\";\nimport { detectFramework } from \"../lib/detectors/framework.js\";\nimport { detectTypeScript } from \"../lib/detectors/typescript.js\";\nimport { detectPackageManager, getInstallCommand, getInstallDevCommand } from \"../lib/detectors/package-manager.js\";\nimport { runInitPrompts } from \"../lib/prompts/init.prompts.js\";\nimport { logger } from \"../lib/utils/logger.js\";\n\n/**\n * Execute a shell command asynchronously\n * This allows spinners to animate while the command runs\n */\nfunction execAsync(command: string, cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const [cmd, ...args] = command.split(\" \");\n const child = spawn(cmd, args, {\n cwd,\n stdio: \"ignore\",\n shell: true,\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n });\n}\n\nexport interface InitCommandOptions {\n yes?: boolean;\n url?: string;\n token?: string;\n framework?: string;\n}\n\nexport async function initCommand(_options: InitCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Detect project configuration\n const s = p.spinner();\n s.start(\"Detecting project configuration...\");\n\n const [framework, typescript, packageManager] = await Promise.all([\n detectFramework(cwd),\n detectTypeScript(cwd),\n detectPackageManager(cwd),\n ]);\n\n s.stop(\"Project configuration detected\");\n\n // Run interactive prompts\n const answers = await runInitPrompts({\n framework,\n typescript,\n packageManager,\n });\n\n if (!answers) {\n return;\n }\n\n // Create configuration\n s.start(\"Creating configuration files...\");\n\n try {\n // Create strapi.config.ts\n const configContent = generateConfigFile({\n strapiUrl: answers.strapiUrl,\n strapiVersion: answers.strapiVersion,\n apiPrefix: answers.apiPrefix,\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 const installStrapi2frontCmd = getInstallDevCommand(packageManager.name, \"strapi2front\");\n s.start(`Installing strapi2front... (${pc.dim(installStrapi2frontCmd)})`);\n try {\n await execAsync(installStrapi2frontCmd, cwd);\n s.stop(`${pc.green(\"✓\")} strapi2front installed`);\n } catch {\n s.stop(`${pc.red(\"✗\")} Failed to install strapi2front`);\n logger.warn(`Please install manually: ${installStrapi2frontCmd}`);\n }\n\n // Install strapi-sdk-js as regular dependency\n const installSdkCmd = getInstallCommand(packageManager.name, \"strapi-sdk-js\");\n s.start(`Installing strapi-sdk-js... (${pc.dim(installSdkCmd)})`);\n try {\n await execAsync(installSdkCmd, cwd);\n s.stop(`${pc.green(\"✓\")} strapi-sdk-js installed`);\n } catch {\n s.stop(`${pc.red(\"✗\")} Failed to install strapi-sdk-js`);\n logger.warn(`Please install manually: ${installSdkCmd}`);\n }\n } else {\n p.log.info(pc.dim(\"Remember to install dependencies manually:\"));\n p.log.info(pc.dim(` ${getInstallDevCommand(packageManager.name, \"strapi2front\")}`));\n p.log.info(pc.dim(` ${getInstallCommand(packageManager.name, \"strapi-sdk-js\")}`));\n }\n\n // Show success message\n 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 apiPrefix: string;\n outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}): string {\n // Only include apiPrefix if it's not the default\n const apiPrefixLine = answers.apiPrefix !== \"/api\"\n ? `\\n // API prefix (customized from default \"/api\")\\n apiPrefix: \"${answers.apiPrefix}\",\\n`\n : \"\";\n\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${apiPrefixLine}\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, config.apiPrefix);\n s.stop(\"Version detection complete\");\n\n let effectiveVersion: StrapiVersion = config.strapiVersion;\n\n if (versionResult.detected) {\n if (versionResult.detected !== config.strapiVersion) {\n // Version mismatch detected\n if (versionResult.detected === \"v5\" && config.strapiVersion === \"v4\") {\n p.log.warn(\n pc.yellow(`Detected Strapi ${pc.bold(\"v5\")} but config has ${pc.bold(\"v4\")}. Using v5.`)\n );\n effectiveVersion = \"v5\";\n } else if (versionResult.detected === \"v4\" && config.strapiVersion === \"v5\") {\n p.log.warn(\n pc.yellow(`Detected Strapi ${pc.bold(\"v4\")} but config has ${pc.bold(\"v5\")}. Using v4.`)\n );\n effectiveVersion = \"v4\";\n }\n } else {\n p.log.info(`Strapi ${pc.green(pc.bold(config.strapiVersion))}`);\n }\n } else {\n p.log.warn(pc.yellow(`Could not detect Strapi version. Using ${pc.bold(config.strapiVersion)}`));\n }\n\n // Update config with effective version for this sync\n config = { ...config, strapiVersion: effectiveVersion };\n\n // Fetch schema from Strapi\n s.start(\"Fetching schema from Strapi...\");\n const rawSchema = await fetchSchema(config.url, config.token, config.apiPrefix);\n const schema = parseSchema(rawSchema);\n s.stop(`Schema fetched: ${schema.collections.length} collections, ${schema.singles.length} singles, ${schema.components.length} components`);\n\n // Check for Blocks fields and prompt for renderer package\n let blocksRendererInstalled = isPackageInstalled(BLOCKS_RENDERER_PACKAGE, cwd);\n const { hasBlocks: hasBlocksFields, fieldsFound: blocksFieldsFound } = schemaHasBlocks(schema);\n\n if (hasBlocksFields && !blocksRendererInstalled) {\n p.log.info(`Blocks fields detected: ${pc.cyan(blocksFieldsFound.join(\", \"))}`);\n\n const installBlocks = await p.confirm({\n message: `Install ${pc.cyan(BLOCKS_RENDERER_PACKAGE)} for proper type support and rendering?`,\n initialValue: true,\n });\n\n if (p.isCancel(installBlocks)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n\n if (installBlocks) {\n s.start(`Installing ${BLOCKS_RENDERER_PACKAGE}...`);\n try {\n installPackage(BLOCKS_RENDERER_PACKAGE, cwd);\n blocksRendererInstalled = true;\n s.stop(`${BLOCKS_RENDERER_PACKAGE} installed`);\n } catch (error) {\n s.stop(`Failed to install ${BLOCKS_RENDERER_PACKAGE}`);\n logger.warn(\"You can install it manually later and re-run sync\");\n }\n } else {\n p.log.info(pc.dim(`Skipping ${BLOCKS_RENDERER_PACKAGE}. BlocksContent will be typed as unknown[]`));\n }\n }\n\n const outputPath = path.join(cwd, config.output.path);\n const generatedFiles: string[] = [];\n\n // Determine what to generate\n const generateAll = !options.typesOnly && !options.servicesOnly && !options.actionsOnly;\n\n // Check structure mode\n const isByFeature = config.output.structure === 'by-feature';\n const currentStructure: OutputStructure = isByFeature ? \"by-feature\" : \"by-layer\";\n\n // Check for orphaned files from previous structure\n if (fs.existsSync(outputPath)) {\n const orphanedFolders = getOrphanedFolders(outputPath, currentStructure);\n\n if (orphanedFolders.length > 0) {\n const otherStructure = isByFeature ? \"by-layer\" : \"by-feature\";\n p.log.warn(\n pc.yellow(`Found files from previous ${pc.bold(otherStructure)} structure:`)\n );\n p.log.message(pc.dim(` ${orphanedFolders.join(\", \")}`));\n\n let shouldClean = options.clean;\n\n if (!shouldClean) {\n const cleanResponse = await p.confirm({\n message: `Remove orphaned ${otherStructure} files?`,\n initialValue: true,\n });\n\n if (p.isCancel(cleanResponse)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n\n shouldClean = cleanResponse;\n }\n\n if (shouldClean) {\n s.start(\"Cleaning orphaned files...\");\n cleanOrphanedFiles(outputPath, orphanedFolders);\n s.stop(`Removed: ${orphanedFolders.join(\", \")}`);\n } else {\n p.log.info(pc.dim(\"Keeping orphaned files. You can clean them manually or use --clean flag.\"));\n }\n }\n }\n\n 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 apiPrefix: config.apiPrefix,\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, apiPrefix: config.apiPrefix });\n generatedFiles.push(...clientFiles);\n s.stop(\"Generated client\");\n\n // Generate locales (for i18n support)\n s.start(\"Generating locales...\");\n const localesFiles = await generateLocales(rawSchema.locales, { outputDir: outputPath });\n generatedFiles.push(...localesFiles);\n if (rawSchema.locales.length > 0) {\n s.stop(`Generated locales: ${rawSchema.locales.map(l => l.code).join(\", \")}`);\n } else {\n s.stop(\"Generated locales (i18n not enabled in Strapi)\");\n }\n }\n }\n\n // Generate services\n if (generateAll || options.servicesOnly) {\n if (config.features.services) {\n s.start(\"Generating services...\");\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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/detectors/framework.ts","../../src/lib/detectors/typescript.ts","../../src/lib/detectors/package-manager.ts","../../src/lib/prompts/init.prompts.ts","../../src/lib/utils/logger.ts","../../src/commands/init.ts","../../src/commands/sync.ts","../../src/bin/strapi2front.ts"],"names":["path","fs","commands","pc","args","p2","detectPackageManager","p3"],"mappings":"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","file":"strapi2front.js","sourcesContent":["import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type Framework = \"astro\" | \"nextjs\" | \"nuxt\" | \"unknown\";\n\nexport interface FrameworkInfo {\n name: Framework;\n version: string | null;\n configFile: string | null;\n}\n\nconst FRAMEWORK_DETECTORS: Record<\n string,\n { name: Framework; configFiles: string[] }\n> = {\n astro: {\n name: \"astro\",\n configFiles: [\"astro.config.mjs\", \"astro.config.ts\", \"astro.config.js\"],\n },\n next: {\n name: \"nextjs\",\n configFiles: [\"next.config.mjs\", \"next.config.ts\", \"next.config.js\"],\n },\n nuxt: {\n name: \"nuxt\",\n configFiles: [\"nuxt.config.ts\", \"nuxt.config.js\"],\n },\n};\n\nexport async function detectFramework(cwd: string = process.cwd()): Promise<FrameworkInfo> {\n // Read package.json to check dependencies\n const pkgPath = path.join(cwd, \"package.json\");\n\n try {\n const pkgContent = await fs.readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n // Check each framework\n for (const [pkgName, detector] of Object.entries(FRAMEWORK_DETECTORS)) {\n if (deps[pkgName]) {\n // Check for config file\n for (const configFile of detector.configFiles) {\n const configPath = path.join(cwd, configFile);\n try {\n await fs.access(configPath);\n return {\n name: detector.name,\n version: deps[pkgName],\n configFile,\n };\n } catch {\n // Config file not found, continue\n }\n }\n\n // Package found but no config file\n return {\n name: detector.name,\n version: deps[pkgName],\n configFile: null,\n };\n }\n }\n } catch {\n // package.json not found\n }\n\n return {\n name: \"unknown\",\n version: null,\n configFile: null,\n };\n}\n\nexport function getFrameworkDisplayName(framework: Framework): string {\n const names: Record<Framework, string> = {\n astro: \"Astro\",\n nextjs: \"Next.js\",\n nuxt: \"Nuxt\",\n unknown: \"Unknown\",\n };\n return names[framework];\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport interface TypeScriptInfo {\n enabled: boolean;\n configFile: string | null;\n version: string | null;\n}\n\nconst TS_CONFIG_FILES = [\"tsconfig.json\", \"tsconfig.app.json\"];\n\nexport async function detectTypeScript(cwd: string = process.cwd()): Promise<TypeScriptInfo> {\n // Check for tsconfig\n for (const configFile of TS_CONFIG_FILES) {\n const configPath = path.join(cwd, configFile);\n try {\n await fs.access(configPath);\n\n // Check package.json for typescript version\n const pkgPath = path.join(cwd, \"package.json\");\n try {\n const pkgContent = await fs.readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n return {\n enabled: true,\n configFile,\n version: deps.typescript || null,\n };\n } catch {\n return {\n enabled: true,\n configFile,\n version: null,\n };\n }\n } catch {\n // Config not found, continue\n }\n }\n\n return {\n enabled: false,\n configFile: null,\n version: null,\n };\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type PackageManager = \"pnpm\" | \"npm\" | \"yarn\" | \"bun\";\n\nexport interface PackageManagerInfo {\n name: PackageManager;\n lockFile: string | null;\n}\n\nconst LOCK_FILES: Record<string, PackageManager> = {\n \"pnpm-lock.yaml\": \"pnpm\",\n \"package-lock.json\": \"npm\",\n \"yarn.lock\": \"yarn\",\n \"bun.lockb\": \"bun\",\n};\n\nexport async function detectPackageManager(cwd: string = process.cwd()): Promise<PackageManagerInfo> {\n // Check for lock files\n for (const [lockFile, pm] of Object.entries(LOCK_FILES)) {\n const lockPath = path.join(cwd, lockFile);\n try {\n await fs.access(lockPath);\n return {\n name: pm,\n lockFile,\n };\n } catch {\n // Lock file not found, continue\n }\n }\n\n // Default to npm if no lock file found\n return {\n name: \"npm\",\n lockFile: null,\n };\n}\n\nexport function getInstallCommand(pm: PackageManager, pkg: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm add ${pkg}`,\n npm: `npm install ${pkg}`,\n yarn: `yarn add ${pkg}`,\n bun: `bun add ${pkg}`,\n };\n return commands[pm];\n}\n\nexport function getInstallDevCommand(pm: PackageManager, pkg: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm add -D ${pkg}`,\n npm: `npm install -D ${pkg}`,\n yarn: `yarn add -D ${pkg}`,\n bun: `bun add -d ${pkg}`,\n };\n return commands[pm];\n}\n\nexport function getRunCommand(pm: PackageManager, script: string): string {\n const commands: Record<PackageManager, string> = {\n pnpm: `pnpm ${script}`,\n npm: `npm run ${script}`,\n yarn: `yarn ${script}`,\n bun: `bun run ${script}`,\n };\n return commands[pm];\n}\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { getFrameworkDisplayName, type FrameworkInfo } from \"../detectors/framework.js\";\nimport type { TypeScriptInfo } from \"../detectors/typescript.js\";\nimport type { PackageManagerInfo } from \"../detectors/package-manager.js\";\n\nexport interface DetectionResults {\n framework: FrameworkInfo;\n typescript: TypeScriptInfo;\n packageManager: PackageManagerInfo;\n}\n\nexport interface InitPromptAnswers {\n strapiUrl: string;\n strapiToken: string;\n strapiVersion: \"v4\" | \"v5\";\n apiPrefix: string;\n outputFormat: \"typescript\" | \"jsdoc\";\n outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}\n\n/**\n * Parse version string to get major version number\n */\nfunction getMajorVersion(version: string | null): number | null {\n if (!version) return null;\n // Remove ^ or ~ prefix and get first number\n const match = version.replace(/^[\\^~]/, \"\").match(/^(\\d+)/);\n return match ? parseInt(match[1], 10) : null;\n}\n\nexport async function runInitPrompts(detection: DetectionResults): Promise<InitPromptAnswers | null> {\n p.intro(pc.cyan(\"strapi2front setup\"));\n\n // Show detected info\n p.note(\n [\n `Framework: ${pc.green(getFrameworkDisplayName(detection.framework.name))} ${detection.framework.version ? pc.dim(`v${detection.framework.version}`) : \"\"}`,\n `TypeScript: ${detection.typescript.enabled ? pc.green(\"enabled\") : pc.yellow(\"disabled\")}`,\n `Package Manager: ${pc.green(detection.packageManager.name)}`,\n ].join(\"\\n\"),\n \"Detected Configuration\"\n );\n\n // Track warnings and feature availability\n let canGenerateActions = true;\n let canGenerateTypes = true;\n\n // Check framework support for additional features\n if (detection.framework.name === \"unknown\") {\n // Unknown framework - generate types and services only\n canGenerateActions = false;\n } else if (detection.framework.name !== \"astro\") {\n // Non-Astro framework - generate types and services only (for now)\n canGenerateActions = false;\n } else {\n // Astro - check version for Actions support (requires v4+)\n const majorVersion = getMajorVersion(detection.framework.version);\n if (majorVersion !== null && majorVersion < 4) {\n p.log.warn(pc.yellow(`Astro v${majorVersion} detected. Upgrade to v4+ to enable Actions.`));\n canGenerateActions = false;\n }\n }\n\n // Determine output format based on TypeScript support\n let outputFormat: \"typescript\" | \"jsdoc\" = \"typescript\";\n\n if (!detection.typescript.enabled) {\n p.log.info(pc.dim(\"TypeScript not detected. Files will be generated as JavaScript with JSDoc annotations.\"));\n outputFormat = \"jsdoc\";\n }\n\n // Prompt for Strapi connection\n const defaultUrl = \"http://localhost:1337\";\n const strapiUrlInput = await p.text({\n message: \"What is your Strapi URL?\",\n placeholder: `${defaultUrl} (press Enter for default)`,\n validate: (value): string | undefined => {\n const trimmed = (value || \"\").trim();\n // Allow empty (will use default)\n if (trimmed === \"\") return undefined;\n try {\n new URL(trimmed);\n return undefined;\n } catch {\n return \"Please enter a valid URL\";\n }\n },\n });\n\n if (p.isCancel(strapiUrlInput)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Use default if empty or whitespace only\n const strapiUrl = ((strapiUrlInput as string) || \"\").trim() || defaultUrl;\n\n const strapiToken = await p.text({\n message: \"What is your Strapi API token?\",\n placeholder: \"Press Enter to skip (you can add it later in .env)\",\n });\n\n if (p.isCancel(strapiToken)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Trim and check if empty\n const trimmedToken = ((strapiToken as string) || \"\").trim();\n\n // Show hint if token is empty\n if (trimmedToken === \"\") {\n p.log.info(pc.dim(\"Token skipped. Remember to add STRAPI_TOKEN to your .env file later.\"));\n }\n\n // Strapi version\n const strapiVersion = await p.select({\n message: \"What version of Strapi are you using?\",\n options: [\n { value: \"v5\", label: \"Strapi v5\", hint: \"Recommended - Latest version\" },\n { value: \"v4\", label: \"Strapi v4\", hint: \"Legacy version\" },\n ],\n initialValue: \"v5\",\n });\n\n if (p.isCancel(strapiVersion)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n p.log.info(pc.dim(`Using Strapi ${strapiVersion}. This can be changed later in strapi.config.ts`));\n\n // API Prefix\n const defaultPrefix = \"/api\";\n const apiPrefixInput = await p.text({\n message: \"What is your Strapi API prefix?\",\n placeholder: `${defaultPrefix} (press Enter for default)`,\n validate: (value): string | undefined => {\n const trimmed = (value || \"\").trim();\n if (trimmed === \"\") return undefined;\n if (!trimmed.startsWith(\"/\")) {\n return \"API prefix must start with /\";\n }\n return undefined;\n },\n });\n\n if (p.isCancel(apiPrefixInput)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n const apiPrefix = ((apiPrefixInput as string) || \"\").trim() || defaultPrefix;\n\n if (apiPrefix !== defaultPrefix) {\n p.log.info(pc.dim(`Using custom API prefix: ${apiPrefix}`));\n }\n\n // Output directory\n const outputDir = await p.text({\n message: \"Where should we generate the Strapi files?\",\n placeholder: \"src/strapi\",\n defaultValue: \"src/strapi\",\n });\n\n if (p.isCancel(outputDir)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Features to generate - labels depend on output format\n const isTypeScript = outputFormat === \"typescript\";\n const featureOptions = [\n {\n value: \"types\",\n label: isTypeScript ? \"Types\" : \"Type Definitions\",\n hint: isTypeScript\n ? \"TypeScript interfaces for your content types\"\n : \"JSDoc type definitions for your content types\"\n },\n {\n value: \"services\",\n label: \"Services\",\n hint: isTypeScript\n ? \"Typed service functions for data fetching\"\n : \"Service functions with JSDoc annotations\"\n },\n ];\n\n // Only show Astro Actions if available (requires TypeScript)\n if (canGenerateActions && isTypeScript) {\n featureOptions.push({ value: \"actions\", label: \"Astro Actions\", hint: \"Type-safe actions for client/server\" });\n }\n\n const initialFeatures = (canGenerateActions && isTypeScript)\n ? [\"types\", \"services\", \"actions\"]\n : [\"types\", \"services\"];\n\n const features = await p.multiselect({\n message: \"What would you like to generate?\",\n options: featureOptions,\n initialValues: initialFeatures,\n required: true,\n });\n\n if (p.isCancel(features)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n return {\n strapiUrl: strapiUrl,\n strapiToken: trimmedToken,\n strapiVersion: strapiVersion as \"v4\" | \"v5\",\n apiPrefix: apiPrefix,\n outputFormat: outputFormat,\n outputDir: ((outputDir as string) || \"\").trim() || \"src/strapi\",\n generateActions: canGenerateActions && isTypeScript && (features as string[]).includes(\"actions\"),\n generateServices: (features as string[]).includes(\"services\"),\n };\n}\n\nexport async function confirmOverwrite(files: string[]): Promise<boolean> {\n const confirm = await p.confirm({\n message: `The following files will be overwritten:\\n${files.map((f) => ` - ${f}`).join(\"\\n\")}\\n\\nContinue?`,\n initialValue: true,\n });\n\n return !p.isCancel(confirm) && confirm === true;\n}\n","import pc from 'picocolors';\n\nexport const logger = {\n info: (message: string) => {\n console.log(pc.blue(\"i\"), message);\n },\n\n success: (message: string) => {\n console.log(pc.green(\"v\"), message);\n },\n\n warn: (message: string) => {\n console.log(pc.yellow(\"!\"), message);\n },\n\n error: (message: string) => {\n console.log(pc.red(\"x\"), message);\n },\n\n step: (message: string) => {\n console.log(pc.cyan(\">\"), message);\n },\n\n dim: (message: string) => {\n console.log(pc.dim(message));\n },\n\n newLine: () => {\n console.log(\"\");\n },\n};\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { detectFramework } from \"../lib/detectors/framework.js\";\nimport { detectTypeScript } from \"../lib/detectors/typescript.js\";\nimport { detectPackageManager, getInstallCommand, getInstallDevCommand } from \"../lib/detectors/package-manager.js\";\nimport { runInitPrompts } from \"../lib/prompts/init.prompts.js\";\nimport { logger } from \"../lib/utils/logger.js\";\n\n/**\n * Execute a shell command asynchronously\n * This allows spinners to animate while the command runs\n */\nfunction execAsync(command: string, cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const [cmd, ...args] = command.split(\" \");\n const child = spawn(cmd, args, {\n cwd,\n stdio: \"ignore\",\n shell: true,\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n });\n}\n\nexport interface InitCommandOptions {\n yes?: boolean;\n url?: string;\n token?: string;\n framework?: string;\n}\n\nexport async function initCommand(_options: InitCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Detect project configuration\n const s = p.spinner();\n s.start(\"Detecting project configuration...\");\n\n const [framework, typescript, packageManager] = await Promise.all([\n detectFramework(cwd),\n detectTypeScript(cwd),\n detectPackageManager(cwd),\n ]);\n\n s.stop(\"Project configuration detected\");\n\n // Run interactive prompts\n const answers = await runInitPrompts({\n framework,\n typescript,\n packageManager,\n });\n\n if (!answers) {\n return;\n }\n\n // Create configuration\n s.start(\"Creating configuration files...\");\n\n try {\n // Create config file (use .js extension for JSDoc projects)\n const configExtension = answers.outputFormat === \"jsdoc\" ? \"js\" : \"ts\";\n const configContent = generateConfigFile({\n strapiUrl: answers.strapiUrl,\n strapiVersion: answers.strapiVersion,\n apiPrefix: answers.apiPrefix,\n outputFormat: answers.outputFormat,\n outputDir: answers.outputDir,\n generateActions: answers.generateActions,\n generateServices: answers.generateServices,\n });\n const configPath = path.join(cwd, `strapi.config.${configExtension}`);\n await fs.writeFile(configPath, configContent, \"utf-8\");\n\n // Update .env file\n const envPath = path.join(cwd, \".env\");\n await appendToEnvFile(envPath, {\n STRAPI_URL: answers.strapiUrl,\n STRAPI_TOKEN: answers.strapiToken,\n });\n\n // Create output directory\n const outputPath = path.join(cwd, answers.outputDir);\n await fs.mkdir(outputPath, { recursive: true });\n\n s.stop(\"Configuration files created\");\n\n // Install dependencies\n const installDeps = await p.confirm({\n message: \"Install required dependencies (strapi2front, strapi-sdk-js)?\",\n initialValue: true,\n });\n\n if (p.isCancel(installDeps)) {\n p.cancel(\"Setup cancelled\");\n process.exit(0);\n }\n\n if (installDeps) {\n // Install strapi2front as dev dependency (needed for config file)\n const installStrapi2frontCmd = getInstallDevCommand(packageManager.name, \"strapi2front\");\n s.start(`Installing strapi2front... (${pc.dim(installStrapi2frontCmd)})`);\n try {\n await execAsync(installStrapi2frontCmd, cwd);\n s.stop(`${pc.green(\"✓\")} strapi2front installed`);\n } catch {\n s.stop(`${pc.red(\"✗\")} Failed to install strapi2front`);\n logger.warn(`Please install manually: ${installStrapi2frontCmd}`);\n }\n\n // Install strapi-sdk-js as regular dependency\n const installSdkCmd = getInstallCommand(packageManager.name, \"strapi-sdk-js\");\n s.start(`Installing strapi-sdk-js... (${pc.dim(installSdkCmd)})`);\n try {\n await execAsync(installSdkCmd, cwd);\n s.stop(`${pc.green(\"✓\")} strapi-sdk-js installed`);\n } catch {\n s.stop(`${pc.red(\"✗\")} Failed to install strapi-sdk-js`);\n logger.warn(`Please install manually: ${installSdkCmd}`);\n }\n } else {\n p.log.info(pc.dim(\"Remember to install dependencies manually:\"));\n p.log.info(pc.dim(` ${getInstallDevCommand(packageManager.name, \"strapi2front\")}`));\n p.log.info(pc.dim(` ${getInstallCommand(packageManager.name, \"strapi-sdk-js\")}`));\n }\n\n // Show success message\n const configFileName = `strapi.config.${configExtension}`;\n const fileExt = answers.outputFormat === \"jsdoc\" ? \".js\" : \".ts\";\n p.note(\n [\n `${pc.green(\"✓\")} Created ${pc.cyan(configFileName)}`,\n `${pc.green(\"✓\")} Updated ${pc.cyan(\".env\")} with Strapi credentials`,\n `${pc.green(\"✓\")} Created output directory ${pc.cyan(answers.outputDir)}`,\n \"\",\n `Output format: ${pc.cyan(answers.outputFormat === \"jsdoc\" ? \"JavaScript (JSDoc)\" : \"TypeScript\")}`,\n \"\",\n `Next steps:`,\n ` 1. Run ${pc.cyan(\"npx strapi2front sync\")} to generate files`,\n ` 2. Import from ${pc.cyan(answers.outputDir + \"/collections/*\" + fileExt)}`,\n ` 3. Import services from ${pc.cyan(answers.outputDir + \"/collections/*.service\" + fileExt)}`,\n ].join(\"\\n\"),\n \"Setup complete!\"\n );\n\n p.outro(pc.green(\"Happy coding!\"));\n } catch (error) {\n s.stop(\"Failed to create configuration files\");\n logger.error(error instanceof Error ? error.message : \"Unknown error\");\n process.exit(1);\n }\n}\n\nfunction generateConfigFile(answers: {\n strapiUrl: string;\n strapiVersion: \"v4\" | \"v5\";\n apiPrefix: string;\n outputFormat: \"typescript\" | \"jsdoc\";\n outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}): string {\n const isTypeScript = answers.outputFormat === \"typescript\";\n\n if (isTypeScript) {\n return `import { defineConfig } from \"strapi2front\";\n\nexport default defineConfig({\n // Strapi connection\n url: process.env.STRAPI_URL || \"${answers.strapiUrl}\",\n token: process.env.STRAPI_TOKEN,\n\n // API prefix (default: \"/api\")\n apiPrefix: \"${answers.apiPrefix}\",\n\n // Output format: \"typescript\" (.ts) or \"jsdoc\" (.js with JSDoc)\n outputFormat: \"typescript\",\n\n // Output configuration\n output: {\n path: \"${answers.outputDir}\",\n types: \"types\",\n services: \"services\",\n actions: \"actions/strapi\",\n structure: 'by-feature' // or 'by-layer'\n },\n\n // Features to generate\n features: {\n types: true,\n services: ${answers.generateServices},\n actions: ${answers.generateActions},\n },\n\n // Strapi version\n strapiVersion: \"${answers.strapiVersion}\",\n});\n`;\n }\n\n // JSDoc config (JavaScript)\n return `// @ts-check\nconst { defineConfig } = require(\"strapi2front\");\n\nmodule.exports = defineConfig({\n // Strapi connection\n url: process.env.STRAPI_URL || \"${answers.strapiUrl}\",\n token: process.env.STRAPI_TOKEN,\n\n // API prefix (default: \"/api\")\n apiPrefix: \"${answers.apiPrefix}\",\n\n // Output format: \"typescript\" (.ts) or \"jsdoc\" (.js with JSDoc)\n outputFormat: \"jsdoc\",\n\n // Output configuration\n output: {\n path: \"${answers.outputDir}\",\n types: \"types\",\n services: \"services\",\n structure: 'by-feature' // or 'by-layer'\n },\n\n // Features to generate\n features: {\n types: true,\n services: ${answers.generateServices},\n actions: false, // Actions require TypeScript\n },\n\n // Strapi version\n strapiVersion: \"${answers.strapiVersion}\",\n});\n`;\n}\n\nasync function appendToEnvFile(\n envPath: string,\n variables: Record<string, string>\n): Promise<void> {\n let content = \"\";\n\n try {\n content = await fs.readFile(envPath, \"utf-8\");\n } catch {\n // File does not exist, create new\n }\n\n const lines = content.split(\"\\n\");\n const existingKeys = new Set(\n lines\n .filter((line) => line.includes(\"=\"))\n .map((line) => line.split(\"=\")[0].trim())\n );\n\n const newLines: string[] = [];\n\n for (const [key, value] of Object.entries(variables)) {\n if (!existingKeys.has(key)) {\n newLines.push(`${key}=${value}`);\n }\n }\n\n if (newLines.length > 0) {\n const separator = content.endsWith(\"\\n\") || content === \"\" ? \"\" : \"\\n\";\n const newContent = content + separator + newLines.join(\"\\n\") + \"\\n\";\n await fs.writeFile(envPath, newContent, \"utf-8\");\n }\n}\n\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { loadConfig } from \"@strapi2front/core\";\nimport { fetchSchema, detectStrapiVersion } from \"@strapi2front/core\";\nimport { parseSchema } from \"@strapi2front/core\";\nimport type { StrapiVersion } from \"@strapi2front/core\";\nimport type { ParsedSchema, Attribute } from \"@strapi2front/core\";\nimport { generateTypes } from \"@strapi2front/generators\";\nimport { generateServices } from \"@strapi2front/generators\";\nimport { generateActions } from \"@strapi2front/generators\";\nimport { generateClient } from \"@strapi2front/generators\";\nimport { generateLocales } from \"@strapi2front/generators\";\nimport { generateByFeature } from \"@strapi2front/generators\";\nimport { logger } from \"../lib/utils/logger.js\";\n\nconst BLOCKS_RENDERER_PACKAGE = \"@strapi/blocks-react-renderer\";\n\n/**\n * Check if schema contains any blocks fields\n */\nfunction schemaHasBlocks(schema: ParsedSchema): { hasBlocks: boolean; fieldsFound: string[] } {\n const fieldsFound: string[] = [];\n\n const checkAttributes = (typeName: string, attributes: Record<string, Attribute>): void => {\n for (const [fieldName, attr] of Object.entries(attributes)) {\n if (attr.type === \"blocks\") {\n fieldsFound.push(`${typeName}.${fieldName}`);\n }\n }\n };\n\n for (const collection of schema.collections) {\n checkAttributes(collection.singularName, collection.attributes);\n }\n\n for (const single of schema.singles) {\n checkAttributes(single.singularName, single.attributes);\n }\n\n for (const component of schema.components) {\n checkAttributes(`component:${component.name}`, component.attributes);\n }\n\n return { hasBlocks: fieldsFound.length > 0, fieldsFound };\n}\n\n/**\n * Check if a package is installed\n */\nfunction isPackageInstalled(packageName: string, cwd: string): boolean {\n try {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) return false;\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n return packageName in deps;\n } catch {\n return false;\n }\n}\n\n/**\n * Detect package manager\n */\nfunction detectPackageManager(cwd: string): \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" {\n if (fs.existsSync(path.join(cwd, \"bun.lockb\"))) return \"bun\";\n if (fs.existsSync(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (fs.existsSync(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\n/**\n * Install a package\n */\nfunction installPackage(packageName: string, cwd: string): void {\n const pm = detectPackageManager(cwd);\n const commands: Record<string, string> = {\n npm: `npm install ${packageName}`,\n yarn: `yarn add ${packageName}`,\n pnpm: `pnpm add ${packageName}`,\n bun: `bun add ${packageName}`,\n };\n\n execSync(commands[pm], { cwd, stdio: \"inherit\" });\n}\n\n/**\n * Structure type for output organization\n */\ntype OutputStructure = \"by-layer\" | \"by-feature\";\n\n/**\n * Get orphaned folders from the opposite structure\n */\nfunction getOrphanedFolders(outputPath: string, currentStructure: OutputStructure): string[] {\n const orphanedFolders: string[] = [];\n\n if (currentStructure === \"by-feature\") {\n // If using by-feature, check for by-layer folders\n const byLayerFolders = [\"types\", \"services\", \"actions\"];\n for (const folder of byLayerFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n // Also check for root-level client.ts and locales.ts (by-layer puts them at root)\n if (fs.existsSync(path.join(outputPath, \"client.ts\"))) {\n orphanedFolders.push(\"client.ts\");\n }\n if (fs.existsSync(path.join(outputPath, \"locales.ts\"))) {\n orphanedFolders.push(\"locales.ts\");\n }\n } else {\n // If using by-layer, check for by-feature folders\n const byFeatureFolders = [\"collections\", \"singles\", \"shared\", \"components\"];\n for (const folder of byFeatureFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n }\n\n return orphanedFolders;\n}\n\n/**\n * Remove orphaned folders/files\n */\nfunction cleanOrphanedFiles(outputPath: string, orphanedItems: string[]): void {\n for (const item of orphanedItems) {\n const itemPath = path.join(outputPath, item);\n if (fs.existsSync(itemPath)) {\n const stat = fs.statSync(itemPath);\n if (stat.isDirectory()) {\n fs.rmSync(itemPath, { recursive: true, force: true });\n } else {\n fs.unlinkSync(itemPath);\n }\n }\n }\n}\n\nexport interface SyncCommandOptions {\n force?: boolean;\n typesOnly?: boolean;\n servicesOnly?: boolean;\n actionsOnly?: boolean;\n clean?: boolean;\n}\n\nexport async function syncCommand(options: SyncCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n p.intro(pc.cyan(\"strapi2front sync\"));\n\n const s = p.spinner();\n\n try {\n // Load configuration\n s.start(\"Loading configuration...\");\n let config = await loadConfig(cwd);\n s.stop(\"Configuration loaded\");\n\n // Detect and validate Strapi version\n s.start(\"Detecting Strapi version...\");\n const versionResult = await detectStrapiVersion(config.url, config.token, config.apiPrefix);\n s.stop(\"Version detection complete\");\n\n let effectiveVersion: StrapiVersion = config.strapiVersion;\n\n if (versionResult.detected) {\n if (versionResult.detected !== config.strapiVersion) {\n // Version mismatch detected\n if (versionResult.detected === \"v5\" && config.strapiVersion === \"v4\") {\n p.log.warn(\n pc.yellow(`Detected Strapi ${pc.bold(\"v5\")} but config has ${pc.bold(\"v4\")}. Using v5.`)\n );\n effectiveVersion = \"v5\";\n } else if (versionResult.detected === \"v4\" && config.strapiVersion === \"v5\") {\n p.log.warn(\n pc.yellow(`Detected Strapi ${pc.bold(\"v4\")} but config has ${pc.bold(\"v5\")}. Using v4.`)\n );\n effectiveVersion = \"v4\";\n }\n } else {\n p.log.info(`Strapi ${pc.green(pc.bold(config.strapiVersion))}`);\n }\n } else {\n p.log.warn(pc.yellow(`Could not detect Strapi version. Using ${pc.bold(config.strapiVersion)}`));\n }\n\n // Update config with effective version for this sync\n config = { ...config, strapiVersion: effectiveVersion };\n\n // Fetch schema from Strapi\n s.start(\"Fetching schema from Strapi...\");\n const rawSchema = await fetchSchema(config.url, config.token, config.apiPrefix);\n const schema = parseSchema(rawSchema);\n s.stop(`Schema fetched: ${schema.collections.length} collections, ${schema.singles.length} singles, ${schema.components.length} components`);\n\n // Check for Blocks fields and prompt for renderer package\n let blocksRendererInstalled = isPackageInstalled(BLOCKS_RENDERER_PACKAGE, cwd);\n const { hasBlocks: hasBlocksFields, fieldsFound: blocksFieldsFound } = schemaHasBlocks(schema);\n\n if (hasBlocksFields && !blocksRendererInstalled) {\n p.log.info(`Blocks fields detected: ${pc.cyan(blocksFieldsFound.join(\", \"))}`);\n\n const installBlocks = await p.confirm({\n message: `Install ${pc.cyan(BLOCKS_RENDERER_PACKAGE)} for proper type support and rendering?`,\n initialValue: true,\n });\n\n if (p.isCancel(installBlocks)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n\n if (installBlocks) {\n s.start(`Installing ${BLOCKS_RENDERER_PACKAGE}...`);\n try {\n installPackage(BLOCKS_RENDERER_PACKAGE, cwd);\n blocksRendererInstalled = true;\n s.stop(`${BLOCKS_RENDERER_PACKAGE} installed`);\n } catch (error) {\n s.stop(`Failed to install ${BLOCKS_RENDERER_PACKAGE}`);\n logger.warn(\"You can install it manually later and re-run sync\");\n }\n } else {\n p.log.info(pc.dim(`Skipping ${BLOCKS_RENDERER_PACKAGE}. BlocksContent will be typed as unknown[]`));\n }\n }\n\n const outputPath = path.join(cwd, config.output.path);\n const generatedFiles: string[] = [];\n\n // Determine what to generate\n const generateAll = !options.typesOnly && !options.servicesOnly && !options.actionsOnly;\n\n // Check structure mode\n const isByFeature = config.output.structure === 'by-feature';\n const currentStructure: OutputStructure = isByFeature ? \"by-feature\" : \"by-layer\";\n\n // Check for orphaned files from previous structure\n if (fs.existsSync(outputPath)) {\n const orphanedFolders = getOrphanedFolders(outputPath, currentStructure);\n\n if (orphanedFolders.length > 0) {\n const otherStructure = isByFeature ? \"by-layer\" : \"by-feature\";\n p.log.warn(\n pc.yellow(`Found files from previous ${pc.bold(otherStructure)} structure:`)\n );\n p.log.message(pc.dim(` ${orphanedFolders.join(\", \")}`));\n\n let shouldClean = options.clean;\n\n if (!shouldClean) {\n const cleanResponse = await p.confirm({\n message: `Remove orphaned ${otherStructure} files?`,\n initialValue: true,\n });\n\n if (p.isCancel(cleanResponse)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n\n shouldClean = cleanResponse;\n }\n\n if (shouldClean) {\n s.start(\"Cleaning orphaned files...\");\n cleanOrphanedFiles(outputPath, orphanedFolders);\n s.stop(`Removed: ${orphanedFolders.join(\", \")}`);\n } else {\n p.log.info(pc.dim(\"Keeping orphaned files. You can clean them manually or use --clean flag.\"));\n }\n }\n }\n\n // Get output format from config (default to typescript)\n const outputFormat = config.outputFormat || \"typescript\";\n\n if (isByFeature) {\n // Generate using by-feature structure (screaming architecture)\n s.start(`Generating files (by-feature, ${outputFormat})...`);\n const files = await generateByFeature(schema, rawSchema.locales, {\n outputDir: outputPath,\n features: {\n types: config.features.types && (generateAll || Boolean(options.typesOnly)),\n services: config.features.services && (generateAll || Boolean(options.servicesOnly)),\n actions: config.features.actions && outputFormat === \"typescript\" && (generateAll || Boolean(options.actionsOnly)),\n },\n blocksRendererInstalled,\n strapiVersion: config.strapiVersion,\n apiPrefix: config.apiPrefix,\n outputFormat,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} files`);\n } else {\n // Generate using by-layer structure (default)\n\n // Generate types\n if (generateAll || options.typesOnly) {\n if (config.features.types) {\n s.start(`Generating types (${outputFormat})...`);\n const typesPath = path.join(outputPath, config.output.types);\n const files = await generateTypes(schema, {\n outputDir: typesPath,\n blocksRendererInstalled,\n strapiVersion: config.strapiVersion,\n outputFormat,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} type files`);\n }\n }\n\n // Generate client (needed by services)\n if (generateAll || options.servicesOnly) {\n if (config.features.services) {\n s.start(\"Generating client...\");\n const clientFiles = await generateClient({ outputDir: outputPath, strapiVersion: config.strapiVersion, apiPrefix: config.apiPrefix });\n generatedFiles.push(...clientFiles);\n s.stop(\"Generated client\");\n\n // Generate locales (for i18n support)\n s.start(\"Generating locales...\");\n const localesFiles = await generateLocales(rawSchema.locales, { outputDir: outputPath });\n generatedFiles.push(...localesFiles);\n if (rawSchema.locales.length > 0) {\n s.stop(`Generated locales: ${rawSchema.locales.map(l => l.code).join(\", \")}`);\n } else {\n s.stop(\"Generated locales (i18n not enabled in Strapi)\");\n }\n }\n }\n\n // Generate services\n if (generateAll || options.servicesOnly) {\n if (config.features.services) {\n s.start(`Generating services (${outputFormat})...`);\n const servicesPath = path.join(outputPath, config.output.services);\n const typesImportPath = path.relative(servicesPath, path.join(outputPath, config.output.types)).replace(/\\\\/g, \"/\") || \".\";\n const files = await generateServices(schema, {\n outputDir: servicesPath,\n typesImportPath: typesImportPath.startsWith(\".\") ? typesImportPath : \"./\" + typesImportPath,\n strapiVersion: config.strapiVersion,\n outputFormat,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} service files`);\n }\n }\n\n // Generate actions (only for TypeScript projects)\n if ((generateAll || options.actionsOnly) && outputFormat === \"typescript\") {\n if (config.features.actions) {\n s.start(\"Generating Astro actions...\");\n const actionsPath = path.join(outputPath, config.output.actions);\n const servicesPath = path.join(outputPath, config.output.services);\n\n const servicesImportPath = path.relative(actionsPath, servicesPath).replace(/\\\\/g, \"/\") || \".\";\n\n const files = await generateActions(schema, {\n outputDir: actionsPath,\n servicesImportPath: servicesImportPath.startsWith(\".\") ? servicesImportPath : \"./\" + servicesImportPath,\n strapiVersion: config.strapiVersion,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} action files`);\n }\n }\n }\n\n // Show summary\n p.note(\n [\n `Generated ${generatedFiles.length} files in ${pc.cyan(config.output.path)}`,\n \"\",\n \"Files generated:\",\n ...generatedFiles.slice(0, 10).map((f) => ` ${pc.dim(path.relative(cwd, f))}`),\n generatedFiles.length > 10 ? ` ${pc.dim(`... and ${generatedFiles.length - 10} more`)}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n \"Sync complete!\"\n );\n\n p.outro(pc.green(\"Types and services are ready to use!\"));\n } catch (error) {\n s.stop(\"Sync failed\");\n\n if (error instanceof Error) {\n logger.error(error.message);\n\n if (error.message.includes(\"Could not find strapi.config\")) {\n logger.info(\"Run \\\"npx strapi2front init\\\" first to set up your project.\");\n }\n } else {\n logger.error(\"An unknown error occurred\");\n }\n\n process.exit(1);\n }\n}\n","import { Command } from 'commander';\nimport pc from 'picocolors';\nimport { initCommand } from '../commands/init.js';\nimport { syncCommand } from '../commands/sync.js';\n\nconst program = new Command();\n\n// ASCII Art Logo\nconst logo = `\n _ _ ___ __ _\n ___| |_ _ __ __ _ _ __ (_)__ \\\\ / _|_ __ ___ _ __ | |_\n/ __| __| '__/ _\\` | '_ \\\\| | / /| |_| '__/ _ \\\\| '_ \\\\| __|\n\\\\__ \\\\ |_| | | (_| | |_) | ||_| | _| | | (_) | | | | |_\n|___/\\\\__|_| \\\\__,_| .__/|_|(_) |_| |_| \\\\___/|_| |_|\\\\__|\n |_|\n`;\n\nprogram\n .name('strapi2front')\n .description('Generate TypeScript types, services, and framework actions from your Strapi schema')\n .version('0.1.0')\n .addHelpText('beforeAll', pc.cyan(logo));\n\n// Init command\nprogram\n .command('init')\n .description('Initialize strapi2front in your project')\n .option('-y, --yes', 'Skip prompts and use defaults')\n .option('--url <url>', 'Strapi URL')\n .option('--token <token>', 'Strapi API token')\n .option('--framework <framework>', 'Framework to use (astro)')\n .action(initCommand);\n\n// Sync command\nprogram\n .command('sync')\n .description('Sync types, services, and actions from Strapi schema')\n .option('-f, --force', 'Force regeneration of all files')\n .option('--types-only', 'Only generate types')\n .option('--services-only', 'Only generate services')\n .option('--actions-only', 'Only generate actions')\n .option('--clean', 'Automatically remove orphaned files from previous structure')\n .action(syncCommand);\n\n// If no command is provided, run init by default\nconst args = process.argv.slice(2);\nconst commands = ['init', 'sync', 'help', '--help', '-h', '--version', '-V'];\nconst hasCommand = args.some((arg) => commands.includes(arg));\n\nif (args.length === 0 || !hasCommand) {\n // Show logo and run init\n console.log(pc.cyan(logo));\n initCommand({});\n} else {\n // Parse args normally\n program.parse();\n}\n"]}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -140,6 +140,11 @@ function getInstallDevCommand(pm, pkg) {
|
|
|
140
140
|
};
|
|
141
141
|
return commands[pm];
|
|
142
142
|
}
|
|
143
|
+
function getMajorVersion(version) {
|
|
144
|
+
if (!version) return null;
|
|
145
|
+
const match = version.replace(/^[\^~]/, "").match(/^(\d+)/);
|
|
146
|
+
return match ? parseInt(match[1], 10) : null;
|
|
147
|
+
}
|
|
143
148
|
async function runInitPrompts(detection) {
|
|
144
149
|
p.intro(pc4.cyan("strapi2front setup"));
|
|
145
150
|
p.note(
|
|
@@ -150,13 +155,22 @@ async function runInitPrompts(detection) {
|
|
|
150
155
|
].join("\n"),
|
|
151
156
|
"Detected Configuration"
|
|
152
157
|
);
|
|
158
|
+
let canGenerateActions = true;
|
|
153
159
|
if (detection.framework.name === "unknown") {
|
|
154
|
-
|
|
155
|
-
|
|
160
|
+
canGenerateActions = false;
|
|
161
|
+
} else if (detection.framework.name !== "astro") {
|
|
162
|
+
canGenerateActions = false;
|
|
163
|
+
} else {
|
|
164
|
+
const majorVersion = getMajorVersion(detection.framework.version);
|
|
165
|
+
if (majorVersion !== null && majorVersion < 4) {
|
|
166
|
+
p.log.warn(pc4.yellow(`Astro v${majorVersion} detected. Upgrade to v4+ to enable Actions.`));
|
|
167
|
+
canGenerateActions = false;
|
|
168
|
+
}
|
|
156
169
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
170
|
+
let outputFormat = "typescript";
|
|
171
|
+
if (!detection.typescript.enabled) {
|
|
172
|
+
p.log.info(pc4.dim("TypeScript not detected. Files will be generated as JavaScript with JSDoc annotations."));
|
|
173
|
+
outputFormat = "jsdoc";
|
|
160
174
|
}
|
|
161
175
|
const defaultUrl = "http://localhost:1337";
|
|
162
176
|
const strapiUrlInput = await p.text({
|
|
@@ -233,14 +247,27 @@ async function runInitPrompts(detection) {
|
|
|
233
247
|
p.cancel("Setup cancelled");
|
|
234
248
|
return null;
|
|
235
249
|
}
|
|
250
|
+
const isTypeScript = outputFormat === "typescript";
|
|
251
|
+
const featureOptions = [
|
|
252
|
+
{
|
|
253
|
+
value: "types",
|
|
254
|
+
label: isTypeScript ? "Types" : "Type Definitions",
|
|
255
|
+
hint: isTypeScript ? "TypeScript interfaces for your content types" : "JSDoc type definitions for your content types"
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
value: "services",
|
|
259
|
+
label: "Services",
|
|
260
|
+
hint: isTypeScript ? "Typed service functions for data fetching" : "Service functions with JSDoc annotations"
|
|
261
|
+
}
|
|
262
|
+
];
|
|
263
|
+
if (canGenerateActions && isTypeScript) {
|
|
264
|
+
featureOptions.push({ value: "actions", label: "Astro Actions", hint: "Type-safe actions for client/server" });
|
|
265
|
+
}
|
|
266
|
+
const initialFeatures = canGenerateActions && isTypeScript ? ["types", "services", "actions"] : ["types", "services"];
|
|
236
267
|
const features = await p.multiselect({
|
|
237
268
|
message: "What would you like to generate?",
|
|
238
|
-
options:
|
|
239
|
-
|
|
240
|
-
{ value: "services", label: "Services", hint: "Typed service functions for data fetching" },
|
|
241
|
-
{ value: "actions", label: "Astro Actions", hint: "Type-safe actions for client/server" }
|
|
242
|
-
],
|
|
243
|
-
initialValues: ["types", "services", "actions"],
|
|
269
|
+
options: featureOptions,
|
|
270
|
+
initialValues: initialFeatures,
|
|
244
271
|
required: true
|
|
245
272
|
});
|
|
246
273
|
if (p.isCancel(features)) {
|
|
@@ -252,8 +279,9 @@ async function runInitPrompts(detection) {
|
|
|
252
279
|
strapiToken: trimmedToken,
|
|
253
280
|
strapiVersion,
|
|
254
281
|
apiPrefix,
|
|
282
|
+
outputFormat,
|
|
255
283
|
outputDir: (outputDir || "").trim() || "src/strapi",
|
|
256
|
-
generateActions: features.includes("actions"),
|
|
284
|
+
generateActions: canGenerateActions && isTypeScript && features.includes("actions"),
|
|
257
285
|
generateServices: features.includes("services")
|
|
258
286
|
};
|
|
259
287
|
}
|
|
@@ -322,15 +350,17 @@ async function initCommand(_options) {
|
|
|
322
350
|
}
|
|
323
351
|
s.start("Creating configuration files...");
|
|
324
352
|
try {
|
|
353
|
+
const configExtension = answers.outputFormat === "jsdoc" ? "js" : "ts";
|
|
325
354
|
const configContent = generateConfigFile({
|
|
326
355
|
strapiUrl: answers.strapiUrl,
|
|
327
356
|
strapiVersion: answers.strapiVersion,
|
|
328
357
|
apiPrefix: answers.apiPrefix,
|
|
358
|
+
outputFormat: answers.outputFormat,
|
|
329
359
|
outputDir: answers.outputDir,
|
|
330
360
|
generateActions: answers.generateActions,
|
|
331
361
|
generateServices: answers.generateServices
|
|
332
362
|
});
|
|
333
|
-
const configPath = path5.join(cwd,
|
|
363
|
+
const configPath = path5.join(cwd, `strapi.config.${configExtension}`);
|
|
334
364
|
await fs4.writeFile(configPath, configContent, "utf-8");
|
|
335
365
|
const envPath = path5.join(cwd, ".env");
|
|
336
366
|
await appendToEnvFile(envPath, {
|
|
@@ -372,16 +402,20 @@ async function initCommand(_options) {
|
|
|
372
402
|
p.log.info(pc4.dim(` ${getInstallDevCommand(packageManager.name, "strapi2front")}`));
|
|
373
403
|
p.log.info(pc4.dim(` ${getInstallCommand(packageManager.name, "strapi-sdk-js")}`));
|
|
374
404
|
}
|
|
405
|
+
const configFileName = `strapi.config.${configExtension}`;
|
|
406
|
+
const fileExt = answers.outputFormat === "jsdoc" ? ".js" : ".ts";
|
|
375
407
|
p.note(
|
|
376
408
|
[
|
|
377
|
-
`${pc4.green("
|
|
378
|
-
`${pc4.green("
|
|
379
|
-
`${pc4.green("
|
|
409
|
+
`${pc4.green("\u2713")} Created ${pc4.cyan(configFileName)}`,
|
|
410
|
+
`${pc4.green("\u2713")} Updated ${pc4.cyan(".env")} with Strapi credentials`,
|
|
411
|
+
`${pc4.green("\u2713")} Created output directory ${pc4.cyan(answers.outputDir)}`,
|
|
412
|
+
"",
|
|
413
|
+
`Output format: ${pc4.cyan(answers.outputFormat === "jsdoc" ? "JavaScript (JSDoc)" : "TypeScript")}`,
|
|
380
414
|
"",
|
|
381
415
|
`Next steps:`,
|
|
382
|
-
` 1. Run ${pc4.cyan("npx strapi2front sync")} to generate
|
|
383
|
-
` 2. Import
|
|
384
|
-
` 3. Import services from ${pc4.cyan(answers.outputDir + "/
|
|
416
|
+
` 1. Run ${pc4.cyan("npx strapi2front sync")} to generate files`,
|
|
417
|
+
` 2. Import from ${pc4.cyan(answers.outputDir + "/collections/*" + fileExt)}`,
|
|
418
|
+
` 3. Import services from ${pc4.cyan(answers.outputDir + "/collections/*.service" + fileExt)}`
|
|
385
419
|
].join("\n"),
|
|
386
420
|
"Setup complete!"
|
|
387
421
|
);
|
|
@@ -393,17 +427,21 @@ async function initCommand(_options) {
|
|
|
393
427
|
}
|
|
394
428
|
}
|
|
395
429
|
function generateConfigFile(answers) {
|
|
396
|
-
const
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
` : "";
|
|
400
|
-
return `import { defineConfig } from "strapi2front";
|
|
430
|
+
const isTypeScript = answers.outputFormat === "typescript";
|
|
431
|
+
if (isTypeScript) {
|
|
432
|
+
return `import { defineConfig } from "strapi2front";
|
|
401
433
|
|
|
402
434
|
export default defineConfig({
|
|
403
435
|
// Strapi connection
|
|
404
436
|
url: process.env.STRAPI_URL || "${answers.strapiUrl}",
|
|
405
437
|
token: process.env.STRAPI_TOKEN,
|
|
406
|
-
|
|
438
|
+
|
|
439
|
+
// API prefix (default: "/api")
|
|
440
|
+
apiPrefix: "${answers.apiPrefix}",
|
|
441
|
+
|
|
442
|
+
// Output format: "typescript" (.ts) or "jsdoc" (.js with JSDoc)
|
|
443
|
+
outputFormat: "typescript",
|
|
444
|
+
|
|
407
445
|
// Output configuration
|
|
408
446
|
output: {
|
|
409
447
|
path: "${answers.outputDir}",
|
|
@@ -423,6 +461,40 @@ ${apiPrefixLine}
|
|
|
423
461
|
// Strapi version
|
|
424
462
|
strapiVersion: "${answers.strapiVersion}",
|
|
425
463
|
});
|
|
464
|
+
`;
|
|
465
|
+
}
|
|
466
|
+
return `// @ts-check
|
|
467
|
+
const { defineConfig } = require("strapi2front");
|
|
468
|
+
|
|
469
|
+
module.exports = defineConfig({
|
|
470
|
+
// Strapi connection
|
|
471
|
+
url: process.env.STRAPI_URL || "${answers.strapiUrl}",
|
|
472
|
+
token: process.env.STRAPI_TOKEN,
|
|
473
|
+
|
|
474
|
+
// API prefix (default: "/api")
|
|
475
|
+
apiPrefix: "${answers.apiPrefix}",
|
|
476
|
+
|
|
477
|
+
// Output format: "typescript" (.ts) or "jsdoc" (.js with JSDoc)
|
|
478
|
+
outputFormat: "jsdoc",
|
|
479
|
+
|
|
480
|
+
// Output configuration
|
|
481
|
+
output: {
|
|
482
|
+
path: "${answers.outputDir}",
|
|
483
|
+
types: "types",
|
|
484
|
+
services: "services",
|
|
485
|
+
structure: 'by-feature' // or 'by-layer'
|
|
486
|
+
},
|
|
487
|
+
|
|
488
|
+
// Features to generate
|
|
489
|
+
features: {
|
|
490
|
+
types: true,
|
|
491
|
+
services: ${answers.generateServices},
|
|
492
|
+
actions: false, // Actions require TypeScript
|
|
493
|
+
},
|
|
494
|
+
|
|
495
|
+
// Strapi version
|
|
496
|
+
strapiVersion: "${answers.strapiVersion}",
|
|
497
|
+
});
|
|
426
498
|
`;
|
|
427
499
|
}
|
|
428
500
|
async function appendToEnvFile(envPath, variables) {
|
|
@@ -634,30 +706,33 @@ async function syncCommand(options) {
|
|
|
634
706
|
}
|
|
635
707
|
}
|
|
636
708
|
}
|
|
709
|
+
const outputFormat = config.outputFormat || "typescript";
|
|
637
710
|
if (isByFeature) {
|
|
638
|
-
s.start(
|
|
711
|
+
s.start(`Generating files (by-feature, ${outputFormat})...`);
|
|
639
712
|
const files = await generateByFeature(schema, rawSchema.locales, {
|
|
640
713
|
outputDir: outputPath,
|
|
641
714
|
features: {
|
|
642
715
|
types: config.features.types && (generateAll || Boolean(options.typesOnly)),
|
|
643
716
|
services: config.features.services && (generateAll || Boolean(options.servicesOnly)),
|
|
644
|
-
actions: config.features.actions && (generateAll || Boolean(options.actionsOnly))
|
|
717
|
+
actions: config.features.actions && outputFormat === "typescript" && (generateAll || Boolean(options.actionsOnly))
|
|
645
718
|
},
|
|
646
719
|
blocksRendererInstalled,
|
|
647
720
|
strapiVersion: config.strapiVersion,
|
|
648
|
-
apiPrefix: config.apiPrefix
|
|
721
|
+
apiPrefix: config.apiPrefix,
|
|
722
|
+
outputFormat
|
|
649
723
|
});
|
|
650
724
|
generatedFiles.push(...files);
|
|
651
725
|
s.stop(`Generated ${files.length} files`);
|
|
652
726
|
} else {
|
|
653
727
|
if (generateAll || options.typesOnly) {
|
|
654
728
|
if (config.features.types) {
|
|
655
|
-
s.start(
|
|
729
|
+
s.start(`Generating types (${outputFormat})...`);
|
|
656
730
|
const typesPath = path5.join(outputPath, config.output.types);
|
|
657
731
|
const files = await generateTypes(schema, {
|
|
658
732
|
outputDir: typesPath,
|
|
659
733
|
blocksRendererInstalled,
|
|
660
|
-
strapiVersion: config.strapiVersion
|
|
734
|
+
strapiVersion: config.strapiVersion,
|
|
735
|
+
outputFormat
|
|
661
736
|
});
|
|
662
737
|
generatedFiles.push(...files);
|
|
663
738
|
s.stop(`Generated ${files.length} type files`);
|
|
@@ -681,19 +756,20 @@ async function syncCommand(options) {
|
|
|
681
756
|
}
|
|
682
757
|
if (generateAll || options.servicesOnly) {
|
|
683
758
|
if (config.features.services) {
|
|
684
|
-
s.start(
|
|
759
|
+
s.start(`Generating services (${outputFormat})...`);
|
|
685
760
|
const servicesPath = path5.join(outputPath, config.output.services);
|
|
686
761
|
const typesImportPath = path5.relative(servicesPath, path5.join(outputPath, config.output.types)).replace(/\\/g, "/") || ".";
|
|
687
762
|
const files = await generateServices(schema, {
|
|
688
763
|
outputDir: servicesPath,
|
|
689
764
|
typesImportPath: typesImportPath.startsWith(".") ? typesImportPath : "./" + typesImportPath,
|
|
690
|
-
strapiVersion: config.strapiVersion
|
|
765
|
+
strapiVersion: config.strapiVersion,
|
|
766
|
+
outputFormat
|
|
691
767
|
});
|
|
692
768
|
generatedFiles.push(...files);
|
|
693
769
|
s.stop(`Generated ${files.length} service files`);
|
|
694
770
|
}
|
|
695
771
|
}
|
|
696
|
-
if (generateAll || options.actionsOnly) {
|
|
772
|
+
if ((generateAll || options.actionsOnly) && outputFormat === "typescript") {
|
|
697
773
|
if (config.features.actions) {
|
|
698
774
|
s.start("Generating Astro actions...");
|
|
699
775
|
const actionsPath = path5.join(outputPath, config.output.actions);
|
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","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 apiPrefix: string;\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 // API Prefix\n const defaultPrefix = \"/api\";\n const apiPrefixInput = await p.text({\n message: \"What is your Strapi API prefix?\",\n placeholder: `${defaultPrefix} (press Enter for default)`,\n validate: (value): string | undefined => {\n const trimmed = (value || \"\").trim();\n if (trimmed === \"\") return undefined;\n if (!trimmed.startsWith(\"/\")) {\n return \"API prefix must start with /\";\n }\n return undefined;\n },\n });\n\n if (p.isCancel(apiPrefixInput)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n const apiPrefix = ((apiPrefixInput as string) || \"\").trim() || defaultPrefix;\n\n if (apiPrefix !== defaultPrefix) {\n p.log.info(pc.dim(`Using custom API prefix: ${apiPrefix}`));\n }\n\n // Output directory\n const outputDir = await p.text({\n message: \"Where should we generate the Strapi files?\",\n placeholder: \"src/strapi\",\n defaultValue: \"src/strapi\",\n });\n\n if (p.isCancel(outputDir)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Features to generate\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 apiPrefix: apiPrefix,\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 { spawn } from \"node:child_process\";\nimport { detectFramework } from \"../lib/detectors/framework.js\";\nimport { detectTypeScript } from \"../lib/detectors/typescript.js\";\nimport { detectPackageManager, getInstallCommand, getInstallDevCommand } from \"../lib/detectors/package-manager.js\";\nimport { runInitPrompts } from \"../lib/prompts/init.prompts.js\";\nimport { logger } from \"../lib/utils/logger.js\";\n\n/**\n * Execute a shell command asynchronously\n * This allows spinners to animate while the command runs\n */\nfunction execAsync(command: string, cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const [cmd, ...args] = command.split(\" \");\n const child = spawn(cmd, args, {\n cwd,\n stdio: \"ignore\",\n shell: true,\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n });\n}\n\nexport interface InitCommandOptions {\n yes?: boolean;\n url?: string;\n token?: string;\n framework?: string;\n}\n\nexport async function initCommand(_options: InitCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Detect project configuration\n const s = p.spinner();\n s.start(\"Detecting project configuration...\");\n\n const [framework, typescript, packageManager] = await Promise.all([\n detectFramework(cwd),\n detectTypeScript(cwd),\n detectPackageManager(cwd),\n ]);\n\n s.stop(\"Project configuration detected\");\n\n // Run interactive prompts\n const answers = await runInitPrompts({\n framework,\n typescript,\n packageManager,\n });\n\n if (!answers) {\n return;\n }\n\n // Create configuration\n s.start(\"Creating configuration files...\");\n\n try {\n // Create strapi.config.ts\n const configContent = generateConfigFile({\n strapiUrl: answers.strapiUrl,\n strapiVersion: answers.strapiVersion,\n apiPrefix: answers.apiPrefix,\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 const installStrapi2frontCmd = getInstallDevCommand(packageManager.name, \"strapi2front\");\n s.start(`Installing strapi2front... (${pc.dim(installStrapi2frontCmd)})`);\n try {\n await execAsync(installStrapi2frontCmd, cwd);\n s.stop(`${pc.green(\"✓\")} strapi2front installed`);\n } catch {\n s.stop(`${pc.red(\"✗\")} Failed to install strapi2front`);\n logger.warn(`Please install manually: ${installStrapi2frontCmd}`);\n }\n\n // Install strapi-sdk-js as regular dependency\n const installSdkCmd = getInstallCommand(packageManager.name, \"strapi-sdk-js\");\n s.start(`Installing strapi-sdk-js... (${pc.dim(installSdkCmd)})`);\n try {\n await execAsync(installSdkCmd, cwd);\n s.stop(`${pc.green(\"✓\")} strapi-sdk-js installed`);\n } catch {\n s.stop(`${pc.red(\"✗\")} Failed to install strapi-sdk-js`);\n logger.warn(`Please install manually: ${installSdkCmd}`);\n }\n } else {\n p.log.info(pc.dim(\"Remember to install dependencies manually:\"));\n p.log.info(pc.dim(` ${getInstallDevCommand(packageManager.name, \"strapi2front\")}`));\n p.log.info(pc.dim(` ${getInstallCommand(packageManager.name, \"strapi-sdk-js\")}`));\n }\n\n // Show success message\n 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 apiPrefix: string;\n outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}): string {\n // Only include apiPrefix if it's not the default\n const apiPrefixLine = answers.apiPrefix !== \"/api\"\n ? `\\n // API prefix (customized from default \"/api\")\\n apiPrefix: \"${answers.apiPrefix}\",\\n`\n : \"\";\n\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${apiPrefixLine}\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, config.apiPrefix);\n s.stop(\"Version detection complete\");\n\n let effectiveVersion: StrapiVersion = config.strapiVersion;\n\n if (versionResult.detected) {\n if (versionResult.detected !== config.strapiVersion) {\n // Version mismatch detected\n if (versionResult.detected === \"v5\" && config.strapiVersion === \"v4\") {\n p.log.warn(\n pc.yellow(`Detected Strapi ${pc.bold(\"v5\")} but config has ${pc.bold(\"v4\")}. Using v5.`)\n );\n effectiveVersion = \"v5\";\n } else if (versionResult.detected === \"v4\" && config.strapiVersion === \"v5\") {\n p.log.warn(\n pc.yellow(`Detected Strapi ${pc.bold(\"v4\")} but config has ${pc.bold(\"v5\")}. Using v4.`)\n );\n effectiveVersion = \"v4\";\n }\n } else {\n p.log.info(`Strapi ${pc.green(pc.bold(config.strapiVersion))}`);\n }\n } else {\n p.log.warn(pc.yellow(`Could not detect Strapi version. Using ${pc.bold(config.strapiVersion)}`));\n }\n\n // Update config with effective version for this sync\n config = { ...config, strapiVersion: effectiveVersion };\n\n // Fetch schema from Strapi\n s.start(\"Fetching schema from Strapi...\");\n const rawSchema = await fetchSchema(config.url, config.token, config.apiPrefix);\n const schema = parseSchema(rawSchema);\n s.stop(`Schema fetched: ${schema.collections.length} collections, ${schema.singles.length} singles, ${schema.components.length} components`);\n\n // Check for Blocks fields and prompt for renderer package\n let blocksRendererInstalled = isPackageInstalled(BLOCKS_RENDERER_PACKAGE, cwd);\n const { hasBlocks: hasBlocksFields, fieldsFound: blocksFieldsFound } = schemaHasBlocks(schema);\n\n if (hasBlocksFields && !blocksRendererInstalled) {\n p.log.info(`Blocks fields detected: ${pc.cyan(blocksFieldsFound.join(\", \"))}`);\n\n const installBlocks = await p.confirm({\n message: `Install ${pc.cyan(BLOCKS_RENDERER_PACKAGE)} for proper type support and rendering?`,\n initialValue: true,\n });\n\n if (p.isCancel(installBlocks)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n\n if (installBlocks) {\n s.start(`Installing ${BLOCKS_RENDERER_PACKAGE}...`);\n try {\n installPackage(BLOCKS_RENDERER_PACKAGE, cwd);\n blocksRendererInstalled = true;\n s.stop(`${BLOCKS_RENDERER_PACKAGE} installed`);\n } catch (error) {\n s.stop(`Failed to install ${BLOCKS_RENDERER_PACKAGE}`);\n logger.warn(\"You can install it manually later and re-run sync\");\n }\n } else {\n p.log.info(pc.dim(`Skipping ${BLOCKS_RENDERER_PACKAGE}. BlocksContent will be typed as unknown[]`));\n }\n }\n\n const outputPath = path.join(cwd, config.output.path);\n const generatedFiles: string[] = [];\n\n // Determine what to generate\n const generateAll = !options.typesOnly && !options.servicesOnly && !options.actionsOnly;\n\n // Check structure mode\n const isByFeature = config.output.structure === 'by-feature';\n const currentStructure: OutputStructure = isByFeature ? \"by-feature\" : \"by-layer\";\n\n // Check for orphaned files from previous structure\n if (fs.existsSync(outputPath)) {\n const orphanedFolders = getOrphanedFolders(outputPath, currentStructure);\n\n if (orphanedFolders.length > 0) {\n const otherStructure = isByFeature ? \"by-layer\" : \"by-feature\";\n p.log.warn(\n pc.yellow(`Found files from previous ${pc.bold(otherStructure)} structure:`)\n );\n p.log.message(pc.dim(` ${orphanedFolders.join(\", \")}`));\n\n let shouldClean = options.clean;\n\n if (!shouldClean) {\n const cleanResponse = await p.confirm({\n message: `Remove orphaned ${otherStructure} files?`,\n initialValue: true,\n });\n\n if (p.isCancel(cleanResponse)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n\n shouldClean = cleanResponse;\n }\n\n if (shouldClean) {\n s.start(\"Cleaning orphaned files...\");\n cleanOrphanedFiles(outputPath, orphanedFolders);\n s.stop(`Removed: ${orphanedFolders.join(\", \")}`);\n } else {\n p.log.info(pc.dim(\"Keeping orphaned files. You can clean them manually or use --clean flag.\"));\n }\n }\n }\n\n 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 apiPrefix: config.apiPrefix,\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, apiPrefix: config.apiPrefix });\n generatedFiles.push(...clientFiles);\n s.stop(\"Generated client\");\n\n // Generate locales (for i18n support)\n s.start(\"Generating locales...\");\n const localesFiles = await generateLocales(rawSchema.locales, { outputDir: outputPath });\n generatedFiles.push(...localesFiles);\n if (rawSchema.locales.length > 0) {\n s.stop(`Generated locales: ${rawSchema.locales.map(l => l.code).join(\", \")}`);\n } else {\n s.stop(\"Generated locales (i18n not enabled in Strapi)\");\n }\n }\n }\n\n // Generate services\n if (generateAll || options.servicesOnly) {\n if (config.features.services) {\n s.start(\"Generating services...\");\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"]}
|
|
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","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 apiPrefix: string;\n outputFormat: \"typescript\" | \"jsdoc\";\n outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}\n\n/**\n * Parse version string to get major version number\n */\nfunction getMajorVersion(version: string | null): number | null {\n if (!version) return null;\n // Remove ^ or ~ prefix and get first number\n const match = version.replace(/^[\\^~]/, \"\").match(/^(\\d+)/);\n return match ? parseInt(match[1], 10) : null;\n}\n\nexport async function runInitPrompts(detection: DetectionResults): Promise<InitPromptAnswers | null> {\n p.intro(pc.cyan(\"strapi2front setup\"));\n\n // Show detected info\n p.note(\n [\n `Framework: ${pc.green(getFrameworkDisplayName(detection.framework.name))} ${detection.framework.version ? pc.dim(`v${detection.framework.version}`) : \"\"}`,\n `TypeScript: ${detection.typescript.enabled ? pc.green(\"enabled\") : pc.yellow(\"disabled\")}`,\n `Package Manager: ${pc.green(detection.packageManager.name)}`,\n ].join(\"\\n\"),\n \"Detected Configuration\"\n );\n\n // Track warnings and feature availability\n let canGenerateActions = true;\n let canGenerateTypes = true;\n\n // Check framework support for additional features\n if (detection.framework.name === \"unknown\") {\n // Unknown framework - generate types and services only\n canGenerateActions = false;\n } else if (detection.framework.name !== \"astro\") {\n // Non-Astro framework - generate types and services only (for now)\n canGenerateActions = false;\n } else {\n // Astro - check version for Actions support (requires v4+)\n const majorVersion = getMajorVersion(detection.framework.version);\n if (majorVersion !== null && majorVersion < 4) {\n p.log.warn(pc.yellow(`Astro v${majorVersion} detected. Upgrade to v4+ to enable Actions.`));\n canGenerateActions = false;\n }\n }\n\n // Determine output format based on TypeScript support\n let outputFormat: \"typescript\" | \"jsdoc\" = \"typescript\";\n\n if (!detection.typescript.enabled) {\n p.log.info(pc.dim(\"TypeScript not detected. Files will be generated as JavaScript with JSDoc annotations.\"));\n outputFormat = \"jsdoc\";\n }\n\n // Prompt for Strapi connection\n const defaultUrl = \"http://localhost:1337\";\n const strapiUrlInput = await p.text({\n message: \"What is your Strapi URL?\",\n placeholder: `${defaultUrl} (press Enter for default)`,\n validate: (value): string | undefined => {\n const trimmed = (value || \"\").trim();\n // Allow empty (will use default)\n if (trimmed === \"\") return undefined;\n try {\n new URL(trimmed);\n return undefined;\n } catch {\n return \"Please enter a valid URL\";\n }\n },\n });\n\n if (p.isCancel(strapiUrlInput)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Use default if empty or whitespace only\n const strapiUrl = ((strapiUrlInput as string) || \"\").trim() || defaultUrl;\n\n const strapiToken = await p.text({\n message: \"What is your Strapi API token?\",\n placeholder: \"Press Enter to skip (you can add it later in .env)\",\n });\n\n if (p.isCancel(strapiToken)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Trim and check if empty\n const trimmedToken = ((strapiToken as string) || \"\").trim();\n\n // Show hint if token is empty\n if (trimmedToken === \"\") {\n p.log.info(pc.dim(\"Token skipped. Remember to add STRAPI_TOKEN to your .env file later.\"));\n }\n\n // Strapi version\n const strapiVersion = await p.select({\n message: \"What version of Strapi are you using?\",\n options: [\n { value: \"v5\", label: \"Strapi v5\", hint: \"Recommended - Latest version\" },\n { value: \"v4\", label: \"Strapi v4\", hint: \"Legacy version\" },\n ],\n initialValue: \"v5\",\n });\n\n if (p.isCancel(strapiVersion)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n p.log.info(pc.dim(`Using Strapi ${strapiVersion}. This can be changed later in strapi.config.ts`));\n\n // API Prefix\n const defaultPrefix = \"/api\";\n const apiPrefixInput = await p.text({\n message: \"What is your Strapi API prefix?\",\n placeholder: `${defaultPrefix} (press Enter for default)`,\n validate: (value): string | undefined => {\n const trimmed = (value || \"\").trim();\n if (trimmed === \"\") return undefined;\n if (!trimmed.startsWith(\"/\")) {\n return \"API prefix must start with /\";\n }\n return undefined;\n },\n });\n\n if (p.isCancel(apiPrefixInput)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n const apiPrefix = ((apiPrefixInput as string) || \"\").trim() || defaultPrefix;\n\n if (apiPrefix !== defaultPrefix) {\n p.log.info(pc.dim(`Using custom API prefix: ${apiPrefix}`));\n }\n\n // Output directory\n const outputDir = await p.text({\n message: \"Where should we generate the Strapi files?\",\n placeholder: \"src/strapi\",\n defaultValue: \"src/strapi\",\n });\n\n if (p.isCancel(outputDir)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n // Features to generate - labels depend on output format\n const isTypeScript = outputFormat === \"typescript\";\n const featureOptions = [\n {\n value: \"types\",\n label: isTypeScript ? \"Types\" : \"Type Definitions\",\n hint: isTypeScript\n ? \"TypeScript interfaces for your content types\"\n : \"JSDoc type definitions for your content types\"\n },\n {\n value: \"services\",\n label: \"Services\",\n hint: isTypeScript\n ? \"Typed service functions for data fetching\"\n : \"Service functions with JSDoc annotations\"\n },\n ];\n\n // Only show Astro Actions if available (requires TypeScript)\n if (canGenerateActions && isTypeScript) {\n featureOptions.push({ value: \"actions\", label: \"Astro Actions\", hint: \"Type-safe actions for client/server\" });\n }\n\n const initialFeatures = (canGenerateActions && isTypeScript)\n ? [\"types\", \"services\", \"actions\"]\n : [\"types\", \"services\"];\n\n const features = await p.multiselect({\n message: \"What would you like to generate?\",\n options: featureOptions,\n initialValues: initialFeatures,\n required: true,\n });\n\n if (p.isCancel(features)) {\n p.cancel(\"Setup cancelled\");\n return null;\n }\n\n return {\n strapiUrl: strapiUrl,\n strapiToken: trimmedToken,\n strapiVersion: strapiVersion as \"v4\" | \"v5\",\n apiPrefix: apiPrefix,\n outputFormat: outputFormat,\n outputDir: ((outputDir as string) || \"\").trim() || \"src/strapi\",\n generateActions: canGenerateActions && isTypeScript && (features as string[]).includes(\"actions\"),\n generateServices: (features as string[]).includes(\"services\"),\n };\n}\n\nexport async function confirmOverwrite(files: string[]): Promise<boolean> {\n const confirm = await p.confirm({\n message: `The following files will be overwritten:\\n${files.map((f) => ` - ${f}`).join(\"\\n\")}\\n\\nContinue?`,\n initialValue: true,\n });\n\n return !p.isCancel(confirm) && confirm === true;\n}\n","import pc from 'picocolors';\n\nexport const logger = {\n info: (message: string) => {\n console.log(pc.blue(\"i\"), message);\n },\n\n success: (message: string) => {\n console.log(pc.green(\"v\"), message);\n },\n\n warn: (message: string) => {\n console.log(pc.yellow(\"!\"), message);\n },\n\n error: (message: string) => {\n console.log(pc.red(\"x\"), message);\n },\n\n step: (message: string) => {\n console.log(pc.cyan(\">\"), message);\n },\n\n dim: (message: string) => {\n console.log(pc.dim(message));\n },\n\n newLine: () => {\n console.log(\"\");\n },\n};\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { detectFramework } from \"../lib/detectors/framework.js\";\nimport { detectTypeScript } from \"../lib/detectors/typescript.js\";\nimport { detectPackageManager, getInstallCommand, getInstallDevCommand } from \"../lib/detectors/package-manager.js\";\nimport { runInitPrompts } from \"../lib/prompts/init.prompts.js\";\nimport { logger } from \"../lib/utils/logger.js\";\n\n/**\n * Execute a shell command asynchronously\n * This allows spinners to animate while the command runs\n */\nfunction execAsync(command: string, cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const [cmd, ...args] = command.split(\" \");\n const child = spawn(cmd, args, {\n cwd,\n stdio: \"ignore\",\n shell: true,\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${code}`));\n }\n });\n\n child.on(\"error\", (error) => {\n reject(error);\n });\n });\n}\n\nexport interface InitCommandOptions {\n yes?: boolean;\n url?: string;\n token?: string;\n framework?: string;\n}\n\nexport async function initCommand(_options: InitCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Detect project configuration\n const s = p.spinner();\n s.start(\"Detecting project configuration...\");\n\n const [framework, typescript, packageManager] = await Promise.all([\n detectFramework(cwd),\n detectTypeScript(cwd),\n detectPackageManager(cwd),\n ]);\n\n s.stop(\"Project configuration detected\");\n\n // Run interactive prompts\n const answers = await runInitPrompts({\n framework,\n typescript,\n packageManager,\n });\n\n if (!answers) {\n return;\n }\n\n // Create configuration\n s.start(\"Creating configuration files...\");\n\n try {\n // Create config file (use .js extension for JSDoc projects)\n const configExtension = answers.outputFormat === \"jsdoc\" ? \"js\" : \"ts\";\n const configContent = generateConfigFile({\n strapiUrl: answers.strapiUrl,\n strapiVersion: answers.strapiVersion,\n apiPrefix: answers.apiPrefix,\n outputFormat: answers.outputFormat,\n outputDir: answers.outputDir,\n generateActions: answers.generateActions,\n generateServices: answers.generateServices,\n });\n const configPath = path.join(cwd, `strapi.config.${configExtension}`);\n await fs.writeFile(configPath, configContent, \"utf-8\");\n\n // Update .env file\n const envPath = path.join(cwd, \".env\");\n await appendToEnvFile(envPath, {\n STRAPI_URL: answers.strapiUrl,\n STRAPI_TOKEN: answers.strapiToken,\n });\n\n // Create output directory\n const outputPath = path.join(cwd, answers.outputDir);\n await fs.mkdir(outputPath, { recursive: true });\n\n s.stop(\"Configuration files created\");\n\n // Install dependencies\n const installDeps = await p.confirm({\n message: \"Install required dependencies (strapi2front, strapi-sdk-js)?\",\n initialValue: true,\n });\n\n if (p.isCancel(installDeps)) {\n p.cancel(\"Setup cancelled\");\n process.exit(0);\n }\n\n if (installDeps) {\n // Install strapi2front as dev dependency (needed for config file)\n const installStrapi2frontCmd = getInstallDevCommand(packageManager.name, \"strapi2front\");\n s.start(`Installing strapi2front... (${pc.dim(installStrapi2frontCmd)})`);\n try {\n await execAsync(installStrapi2frontCmd, cwd);\n s.stop(`${pc.green(\"✓\")} strapi2front installed`);\n } catch {\n s.stop(`${pc.red(\"✗\")} Failed to install strapi2front`);\n logger.warn(`Please install manually: ${installStrapi2frontCmd}`);\n }\n\n // Install strapi-sdk-js as regular dependency\n const installSdkCmd = getInstallCommand(packageManager.name, \"strapi-sdk-js\");\n s.start(`Installing strapi-sdk-js... (${pc.dim(installSdkCmd)})`);\n try {\n await execAsync(installSdkCmd, cwd);\n s.stop(`${pc.green(\"✓\")} strapi-sdk-js installed`);\n } catch {\n s.stop(`${pc.red(\"✗\")} Failed to install strapi-sdk-js`);\n logger.warn(`Please install manually: ${installSdkCmd}`);\n }\n } else {\n p.log.info(pc.dim(\"Remember to install dependencies manually:\"));\n p.log.info(pc.dim(` ${getInstallDevCommand(packageManager.name, \"strapi2front\")}`));\n p.log.info(pc.dim(` ${getInstallCommand(packageManager.name, \"strapi-sdk-js\")}`));\n }\n\n // Show success message\n const configFileName = `strapi.config.${configExtension}`;\n const fileExt = answers.outputFormat === \"jsdoc\" ? \".js\" : \".ts\";\n p.note(\n [\n `${pc.green(\"✓\")} Created ${pc.cyan(configFileName)}`,\n `${pc.green(\"✓\")} Updated ${pc.cyan(\".env\")} with Strapi credentials`,\n `${pc.green(\"✓\")} Created output directory ${pc.cyan(answers.outputDir)}`,\n \"\",\n `Output format: ${pc.cyan(answers.outputFormat === \"jsdoc\" ? \"JavaScript (JSDoc)\" : \"TypeScript\")}`,\n \"\",\n `Next steps:`,\n ` 1. Run ${pc.cyan(\"npx strapi2front sync\")} to generate files`,\n ` 2. Import from ${pc.cyan(answers.outputDir + \"/collections/*\" + fileExt)}`,\n ` 3. Import services from ${pc.cyan(answers.outputDir + \"/collections/*.service\" + fileExt)}`,\n ].join(\"\\n\"),\n \"Setup complete!\"\n );\n\n p.outro(pc.green(\"Happy coding!\"));\n } catch (error) {\n s.stop(\"Failed to create configuration files\");\n logger.error(error instanceof Error ? error.message : \"Unknown error\");\n process.exit(1);\n }\n}\n\nfunction generateConfigFile(answers: {\n strapiUrl: string;\n strapiVersion: \"v4\" | \"v5\";\n apiPrefix: string;\n outputFormat: \"typescript\" | \"jsdoc\";\n outputDir: string;\n generateActions: boolean;\n generateServices: boolean;\n}): string {\n const isTypeScript = answers.outputFormat === \"typescript\";\n\n if (isTypeScript) {\n return `import { defineConfig } from \"strapi2front\";\n\nexport default defineConfig({\n // Strapi connection\n url: process.env.STRAPI_URL || \"${answers.strapiUrl}\",\n token: process.env.STRAPI_TOKEN,\n\n // API prefix (default: \"/api\")\n apiPrefix: \"${answers.apiPrefix}\",\n\n // Output format: \"typescript\" (.ts) or \"jsdoc\" (.js with JSDoc)\n outputFormat: \"typescript\",\n\n // Output configuration\n output: {\n path: \"${answers.outputDir}\",\n types: \"types\",\n services: \"services\",\n actions: \"actions/strapi\",\n structure: 'by-feature' // or 'by-layer'\n },\n\n // Features to generate\n features: {\n types: true,\n services: ${answers.generateServices},\n actions: ${answers.generateActions},\n },\n\n // Strapi version\n strapiVersion: \"${answers.strapiVersion}\",\n});\n`;\n }\n\n // JSDoc config (JavaScript)\n return `// @ts-check\nconst { defineConfig } = require(\"strapi2front\");\n\nmodule.exports = defineConfig({\n // Strapi connection\n url: process.env.STRAPI_URL || \"${answers.strapiUrl}\",\n token: process.env.STRAPI_TOKEN,\n\n // API prefix (default: \"/api\")\n apiPrefix: \"${answers.apiPrefix}\",\n\n // Output format: \"typescript\" (.ts) or \"jsdoc\" (.js with JSDoc)\n outputFormat: \"jsdoc\",\n\n // Output configuration\n output: {\n path: \"${answers.outputDir}\",\n types: \"types\",\n services: \"services\",\n structure: 'by-feature' // or 'by-layer'\n },\n\n // Features to generate\n features: {\n types: true,\n services: ${answers.generateServices},\n actions: false, // Actions require TypeScript\n },\n\n // Strapi version\n strapiVersion: \"${answers.strapiVersion}\",\n});\n`;\n}\n\nasync function appendToEnvFile(\n envPath: string,\n variables: Record<string, string>\n): Promise<void> {\n let content = \"\";\n\n try {\n content = await fs.readFile(envPath, \"utf-8\");\n } catch {\n // File does not exist, create new\n }\n\n const lines = content.split(\"\\n\");\n const existingKeys = new Set(\n lines\n .filter((line) => line.includes(\"=\"))\n .map((line) => line.split(\"=\")[0].trim())\n );\n\n const newLines: string[] = [];\n\n for (const [key, value] of Object.entries(variables)) {\n if (!existingKeys.has(key)) {\n newLines.push(`${key}=${value}`);\n }\n }\n\n if (newLines.length > 0) {\n const separator = content.endsWith(\"\\n\") || content === \"\" ? \"\" : \"\\n\";\n const newContent = content + separator + newLines.join(\"\\n\") + \"\\n\";\n await fs.writeFile(envPath, newContent, \"utf-8\");\n }\n}\n\n","import * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport path from \"node:path\";\nimport fs from \"node:fs\";\nimport { execSync } from \"node:child_process\";\nimport { loadConfig } from \"@strapi2front/core\";\nimport { fetchSchema, detectStrapiVersion } from \"@strapi2front/core\";\nimport { parseSchema } from \"@strapi2front/core\";\nimport type { StrapiVersion } from \"@strapi2front/core\";\nimport type { ParsedSchema, Attribute } from \"@strapi2front/core\";\nimport { generateTypes } from \"@strapi2front/generators\";\nimport { generateServices } from \"@strapi2front/generators\";\nimport { generateActions } from \"@strapi2front/generators\";\nimport { generateClient } from \"@strapi2front/generators\";\nimport { generateLocales } from \"@strapi2front/generators\";\nimport { generateByFeature } from \"@strapi2front/generators\";\nimport { logger } from \"../lib/utils/logger.js\";\n\nconst BLOCKS_RENDERER_PACKAGE = \"@strapi/blocks-react-renderer\";\n\n/**\n * Check if schema contains any blocks fields\n */\nfunction schemaHasBlocks(schema: ParsedSchema): { hasBlocks: boolean; fieldsFound: string[] } {\n const fieldsFound: string[] = [];\n\n const checkAttributes = (typeName: string, attributes: Record<string, Attribute>): void => {\n for (const [fieldName, attr] of Object.entries(attributes)) {\n if (attr.type === \"blocks\") {\n fieldsFound.push(`${typeName}.${fieldName}`);\n }\n }\n };\n\n for (const collection of schema.collections) {\n checkAttributes(collection.singularName, collection.attributes);\n }\n\n for (const single of schema.singles) {\n checkAttributes(single.singularName, single.attributes);\n }\n\n for (const component of schema.components) {\n checkAttributes(`component:${component.name}`, component.attributes);\n }\n\n return { hasBlocks: fieldsFound.length > 0, fieldsFound };\n}\n\n/**\n * Check if a package is installed\n */\nfunction isPackageInstalled(packageName: string, cwd: string): boolean {\n try {\n const packageJsonPath = path.join(cwd, \"package.json\");\n if (!fs.existsSync(packageJsonPath)) return false;\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"));\n const deps = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n };\n\n return packageName in deps;\n } catch {\n return false;\n }\n}\n\n/**\n * Detect package manager\n */\nfunction detectPackageManager(cwd: string): \"npm\" | \"yarn\" | \"pnpm\" | \"bun\" {\n if (fs.existsSync(path.join(cwd, \"bun.lockb\"))) return \"bun\";\n if (fs.existsSync(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (fs.existsSync(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\n/**\n * Install a package\n */\nfunction installPackage(packageName: string, cwd: string): void {\n const pm = detectPackageManager(cwd);\n const commands: Record<string, string> = {\n npm: `npm install ${packageName}`,\n yarn: `yarn add ${packageName}`,\n pnpm: `pnpm add ${packageName}`,\n bun: `bun add ${packageName}`,\n };\n\n execSync(commands[pm], { cwd, stdio: \"inherit\" });\n}\n\n/**\n * Structure type for output organization\n */\ntype OutputStructure = \"by-layer\" | \"by-feature\";\n\n/**\n * Get orphaned folders from the opposite structure\n */\nfunction getOrphanedFolders(outputPath: string, currentStructure: OutputStructure): string[] {\n const orphanedFolders: string[] = [];\n\n if (currentStructure === \"by-feature\") {\n // If using by-feature, check for by-layer folders\n const byLayerFolders = [\"types\", \"services\", \"actions\"];\n for (const folder of byLayerFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n // Also check for root-level client.ts and locales.ts (by-layer puts them at root)\n if (fs.existsSync(path.join(outputPath, \"client.ts\"))) {\n orphanedFolders.push(\"client.ts\");\n }\n if (fs.existsSync(path.join(outputPath, \"locales.ts\"))) {\n orphanedFolders.push(\"locales.ts\");\n }\n } else {\n // If using by-layer, check for by-feature folders\n const byFeatureFolders = [\"collections\", \"singles\", \"shared\", \"components\"];\n for (const folder of byFeatureFolders) {\n const folderPath = path.join(outputPath, folder);\n if (fs.existsSync(folderPath)) {\n orphanedFolders.push(folder);\n }\n }\n }\n\n return orphanedFolders;\n}\n\n/**\n * Remove orphaned folders/files\n */\nfunction cleanOrphanedFiles(outputPath: string, orphanedItems: string[]): void {\n for (const item of orphanedItems) {\n const itemPath = path.join(outputPath, item);\n if (fs.existsSync(itemPath)) {\n const stat = fs.statSync(itemPath);\n if (stat.isDirectory()) {\n fs.rmSync(itemPath, { recursive: true, force: true });\n } else {\n fs.unlinkSync(itemPath);\n }\n }\n }\n}\n\nexport interface SyncCommandOptions {\n force?: boolean;\n typesOnly?: boolean;\n servicesOnly?: boolean;\n actionsOnly?: boolean;\n clean?: boolean;\n}\n\nexport async function syncCommand(options: SyncCommandOptions): Promise<void> {\n const cwd = process.cwd();\n\n p.intro(pc.cyan(\"strapi2front sync\"));\n\n const s = p.spinner();\n\n try {\n // Load configuration\n s.start(\"Loading configuration...\");\n let config = await loadConfig(cwd);\n s.stop(\"Configuration loaded\");\n\n // Detect and validate Strapi version\n s.start(\"Detecting Strapi version...\");\n const versionResult = await detectStrapiVersion(config.url, config.token, config.apiPrefix);\n s.stop(\"Version detection complete\");\n\n let effectiveVersion: StrapiVersion = config.strapiVersion;\n\n if (versionResult.detected) {\n if (versionResult.detected !== config.strapiVersion) {\n // Version mismatch detected\n if (versionResult.detected === \"v5\" && config.strapiVersion === \"v4\") {\n p.log.warn(\n pc.yellow(`Detected Strapi ${pc.bold(\"v5\")} but config has ${pc.bold(\"v4\")}. Using v5.`)\n );\n effectiveVersion = \"v5\";\n } else if (versionResult.detected === \"v4\" && config.strapiVersion === \"v5\") {\n p.log.warn(\n pc.yellow(`Detected Strapi ${pc.bold(\"v4\")} but config has ${pc.bold(\"v5\")}. Using v4.`)\n );\n effectiveVersion = \"v4\";\n }\n } else {\n p.log.info(`Strapi ${pc.green(pc.bold(config.strapiVersion))}`);\n }\n } else {\n p.log.warn(pc.yellow(`Could not detect Strapi version. Using ${pc.bold(config.strapiVersion)}`));\n }\n\n // Update config with effective version for this sync\n config = { ...config, strapiVersion: effectiveVersion };\n\n // Fetch schema from Strapi\n s.start(\"Fetching schema from Strapi...\");\n const rawSchema = await fetchSchema(config.url, config.token, config.apiPrefix);\n const schema = parseSchema(rawSchema);\n s.stop(`Schema fetched: ${schema.collections.length} collections, ${schema.singles.length} singles, ${schema.components.length} components`);\n\n // Check for Blocks fields and prompt for renderer package\n let blocksRendererInstalled = isPackageInstalled(BLOCKS_RENDERER_PACKAGE, cwd);\n const { hasBlocks: hasBlocksFields, fieldsFound: blocksFieldsFound } = schemaHasBlocks(schema);\n\n if (hasBlocksFields && !blocksRendererInstalled) {\n p.log.info(`Blocks fields detected: ${pc.cyan(blocksFieldsFound.join(\", \"))}`);\n\n const installBlocks = await p.confirm({\n message: `Install ${pc.cyan(BLOCKS_RENDERER_PACKAGE)} for proper type support and rendering?`,\n initialValue: true,\n });\n\n if (p.isCancel(installBlocks)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n\n if (installBlocks) {\n s.start(`Installing ${BLOCKS_RENDERER_PACKAGE}...`);\n try {\n installPackage(BLOCKS_RENDERER_PACKAGE, cwd);\n blocksRendererInstalled = true;\n s.stop(`${BLOCKS_RENDERER_PACKAGE} installed`);\n } catch (error) {\n s.stop(`Failed to install ${BLOCKS_RENDERER_PACKAGE}`);\n logger.warn(\"You can install it manually later and re-run sync\");\n }\n } else {\n p.log.info(pc.dim(`Skipping ${BLOCKS_RENDERER_PACKAGE}. BlocksContent will be typed as unknown[]`));\n }\n }\n\n const outputPath = path.join(cwd, config.output.path);\n const generatedFiles: string[] = [];\n\n // Determine what to generate\n const generateAll = !options.typesOnly && !options.servicesOnly && !options.actionsOnly;\n\n // Check structure mode\n const isByFeature = config.output.structure === 'by-feature';\n const currentStructure: OutputStructure = isByFeature ? \"by-feature\" : \"by-layer\";\n\n // Check for orphaned files from previous structure\n if (fs.existsSync(outputPath)) {\n const orphanedFolders = getOrphanedFolders(outputPath, currentStructure);\n\n if (orphanedFolders.length > 0) {\n const otherStructure = isByFeature ? \"by-layer\" : \"by-feature\";\n p.log.warn(\n pc.yellow(`Found files from previous ${pc.bold(otherStructure)} structure:`)\n );\n p.log.message(pc.dim(` ${orphanedFolders.join(\", \")}`));\n\n let shouldClean = options.clean;\n\n if (!shouldClean) {\n const cleanResponse = await p.confirm({\n message: `Remove orphaned ${otherStructure} files?`,\n initialValue: true,\n });\n\n if (p.isCancel(cleanResponse)) {\n p.cancel(\"Sync cancelled\");\n process.exit(0);\n }\n\n shouldClean = cleanResponse;\n }\n\n if (shouldClean) {\n s.start(\"Cleaning orphaned files...\");\n cleanOrphanedFiles(outputPath, orphanedFolders);\n s.stop(`Removed: ${orphanedFolders.join(\", \")}`);\n } else {\n p.log.info(pc.dim(\"Keeping orphaned files. You can clean them manually or use --clean flag.\"));\n }\n }\n }\n\n // Get output format from config (default to typescript)\n const outputFormat = config.outputFormat || \"typescript\";\n\n if (isByFeature) {\n // Generate using by-feature structure (screaming architecture)\n s.start(`Generating files (by-feature, ${outputFormat})...`);\n const files = await generateByFeature(schema, rawSchema.locales, {\n outputDir: outputPath,\n features: {\n types: config.features.types && (generateAll || Boolean(options.typesOnly)),\n services: config.features.services && (generateAll || Boolean(options.servicesOnly)),\n actions: config.features.actions && outputFormat === \"typescript\" && (generateAll || Boolean(options.actionsOnly)),\n },\n blocksRendererInstalled,\n strapiVersion: config.strapiVersion,\n apiPrefix: config.apiPrefix,\n outputFormat,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} files`);\n } else {\n // Generate using by-layer structure (default)\n\n // Generate types\n if (generateAll || options.typesOnly) {\n if (config.features.types) {\n s.start(`Generating types (${outputFormat})...`);\n const typesPath = path.join(outputPath, config.output.types);\n const files = await generateTypes(schema, {\n outputDir: typesPath,\n blocksRendererInstalled,\n strapiVersion: config.strapiVersion,\n outputFormat,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} type files`);\n }\n }\n\n // Generate client (needed by services)\n if (generateAll || options.servicesOnly) {\n if (config.features.services) {\n s.start(\"Generating client...\");\n const clientFiles = await generateClient({ outputDir: outputPath, strapiVersion: config.strapiVersion, apiPrefix: config.apiPrefix });\n generatedFiles.push(...clientFiles);\n s.stop(\"Generated client\");\n\n // Generate locales (for i18n support)\n s.start(\"Generating locales...\");\n const localesFiles = await generateLocales(rawSchema.locales, { outputDir: outputPath });\n generatedFiles.push(...localesFiles);\n if (rawSchema.locales.length > 0) {\n s.stop(`Generated locales: ${rawSchema.locales.map(l => l.code).join(\", \")}`);\n } else {\n s.stop(\"Generated locales (i18n not enabled in Strapi)\");\n }\n }\n }\n\n // Generate services\n if (generateAll || options.servicesOnly) {\n if (config.features.services) {\n s.start(`Generating services (${outputFormat})...`);\n const servicesPath = path.join(outputPath, config.output.services);\n const typesImportPath = path.relative(servicesPath, path.join(outputPath, config.output.types)).replace(/\\\\/g, \"/\") || \".\";\n const files = await generateServices(schema, {\n outputDir: servicesPath,\n typesImportPath: typesImportPath.startsWith(\".\") ? typesImportPath : \"./\" + typesImportPath,\n strapiVersion: config.strapiVersion,\n outputFormat,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} service files`);\n }\n }\n\n // Generate actions (only for TypeScript projects)\n if ((generateAll || options.actionsOnly) && outputFormat === \"typescript\") {\n if (config.features.actions) {\n s.start(\"Generating Astro actions...\");\n const actionsPath = path.join(outputPath, config.output.actions);\n const servicesPath = path.join(outputPath, config.output.services);\n\n const servicesImportPath = path.relative(actionsPath, servicesPath).replace(/\\\\/g, \"/\") || \".\";\n\n const files = await generateActions(schema, {\n outputDir: actionsPath,\n servicesImportPath: servicesImportPath.startsWith(\".\") ? servicesImportPath : \"./\" + servicesImportPath,\n strapiVersion: config.strapiVersion,\n });\n generatedFiles.push(...files);\n s.stop(`Generated ${files.length} action files`);\n }\n }\n }\n\n // Show summary\n p.note(\n [\n `Generated ${generatedFiles.length} files in ${pc.cyan(config.output.path)}`,\n \"\",\n \"Files generated:\",\n ...generatedFiles.slice(0, 10).map((f) => ` ${pc.dim(path.relative(cwd, f))}`),\n generatedFiles.length > 10 ? ` ${pc.dim(`... and ${generatedFiles.length - 10} more`)}` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n \"Sync complete!\"\n );\n\n p.outro(pc.green(\"Types and services are ready to use!\"));\n } catch (error) {\n s.stop(\"Sync failed\");\n\n if (error instanceof Error) {\n logger.error(error.message);\n\n if (error.message.includes(\"Could not find strapi.config\")) {\n logger.info(\"Run \\\"npx strapi2front init\\\" first to set up your project.\");\n }\n } else {\n logger.error(\"An unknown error occurred\");\n }\n\n process.exit(1);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "strapi2front",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Generate TypeScript types, services, and framework actions from your Strapi schema",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"picocolors": "^1.0.0",
|
|
28
28
|
"pkg-types": "^1.0.0",
|
|
29
29
|
"@strapi2front/client": "0.1.0",
|
|
30
|
-
"@strapi2front/
|
|
31
|
-
"@strapi2front/
|
|
30
|
+
"@strapi2front/generators": "0.3.0",
|
|
31
|
+
"@strapi2front/core": "0.3.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"tsup": "^8.0.0",
|