@strapi2front/core 0.1.5 → 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/index.d.ts +13 -6
- package/dist/index.js +23 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -6,12 +6,14 @@ 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"]>>;
|
|
11
|
+
outputFormat: z.ZodDefault<z.ZodEnum<["typescript", "jsdoc"]>>;
|
|
10
12
|
output: z.ZodDefault<z.ZodObject<{
|
|
11
13
|
path: z.ZodDefault<z.ZodString>;
|
|
12
14
|
types: z.ZodDefault<z.ZodString>;
|
|
13
15
|
services: z.ZodDefault<z.ZodString>;
|
|
14
|
-
actions: z.ZodDefault<z.ZodString
|
|
16
|
+
actions: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
15
17
|
structure: z.ZodDefault<z.ZodEnum<["by-layer", "by-feature"]>>;
|
|
16
18
|
}, "strip", z.ZodTypeAny, {
|
|
17
19
|
path: string;
|
|
@@ -51,7 +53,9 @@ declare const configSchema: z.ZodObject<{
|
|
|
51
53
|
}>>;
|
|
52
54
|
}, "strip", z.ZodTypeAny, {
|
|
53
55
|
url: string;
|
|
56
|
+
apiPrefix: string;
|
|
54
57
|
strapiVersion: "v4" | "v5";
|
|
58
|
+
outputFormat: "typescript" | "jsdoc";
|
|
55
59
|
options: {
|
|
56
60
|
includeDrafts: boolean;
|
|
57
61
|
strictTypes: boolean;
|
|
@@ -72,7 +76,9 @@ declare const configSchema: z.ZodObject<{
|
|
|
72
76
|
}, {
|
|
73
77
|
url: string;
|
|
74
78
|
token?: string | undefined;
|
|
79
|
+
apiPrefix?: string | undefined;
|
|
75
80
|
strapiVersion?: "v4" | "v5" | undefined;
|
|
81
|
+
outputFormat?: "typescript" | "jsdoc" | undefined;
|
|
76
82
|
options?: {
|
|
77
83
|
includeDrafts?: boolean | undefined;
|
|
78
84
|
strictTypes?: boolean | undefined;
|
|
@@ -91,11 +97,12 @@ declare const configSchema: z.ZodObject<{
|
|
|
91
97
|
} | undefined;
|
|
92
98
|
}>;
|
|
93
99
|
type StrapiIntegrateConfig = z.infer<typeof configSchema>;
|
|
100
|
+
type StrapiIntegrateConfigInput = z.input<typeof configSchema>;
|
|
94
101
|
|
|
95
102
|
/**
|
|
96
103
|
* Helper function for defining configuration with type safety
|
|
97
104
|
*/
|
|
98
|
-
declare function defineConfig(config:
|
|
105
|
+
declare function defineConfig(config: StrapiIntegrateConfigInput): StrapiIntegrateConfig;
|
|
99
106
|
/**
|
|
100
107
|
* Load configuration from strapi.config.ts
|
|
101
108
|
*/
|
|
@@ -309,7 +316,7 @@ type Attribute = StringAttribute | BlocksAttribute | NumberAttribute | BooleanAt
|
|
|
309
316
|
/**
|
|
310
317
|
* Fetch content type schema from Strapi
|
|
311
318
|
*/
|
|
312
|
-
declare function fetchSchema(url: string, token?: string): Promise<StrapiSchema>;
|
|
319
|
+
declare function fetchSchema(url: string, token?: string, apiPrefix?: string): Promise<StrapiSchema>;
|
|
313
320
|
type StrapiVersion = "v4" | "v5";
|
|
314
321
|
interface VersionDetectionResult {
|
|
315
322
|
detected: StrapiVersion | null;
|
|
@@ -329,11 +336,11 @@ interface VersionDetectionResult {
|
|
|
329
336
|
* V5-exclusive attributes:
|
|
330
337
|
* - entryDocumentId in plugin::content-releases.release-action
|
|
331
338
|
*/
|
|
332
|
-
declare function detectStrapiVersion(url: string, token?: string): Promise<VersionDetectionResult>;
|
|
339
|
+
declare function detectStrapiVersion(url: string, token?: string, apiPrefix?: string): Promise<VersionDetectionResult>;
|
|
333
340
|
/**
|
|
334
341
|
* Test connection to Strapi
|
|
335
342
|
*/
|
|
336
|
-
declare function testConnection(url: string, token?: string): Promise<{
|
|
343
|
+
declare function testConnection(url: string, token?: string, apiPrefix?: string): Promise<{
|
|
337
344
|
success: boolean;
|
|
338
345
|
message: string;
|
|
339
346
|
version?: string;
|
|
@@ -360,4 +367,4 @@ declare function toCamelCase(str: string): string;
|
|
|
360
367
|
*/
|
|
361
368
|
declare function toKebabCase(str: string): string;
|
|
362
369
|
|
|
363
|
-
export { type Attribute, type AttributeType, type BlocksAttribute, type BooleanAttribute, type CollectionType, type ComponentAttribute, type ComponentSchema, type ComponentType, type ContentTypeSchema, type DateAttribute, type DynamicZoneAttribute, type EnumerationAttribute, type JsonAttribute, type MediaAttribute, type NumberAttribute, type ParsedSchema, type RelationAttribute, type SingleType, type StrapiIntegrateConfig, type StrapiLocale, type StrapiSchema, type StrapiVersion, type StringAttribute, type VersionDetectionResult, configSchema, defineConfig, detectStrapiVersion, fetchSchema, loadConfig, parseSchema, testConnection, toCamelCase, toKebabCase, toPascalCase, uidToIdentifier };
|
|
370
|
+
export { type Attribute, type AttributeType, type BlocksAttribute, type BooleanAttribute, type CollectionType, type ComponentAttribute, type ComponentSchema, type ComponentType, type ContentTypeSchema, type DateAttribute, type DynamicZoneAttribute, type EnumerationAttribute, type JsonAttribute, type MediaAttribute, type NumberAttribute, type ParsedSchema, type RelationAttribute, type SingleType, type StrapiIntegrateConfig, type StrapiIntegrateConfigInput, type StrapiLocale, type StrapiSchema, type StrapiVersion, type StringAttribute, type VersionDetectionResult, configSchema, defineConfig, detectStrapiVersion, fetchSchema, loadConfig, parseSchema, testConnection, toCamelCase, toKebabCase, toPascalCase, uidToIdentifier };
|
package/dist/index.js
CHANGED
|
@@ -9,14 +9,18 @@ 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"),
|
|
16
|
+
// Output format: 'typescript' for .ts files, 'jsdoc' for .js with JSDoc annotations
|
|
17
|
+
outputFormat: z.enum(["typescript", "jsdoc"]).default("typescript"),
|
|
14
18
|
// Output paths
|
|
15
19
|
output: z.object({
|
|
16
20
|
path: z.string().default("src/strapi"),
|
|
17
21
|
types: z.string().default("types"),
|
|
18
22
|
services: z.string().default("services"),
|
|
19
|
-
actions: z.string().default("actions/strapi"),
|
|
23
|
+
actions: z.string().optional().default("actions/strapi"),
|
|
20
24
|
// Output structure: 'by-layer' (types/, services/, actions/) or 'by-feature' (article/, category/)
|
|
21
25
|
structure: z.enum(["by-layer", "by-feature"]).default("by-feature")
|
|
22
26
|
}).default({}),
|
|
@@ -98,8 +102,16 @@ function resolveEnvVariables(config) {
|
|
|
98
102
|
function normalizeUrl(url) {
|
|
99
103
|
return url.replace(/\/+$/, "");
|
|
100
104
|
}
|
|
101
|
-
|
|
105
|
+
function normalizeApiPrefix(prefix) {
|
|
106
|
+
let normalized = prefix.trim();
|
|
107
|
+
if (!normalized.startsWith("/")) {
|
|
108
|
+
normalized = "/" + normalized;
|
|
109
|
+
}
|
|
110
|
+
return normalized.replace(/\/+$/, "");
|
|
111
|
+
}
|
|
112
|
+
async function fetchSchema(url, token, apiPrefix = "/api") {
|
|
102
113
|
const baseUrl = normalizeUrl(url);
|
|
114
|
+
const prefix = normalizeApiPrefix(apiPrefix);
|
|
103
115
|
const headers = {
|
|
104
116
|
"Content-Type": "application/json"
|
|
105
117
|
};
|
|
@@ -107,7 +119,7 @@ async function fetchSchema(url, token) {
|
|
|
107
119
|
headers["Authorization"] = `Bearer ${token}`;
|
|
108
120
|
}
|
|
109
121
|
const contentTypesResponse = await fetch(
|
|
110
|
-
`${baseUrl}/
|
|
122
|
+
`${baseUrl}${prefix}/content-type-builder/content-types`,
|
|
111
123
|
{ headers }
|
|
112
124
|
);
|
|
113
125
|
if (!contentTypesResponse.ok) {
|
|
@@ -118,7 +130,7 @@ async function fetchSchema(url, token) {
|
|
|
118
130
|
}
|
|
119
131
|
const contentTypesData = await contentTypesResponse.json();
|
|
120
132
|
const componentsResponse = await fetch(
|
|
121
|
-
`${baseUrl}/
|
|
133
|
+
`${baseUrl}${prefix}/content-type-builder/components`,
|
|
122
134
|
{ headers }
|
|
123
135
|
);
|
|
124
136
|
if (!componentsResponse.ok) {
|
|
@@ -131,7 +143,7 @@ async function fetchSchema(url, token) {
|
|
|
131
143
|
let locales = [];
|
|
132
144
|
try {
|
|
133
145
|
const localesResponse = await fetch(
|
|
134
|
-
`${baseUrl}/
|
|
146
|
+
`${baseUrl}${prefix}/i18n/locales`,
|
|
135
147
|
{ headers }
|
|
136
148
|
);
|
|
137
149
|
if (localesResponse.ok) {
|
|
@@ -148,8 +160,9 @@ async function fetchSchema(url, token) {
|
|
|
148
160
|
locales
|
|
149
161
|
};
|
|
150
162
|
}
|
|
151
|
-
async function detectStrapiVersion(url, token) {
|
|
163
|
+
async function detectStrapiVersion(url, token, apiPrefix = "/api") {
|
|
152
164
|
const baseUrl = normalizeUrl(url);
|
|
165
|
+
const prefix = normalizeApiPrefix(apiPrefix);
|
|
153
166
|
const headers = {
|
|
154
167
|
"Content-Type": "application/json"
|
|
155
168
|
};
|
|
@@ -158,7 +171,7 @@ async function detectStrapiVersion(url, token) {
|
|
|
158
171
|
}
|
|
159
172
|
try {
|
|
160
173
|
const response = await fetch(
|
|
161
|
-
`${baseUrl}/
|
|
174
|
+
`${baseUrl}${prefix}/content-type-builder/content-types`,
|
|
162
175
|
{ headers }
|
|
163
176
|
);
|
|
164
177
|
if (!response.ok) {
|
|
@@ -222,8 +235,9 @@ async function detectStrapiVersion(url, token) {
|
|
|
222
235
|
};
|
|
223
236
|
}
|
|
224
237
|
}
|
|
225
|
-
async function testConnection(url, token) {
|
|
238
|
+
async function testConnection(url, token, apiPrefix = "/api") {
|
|
226
239
|
const baseUrl = normalizeUrl(url);
|
|
240
|
+
const prefix = normalizeApiPrefix(apiPrefix);
|
|
227
241
|
try {
|
|
228
242
|
const headers = {
|
|
229
243
|
"Content-Type": "application/json"
|
|
@@ -232,7 +246,7 @@ async function testConnection(url, token) {
|
|
|
232
246
|
headers["Authorization"] = `Bearer ${token}`;
|
|
233
247
|
}
|
|
234
248
|
const response = await fetch(
|
|
235
|
-
`${baseUrl}/
|
|
249
|
+
`${baseUrl}${prefix}/content-type-builder/content-types`,
|
|
236
250
|
{ headers }
|
|
237
251
|
);
|
|
238
252
|
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 (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 * 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 format: 'typescript' for .ts files, 'jsdoc' for .js with JSDoc annotations\n outputFormat: z.enum([\"typescript\", \"jsdoc\"]).default(\"typescript\"),\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"]}
|