@strapi2front/core 0.4.0 → 0.5.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/index.d.ts CHANGED
@@ -12,35 +12,54 @@ declare const configSchema: z.ZodObject<{
12
12
  moduleType: z.ZodOptional<z.ZodEnum<["esm", "commonjs"]>>;
13
13
  output: z.ZodDefault<z.ZodObject<{
14
14
  path: z.ZodDefault<z.ZodString>;
15
- types: z.ZodDefault<z.ZodString>;
16
- services: z.ZodDefault<z.ZodString>;
17
- actions: z.ZodDefault<z.ZodOptional<z.ZodString>>;
18
- structure: z.ZodDefault<z.ZodEnum<["by-layer", "by-feature"]>>;
19
15
  }, "strip", z.ZodTypeAny, {
20
16
  path: string;
21
- types: string;
22
- services: string;
23
- actions: string;
24
- structure: "by-layer" | "by-feature";
25
17
  }, {
26
18
  path?: string | undefined;
27
- types?: string | undefined;
28
- services?: string | undefined;
29
- actions?: string | undefined;
30
- structure?: "by-layer" | "by-feature" | undefined;
31
19
  }>>;
32
20
  features: z.ZodDefault<z.ZodObject<{
33
21
  types: z.ZodDefault<z.ZodBoolean>;
34
22
  services: z.ZodDefault<z.ZodBoolean>;
35
23
  actions: z.ZodDefault<z.ZodBoolean>;
24
+ schemas: z.ZodOptional<z.ZodBoolean>;
25
+ upload: z.ZodDefault<z.ZodBoolean>;
36
26
  }, "strip", z.ZodTypeAny, {
37
27
  types: boolean;
38
28
  services: boolean;
39
29
  actions: boolean;
30
+ upload: boolean;
31
+ schemas?: boolean | undefined;
40
32
  }, {
41
33
  types?: boolean | undefined;
42
34
  services?: boolean | undefined;
43
35
  actions?: boolean | undefined;
36
+ schemas?: boolean | undefined;
37
+ upload?: boolean | undefined;
38
+ }>>;
39
+ schemaOptions: z.ZodDefault<z.ZodObject<{
40
+ /**
41
+ * Use advanced relation format with connect/disconnect/set operations
42
+ * instead of simple ID arrays.
43
+ *
44
+ * When false (default): { tags: ["id1", "id2"] }
45
+ * When true: { tags: { connect: [{ documentId: "id1" }], disconnect: [...] } }
46
+ *
47
+ * Advanced format supports:
48
+ * - connect: Add relations while preserving existing
49
+ * - disconnect: Remove specific relations
50
+ * - set: Replace all relations
51
+ * - locale: For i18n content types
52
+ * - status: For draft/published targeting
53
+ * - position: For ordering (before, after, start, end)
54
+ *
55
+ * @default false
56
+ * @see https://docs.strapi.io/dev-docs/api/rest/relations
57
+ */
58
+ advancedRelations: z.ZodDefault<z.ZodBoolean>;
59
+ }, "strip", z.ZodTypeAny, {
60
+ advancedRelations: boolean;
61
+ }, {
62
+ advancedRelations?: boolean | undefined;
44
63
  }>>;
45
64
  options: z.ZodDefault<z.ZodObject<{
46
65
  includeDrafts: z.ZodDefault<z.ZodBoolean>;
@@ -63,15 +82,16 @@ declare const configSchema: z.ZodObject<{
63
82
  };
64
83
  output: {
65
84
  path: string;
66
- types: string;
67
- services: string;
68
- actions: string;
69
- structure: "by-layer" | "by-feature";
70
85
  };
71
86
  features: {
72
87
  types: boolean;
73
88
  services: boolean;
74
89
  actions: boolean;
90
+ upload: boolean;
91
+ schemas?: boolean | undefined;
92
+ };
93
+ schemaOptions: {
94
+ advancedRelations: boolean;
75
95
  };
76
96
  token?: string | undefined;
77
97
  moduleType?: "esm" | "commonjs" | undefined;
@@ -88,15 +108,16 @@ declare const configSchema: z.ZodObject<{
88
108
  } | undefined;
89
109
  output?: {
90
110
  path?: string | undefined;
91
- types?: string | undefined;
92
- services?: string | undefined;
93
- actions?: string | undefined;
94
- structure?: "by-layer" | "by-feature" | undefined;
95
111
  } | undefined;
96
112
  features?: {
97
113
  types?: boolean | undefined;
98
114
  services?: boolean | undefined;
99
115
  actions?: boolean | undefined;
116
+ schemas?: boolean | undefined;
117
+ upload?: boolean | undefined;
118
+ } | undefined;
119
+ schemaOptions?: {
120
+ advancedRelations?: boolean | undefined;
100
121
  } | undefined;
101
122
  }>;
102
123
  type StrapiIntegrateConfig = z.infer<typeof configSchema>;
package/dist/index.js CHANGED
@@ -17,20 +17,42 @@ var configSchema = z.object({
17
17
  outputFormat: z.enum(["typescript", "jsdoc"]).default("typescript"),
18
18
  // Module type: 'esm' for ES Modules, 'commonjs' for CommonJS (auto-detected if not specified)
19
19
  moduleType: z.enum(["esm", "commonjs"]).optional(),
20
- // Output paths
20
+ // Output path
21
21
  output: z.object({
22
- path: z.string().default("src/strapi"),
23
- types: z.string().default("types"),
24
- services: z.string().default("services"),
25
- actions: z.string().optional().default("actions/strapi"),
26
- // Output structure: 'by-layer' (types/, services/, actions/) or 'by-feature' (article/, category/)
27
- structure: z.enum(["by-layer", "by-feature"]).default("by-feature")
22
+ path: z.string().default("src/strapi")
28
23
  }).default({}),
29
24
  // Features to generate
30
25
  features: z.object({
31
26
  types: z.boolean().default(true),
32
27
  services: z.boolean().default(true),
33
- actions: z.boolean().default(true)
28
+ actions: z.boolean().default(true),
29
+ // Zod schemas for validation (React Hook Form, TanStack Form, etc.)
30
+ // Default: true for TypeScript, false for JSDoc
31
+ schemas: z.boolean().optional(),
32
+ // Upload helpers (public client + Astro action)
33
+ upload: z.boolean().default(false)
34
+ }).default({}),
35
+ // Schema generation options
36
+ schemaOptions: z.object({
37
+ /**
38
+ * Use advanced relation format with connect/disconnect/set operations
39
+ * instead of simple ID arrays.
40
+ *
41
+ * When false (default): { tags: ["id1", "id2"] }
42
+ * When true: { tags: { connect: [{ documentId: "id1" }], disconnect: [...] } }
43
+ *
44
+ * Advanced format supports:
45
+ * - connect: Add relations while preserving existing
46
+ * - disconnect: Remove specific relations
47
+ * - set: Replace all relations
48
+ * - locale: For i18n content types
49
+ * - status: For draft/published targeting
50
+ * - position: For ordering (before, after, start, end)
51
+ *
52
+ * @default false
53
+ * @see https://docs.strapi.io/dev-docs/api/rest/relations
54
+ */
55
+ advancedRelations: z.boolean().default(false)
34
56
  }).default({}),
35
57
  // Advanced options
36
58
  options: z.object({
@@ -42,7 +64,7 @@ var configSchema = z.object({
42
64
  });
43
65
 
44
66
  // src/config/loader.ts
45
- var CONFIG_FILES = ["strapi.config.ts", "strapi.config.js", "strapi.config.mjs"];
67
+ var CONFIG_FILES = ["strapi.config.ts", "strapi.config.js", "strapi.config.mjs", "strapi.config.cjs"];
46
68
  function defineConfig(config) {
47
69
  return configSchema.parse(config);
48
70
  }
@@ -94,8 +116,11 @@ function resolveEnvVariables(config) {
94
116
  resolved[key] = value;
95
117
  }
96
118
  }
97
- if (!resolved["token"] && process.env["STRAPI_TOKEN"]) {
98
- resolved["token"] = process.env["STRAPI_TOKEN"];
119
+ if (!resolved["token"]) {
120
+ const syncToken = process.env["STRAPI_SYNC_TOKEN"] || process.env["STRAPI_TOKEN"];
121
+ if (syncToken) {
122
+ resolved["token"] = syncToken;
123
+ }
99
124
  }
100
125
  return resolved;
101
126
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/schema.ts","../src/config/loader.ts","../src/schema/fetcher.ts","../src/schema/parser.ts"],"names":["loadEnv"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\n/**\n * Configuration schema for strapi2front\n */\nexport const configSchema = z.object({\n // Strapi connection\n url: z.string().url(\"url must be a valid URL\"),\n token: z.string().min(1, \"token is required\").optional(),\n\n // API prefix (default: \"/api\", can be customized in Strapi config)\n apiPrefix: z.string().default(\"/api\"),\n\n // Strapi version\n strapiVersion: z.enum([\"v4\", \"v5\"]).default(\"v5\"),\n\n // Output format: 'typescript' for .ts files, 'jsdoc' for .js with JSDoc annotations\n outputFormat: z.enum([\"typescript\", \"jsdoc\"]).default(\"typescript\"),\n\n // Module type: 'esm' for ES Modules, 'commonjs' for CommonJS (auto-detected if not specified)\n moduleType: z.enum([\"esm\", \"commonjs\"]).optional(),\n\n // Output paths\n output: z.object({\n path: z.string().default(\"src/strapi\"),\n types: z.string().default(\"types\"),\n services: z.string().default(\"services\"),\n actions: z.string().optional().default(\"actions/strapi\"),\n // Output structure: 'by-layer' (types/, services/, actions/) or 'by-feature' (article/, category/)\n structure: z.enum([\"by-layer\", \"by-feature\"]).default(\"by-feature\"),\n }).default({}),\n\n // Features to generate\n features: z.object({\n types: z.boolean().default(true),\n services: z.boolean().default(true),\n actions: z.boolean().default(true),\n }).default({}),\n\n // Advanced options\n options: z.object({\n // Include draft content types\n includeDrafts: z.boolean().default(false),\n // Generate strict types (no optional fields)\n strictTypes: z.boolean().default(false),\n }).default({}),\n});\n\nexport type StrapiIntegrateConfig = z.infer<typeof configSchema>;\nexport type StrapiIntegrateConfigInput = z.input<typeof configSchema>;\n","import { createJiti } from 'jiti';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { config as loadEnv } from 'dotenv';\nimport { configSchema, type StrapiIntegrateConfig, type StrapiIntegrateConfigInput } from './schema.js';\n\nconst CONFIG_FILES = ['strapi.config.ts', 'strapi.config.js', 'strapi.config.mjs'];\n\n/**\n * Helper function for defining configuration with type safety\n */\nexport function defineConfig(config: StrapiIntegrateConfigInput): StrapiIntegrateConfig {\n return configSchema.parse(config);\n}\n\n/**\n * Load configuration from strapi.config.ts\n */\nexport async function loadConfig(cwd: string = process.cwd()): Promise<StrapiIntegrateConfig> {\n // Load environment variables from .env file (quiet to suppress dotenv logs)\n loadEnv({ path: path.join(cwd, '.env'), quiet: true });\n\n // Find config file\n let configPath: string | null = null;\n\n for (const file of CONFIG_FILES) {\n const fullPath = path.join(cwd, file);\n try {\n await fs.access(fullPath);\n configPath = fullPath;\n break;\n } catch {\n // File doesn't exist, continue\n }\n }\n\n if (!configPath) {\n throw new Error(\n `Could not find strapi.config.ts in ${cwd}. Run \"npx strapi2front init\" first.`\n );\n }\n\n // Load config using jiti (supports TypeScript)\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n });\n\n try {\n const rawConfig = await jiti.import(configPath);\n const config = (rawConfig as { default?: unknown }).default || rawConfig;\n\n // Resolve environment variables\n const resolvedConfig = resolveEnvVariables(config as Record<string, unknown>);\n\n // Validate with Zod\n return configSchema.parse(resolvedConfig);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to load config: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Resolve environment variables in config\n */\nfunction resolveEnvVariables(config: Record<string, unknown>): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(config)) {\n if (typeof value === 'string') {\n // Check if it's a process.env reference that wasn't resolved\n if (value.startsWith('process.env.')) {\n const envKey = value.replace('process.env.', '');\n resolved[key] = process.env[envKey] || value;\n } else {\n resolved[key] = value;\n }\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n resolved[key] = resolveEnvVariables(value as Record<string, unknown>);\n } else {\n resolved[key] = value;\n }\n }\n\n // Also check for token from environment\n if (!resolved['token'] && process.env['STRAPI_TOKEN']) {\n resolved['token'] = process.env['STRAPI_TOKEN'];\n }\n\n return resolved;\n}\n","import type { StrapiSchema, ContentTypeSchema, ComponentSchema, StrapiLocale } from \"./types.js\";\n\ninterface ContentTypesApiResponse {\n data: ContentTypeSchema[];\n}\n\ninterface ComponentsApiResponse {\n data: ComponentSchema[];\n}\n\ntype LocalesApiResponse = StrapiLocale[];\n\n/**\n * Normalize URL by removing trailing slashes\n */\nfunction normalizeUrl(url: string): string {\n return url.replace(/\\/+$/, '');\n}\n\n/**\n * Normalize API prefix (ensure it starts with / and has no trailing slash)\n */\nfunction normalizeApiPrefix(prefix: string): string {\n let normalized = prefix.trim();\n if (!normalized.startsWith('/')) {\n normalized = '/' + normalized;\n }\n return normalized.replace(/\\/+$/, '');\n}\n\n/**\n * Fetch content type schema from Strapi\n */\nexport async function fetchSchema(\n url: string,\n token?: string,\n apiPrefix: string = \"/api\"\n): Promise<StrapiSchema> {\n const baseUrl = normalizeUrl(url);\n const prefix = normalizeApiPrefix(apiPrefix);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n // Fetch content types from content-type-builder API\n const contentTypesResponse = await fetch(\n `${baseUrl}${prefix}/content-type-builder/content-types`,\n { headers }\n );\n\n if (!contentTypesResponse.ok) {\n const error = await contentTypesResponse.text();\n throw new Error(\n `Failed to fetch content types: ${contentTypesResponse.status} ${error}`\n );\n }\n\n const contentTypesData = await contentTypesResponse.json() as ContentTypesApiResponse;\n\n // Fetch components\n const componentsResponse = await fetch(\n `${baseUrl}${prefix}/content-type-builder/components`,\n { headers }\n );\n\n if (!componentsResponse.ok) {\n const error = await componentsResponse.text();\n throw new Error(\n `Failed to fetch components: ${componentsResponse.status} ${error}`\n );\n }\n\n const componentsData = await componentsResponse.json() as ComponentsApiResponse;\n\n // Fetch locales (i18n)\n let locales: StrapiLocale[] = [];\n try {\n const localesResponse = await fetch(\n `${baseUrl}${prefix}/i18n/locales`,\n { headers }\n );\n\n if (localesResponse.ok) {\n locales = await localesResponse.json() as LocalesApiResponse;\n }\n } catch {\n // i18n might not be enabled, continue without locales\n }\n\n // Filter out internal Strapi content types\n const userContentTypes = (contentTypesData.data || []).filter((ct) => {\n return (\n ct.uid.startsWith(\"api::\") &&\n !ct.uid.includes(\"strapi::\") &&\n !ct.uid.includes(\"admin::\")\n );\n });\n\n return {\n contentTypes: userContentTypes,\n components: componentsData.data || [],\n locales,\n };\n}\n\nexport type StrapiVersion = \"v4\" | \"v5\";\n\nexport interface VersionDetectionResult {\n detected: StrapiVersion | null;\n confidence: \"high\" | \"medium\" | \"low\";\n reason: string;\n}\n\n/**\n * Detect Strapi version by analyzing content types unique to each version.\n *\n * V5-exclusive content types:\n * - plugin::content-releases.release\n * - plugin::content-releases.release-action\n * - plugin::review-workflows.workflow\n * - plugin::review-workflows.workflow-stage\n * - admin::session\n *\n * V5-exclusive attributes:\n * - entryDocumentId in plugin::content-releases.release-action\n */\nexport async function detectStrapiVersion(\n url: string,\n token?: string,\n apiPrefix: string = \"/api\"\n): Promise<VersionDetectionResult> {\n const baseUrl = normalizeUrl(url);\n const prefix = normalizeApiPrefix(apiPrefix);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n try {\n const response = await fetch(\n `${baseUrl}${prefix}/content-type-builder/content-types`,\n { headers }\n );\n\n if (!response.ok) {\n return {\n detected: null,\n confidence: \"low\",\n reason: `Could not fetch schema: ${response.status}`,\n };\n }\n\n const data = await response.json() as ContentTypesApiResponse;\n const contentTypes = data.data || [];\n\n if (contentTypes.length === 0) {\n return {\n detected: null,\n confidence: \"low\",\n reason: \"No content types found in schema\",\n };\n }\n\n // V5-exclusive content type UIDs\n const v5ExclusiveUids = [\n \"plugin::content-releases.release\",\n \"plugin::content-releases.release-action\",\n \"plugin::review-workflows.workflow\",\n \"plugin::review-workflows.workflow-stage\",\n \"admin::session\",\n ];\n\n // Check for V5-exclusive content types\n const contentTypeUids = contentTypes.map((ct) => ct.uid);\n const foundV5ContentType = v5ExclusiveUids.find((uid) => contentTypeUids.includes(uid));\n\n if (foundV5ContentType) {\n return {\n detected: \"v5\",\n confidence: \"high\",\n reason: `Found v5-exclusive content type: ${foundV5ContentType}`,\n };\n }\n\n // Check for entryDocumentId attribute (v5 exclusive)\n const releaseAction = contentTypes.find((ct) => ct.uid === \"plugin::content-releases.release-action\");\n if (releaseAction?.schema?.attributes && \"entryDocumentId\" in releaseAction.schema.attributes) {\n return {\n detected: \"v5\",\n confidence: \"high\",\n reason: \"Found entryDocumentId attribute (Strapi v5 feature)\",\n };\n }\n\n // If none of the v5-exclusive features are found, it's v4\n // Check for typical v4 content types to confirm\n const hasV4AdminTypes = contentTypeUids.includes(\"admin::permission\") &&\n contentTypeUids.includes(\"admin::user\") &&\n !contentTypeUids.includes(\"admin::session\");\n\n if (hasV4AdminTypes) {\n return {\n detected: \"v4\",\n confidence: \"high\",\n reason: \"No v5-exclusive content types found, confirmed v4 structure\",\n };\n }\n\n // Fallback - assume v4 since it's the legacy version\n return {\n detected: \"v4\",\n confidence: \"medium\",\n reason: \"Could not find v5-specific features, assuming v4\",\n };\n } catch (error) {\n return {\n detected: null,\n confidence: \"low\",\n reason: error instanceof Error ? error.message : \"Detection failed\",\n };\n }\n}\n\n/**\n * Test connection to Strapi\n */\nexport async function testConnection(\n url: string,\n token?: string,\n apiPrefix: string = \"/api\"\n): Promise<{ success: boolean; message: string; version?: string }> {\n const baseUrl = normalizeUrl(url);\n const prefix = normalizeApiPrefix(apiPrefix);\n\n try {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n // Try to fetch content types (requires authentication)\n const response = await fetch(\n `${baseUrl}${prefix}/content-type-builder/content-types`,\n { headers }\n );\n\n if (response.ok) {\n return {\n success: true,\n message: \"Connected successfully\",\n };\n }\n\n if (response.status === 401) {\n return {\n success: false,\n message: \"Invalid or missing API token\",\n };\n }\n\n if (response.status === 403) {\n return {\n success: false,\n message: \"API token does not have permission to access content-type-builder\",\n };\n }\n\n return {\n success: false,\n message: `Failed to connect: ${response.status} ${response.statusText}`,\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : \"Connection failed\",\n };\n }\n}\n","import type {\n StrapiSchema,\n ParsedSchema,\n CollectionType,\n SingleType,\n ComponentType,\n Attribute,\n} from './types.js';\n\n/**\n * Parse raw Strapi schema into a structured format for code generation\n */\nexport function parseSchema(schema: StrapiSchema): ParsedSchema {\n const collections: CollectionType[] = [];\n const singles: SingleType[] = [];\n\n for (const ct of schema.contentTypes) {\n const { kind, singularName, pluralName, displayName, description, draftAndPublish, pluginOptions, attributes } = ct.schema;\n\n // Filter out system attributes\n const filteredAttributes = filterSystemAttributes(attributes);\n\n // Check if i18n is enabled for this content type\n const localized = Boolean(\n pluginOptions?.i18n &&\n typeof pluginOptions.i18n === 'object' &&\n (pluginOptions.i18n as Record<string, unknown>).localized\n );\n\n if (kind === 'collectionType') {\n collections.push({\n uid: ct.uid,\n apiId: ct.apiID,\n singularName,\n pluralName,\n displayName,\n description,\n draftAndPublish: draftAndPublish ?? false,\n localized,\n attributes: filteredAttributes,\n });\n } else if (kind === 'singleType') {\n singles.push({\n uid: ct.uid,\n apiId: ct.apiID,\n singularName,\n displayName,\n description,\n draftAndPublish: draftAndPublish ?? false,\n localized,\n attributes: filteredAttributes,\n });\n }\n }\n\n // Parse components\n const components: ComponentType[] = schema.components.map((comp) => {\n const filteredAttributes = filterSystemAttributes(comp.schema.attributes);\n\n return {\n uid: comp.uid,\n category: comp.category,\n name: comp.apiId,\n displayName: comp.schema.displayName,\n description: comp.schema.description,\n attributes: filteredAttributes,\n };\n });\n\n // Sort alphabetically\n collections.sort((a, b) => a.singularName.localeCompare(b.singularName));\n singles.sort((a, b) => a.singularName.localeCompare(b.singularName));\n components.sort((a, b) => a.name.localeCompare(b.name));\n\n return {\n collections,\n singles,\n components,\n };\n}\n\n/**\n * Filter out system attributes that shouldn't be in the generated types\n */\nfunction filterSystemAttributes(\n attributes: Record<string, Attribute>\n): Record<string, Attribute> {\n const SYSTEM_ATTRIBUTES = [\n 'createdBy',\n 'updatedBy',\n 'localizations',\n 'locale',\n ];\n\n const filtered: Record<string, Attribute> = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n // Skip system attributes\n if (SYSTEM_ATTRIBUTES.includes(key)) {\n continue;\n }\n\n // Skip private attributes\n if (value.private === true) {\n continue;\n }\n\n filtered[key] = value;\n }\n\n return filtered;\n}\n\n/**\n * Get the API endpoint name for a content type\n */\nexport function getApiEndpoint(singularName: string, pluralName: string): string {\n return pluralName || `${singularName}s`;\n}\n\n/**\n * Convert uid to a valid TypeScript identifier\n */\nexport function uidToIdentifier(uid: string): string {\n // api::post.post -> Post\n // api::blog-post.blog-post -> BlogPost\n const parts = uid.split('.');\n const name = parts[parts.length - 1] || uid;\n\n return toPascalCase(name);\n}\n\n/**\n * Convert string to PascalCase\n */\nexport function toPascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n\n/**\n * Convert string to camelCase\n */\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\n/**\n * Convert string to kebab-case\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n"]}
1
+ {"version":3,"sources":["../src/config/schema.ts","../src/config/loader.ts","../src/schema/fetcher.ts","../src/schema/parser.ts"],"names":["loadEnv"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\n\n/**\n * Configuration schema for strapi2front\n */\nexport const configSchema = z.object({\n // Strapi connection\n url: z.string().url(\"url must be a valid URL\"),\n token: z.string().min(1, \"token is required\").optional(),\n\n // API prefix (default: \"/api\", can be customized in Strapi config)\n apiPrefix: z.string().default(\"/api\"),\n\n // Strapi version\n strapiVersion: z.enum([\"v4\", \"v5\"]).default(\"v5\"),\n\n // Output format: 'typescript' for .ts files, 'jsdoc' for .js with JSDoc annotations\n outputFormat: z.enum([\"typescript\", \"jsdoc\"]).default(\"typescript\"),\n\n // Module type: 'esm' for ES Modules, 'commonjs' for CommonJS (auto-detected if not specified)\n moduleType: z.enum([\"esm\", \"commonjs\"]).optional(),\n\n // Output path\n output: z.object({\n path: z.string().default(\"src/strapi\"),\n }).default({}),\n\n // Features to generate\n features: z.object({\n types: z.boolean().default(true),\n services: z.boolean().default(true),\n actions: z.boolean().default(true),\n // Zod schemas for validation (React Hook Form, TanStack Form, etc.)\n // Default: true for TypeScript, false for JSDoc\n schemas: z.boolean().optional(),\n // Upload helpers (public client + Astro action)\n upload: z.boolean().default(false),\n }).default({}),\n\n // Schema generation options\n schemaOptions: z.object({\n /**\n * Use advanced relation format with connect/disconnect/set operations\n * instead of simple ID arrays.\n *\n * When false (default): { tags: [\"id1\", \"id2\"] }\n * When true: { tags: { connect: [{ documentId: \"id1\" }], disconnect: [...] } }\n *\n * Advanced format supports:\n * - connect: Add relations while preserving existing\n * - disconnect: Remove specific relations\n * - set: Replace all relations\n * - locale: For i18n content types\n * - status: For draft/published targeting\n * - position: For ordering (before, after, start, end)\n *\n * @default false\n * @see https://docs.strapi.io/dev-docs/api/rest/relations\n */\n advancedRelations: z.boolean().default(false),\n }).default({}),\n\n // Advanced options\n options: z.object({\n // Include draft content types\n includeDrafts: z.boolean().default(false),\n // Generate strict types (no optional fields)\n strictTypes: z.boolean().default(false),\n }).default({}),\n});\n\nexport type StrapiIntegrateConfig = z.infer<typeof configSchema>;\nexport type StrapiIntegrateConfigInput = z.input<typeof configSchema>;\n","import { createJiti } from 'jiti';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { config as loadEnv } from 'dotenv';\nimport { configSchema, type StrapiIntegrateConfig, type StrapiIntegrateConfigInput } from './schema.js';\n\nconst CONFIG_FILES = ['strapi.config.ts', 'strapi.config.js', 'strapi.config.mjs', 'strapi.config.cjs'];\n\n/**\n * Helper function for defining configuration with type safety\n */\nexport function defineConfig(config: StrapiIntegrateConfigInput): StrapiIntegrateConfig {\n return configSchema.parse(config);\n}\n\n/**\n * Load configuration from strapi.config.ts\n */\nexport async function loadConfig(cwd: string = process.cwd()): Promise<StrapiIntegrateConfig> {\n // Load environment variables from .env file (quiet to suppress dotenv logs)\n loadEnv({ path: path.join(cwd, '.env'), quiet: true });\n\n // Find config file\n let configPath: string | null = null;\n\n for (const file of CONFIG_FILES) {\n const fullPath = path.join(cwd, file);\n try {\n await fs.access(fullPath);\n configPath = fullPath;\n break;\n } catch {\n // File doesn't exist, continue\n }\n }\n\n if (!configPath) {\n throw new Error(\n `Could not find strapi.config.ts in ${cwd}. Run \"npx strapi2front init\" first.`\n );\n }\n\n // Load config using jiti (supports TypeScript)\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n });\n\n try {\n const rawConfig = await jiti.import(configPath);\n const config = (rawConfig as { default?: unknown }).default || rawConfig;\n\n // Resolve environment variables\n const resolvedConfig = resolveEnvVariables(config as Record<string, unknown>);\n\n // Validate with Zod\n return configSchema.parse(resolvedConfig);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to load config: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Resolve environment variables in config\n */\nfunction resolveEnvVariables(config: Record<string, unknown>): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(config)) {\n if (typeof value === 'string') {\n // Check if it's a process.env reference that wasn't resolved\n if (value.startsWith('process.env.')) {\n const envKey = value.replace('process.env.', '');\n resolved[key] = process.env[envKey] || value;\n } else {\n resolved[key] = value;\n }\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n resolved[key] = resolveEnvVariables(value as Record<string, unknown>);\n } else {\n resolved[key] = value;\n }\n }\n\n // Also check for token from environment\n // Priority: STRAPI_SYNC_TOKEN (for sync command) > STRAPI_TOKEN (fallback)\n if (!resolved['token']) {\n const syncToken = process.env['STRAPI_SYNC_TOKEN'] || process.env['STRAPI_TOKEN'];\n if (syncToken) {\n resolved['token'] = syncToken;\n }\n }\n\n return resolved;\n}\n","import type { StrapiSchema, ContentTypeSchema, ComponentSchema, StrapiLocale } from \"./types.js\";\n\ninterface ContentTypesApiResponse {\n data: ContentTypeSchema[];\n}\n\ninterface ComponentsApiResponse {\n data: ComponentSchema[];\n}\n\ntype LocalesApiResponse = StrapiLocale[];\n\n/**\n * Normalize URL by removing trailing slashes\n */\nfunction normalizeUrl(url: string): string {\n return url.replace(/\\/+$/, '');\n}\n\n/**\n * Normalize API prefix (ensure it starts with / and has no trailing slash)\n */\nfunction normalizeApiPrefix(prefix: string): string {\n let normalized = prefix.trim();\n if (!normalized.startsWith('/')) {\n normalized = '/' + normalized;\n }\n return normalized.replace(/\\/+$/, '');\n}\n\n/**\n * Fetch content type schema from Strapi\n */\nexport async function fetchSchema(\n url: string,\n token?: string,\n apiPrefix: string = \"/api\"\n): Promise<StrapiSchema> {\n const baseUrl = normalizeUrl(url);\n const prefix = normalizeApiPrefix(apiPrefix);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n // Fetch content types from content-type-builder API\n const contentTypesResponse = await fetch(\n `${baseUrl}${prefix}/content-type-builder/content-types`,\n { headers }\n );\n\n if (!contentTypesResponse.ok) {\n const error = await contentTypesResponse.text();\n throw new Error(\n `Failed to fetch content types: ${contentTypesResponse.status} ${error}`\n );\n }\n\n const contentTypesData = await contentTypesResponse.json() as ContentTypesApiResponse;\n\n // Fetch components\n const componentsResponse = await fetch(\n `${baseUrl}${prefix}/content-type-builder/components`,\n { headers }\n );\n\n if (!componentsResponse.ok) {\n const error = await componentsResponse.text();\n throw new Error(\n `Failed to fetch components: ${componentsResponse.status} ${error}`\n );\n }\n\n const componentsData = await componentsResponse.json() as ComponentsApiResponse;\n\n // Fetch locales (i18n)\n let locales: StrapiLocale[] = [];\n try {\n const localesResponse = await fetch(\n `${baseUrl}${prefix}/i18n/locales`,\n { headers }\n );\n\n if (localesResponse.ok) {\n locales = await localesResponse.json() as LocalesApiResponse;\n }\n } catch {\n // i18n might not be enabled, continue without locales\n }\n\n // Filter out internal Strapi content types\n const userContentTypes = (contentTypesData.data || []).filter((ct) => {\n return (\n ct.uid.startsWith(\"api::\") &&\n !ct.uid.includes(\"strapi::\") &&\n !ct.uid.includes(\"admin::\")\n );\n });\n\n return {\n contentTypes: userContentTypes,\n components: componentsData.data || [],\n locales,\n };\n}\n\nexport type StrapiVersion = \"v4\" | \"v5\";\n\nexport interface VersionDetectionResult {\n detected: StrapiVersion | null;\n confidence: \"high\" | \"medium\" | \"low\";\n reason: string;\n}\n\n/**\n * Detect Strapi version by analyzing content types unique to each version.\n *\n * V5-exclusive content types:\n * - plugin::content-releases.release\n * - plugin::content-releases.release-action\n * - plugin::review-workflows.workflow\n * - plugin::review-workflows.workflow-stage\n * - admin::session\n *\n * V5-exclusive attributes:\n * - entryDocumentId in plugin::content-releases.release-action\n */\nexport async function detectStrapiVersion(\n url: string,\n token?: string,\n apiPrefix: string = \"/api\"\n): Promise<VersionDetectionResult> {\n const baseUrl = normalizeUrl(url);\n const prefix = normalizeApiPrefix(apiPrefix);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n try {\n const response = await fetch(\n `${baseUrl}${prefix}/content-type-builder/content-types`,\n { headers }\n );\n\n if (!response.ok) {\n return {\n detected: null,\n confidence: \"low\",\n reason: `Could not fetch schema: ${response.status}`,\n };\n }\n\n const data = await response.json() as ContentTypesApiResponse;\n const contentTypes = data.data || [];\n\n if (contentTypes.length === 0) {\n return {\n detected: null,\n confidence: \"low\",\n reason: \"No content types found in schema\",\n };\n }\n\n // V5-exclusive content type UIDs\n const v5ExclusiveUids = [\n \"plugin::content-releases.release\",\n \"plugin::content-releases.release-action\",\n \"plugin::review-workflows.workflow\",\n \"plugin::review-workflows.workflow-stage\",\n \"admin::session\",\n ];\n\n // Check for V5-exclusive content types\n const contentTypeUids = contentTypes.map((ct) => ct.uid);\n const foundV5ContentType = v5ExclusiveUids.find((uid) => contentTypeUids.includes(uid));\n\n if (foundV5ContentType) {\n return {\n detected: \"v5\",\n confidence: \"high\",\n reason: `Found v5-exclusive content type: ${foundV5ContentType}`,\n };\n }\n\n // Check for entryDocumentId attribute (v5 exclusive)\n const releaseAction = contentTypes.find((ct) => ct.uid === \"plugin::content-releases.release-action\");\n if (releaseAction?.schema?.attributes && \"entryDocumentId\" in releaseAction.schema.attributes) {\n return {\n detected: \"v5\",\n confidence: \"high\",\n reason: \"Found entryDocumentId attribute (Strapi v5 feature)\",\n };\n }\n\n // If none of the v5-exclusive features are found, it's v4\n // Check for typical v4 content types to confirm\n const hasV4AdminTypes = contentTypeUids.includes(\"admin::permission\") &&\n contentTypeUids.includes(\"admin::user\") &&\n !contentTypeUids.includes(\"admin::session\");\n\n if (hasV4AdminTypes) {\n return {\n detected: \"v4\",\n confidence: \"high\",\n reason: \"No v5-exclusive content types found, confirmed v4 structure\",\n };\n }\n\n // Fallback - assume v4 since it's the legacy version\n return {\n detected: \"v4\",\n confidence: \"medium\",\n reason: \"Could not find v5-specific features, assuming v4\",\n };\n } catch (error) {\n return {\n detected: null,\n confidence: \"low\",\n reason: error instanceof Error ? error.message : \"Detection failed\",\n };\n }\n}\n\n/**\n * Test connection to Strapi\n */\nexport async function testConnection(\n url: string,\n token?: string,\n apiPrefix: string = \"/api\"\n): Promise<{ success: boolean; message: string; version?: string }> {\n const baseUrl = normalizeUrl(url);\n const prefix = normalizeApiPrefix(apiPrefix);\n\n try {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n // Try to fetch content types (requires authentication)\n const response = await fetch(\n `${baseUrl}${prefix}/content-type-builder/content-types`,\n { headers }\n );\n\n if (response.ok) {\n return {\n success: true,\n message: \"Connected successfully\",\n };\n }\n\n if (response.status === 401) {\n return {\n success: false,\n message: \"Invalid or missing API token\",\n };\n }\n\n if (response.status === 403) {\n return {\n success: false,\n message: \"API token does not have permission to access content-type-builder\",\n };\n }\n\n return {\n success: false,\n message: `Failed to connect: ${response.status} ${response.statusText}`,\n };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : \"Connection failed\",\n };\n }\n}\n","import type {\n StrapiSchema,\n ParsedSchema,\n CollectionType,\n SingleType,\n ComponentType,\n Attribute,\n} from './types.js';\n\n/**\n * Parse raw Strapi schema into a structured format for code generation\n */\nexport function parseSchema(schema: StrapiSchema): ParsedSchema {\n const collections: CollectionType[] = [];\n const singles: SingleType[] = [];\n\n for (const ct of schema.contentTypes) {\n const { kind, singularName, pluralName, displayName, description, draftAndPublish, pluginOptions, attributes } = ct.schema;\n\n // Filter out system attributes\n const filteredAttributes = filterSystemAttributes(attributes);\n\n // Check if i18n is enabled for this content type\n const localized = Boolean(\n pluginOptions?.i18n &&\n typeof pluginOptions.i18n === 'object' &&\n (pluginOptions.i18n as Record<string, unknown>).localized\n );\n\n if (kind === 'collectionType') {\n collections.push({\n uid: ct.uid,\n apiId: ct.apiID,\n singularName,\n pluralName,\n displayName,\n description,\n draftAndPublish: draftAndPublish ?? false,\n localized,\n attributes: filteredAttributes,\n });\n } else if (kind === 'singleType') {\n singles.push({\n uid: ct.uid,\n apiId: ct.apiID,\n singularName,\n displayName,\n description,\n draftAndPublish: draftAndPublish ?? false,\n localized,\n attributes: filteredAttributes,\n });\n }\n }\n\n // Parse components\n const components: ComponentType[] = schema.components.map((comp) => {\n const filteredAttributes = filterSystemAttributes(comp.schema.attributes);\n\n return {\n uid: comp.uid,\n category: comp.category,\n name: comp.apiId,\n displayName: comp.schema.displayName,\n description: comp.schema.description,\n attributes: filteredAttributes,\n };\n });\n\n // Sort alphabetically\n collections.sort((a, b) => a.singularName.localeCompare(b.singularName));\n singles.sort((a, b) => a.singularName.localeCompare(b.singularName));\n components.sort((a, b) => a.name.localeCompare(b.name));\n\n return {\n collections,\n singles,\n components,\n };\n}\n\n/**\n * Filter out system attributes that shouldn't be in the generated types\n */\nfunction filterSystemAttributes(\n attributes: Record<string, Attribute>\n): Record<string, Attribute> {\n const SYSTEM_ATTRIBUTES = [\n 'createdBy',\n 'updatedBy',\n 'localizations',\n 'locale',\n ];\n\n const filtered: Record<string, Attribute> = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n // Skip system attributes\n if (SYSTEM_ATTRIBUTES.includes(key)) {\n continue;\n }\n\n // Skip private attributes\n if (value.private === true) {\n continue;\n }\n\n filtered[key] = value;\n }\n\n return filtered;\n}\n\n/**\n * Get the API endpoint name for a content type\n */\nexport function getApiEndpoint(singularName: string, pluralName: string): string {\n return pluralName || `${singularName}s`;\n}\n\n/**\n * Convert uid to a valid TypeScript identifier\n */\nexport function uidToIdentifier(uid: string): string {\n // api::post.post -> Post\n // api::blog-post.blog-post -> BlogPost\n const parts = uid.split('.');\n const name = parts[parts.length - 1] || uid;\n\n return toPascalCase(name);\n}\n\n/**\n * Convert string to PascalCase\n */\nexport function toPascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n\n/**\n * Convert string to camelCase\n */\nexport function toCamelCase(str: string): string {\n const pascal = toPascalCase(str);\n return pascal.charAt(0).toLowerCase() + pascal.slice(1);\n}\n\n/**\n * Convert string to kebab-case\n */\nexport function toKebabCase(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi2front/core",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Core utilities and configuration for strapi2front",
5
5
  "type": "module",
6
6
  "exports": {