strapi-typed-client 1.0.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/LICENSE +21 -0
- package/README.md +83 -0
- package/dist/cli/commands/check.d.ts +27 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +91 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +28 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +129 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +21 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +113 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +40 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/api-client.d.ts +41 -0
- package/dist/cli/utils/api-client.d.ts.map +1 -0
- package/dist/cli/utils/api-client.js +81 -0
- package/dist/cli/utils/api-client.js.map +1 -0
- package/dist/cli/utils/file-writer.d.ts +44 -0
- package/dist/cli/utils/file-writer.d.ts.map +1 -0
- package/dist/cli/utils/file-writer.js +89 -0
- package/dist/cli/utils/file-writer.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +37 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +622 -0
- package/dist/client.js +688 -0
- package/dist/core/endpoint-converter.d.ts +26 -0
- package/dist/core/endpoint-converter.d.ts.map +1 -0
- package/dist/core/endpoint-converter.js +161 -0
- package/dist/core/endpoint-converter.js.map +1 -0
- package/dist/core/generator/filters-generator.d.ts +22 -0
- package/dist/core/generator/filters-generator.d.ts.map +1 -0
- package/dist/core/generator/filters-generator.js +236 -0
- package/dist/core/generator/filters-generator.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +11 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/schema-transformer.d.ts +19 -0
- package/dist/core/schema-transformer.d.ts.map +1 -0
- package/dist/core/schema-transformer.js +306 -0
- package/dist/core/schema-transformer.js.map +1 -0
- package/dist/generator/auth-api-generator.d.ts +14 -0
- package/dist/generator/auth-api-generator.d.ts.map +1 -0
- package/dist/generator/auth-api-generator.js +518 -0
- package/dist/generator/auth-api-generator.js.map +1 -0
- package/dist/generator/blocks-types-template.d.ts +134 -0
- package/dist/generator/blocks-types-template.d.ts.map +1 -0
- package/dist/generator/blocks-types-template.js +4 -0
- package/dist/generator/blocks-types-template.js.map +1 -0
- package/dist/generator/client-generator.d.ts +19 -0
- package/dist/generator/client-generator.d.ts.map +1 -0
- package/dist/generator/client-generator.js +707 -0
- package/dist/generator/client-generator.js.map +1 -0
- package/dist/generator/custom-api-generator.d.ts +26 -0
- package/dist/generator/custom-api-generator.d.ts.map +1 -0
- package/dist/generator/custom-api-generator.js +145 -0
- package/dist/generator/custom-api-generator.js.map +1 -0
- package/dist/generator/index-generator.d.ts +4 -0
- package/dist/generator/index-generator.d.ts.map +1 -0
- package/dist/generator/index-generator.js +11 -0
- package/dist/generator/index-generator.js.map +1 -0
- package/dist/generator/index.d.ts +14 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +94 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/types-generator.d.ts +35 -0
- package/dist/generator/types-generator.d.ts.map +1 -0
- package/dist/generator/types-generator.js +641 -0
- package/dist/generator/types-generator.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4 -0
- package/dist/next/index.d.ts +16 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +224 -0
- package/dist/next/index.js.map +1 -0
- package/dist/parser/custom-types-parser.d.ts +39 -0
- package/dist/parser/custom-types-parser.d.ts.map +1 -0
- package/dist/parser/custom-types-parser.js +206 -0
- package/dist/parser/custom-types-parser.js.map +1 -0
- package/dist/parser/index.d.ts +23 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +457 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/routes-parser.d.ts +21 -0
- package/dist/parser/routes-parser.d.ts.map +1 -0
- package/dist/parser/routes-parser.js +184 -0
- package/dist/parser/routes-parser.js.map +1 -0
- package/dist/plugin/admin/src/index.d.ts +16 -0
- package/dist/plugin/admin/src/index.d.ts.map +1 -0
- package/dist/plugin/admin/src/index.js +30 -0
- package/dist/plugin/admin/src/index.js.map +1 -0
- package/dist/plugin/admin/src/pages/HomePage.d.ts +2 -0
- package/dist/plugin/admin/src/pages/HomePage.d.ts.map +1 -0
- package/dist/plugin/admin/src/pages/HomePage.js +273 -0
- package/dist/plugin/admin/src/pages/HomePage.js.map +1 -0
- package/dist/plugin/admin/src/pluginId.d.ts +2 -0
- package/dist/plugin/admin/src/pluginId.d.ts.map +1 -0
- package/dist/plugin/admin/src/pluginId.js +2 -0
- package/dist/plugin/admin/src/pluginId.js.map +1 -0
- package/dist/plugin/index.d.ts +22 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +22 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/server/src/config/index.d.ts +31 -0
- package/dist/plugin/server/src/config/index.d.ts.map +1 -0
- package/dist/plugin/server/src/config/index.js +35 -0
- package/dist/plugin/server/src/config/index.js.map +1 -0
- package/dist/plugin/server/src/controllers/schema.d.ts +41 -0
- package/dist/plugin/server/src/controllers/schema.d.ts.map +1 -0
- package/dist/plugin/server/src/controllers/schema.js +51 -0
- package/dist/plugin/server/src/controllers/schema.js.map +1 -0
- package/dist/plugin/server/src/index.d.ts +114 -0
- package/dist/plugin/server/src/index.d.ts.map +1 -0
- package/dist/plugin/server/src/index.js +76 -0
- package/dist/plugin/server/src/index.js.map +1 -0
- package/dist/plugin/server/src/routes/index.d.ts +14 -0
- package/dist/plugin/server/src/routes/index.d.ts.map +1 -0
- package/dist/plugin/server/src/routes/index.js +23 -0
- package/dist/plugin/server/src/routes/index.js.map +1 -0
- package/dist/plugin/server/src/services/endpoints.d.ts +36 -0
- package/dist/plugin/server/src/services/endpoints.d.ts.map +1 -0
- package/dist/plugin/server/src/services/endpoints.js +523 -0
- package/dist/plugin/server/src/services/endpoints.js.map +1 -0
- package/dist/plugin/server/src/services/schema.d.ts +25 -0
- package/dist/plugin/server/src/services/schema.d.ts.map +1 -0
- package/dist/plugin/server/src/services/schema.js +164 -0
- package/dist/plugin/server/src/services/schema.js.map +1 -0
- package/dist/schema-meta.ts +7 -0
- package/dist/schema-types.d.ts +104 -0
- package/dist/schema-types.d.ts.map +1 -0
- package/dist/schema-types.js +3 -0
- package/dist/schema-types.js.map +1 -0
- package/dist/shared/constants.d.ts +99 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +89 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/endpoint-types.d.ts +42 -0
- package/dist/shared/endpoint-types.d.ts.map +1 -0
- package/dist/shared/endpoint-types.js +6 -0
- package/dist/shared/endpoint-types.js.map +1 -0
- package/dist/shared/index.d.ts +12 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +13 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/naming-utils.d.ts +55 -0
- package/dist/shared/naming-utils.d.ts.map +1 -0
- package/dist/shared/naming-utils.js +106 -0
- package/dist/shared/naming-utils.js.map +1 -0
- package/dist/shared/schema-hash.d.ts +39 -0
- package/dist/shared/schema-hash.d.ts.map +1 -0
- package/dist/shared/schema-hash.js +67 -0
- package/dist/shared/schema-hash.js.map +1 -0
- package/dist/shared/strapi-schema-types.d.ts +77 -0
- package/dist/shared/strapi-schema-types.d.ts.map +1 -0
- package/dist/shared/strapi-schema-types.js +10 -0
- package/dist/shared/strapi-schema-types.js.map +1 -0
- package/dist/shared/string-utils.d.ts +68 -0
- package/dist/shared/string-utils.d.ts.map +1 -0
- package/dist/shared/string-utils.js +124 -0
- package/dist/shared/string-utils.js.map +1 -0
- package/dist/transformer/index.d.ts +17 -0
- package/dist/transformer/index.d.ts.map +1 -0
- package/dist/transformer/index.js +83 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/types.d.ts +3430 -0
- package/dist/types.js +3 -0
- package/package.json +152 -0
- package/strapi-admin.js +2 -0
- package/strapi-server.js +2 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Naming utilities for Strapi Types Generator
|
|
3
|
+
* Handles conversion of Strapi-specific naming patterns to TypeScript
|
|
4
|
+
* @module shared/naming-utils
|
|
5
|
+
*/
|
|
6
|
+
import { toPascalCase, pluralize, toKebabCase } from './string-utils.js';
|
|
7
|
+
/**
|
|
8
|
+
* Convert Strapi component UID to TypeScript interface name
|
|
9
|
+
* @example
|
|
10
|
+
* convertComponentName('shared.feature') // 'SharedFeature'
|
|
11
|
+
* convertComponentName('landing.editor-feature') // 'LandingEditorFeature'
|
|
12
|
+
*/
|
|
13
|
+
export function convertComponentName(component) {
|
|
14
|
+
return component
|
|
15
|
+
.split('.')
|
|
16
|
+
.map(part => toPascalCase(part))
|
|
17
|
+
.join('');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Extract clean entity name from Strapi API interface name
|
|
21
|
+
* Handles both Api* and Plugin* prefixes
|
|
22
|
+
* @example
|
|
23
|
+
* extractCleanName('ApiItemItem') // 'Item'
|
|
24
|
+
* extractCleanName('ApiCategoryCategory') // 'Category'
|
|
25
|
+
* extractCleanName('PluginUsersPermissionsUser') // 'User'
|
|
26
|
+
* extractCleanName('PluginUsersPermissionsRole') // 'Role'
|
|
27
|
+
*/
|
|
28
|
+
export function extractCleanName(apiName) {
|
|
29
|
+
// Handle Plugin types (e.g., PluginUsersPermissionsUser -> User)
|
|
30
|
+
if (apiName.startsWith('Plugin')) {
|
|
31
|
+
const withoutPrefix = apiName.replace(/^PluginUsersPermissions/, '');
|
|
32
|
+
return withoutPrefix || apiName;
|
|
33
|
+
}
|
|
34
|
+
// Handle API types (e.g., ApiItemItem -> Item)
|
|
35
|
+
const withoutApi = apiName.replace(/^Api/, '');
|
|
36
|
+
// Find the repeated name pattern (e.g., ItemItem -> Item)
|
|
37
|
+
for (let i = 1; i <= withoutApi.length / 2; i++) {
|
|
38
|
+
const firstPart = withoutApi.substring(0, i);
|
|
39
|
+
const secondPart = withoutApi.substring(i, i * 2);
|
|
40
|
+
if (firstPart.toLowerCase() === secondPart.toLowerCase()) {
|
|
41
|
+
// Return the properly cased version
|
|
42
|
+
return firstPart.charAt(0).toUpperCase() + firstPart.slice(1);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Fallback: remove common suffixes or return as-is
|
|
46
|
+
return withoutApi;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Convert clean entity name to API endpoint name
|
|
50
|
+
* Follows Strapi's convention of pluralized kebab-case for collections
|
|
51
|
+
* and plain kebab-case for single types
|
|
52
|
+
* @example
|
|
53
|
+
* toEndpointName('Item') // 'items'
|
|
54
|
+
* toEndpointName('SaveGame') // 'save-games'
|
|
55
|
+
* toEndpointName('Category') // 'categories'
|
|
56
|
+
* toEndpointName('Homepage', true) // 'homepage'
|
|
57
|
+
*/
|
|
58
|
+
export function toEndpointName(cleanName, isSingle) {
|
|
59
|
+
const kebab = toKebabCase(cleanName);
|
|
60
|
+
return isSingle ? kebab : pluralize(kebab);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Extract Strapi relation target to TypeScript type name
|
|
64
|
+
* Handles both API and Plugin relation targets
|
|
65
|
+
* @example
|
|
66
|
+
* extractRelationTarget("'api::item.item'") // 'Item'
|
|
67
|
+
* extractRelationTarget("'plugin::users-permissions.user'") // 'User'
|
|
68
|
+
*/
|
|
69
|
+
export function extractRelationTarget(target) {
|
|
70
|
+
// Remove quotes if present
|
|
71
|
+
const cleaned = target.replace(/['"]/g, '');
|
|
72
|
+
// Handle plugin relation (e.g., 'plugin::users-permissions.user')
|
|
73
|
+
if (cleaned.startsWith('plugin::')) {
|
|
74
|
+
const afterPlugin = cleaned.split('::')[1]; // 'users-permissions.user'
|
|
75
|
+
const modelName = afterPlugin.split('.')[1]; // 'user'
|
|
76
|
+
return toPascalCase(modelName);
|
|
77
|
+
}
|
|
78
|
+
// Handle API relation (e.g., 'api::item.item')
|
|
79
|
+
if (cleaned.startsWith('api::')) {
|
|
80
|
+
const afterApi = cleaned.split('::')[1]; // 'item.item'
|
|
81
|
+
const modelName = afterApi.split('.')[1]; // 'item'
|
|
82
|
+
return toPascalCase(modelName);
|
|
83
|
+
}
|
|
84
|
+
// Fallback - try to extract last part
|
|
85
|
+
const parts = cleaned.split('.');
|
|
86
|
+
return toPascalCase(parts[parts.length - 1] || cleaned);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Convert Strapi component category and name to component UID
|
|
90
|
+
* @example
|
|
91
|
+
* toComponentUid('Landing', 'EditorFeature') // 'landing.editor-feature'
|
|
92
|
+
*/
|
|
93
|
+
export function toComponentUid(category, name) {
|
|
94
|
+
return `${toKebabCase(category)}.${toKebabCase(name)}`;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Extract component category from component name
|
|
98
|
+
* @example
|
|
99
|
+
* extractComponentCategory('landing.editor-feature') // 'landing'
|
|
100
|
+
* extractComponentCategory('shared.seo') // 'shared'
|
|
101
|
+
*/
|
|
102
|
+
export function extractComponentCategory(componentUid) {
|
|
103
|
+
const parts = componentUid.split('.');
|
|
104
|
+
return parts[0] || componentUid;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=naming-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming-utils.js","sourceRoot":"","sources":["../../src/shared/naming-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema hashing utilities for Strapi Types Generator
|
|
3
|
+
* Used for detecting schema changes and cache invalidation
|
|
4
|
+
* @module shared/schema-hash
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Compute SHA256 hash of a schema object
|
|
8
|
+
* The schema is normalized (sorted keys) before hashing for deterministic results
|
|
9
|
+
* @param schema Any JSON-serializable schema object
|
|
10
|
+
* @returns Hex-encoded SHA256 hash
|
|
11
|
+
*/
|
|
12
|
+
export declare function computeSchemaHash(schema: unknown): string;
|
|
13
|
+
/**
|
|
14
|
+
* Compare two schema hashes
|
|
15
|
+
* @returns true if schemas are identical
|
|
16
|
+
*/
|
|
17
|
+
export declare function schemasMatch(hash1: string, hash2: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Generate a short hash (first 8 characters) for display purposes
|
|
20
|
+
* @param hash Full SHA256 hash
|
|
21
|
+
* @returns Short hash suitable for display
|
|
22
|
+
*/
|
|
23
|
+
export declare function shortHash(hash: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Create schema metadata object for inclusion in generated code
|
|
26
|
+
*/
|
|
27
|
+
export interface SchemaMetadata {
|
|
28
|
+
hash: string;
|
|
29
|
+
shortHash: string;
|
|
30
|
+
generatedAt: string;
|
|
31
|
+
version: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generate schema metadata from a schema object
|
|
35
|
+
* @param schema The parsed schema
|
|
36
|
+
* @param version Package version
|
|
37
|
+
*/
|
|
38
|
+
export declare function generateSchemaMetadata(schema: unknown, version: string): SchemaMetadata;
|
|
39
|
+
//# sourceMappingURL=schema-hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-hash.d.ts","sourceRoot":"","sources":["../../src/shared/schema-hash.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4BH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAIzD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAElE;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAClB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAClC,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,MAAM,GAChB,cAAc,CAQhB"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema hashing utilities for Strapi Types Generator
|
|
3
|
+
* Used for detecting schema changes and cache invalidation
|
|
4
|
+
* @module shared/schema-hash
|
|
5
|
+
*/
|
|
6
|
+
import * as crypto from 'crypto';
|
|
7
|
+
/**
|
|
8
|
+
* Normalize and sort object keys recursively for deterministic serialization
|
|
9
|
+
*/
|
|
10
|
+
function normalizeObject(obj) {
|
|
11
|
+
if (obj === null || obj === undefined) {
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
if (Array.isArray(obj)) {
|
|
15
|
+
return obj.map(normalizeObject);
|
|
16
|
+
}
|
|
17
|
+
if (typeof obj === 'object') {
|
|
18
|
+
const sorted = {};
|
|
19
|
+
const keys = Object.keys(obj).sort();
|
|
20
|
+
for (const key of keys) {
|
|
21
|
+
sorted[key] = normalizeObject(obj[key]);
|
|
22
|
+
}
|
|
23
|
+
return sorted;
|
|
24
|
+
}
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Compute SHA256 hash of a schema object
|
|
29
|
+
* The schema is normalized (sorted keys) before hashing for deterministic results
|
|
30
|
+
* @param schema Any JSON-serializable schema object
|
|
31
|
+
* @returns Hex-encoded SHA256 hash
|
|
32
|
+
*/
|
|
33
|
+
export function computeSchemaHash(schema) {
|
|
34
|
+
const normalized = normalizeObject(schema);
|
|
35
|
+
const json = JSON.stringify(normalized);
|
|
36
|
+
return crypto.createHash('sha256').update(json).digest('hex');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Compare two schema hashes
|
|
40
|
+
* @returns true if schemas are identical
|
|
41
|
+
*/
|
|
42
|
+
export function schemasMatch(hash1, hash2) {
|
|
43
|
+
return hash1 === hash2;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Generate a short hash (first 8 characters) for display purposes
|
|
47
|
+
* @param hash Full SHA256 hash
|
|
48
|
+
* @returns Short hash suitable for display
|
|
49
|
+
*/
|
|
50
|
+
export function shortHash(hash) {
|
|
51
|
+
return hash.substring(0, 8);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Generate schema metadata from a schema object
|
|
55
|
+
* @param schema The parsed schema
|
|
56
|
+
* @param version Package version
|
|
57
|
+
*/
|
|
58
|
+
export function generateSchemaMetadata(schema, version) {
|
|
59
|
+
const hash = computeSchemaHash(schema);
|
|
60
|
+
return {
|
|
61
|
+
hash,
|
|
62
|
+
shortHash: shortHash(hash),
|
|
63
|
+
generatedAt: new Date().toISOString(),
|
|
64
|
+
version,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=schema-hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-hash.js","sourceRoot":"","sources":["../../src/shared/schema-hash.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAA;AAEhC;;GAEG;AACH,SAAS,eAAe,CAAC,GAAY;IACjC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,GAAG,CAAA;IACd,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IACnC,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,MAAM,GAA4B,EAAE,CAAA;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAA8B,CAAC,CAAC,IAAI,EAAE,CAAA;QAC/D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,eAAe,CAAE,GAA+B,CAAC,GAAG,CAAC,CAAC,CAAA;QACxE,CAAC;QACD,OAAO,MAAM,CAAA;IACjB,CAAC;IAED,OAAO,GAAG,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC7C,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;IACvC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,KAAa;IACrD,OAAO,KAAK,KAAK,KAAK,CAAA;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAC/B,CAAC;AAYD;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAClC,MAAe,EACf,OAAe;IAEf,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;IACtC,OAAO;QACH,IAAI;QACJ,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC;QAC1B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,OAAO;KACV,CAAA;AACL,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Strapi schema types
|
|
3
|
+
*
|
|
4
|
+
* These types describe the raw schema structure as extracted from Strapi runtime.
|
|
5
|
+
* Used by both the plugin (server-side extraction) and the CLI (API consumption).
|
|
6
|
+
*
|
|
7
|
+
* @module shared/strapi-schema-types
|
|
8
|
+
*/
|
|
9
|
+
import type { ParsedEndpoint, ExtraControllerType } from './endpoint-types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Strapi attribute structure from runtime schema
|
|
12
|
+
*/
|
|
13
|
+
export interface StrapiAttribute {
|
|
14
|
+
type: string;
|
|
15
|
+
required?: boolean;
|
|
16
|
+
private?: boolean;
|
|
17
|
+
relation?: string;
|
|
18
|
+
target?: string;
|
|
19
|
+
component?: string;
|
|
20
|
+
repeatable?: boolean;
|
|
21
|
+
components?: string[];
|
|
22
|
+
enum?: string[];
|
|
23
|
+
multiple?: boolean;
|
|
24
|
+
[key: string]: unknown;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Strapi content type structure from runtime schema
|
|
28
|
+
*/
|
|
29
|
+
export interface StrapiContentType {
|
|
30
|
+
uid: string;
|
|
31
|
+
kind: 'collectionType' | 'singleType';
|
|
32
|
+
collectionName: string;
|
|
33
|
+
info: {
|
|
34
|
+
singularName: string;
|
|
35
|
+
pluralName: string;
|
|
36
|
+
displayName: string;
|
|
37
|
+
description?: string;
|
|
38
|
+
};
|
|
39
|
+
attributes: Record<string, StrapiAttribute>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Strapi component structure from runtime schema
|
|
43
|
+
*/
|
|
44
|
+
export interface StrapiComponent {
|
|
45
|
+
uid: string;
|
|
46
|
+
category: string;
|
|
47
|
+
info: {
|
|
48
|
+
displayName: string;
|
|
49
|
+
description?: string;
|
|
50
|
+
};
|
|
51
|
+
attributes: Record<string, StrapiAttribute>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Complete schema extracted from Strapi
|
|
55
|
+
*/
|
|
56
|
+
export interface ExtractedSchema {
|
|
57
|
+
contentTypes: Record<string, StrapiContentType>;
|
|
58
|
+
components: Record<string, StrapiComponent>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Full schema response from the plugin API
|
|
62
|
+
*/
|
|
63
|
+
export interface SchemaResponse {
|
|
64
|
+
schema: ExtractedSchema;
|
|
65
|
+
endpoints: ParsedEndpoint[];
|
|
66
|
+
extraTypes: ExtraControllerType[];
|
|
67
|
+
hash: string;
|
|
68
|
+
generatedAt: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Lightweight hash-only response from the plugin API
|
|
72
|
+
*/
|
|
73
|
+
export interface HashResponse {
|
|
74
|
+
hash: string;
|
|
75
|
+
generatedAt: string;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=strapi-schema-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strapi-schema-types.d.ts","sourceRoot":"","sources":["../../src/shared/strapi-schema-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAE9E;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,gBAAgB,GAAG,YAAY,CAAA;IACrC,cAAc,EAAE,MAAM,CAAA;IACtB,IAAI,EAAE;QACF,YAAY,EAAE,MAAM,CAAA;QACpB,UAAU,EAAE,MAAM,CAAA;QAClB,WAAW,EAAE,MAAM,CAAA;QACnB,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB,CAAA;IACD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE;QACF,WAAW,EAAE,MAAM,CAAA;QACnB,WAAW,CAAC,EAAE,MAAM,CAAA;KACvB,CAAA;IACD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IAC/C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC3B,MAAM,EAAE,eAAe,CAAA;IACvB,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,UAAU,EAAE,mBAAmB,EAAE,CAAA;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACtB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Strapi schema types
|
|
3
|
+
*
|
|
4
|
+
* These types describe the raw schema structure as extracted from Strapi runtime.
|
|
5
|
+
* Used by both the plugin (server-side extraction) and the CLI (API consumption).
|
|
6
|
+
*
|
|
7
|
+
* @module shared/strapi-schema-types
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=strapi-schema-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strapi-schema-types.js","sourceRoot":"","sources":["../../src/shared/strapi-schema-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String manipulation utilities for Strapi Types Generator
|
|
3
|
+
* @module shared/string-utils
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert kebab-case or snake_case to camelCase
|
|
7
|
+
* @example
|
|
8
|
+
* toCamelCase('forgot-password') // 'forgotPassword'
|
|
9
|
+
* toCamelCase('create_item') // 'createItem'
|
|
10
|
+
*/
|
|
11
|
+
export declare function toCamelCase(str: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Convert first character to lowercase (for method names)
|
|
14
|
+
* @example
|
|
15
|
+
* toLowerFirst('CreateCheckout') // 'createCheckout'
|
|
16
|
+
* toLowerFirst('UpdateCode') // 'updateCode'
|
|
17
|
+
*/
|
|
18
|
+
export declare function toLowerFirst(str: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Convert kebab-case or snake_case to PascalCase
|
|
21
|
+
* @example
|
|
22
|
+
* toPascalCase('team-invitation') // 'TeamInvitation'
|
|
23
|
+
* toPascalCase('custom-upload') // 'CustomUpload'
|
|
24
|
+
*/
|
|
25
|
+
export declare function toPascalCase(str: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Convert PascalCase or camelCase to kebab-case
|
|
28
|
+
* @example
|
|
29
|
+
* toKebabCase('TeamInvitation') // 'team-invitation'
|
|
30
|
+
* toKebabCase('customUpload') // 'custom-upload'
|
|
31
|
+
*/
|
|
32
|
+
export declare function toKebabCase(str: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Convert PascalCase or camelCase to snake_case
|
|
35
|
+
* @example
|
|
36
|
+
* toSnakeCase('TeamInvitation') // 'team_invitation'
|
|
37
|
+
* toSnakeCase('customUpload') // 'custom_upload'
|
|
38
|
+
*/
|
|
39
|
+
export declare function toSnakeCase(str: string): string;
|
|
40
|
+
/**
|
|
41
|
+
* Capitalize first letter of a string
|
|
42
|
+
* @example
|
|
43
|
+
* capitalize('hello') // 'Hello'
|
|
44
|
+
*/
|
|
45
|
+
export declare function capitalize(str: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Convert kebab-case or snake_case to PascalCase, preserving known abbreviations
|
|
48
|
+
* @example
|
|
49
|
+
* toPascalCasePreserve('ai-studio') // 'AIStudio'
|
|
50
|
+
* toPascalCasePreserve('team-invitation') // 'TeamInvitation'
|
|
51
|
+
*/
|
|
52
|
+
export declare function toPascalCasePreserve(str: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Extract path parameters from a URL path
|
|
55
|
+
* @example
|
|
56
|
+
* extractPathParams('/items/:id/action') // ['id']
|
|
57
|
+
* extractPathParams('/auth/:provider/callback') // ['provider']
|
|
58
|
+
*/
|
|
59
|
+
export declare function extractPathParams(routePath: string): string[];
|
|
60
|
+
/**
|
|
61
|
+
* Simple English pluralization
|
|
62
|
+
* @example
|
|
63
|
+
* pluralize('item') // 'items'
|
|
64
|
+
* pluralize('category') // 'categories'
|
|
65
|
+
* pluralize('boss') // 'bosses'
|
|
66
|
+
*/
|
|
67
|
+
export declare function pluralize(word: string): string;
|
|
68
|
+
//# sourceMappingURL=string-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-utils.d.ts","sourceRoot":"","sources":["../../src/shared/string-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKhD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAOD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAexD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAU7D;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAc9C"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String manipulation utilities for Strapi Types Generator
|
|
3
|
+
* @module shared/string-utils
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert kebab-case or snake_case to camelCase
|
|
7
|
+
* @example
|
|
8
|
+
* toCamelCase('forgot-password') // 'forgotPassword'
|
|
9
|
+
* toCamelCase('create_item') // 'createItem'
|
|
10
|
+
*/
|
|
11
|
+
export function toCamelCase(str) {
|
|
12
|
+
return str.replace(/[-_]([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Convert first character to lowercase (for method names)
|
|
16
|
+
* @example
|
|
17
|
+
* toLowerFirst('CreateCheckout') // 'createCheckout'
|
|
18
|
+
* toLowerFirst('UpdateCode') // 'updateCode'
|
|
19
|
+
*/
|
|
20
|
+
export function toLowerFirst(str) {
|
|
21
|
+
return str.charAt(0).toLowerCase() + str.slice(1);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Convert kebab-case or snake_case to PascalCase
|
|
25
|
+
* @example
|
|
26
|
+
* toPascalCase('team-invitation') // 'TeamInvitation'
|
|
27
|
+
* toPascalCase('custom-upload') // 'CustomUpload'
|
|
28
|
+
*/
|
|
29
|
+
export function toPascalCase(str) {
|
|
30
|
+
return str
|
|
31
|
+
.split(/[-_]/)
|
|
32
|
+
.map(part => part.charAt(0).toUpperCase() + part.slice(1))
|
|
33
|
+
.join('');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Convert PascalCase or camelCase to kebab-case
|
|
37
|
+
* @example
|
|
38
|
+
* toKebabCase('TeamInvitation') // 'team-invitation'
|
|
39
|
+
* toKebabCase('customUpload') // 'custom-upload'
|
|
40
|
+
*/
|
|
41
|
+
export function toKebabCase(str) {
|
|
42
|
+
return str
|
|
43
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
|
|
44
|
+
.replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')
|
|
45
|
+
.toLowerCase();
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Convert PascalCase or camelCase to snake_case
|
|
49
|
+
* @example
|
|
50
|
+
* toSnakeCase('TeamInvitation') // 'team_invitation'
|
|
51
|
+
* toSnakeCase('customUpload') // 'custom_upload'
|
|
52
|
+
*/
|
|
53
|
+
export function toSnakeCase(str) {
|
|
54
|
+
return str
|
|
55
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1_$2')
|
|
56
|
+
.replace(/([A-Z])([A-Z][a-z])/g, '$1_$2')
|
|
57
|
+
.toLowerCase();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Capitalize first letter of a string
|
|
61
|
+
* @example
|
|
62
|
+
* capitalize('hello') // 'Hello'
|
|
63
|
+
*/
|
|
64
|
+
export function capitalize(str) {
|
|
65
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Known abbreviations to preserve in PascalCase conversion
|
|
69
|
+
*/
|
|
70
|
+
const ABBREVIATIONS = ['AI', 'API', 'UI', 'URL', 'ID', 'HTTP', 'SSE', 'SDK'];
|
|
71
|
+
/**
|
|
72
|
+
* Convert kebab-case or snake_case to PascalCase, preserving known abbreviations
|
|
73
|
+
* @example
|
|
74
|
+
* toPascalCasePreserve('ai-studio') // 'AIStudio'
|
|
75
|
+
* toPascalCasePreserve('team-invitation') // 'TeamInvitation'
|
|
76
|
+
*/
|
|
77
|
+
export function toPascalCasePreserve(str) {
|
|
78
|
+
const result = str
|
|
79
|
+
.split(/[-_]/)
|
|
80
|
+
.map(part => part.charAt(0).toUpperCase() + part.slice(1))
|
|
81
|
+
.join('');
|
|
82
|
+
let fixed = result;
|
|
83
|
+
for (const abbr of ABBREVIATIONS) {
|
|
84
|
+
const pattern = new RegExp(`^${abbr[0]}${abbr.slice(1).toLowerCase()}(?=[A-Z]|$)`);
|
|
85
|
+
fixed = fixed.replace(pattern, abbr);
|
|
86
|
+
}
|
|
87
|
+
return fixed;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Extract path parameters from a URL path
|
|
91
|
+
* @example
|
|
92
|
+
* extractPathParams('/items/:id/action') // ['id']
|
|
93
|
+
* extractPathParams('/auth/:provider/callback') // ['provider']
|
|
94
|
+
*/
|
|
95
|
+
export function extractPathParams(routePath) {
|
|
96
|
+
const params = [];
|
|
97
|
+
const regex = /:([a-zA-Z_][a-zA-Z0-9_]*)/g;
|
|
98
|
+
let match;
|
|
99
|
+
while ((match = regex.exec(routePath)) !== null) {
|
|
100
|
+
params.push(match[1]);
|
|
101
|
+
}
|
|
102
|
+
return params;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Simple English pluralization
|
|
106
|
+
* @example
|
|
107
|
+
* pluralize('item') // 'items'
|
|
108
|
+
* pluralize('category') // 'categories'
|
|
109
|
+
* pluralize('boss') // 'bosses'
|
|
110
|
+
*/
|
|
111
|
+
export function pluralize(word) {
|
|
112
|
+
if (word.endsWith('y') && !/[aeiou]y$/i.test(word)) {
|
|
113
|
+
return word.slice(0, -1) + 'ies';
|
|
114
|
+
}
|
|
115
|
+
if (word.endsWith('s') ||
|
|
116
|
+
word.endsWith('x') ||
|
|
117
|
+
word.endsWith('z') ||
|
|
118
|
+
word.endsWith('ch') ||
|
|
119
|
+
word.endsWith('sh')) {
|
|
120
|
+
return word + 'es';
|
|
121
|
+
}
|
|
122
|
+
return word + 's';
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=string-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-utils.js","sourceRoot":"","sources":["../../src/shared/string-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AttributeType } from '../schema-types.js';
|
|
2
|
+
export declare class TypeTransformer {
|
|
3
|
+
/**
|
|
4
|
+
* Converts Strapi attribute type to TypeScript type string
|
|
5
|
+
*/
|
|
6
|
+
toTypeScript(attrType: AttributeType, required: boolean): string;
|
|
7
|
+
private getBaseType;
|
|
8
|
+
private getRelationType;
|
|
9
|
+
private isAlwaysRequired;
|
|
10
|
+
/**
|
|
11
|
+
* Converts API type to collection endpoint name
|
|
12
|
+
* ApiItemItem -> 'items'
|
|
13
|
+
* ApiCatalogCatalog -> 'catalog' (if single type)
|
|
14
|
+
*/
|
|
15
|
+
toEndpointName(cleanName: string, isSingle: boolean): string;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transformer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGlD,qBAAa,eAAe;IACxB;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;IAUhE,OAAO,CAAC,WAAW;IAwDnB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,gBAAgB;IAQxB;;;;OAIG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM;CAG/D"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { convertComponentName, toEndpointName } from '../shared/index.js';
|
|
2
|
+
export class TypeTransformer {
|
|
3
|
+
/**
|
|
4
|
+
* Converts Strapi attribute type to TypeScript type string
|
|
5
|
+
*/
|
|
6
|
+
toTypeScript(attrType, required) {
|
|
7
|
+
let tsType = this.getBaseType(attrType);
|
|
8
|
+
if (!required && !this.isAlwaysRequired(attrType)) {
|
|
9
|
+
tsType += ' | null';
|
|
10
|
+
}
|
|
11
|
+
return tsType;
|
|
12
|
+
}
|
|
13
|
+
getBaseType(attrType) {
|
|
14
|
+
switch (attrType.kind) {
|
|
15
|
+
case 'string':
|
|
16
|
+
case 'text':
|
|
17
|
+
case 'richtext':
|
|
18
|
+
case 'email':
|
|
19
|
+
return 'string';
|
|
20
|
+
case 'blocks':
|
|
21
|
+
return 'BlocksContent';
|
|
22
|
+
case 'integer':
|
|
23
|
+
case 'biginteger':
|
|
24
|
+
case 'float':
|
|
25
|
+
case 'decimal':
|
|
26
|
+
return 'number';
|
|
27
|
+
case 'boolean':
|
|
28
|
+
return 'boolean';
|
|
29
|
+
case 'date':
|
|
30
|
+
case 'datetime':
|
|
31
|
+
case 'time':
|
|
32
|
+
return 'string';
|
|
33
|
+
case 'json':
|
|
34
|
+
return 'unknown';
|
|
35
|
+
case 'enumeration':
|
|
36
|
+
return attrType.values.map(v => `'${v}'`).join(' | ');
|
|
37
|
+
case 'media':
|
|
38
|
+
return attrType.multiple ? 'MediaFile[]' : 'MediaFile';
|
|
39
|
+
case 'component': {
|
|
40
|
+
const componentType = convertComponentName(attrType.component);
|
|
41
|
+
return attrType.repeatable
|
|
42
|
+
? `${componentType}[]`
|
|
43
|
+
: componentType;
|
|
44
|
+
}
|
|
45
|
+
case 'dynamiczone': {
|
|
46
|
+
const components = attrType.components.map(c => convertComponentName(c));
|
|
47
|
+
return `(${components.join(' | ')})[]`;
|
|
48
|
+
}
|
|
49
|
+
case 'relation':
|
|
50
|
+
return this.getRelationType(attrType.relationType);
|
|
51
|
+
default:
|
|
52
|
+
return 'any';
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
getRelationType(relationType) {
|
|
56
|
+
switch (relationType) {
|
|
57
|
+
case 'oneToOne':
|
|
58
|
+
case 'manyToOne':
|
|
59
|
+
return '{ id: number; documentId: string } | null';
|
|
60
|
+
case 'oneToMany':
|
|
61
|
+
case 'manyToMany':
|
|
62
|
+
return '{ id: number; documentId: string }[]';
|
|
63
|
+
default:
|
|
64
|
+
return 'any';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
isAlwaysRequired(attrType) {
|
|
68
|
+
// Relations already have null in their type definition
|
|
69
|
+
if (attrType.kind === 'relation') {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Converts API type to collection endpoint name
|
|
76
|
+
* ApiItemItem -> 'items'
|
|
77
|
+
* ApiCatalogCatalog -> 'catalog' (if single type)
|
|
78
|
+
*/
|
|
79
|
+
toEndpointName(cleanName, isSingle) {
|
|
80
|
+
return toEndpointName(cleanName, isSingle);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transformer/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEzE,MAAM,OAAO,eAAe;IACxB;;OAEG;IACH,YAAY,CAAC,QAAuB,EAAE,QAAiB;QACnD,IAAI,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QAEvC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,SAAS,CAAA;QACvB,CAAC;QAED,OAAO,MAAM,CAAA;IACjB,CAAC;IAEO,WAAW,CAAC,QAAuB;QACvC,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,QAAQ,CAAC;YACd,KAAK,MAAM,CAAC;YACZ,KAAK,UAAU,CAAC;YAChB,KAAK,OAAO;gBACR,OAAO,QAAQ,CAAA;YAEnB,KAAK,QAAQ;gBACT,OAAO,eAAe,CAAA;YAE1B,KAAK,SAAS,CAAC;YACf,KAAK,YAAY,CAAC;YAClB,KAAK,OAAO,CAAC;YACb,KAAK,SAAS;gBACV,OAAO,QAAQ,CAAA;YAEnB,KAAK,SAAS;gBACV,OAAO,SAAS,CAAA;YAEpB,KAAK,MAAM,CAAC;YACZ,KAAK,UAAU,CAAC;YAChB,KAAK,MAAM;gBACP,OAAO,QAAQ,CAAA;YAEnB,KAAK,MAAM;gBACP,OAAO,SAAS,CAAA;YAEpB,KAAK,aAAa;gBACd,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAEzD,KAAK,OAAO;gBACR,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAA;YAE1D,KAAK,WAAW,CAAC,CAAC,CAAC;gBACf,MAAM,aAAa,GAAG,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;gBAC9D,OAAO,QAAQ,CAAC,UAAU;oBACtB,CAAC,CAAC,GAAG,aAAa,IAAI;oBACtB,CAAC,CAAC,aAAa,CAAA;YACvB,CAAC;YAED,KAAK,aAAa,CAAC,CAAC,CAAC;gBACjB,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC3C,oBAAoB,CAAC,CAAC,CAAC,CAC1B,CAAA;gBACD,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAA;YAC1C,CAAC;YAED,KAAK,UAAU;gBACX,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;YAEtD;gBACI,OAAO,KAAK,CAAA;QACpB,CAAC;IACL,CAAC;IAEO,eAAe,CAAC,YAAoB;QACxC,QAAQ,YAAY,EAAE,CAAC;YACnB,KAAK,UAAU,CAAC;YAChB,KAAK,WAAW;gBACZ,OAAO,2CAA2C,CAAA;YAEtD,KAAK,WAAW,CAAC;YACjB,KAAK,YAAY;gBACb,OAAO,sCAAsC,CAAA;YAEjD;gBACI,OAAO,KAAK,CAAA;QACpB,CAAC;IACL,CAAC;IAEO,gBAAgB,CAAC,QAAuB;QAC5C,uDAAuD;QACvD,IAAI,QAAQ,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAA;QACf,CAAC;QACD,OAAO,KAAK,CAAA;IAChB,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,SAAiB,EAAE,QAAiB;QAC/C,OAAO,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAC9C,CAAC;CACJ"}
|