@strapi2front/core 0.1.2 → 0.2.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 +6 -3
- package/dist/index.js +21 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { z } from 'zod';
|
|
|
6
6
|
declare const configSchema: z.ZodObject<{
|
|
7
7
|
url: z.ZodString;
|
|
8
8
|
token: z.ZodOptional<z.ZodString>;
|
|
9
|
+
apiPrefix: z.ZodDefault<z.ZodString>;
|
|
9
10
|
strapiVersion: z.ZodDefault<z.ZodEnum<["v4", "v5"]>>;
|
|
10
11
|
output: z.ZodDefault<z.ZodObject<{
|
|
11
12
|
path: z.ZodDefault<z.ZodString>;
|
|
@@ -51,6 +52,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
51
52
|
}>>;
|
|
52
53
|
}, "strip", z.ZodTypeAny, {
|
|
53
54
|
url: string;
|
|
55
|
+
apiPrefix: string;
|
|
54
56
|
strapiVersion: "v4" | "v5";
|
|
55
57
|
options: {
|
|
56
58
|
includeDrafts: boolean;
|
|
@@ -72,6 +74,7 @@ declare const configSchema: z.ZodObject<{
|
|
|
72
74
|
}, {
|
|
73
75
|
url: string;
|
|
74
76
|
token?: string | undefined;
|
|
77
|
+
apiPrefix?: string | undefined;
|
|
75
78
|
strapiVersion?: "v4" | "v5" | undefined;
|
|
76
79
|
options?: {
|
|
77
80
|
includeDrafts?: boolean | undefined;
|
|
@@ -309,7 +312,7 @@ type Attribute = StringAttribute | BlocksAttribute | NumberAttribute | BooleanAt
|
|
|
309
312
|
/**
|
|
310
313
|
* Fetch content type schema from Strapi
|
|
311
314
|
*/
|
|
312
|
-
declare function fetchSchema(url: string, token?: string): Promise<StrapiSchema>;
|
|
315
|
+
declare function fetchSchema(url: string, token?: string, apiPrefix?: string): Promise<StrapiSchema>;
|
|
313
316
|
type StrapiVersion = "v4" | "v5";
|
|
314
317
|
interface VersionDetectionResult {
|
|
315
318
|
detected: StrapiVersion | null;
|
|
@@ -329,11 +332,11 @@ interface VersionDetectionResult {
|
|
|
329
332
|
* V5-exclusive attributes:
|
|
330
333
|
* - entryDocumentId in plugin::content-releases.release-action
|
|
331
334
|
*/
|
|
332
|
-
declare function detectStrapiVersion(url: string, token?: string): Promise<VersionDetectionResult>;
|
|
335
|
+
declare function detectStrapiVersion(url: string, token?: string, apiPrefix?: string): Promise<VersionDetectionResult>;
|
|
333
336
|
/**
|
|
334
337
|
* Test connection to Strapi
|
|
335
338
|
*/
|
|
336
|
-
declare function testConnection(url: string, token?: string): Promise<{
|
|
339
|
+
declare function testConnection(url: string, token?: string, apiPrefix?: string): Promise<{
|
|
337
340
|
success: boolean;
|
|
338
341
|
message: string;
|
|
339
342
|
version?: string;
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,8 @@ var configSchema = z.object({
|
|
|
9
9
|
// Strapi connection
|
|
10
10
|
url: z.string().url("url must be a valid URL"),
|
|
11
11
|
token: z.string().min(1, "token is required").optional(),
|
|
12
|
+
// API prefix (default: "/api", can be customized in Strapi config)
|
|
13
|
+
apiPrefix: z.string().default("/api"),
|
|
12
14
|
// Strapi version
|
|
13
15
|
strapiVersion: z.enum(["v4", "v5"]).default("v5"),
|
|
14
16
|
// Output paths
|
|
@@ -41,7 +43,7 @@ function defineConfig(config) {
|
|
|
41
43
|
return configSchema.parse(config);
|
|
42
44
|
}
|
|
43
45
|
async function loadConfig(cwd = process.cwd()) {
|
|
44
|
-
config({ path: path.join(cwd, ".env") });
|
|
46
|
+
config({ path: path.join(cwd, ".env"), quiet: true });
|
|
45
47
|
let configPath = null;
|
|
46
48
|
for (const file of CONFIG_FILES) {
|
|
47
49
|
const fullPath = path.join(cwd, file);
|
|
@@ -98,8 +100,16 @@ function resolveEnvVariables(config) {
|
|
|
98
100
|
function normalizeUrl(url) {
|
|
99
101
|
return url.replace(/\/+$/, "");
|
|
100
102
|
}
|
|
101
|
-
|
|
103
|
+
function normalizeApiPrefix(prefix) {
|
|
104
|
+
let normalized = prefix.trim();
|
|
105
|
+
if (!normalized.startsWith("/")) {
|
|
106
|
+
normalized = "/" + normalized;
|
|
107
|
+
}
|
|
108
|
+
return normalized.replace(/\/+$/, "");
|
|
109
|
+
}
|
|
110
|
+
async function fetchSchema(url, token, apiPrefix = "/api") {
|
|
102
111
|
const baseUrl = normalizeUrl(url);
|
|
112
|
+
const prefix = normalizeApiPrefix(apiPrefix);
|
|
103
113
|
const headers = {
|
|
104
114
|
"Content-Type": "application/json"
|
|
105
115
|
};
|
|
@@ -107,7 +117,7 @@ async function fetchSchema(url, token) {
|
|
|
107
117
|
headers["Authorization"] = `Bearer ${token}`;
|
|
108
118
|
}
|
|
109
119
|
const contentTypesResponse = await fetch(
|
|
110
|
-
`${baseUrl}/
|
|
120
|
+
`${baseUrl}${prefix}/content-type-builder/content-types`,
|
|
111
121
|
{ headers }
|
|
112
122
|
);
|
|
113
123
|
if (!contentTypesResponse.ok) {
|
|
@@ -118,7 +128,7 @@ async function fetchSchema(url, token) {
|
|
|
118
128
|
}
|
|
119
129
|
const contentTypesData = await contentTypesResponse.json();
|
|
120
130
|
const componentsResponse = await fetch(
|
|
121
|
-
`${baseUrl}/
|
|
131
|
+
`${baseUrl}${prefix}/content-type-builder/components`,
|
|
122
132
|
{ headers }
|
|
123
133
|
);
|
|
124
134
|
if (!componentsResponse.ok) {
|
|
@@ -131,7 +141,7 @@ async function fetchSchema(url, token) {
|
|
|
131
141
|
let locales = [];
|
|
132
142
|
try {
|
|
133
143
|
const localesResponse = await fetch(
|
|
134
|
-
`${baseUrl}/
|
|
144
|
+
`${baseUrl}${prefix}/i18n/locales`,
|
|
135
145
|
{ headers }
|
|
136
146
|
);
|
|
137
147
|
if (localesResponse.ok) {
|
|
@@ -148,8 +158,9 @@ async function fetchSchema(url, token) {
|
|
|
148
158
|
locales
|
|
149
159
|
};
|
|
150
160
|
}
|
|
151
|
-
async function detectStrapiVersion(url, token) {
|
|
161
|
+
async function detectStrapiVersion(url, token, apiPrefix = "/api") {
|
|
152
162
|
const baseUrl = normalizeUrl(url);
|
|
163
|
+
const prefix = normalizeApiPrefix(apiPrefix);
|
|
153
164
|
const headers = {
|
|
154
165
|
"Content-Type": "application/json"
|
|
155
166
|
};
|
|
@@ -158,7 +169,7 @@ async function detectStrapiVersion(url, token) {
|
|
|
158
169
|
}
|
|
159
170
|
try {
|
|
160
171
|
const response = await fetch(
|
|
161
|
-
`${baseUrl}/
|
|
172
|
+
`${baseUrl}${prefix}/content-type-builder/content-types`,
|
|
162
173
|
{ headers }
|
|
163
174
|
);
|
|
164
175
|
if (!response.ok) {
|
|
@@ -222,8 +233,9 @@ async function detectStrapiVersion(url, token) {
|
|
|
222
233
|
};
|
|
223
234
|
}
|
|
224
235
|
}
|
|
225
|
-
async function testConnection(url, token) {
|
|
236
|
+
async function testConnection(url, token, apiPrefix = "/api") {
|
|
226
237
|
const baseUrl = normalizeUrl(url);
|
|
238
|
+
const prefix = normalizeApiPrefix(apiPrefix);
|
|
227
239
|
try {
|
|
228
240
|
const headers = {
|
|
229
241
|
"Content-Type": "application/json"
|
|
@@ -232,7 +244,7 @@ async function testConnection(url, token) {
|
|
|
232
244
|
headers["Authorization"] = `Bearer ${token}`;
|
|
233
245
|
}
|
|
234
246
|
const response = await fetch(
|
|
235
|
-
`${baseUrl}/
|
|
247
|
+
`${baseUrl}${prefix}/content-type-builder/content-types`,
|
|
236
248
|
{ headers }
|
|
237
249
|
);
|
|
238
250
|
if (response.ok) {
|
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 // Strapi version\n strapiVersion: z.enum([\"v4\", \"v5\"]).default(\"v5\"),\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().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>;\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 } 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: Partial<StrapiIntegrateConfig>): 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\n loadEnv({ path: path.join(cwd, '.env') });\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 * Fetch content type schema from Strapi\n */\nexport async function fetchSchema(\n url: string,\n token?: string\n): Promise<StrapiSchema> {\n const baseUrl = normalizeUrl(url);\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}/api/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}/api/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}/api/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): Promise<VersionDetectionResult> {\n const baseUrl = normalizeUrl(url);\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}/api/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): Promise<{ success: boolean; message: string; version?: string }> {\n const baseUrl = normalizeUrl(url);\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}/api/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 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().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>;\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 } 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: Partial<StrapiIntegrateConfig>): 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"]}
|