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.
Files changed (176) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/dist/cli/commands/check.d.ts +27 -0
  4. package/dist/cli/commands/check.d.ts.map +1 -0
  5. package/dist/cli/commands/check.js +91 -0
  6. package/dist/cli/commands/check.js.map +1 -0
  7. package/dist/cli/commands/generate.d.ts +28 -0
  8. package/dist/cli/commands/generate.d.ts.map +1 -0
  9. package/dist/cli/commands/generate.js +129 -0
  10. package/dist/cli/commands/generate.js.map +1 -0
  11. package/dist/cli/commands/watch.d.ts +21 -0
  12. package/dist/cli/commands/watch.d.ts.map +1 -0
  13. package/dist/cli/commands/watch.js +113 -0
  14. package/dist/cli/commands/watch.js.map +1 -0
  15. package/dist/cli/index.d.ts +14 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +40 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/cli/utils/api-client.d.ts +41 -0
  20. package/dist/cli/utils/api-client.d.ts.map +1 -0
  21. package/dist/cli/utils/api-client.js +81 -0
  22. package/dist/cli/utils/api-client.js.map +1 -0
  23. package/dist/cli/utils/file-writer.d.ts +44 -0
  24. package/dist/cli/utils/file-writer.d.ts.map +1 -0
  25. package/dist/cli/utils/file-writer.js +89 -0
  26. package/dist/cli/utils/file-writer.js.map +1 -0
  27. package/dist/cli.d.ts +3 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +37 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/client.d.ts +622 -0
  32. package/dist/client.js +688 -0
  33. package/dist/core/endpoint-converter.d.ts +26 -0
  34. package/dist/core/endpoint-converter.d.ts.map +1 -0
  35. package/dist/core/endpoint-converter.js +161 -0
  36. package/dist/core/endpoint-converter.js.map +1 -0
  37. package/dist/core/generator/filters-generator.d.ts +22 -0
  38. package/dist/core/generator/filters-generator.d.ts.map +1 -0
  39. package/dist/core/generator/filters-generator.js +236 -0
  40. package/dist/core/generator/filters-generator.js.map +1 -0
  41. package/dist/core/index.d.ts +8 -0
  42. package/dist/core/index.d.ts.map +1 -0
  43. package/dist/core/index.js +11 -0
  44. package/dist/core/index.js.map +1 -0
  45. package/dist/core/schema-transformer.d.ts +19 -0
  46. package/dist/core/schema-transformer.d.ts.map +1 -0
  47. package/dist/core/schema-transformer.js +306 -0
  48. package/dist/core/schema-transformer.js.map +1 -0
  49. package/dist/generator/auth-api-generator.d.ts +14 -0
  50. package/dist/generator/auth-api-generator.d.ts.map +1 -0
  51. package/dist/generator/auth-api-generator.js +518 -0
  52. package/dist/generator/auth-api-generator.js.map +1 -0
  53. package/dist/generator/blocks-types-template.d.ts +134 -0
  54. package/dist/generator/blocks-types-template.d.ts.map +1 -0
  55. package/dist/generator/blocks-types-template.js +4 -0
  56. package/dist/generator/blocks-types-template.js.map +1 -0
  57. package/dist/generator/client-generator.d.ts +19 -0
  58. package/dist/generator/client-generator.d.ts.map +1 -0
  59. package/dist/generator/client-generator.js +707 -0
  60. package/dist/generator/client-generator.js.map +1 -0
  61. package/dist/generator/custom-api-generator.d.ts +26 -0
  62. package/dist/generator/custom-api-generator.d.ts.map +1 -0
  63. package/dist/generator/custom-api-generator.js +145 -0
  64. package/dist/generator/custom-api-generator.js.map +1 -0
  65. package/dist/generator/index-generator.d.ts +4 -0
  66. package/dist/generator/index-generator.d.ts.map +1 -0
  67. package/dist/generator/index-generator.js +11 -0
  68. package/dist/generator/index-generator.js.map +1 -0
  69. package/dist/generator/index.d.ts +14 -0
  70. package/dist/generator/index.d.ts.map +1 -0
  71. package/dist/generator/index.js +94 -0
  72. package/dist/generator/index.js.map +1 -0
  73. package/dist/generator/types-generator.d.ts +35 -0
  74. package/dist/generator/types-generator.d.ts.map +1 -0
  75. package/dist/generator/types-generator.js +641 -0
  76. package/dist/generator/types-generator.js.map +1 -0
  77. package/dist/index.d.ts +2 -0
  78. package/dist/index.js +4 -0
  79. package/dist/next/index.d.ts +16 -0
  80. package/dist/next/index.d.ts.map +1 -0
  81. package/dist/next/index.js +224 -0
  82. package/dist/next/index.js.map +1 -0
  83. package/dist/parser/custom-types-parser.d.ts +39 -0
  84. package/dist/parser/custom-types-parser.d.ts.map +1 -0
  85. package/dist/parser/custom-types-parser.js +206 -0
  86. package/dist/parser/custom-types-parser.js.map +1 -0
  87. package/dist/parser/index.d.ts +23 -0
  88. package/dist/parser/index.d.ts.map +1 -0
  89. package/dist/parser/index.js +457 -0
  90. package/dist/parser/index.js.map +1 -0
  91. package/dist/parser/routes-parser.d.ts +21 -0
  92. package/dist/parser/routes-parser.d.ts.map +1 -0
  93. package/dist/parser/routes-parser.js +184 -0
  94. package/dist/parser/routes-parser.js.map +1 -0
  95. package/dist/plugin/admin/src/index.d.ts +16 -0
  96. package/dist/plugin/admin/src/index.d.ts.map +1 -0
  97. package/dist/plugin/admin/src/index.js +30 -0
  98. package/dist/plugin/admin/src/index.js.map +1 -0
  99. package/dist/plugin/admin/src/pages/HomePage.d.ts +2 -0
  100. package/dist/plugin/admin/src/pages/HomePage.d.ts.map +1 -0
  101. package/dist/plugin/admin/src/pages/HomePage.js +273 -0
  102. package/dist/plugin/admin/src/pages/HomePage.js.map +1 -0
  103. package/dist/plugin/admin/src/pluginId.d.ts +2 -0
  104. package/dist/plugin/admin/src/pluginId.d.ts.map +1 -0
  105. package/dist/plugin/admin/src/pluginId.js +2 -0
  106. package/dist/plugin/admin/src/pluginId.js.map +1 -0
  107. package/dist/plugin/index.d.ts +22 -0
  108. package/dist/plugin/index.d.ts.map +1 -0
  109. package/dist/plugin/index.js +22 -0
  110. package/dist/plugin/index.js.map +1 -0
  111. package/dist/plugin/server/src/config/index.d.ts +31 -0
  112. package/dist/plugin/server/src/config/index.d.ts.map +1 -0
  113. package/dist/plugin/server/src/config/index.js +35 -0
  114. package/dist/plugin/server/src/config/index.js.map +1 -0
  115. package/dist/plugin/server/src/controllers/schema.d.ts +41 -0
  116. package/dist/plugin/server/src/controllers/schema.d.ts.map +1 -0
  117. package/dist/plugin/server/src/controllers/schema.js +51 -0
  118. package/dist/plugin/server/src/controllers/schema.js.map +1 -0
  119. package/dist/plugin/server/src/index.d.ts +114 -0
  120. package/dist/plugin/server/src/index.d.ts.map +1 -0
  121. package/dist/plugin/server/src/index.js +76 -0
  122. package/dist/plugin/server/src/index.js.map +1 -0
  123. package/dist/plugin/server/src/routes/index.d.ts +14 -0
  124. package/dist/plugin/server/src/routes/index.d.ts.map +1 -0
  125. package/dist/plugin/server/src/routes/index.js +23 -0
  126. package/dist/plugin/server/src/routes/index.js.map +1 -0
  127. package/dist/plugin/server/src/services/endpoints.d.ts +36 -0
  128. package/dist/plugin/server/src/services/endpoints.d.ts.map +1 -0
  129. package/dist/plugin/server/src/services/endpoints.js +523 -0
  130. package/dist/plugin/server/src/services/endpoints.js.map +1 -0
  131. package/dist/plugin/server/src/services/schema.d.ts +25 -0
  132. package/dist/plugin/server/src/services/schema.d.ts.map +1 -0
  133. package/dist/plugin/server/src/services/schema.js +164 -0
  134. package/dist/plugin/server/src/services/schema.js.map +1 -0
  135. package/dist/schema-meta.ts +7 -0
  136. package/dist/schema-types.d.ts +104 -0
  137. package/dist/schema-types.d.ts.map +1 -0
  138. package/dist/schema-types.js +3 -0
  139. package/dist/schema-types.js.map +1 -0
  140. package/dist/shared/constants.d.ts +99 -0
  141. package/dist/shared/constants.d.ts.map +1 -0
  142. package/dist/shared/constants.js +89 -0
  143. package/dist/shared/constants.js.map +1 -0
  144. package/dist/shared/endpoint-types.d.ts +42 -0
  145. package/dist/shared/endpoint-types.d.ts.map +1 -0
  146. package/dist/shared/endpoint-types.js +6 -0
  147. package/dist/shared/endpoint-types.js.map +1 -0
  148. package/dist/shared/index.d.ts +12 -0
  149. package/dist/shared/index.d.ts.map +1 -0
  150. package/dist/shared/index.js +13 -0
  151. package/dist/shared/index.js.map +1 -0
  152. package/dist/shared/naming-utils.d.ts +55 -0
  153. package/dist/shared/naming-utils.d.ts.map +1 -0
  154. package/dist/shared/naming-utils.js +106 -0
  155. package/dist/shared/naming-utils.js.map +1 -0
  156. package/dist/shared/schema-hash.d.ts +39 -0
  157. package/dist/shared/schema-hash.d.ts.map +1 -0
  158. package/dist/shared/schema-hash.js +67 -0
  159. package/dist/shared/schema-hash.js.map +1 -0
  160. package/dist/shared/strapi-schema-types.d.ts +77 -0
  161. package/dist/shared/strapi-schema-types.d.ts.map +1 -0
  162. package/dist/shared/strapi-schema-types.js +10 -0
  163. package/dist/shared/strapi-schema-types.js.map +1 -0
  164. package/dist/shared/string-utils.d.ts +68 -0
  165. package/dist/shared/string-utils.d.ts.map +1 -0
  166. package/dist/shared/string-utils.js +124 -0
  167. package/dist/shared/string-utils.js.map +1 -0
  168. package/dist/transformer/index.d.ts +17 -0
  169. package/dist/transformer/index.d.ts.map +1 -0
  170. package/dist/transformer/index.js +83 -0
  171. package/dist/transformer/index.js.map +1 -0
  172. package/dist/types.d.ts +3430 -0
  173. package/dist/types.js +3 -0
  174. package/package.json +152 -0
  175. package/strapi-admin.js +2 -0
  176. 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"}