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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 BoxLab Ltd
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # strapi-typed-client
2
+
3
+ Automatic TypeScript type generation and a fully typed API client for **Strapi v5**. Install a Strapi plugin, run a single CLI command, and get clean TypeScript interfaces plus a ready-to-use fetch client with full autocomplete.
4
+
5
+ **[Documentation](https://boxlab-ltd.github.io/strapi-typed-client/)**
6
+
7
+ ## Quick Start
8
+
9
+ ### 1. Install
10
+
11
+ ```bash
12
+ npm install strapi-typed-client
13
+ ```
14
+
15
+ ### 2. Enable the Strapi plugin
16
+
17
+ ```typescript
18
+ // config/plugins.ts
19
+ export default {
20
+ 'strapi-typed-client': {
21
+ enabled: true,
22
+ },
23
+ }
24
+ ```
25
+
26
+ ### 3. Generate types
27
+
28
+ ```bash
29
+ npx strapi-types generate --url http://localhost:1337
30
+ ```
31
+
32
+ ### 4. Use
33
+
34
+ ```typescript
35
+ import { StrapiClient } from './dist'
36
+
37
+ const strapi = new StrapiClient({
38
+ baseURL: 'http://localhost:1337',
39
+ })
40
+
41
+ const articles = await strapi.articles.find({
42
+ filters: { title: { $contains: 'hello' } },
43
+ populate: { category: true, cover: true },
44
+ })
45
+
46
+ articles[0].category.name // fully typed
47
+ ```
48
+
49
+ ## Features
50
+
51
+ - Clean, flat TypeScript interfaces from your Strapi schema
52
+ - Typed API client — `find`, `findOne`, `create`, `update`, `delete`
53
+ - Automatic type inference for `populate` — no manual casting
54
+ - Nested populate with unlimited depth
55
+ - Separate Input types for create/update (relations as IDs)
56
+ - DynamicZone support with union types
57
+ - Components and nested components
58
+ - Entity-specific filter types
59
+ - Next.js integration (`withStrapiTypes`, cache, revalidate, tags)
60
+ - Schema hashing — skips regeneration when nothing changed
61
+ - Framework-agnostic — works with any TypeScript project
62
+
63
+ ## Requirements
64
+
65
+ - **Strapi v5**
66
+ - **Node.js >= 18**
67
+
68
+ ## Documentation
69
+
70
+ Full documentation is available at **[boxlab-ltd.github.io/strapi-typed-client](https://boxlab-ltd.github.io/strapi-typed-client/)**:
71
+
72
+ - [Getting Started](https://boxlab-ltd.github.io/strapi-typed-client/guide/getting-started) — installation, plugin setup, first generation
73
+ - [CLI Commands](https://boxlab-ltd.github.io/strapi-typed-client/guide/cli) — generate, check, watch
74
+ - [Client Usage](https://boxlab-ltd.github.io/strapi-typed-client/guide/client) — CRUD operations, error handling
75
+ - [Populate](https://boxlab-ltd.github.io/strapi-typed-client/guide/populate) — type inference, nested populate
76
+ - [Filtering & Sorting](https://boxlab-ltd.github.io/strapi-typed-client/guide/filtering) — filters, pagination, field selection
77
+ - [Next.js Integration](https://boxlab-ltd.github.io/strapi-typed-client/guide/nextjs) — auto-generation, cache options
78
+ - [Plugin Config](https://boxlab-ltd.github.io/strapi-typed-client/advanced/plugin-config) — requireAuth, endpoints, schema hashing
79
+ - [API Reference](https://boxlab-ltd.github.io/strapi-typed-client/reference/api) — full StrapiClient API
80
+
81
+ ## License
82
+
83
+ MIT
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Check command - verifies that local types are in sync with remote schema
3
+ * Returns exit code 0 if in sync, 1 if out of sync
4
+ */
5
+ export interface CheckOptions {
6
+ url?: string;
7
+ token?: string;
8
+ output?: string;
9
+ silent?: boolean;
10
+ }
11
+ export interface CheckResult {
12
+ inSync: boolean;
13
+ localHash: string | null;
14
+ remoteHash: string | null;
15
+ error?: string;
16
+ }
17
+ /**
18
+ * Check if local types are in sync with remote schema
19
+ */
20
+ export declare function check(options: CheckOptions): Promise<CheckResult>;
21
+ /**
22
+ * CLI handler for check command
23
+ */
24
+ export declare function createCheckCommand(program: {
25
+ command: (...args: any[]) => any;
26
+ }): void;
27
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,YAAY;IACzB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA2DvE;AASD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IACxC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;CACnC,GAAG,IAAI,CA2CP"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Check command - verifies that local types are in sync with remote schema
3
+ * Returns exit code 0 if in sync, 1 if out of sync
4
+ */
5
+ import { createApiClient } from '../utils/api-client.js';
6
+ import { readLocalSchemaHash } from '../utils/file-writer.js';
7
+ /**
8
+ * Check if local types are in sync with remote schema
9
+ */
10
+ export async function check(options) {
11
+ const outputDir = options.output || './dist';
12
+ try {
13
+ // Read local hash
14
+ const localHash = readLocalSchemaHash(outputDir);
15
+ if (!localHash) {
16
+ return {
17
+ inSync: false,
18
+ localHash: null,
19
+ remoteHash: null,
20
+ error: `No schema-meta.ts found in ${outputDir}. Run 'strapi-types generate' first.`,
21
+ };
22
+ }
23
+ // Create API client
24
+ const client = createApiClient({
25
+ url: options.url,
26
+ token: options.token,
27
+ });
28
+ // Fetch remote hash
29
+ if (!options.silent) {
30
+ console.log(`Checking schema hash from ${options.url || process.env.STRAPI_URL || 'http://localhost:1337'}...`);
31
+ }
32
+ const { hash: remoteHash } = await client.getSchemaHash();
33
+ // Compare hashes
34
+ const inSync = localHash === remoteHash;
35
+ if (!options.silent) {
36
+ if (inSync) {
37
+ console.log(`Types are in sync (hash: ${localHash.substring(0, 8)}...)`);
38
+ }
39
+ else {
40
+ console.log(`Types are out of sync!`);
41
+ console.log(` Local: ${localHash.substring(0, 8)}...`);
42
+ console.log(` Remote: ${remoteHash.substring(0, 8)}...`);
43
+ }
44
+ }
45
+ return {
46
+ inSync,
47
+ localHash,
48
+ remoteHash,
49
+ };
50
+ }
51
+ catch (error) {
52
+ return {
53
+ inSync: false,
54
+ localHash: null,
55
+ remoteHash: null,
56
+ error: error.message,
57
+ };
58
+ }
59
+ }
60
+ /**
61
+ * CLI handler for check command
62
+ */
63
+ export function createCheckCommand(program) {
64
+ program
65
+ .command('check')
66
+ .description('Check if local types are in sync with remote Strapi schema')
67
+ .option('-u, --url <url>', 'Strapi API URL (default: STRAPI_URL env or http://localhost:1337)')
68
+ .option('-t, --token <token>', 'Strapi API token (default: STRAPI_TOKEN env)')
69
+ .option('-o, --output <path>', 'Output directory to check (default: ./dist)')
70
+ .option('-s, --silent', 'Suppress output messages')
71
+ .action(async (opts) => {
72
+ const result = await check({
73
+ url: opts.url,
74
+ token: opts.token,
75
+ output: opts.output,
76
+ silent: opts.silent,
77
+ });
78
+ if (result.error) {
79
+ console.error('Check failed:', result.error);
80
+ process.exit(1);
81
+ }
82
+ if (!result.inSync) {
83
+ if (!opts.silent) {
84
+ console.log("\nRun 'strapi-types generate' to update types.");
85
+ }
86
+ process.exit(1);
87
+ }
88
+ process.exit(0);
89
+ });
90
+ }
91
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Generate command - generates TypeScript types from Strapi schema
3
+ */
4
+ export interface GenerateOptions {
5
+ url?: string;
6
+ token?: string;
7
+ output?: string;
8
+ silent?: boolean;
9
+ force?: boolean;
10
+ }
11
+ export interface GenerateResult {
12
+ success: boolean;
13
+ filesWritten: string[];
14
+ hash?: string;
15
+ error?: string;
16
+ skipped?: boolean;
17
+ }
18
+ /**
19
+ * Generate types from Strapi API
20
+ */
21
+ export declare function generate(options: GenerateOptions): Promise<GenerateResult>;
22
+ /**
23
+ * CLI handler for generate command
24
+ */
25
+ export declare function createGenerateCommand(program: {
26
+ command: (...args: any[]) => any;
27
+ }): void;
28
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,MAAM,WAAW,eAAe;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC1B,OAAO,EAAE,eAAe,GACzB,OAAO,CAAC,cAAc,CAAC,CAoHzB;AAUD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC3C,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;CACnC,GAAG,IAAI,CAsCP"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Generate command - generates TypeScript types from Strapi schema
3
+ */
4
+ import * as path from 'path';
5
+ import { createApiClient } from '../utils/api-client.js';
6
+ import { writeFile, getSchemaMetaPath, generateSchemaMetaContent, readLocalSchemaHash, } from '../utils/file-writer.js';
7
+ import { Generator } from '../../generator/index.js';
8
+ import { transformSchema } from '../../core/schema-transformer.js';
9
+ /**
10
+ * Generate types from Strapi API
11
+ */
12
+ export async function generate(options) {
13
+ const outputDir = options.output || './dist';
14
+ const filesWritten = [];
15
+ try {
16
+ // Create API client
17
+ const client = createApiClient({
18
+ url: options.url,
19
+ token: options.token,
20
+ });
21
+ const baseUrl = options.url || process.env.STRAPI_URL || 'http://localhost:1337';
22
+ // Check if we need to regenerate (compare hashes)
23
+ if (!options.force) {
24
+ const localHash = readLocalSchemaHash(outputDir);
25
+ if (localHash) {
26
+ if (!options.silent) {
27
+ console.log('Checking schema hash...');
28
+ }
29
+ try {
30
+ const { hash: remoteHash } = await client.getSchemaHash();
31
+ if (localHash === remoteHash) {
32
+ if (!options.silent) {
33
+ console.log(`Types are up to date (hash: ${localHash.substring(0, 8)}...)`);
34
+ }
35
+ return {
36
+ success: true,
37
+ filesWritten: [],
38
+ hash: localHash,
39
+ skipped: true,
40
+ };
41
+ }
42
+ if (!options.silent) {
43
+ console.log(`Schema changed (${localHash.substring(0, 8)}... -> ${remoteHash.substring(0, 8)}...)`);
44
+ }
45
+ }
46
+ catch {
47
+ // If hash check fails, continue with full generation
48
+ if (!options.silent) {
49
+ console.log('Could not check remote hash, regenerating...');
50
+ }
51
+ }
52
+ }
53
+ }
54
+ // Fetch schema from Strapi
55
+ if (!options.silent) {
56
+ console.log(`Fetching schema from ${baseUrl}...`);
57
+ }
58
+ const { schema, endpoints, extraTypes, hash, generatedAt } = await client.getSchema();
59
+ if (!options.silent) {
60
+ console.log(` Content types: ${Object.keys(schema.contentTypes).length}`);
61
+ console.log(` Components: ${Object.keys(schema.components).length}`);
62
+ if (endpoints && endpoints.length > 0) {
63
+ console.log(` Custom endpoints: ${endpoints.length}`);
64
+ }
65
+ if (extraTypes && extraTypes.length > 0) {
66
+ console.log(` Extra types: ${extraTypes.length}`);
67
+ }
68
+ }
69
+ // Transform JSON schema to ParsedSchema format
70
+ const parsedSchema = transformSchema(schema);
71
+ // Generate types
72
+ if (!options.silent) {
73
+ console.log('Generating TypeScript types...');
74
+ }
75
+ const generator = new Generator(outputDir, undefined);
76
+ await generator.generate(parsedSchema, endpoints, extraTypes);
77
+ // Track generated files
78
+ filesWritten.push(path.join(outputDir, 'types.js'), path.join(outputDir, 'types.d.ts'), path.join(outputDir, 'client.js'), path.join(outputDir, 'client.d.ts'), path.join(outputDir, 'index.js'), path.join(outputDir, 'index.d.ts'));
79
+ // Write schema metadata
80
+ const metaPath = getSchemaMetaPath(outputDir);
81
+ writeFile(metaPath, generateSchemaMetaContent(hash, generatedAt));
82
+ filesWritten.push(metaPath);
83
+ return {
84
+ success: true,
85
+ filesWritten,
86
+ hash,
87
+ };
88
+ }
89
+ catch (error) {
90
+ return {
91
+ success: false,
92
+ filesWritten,
93
+ error: error.message,
94
+ };
95
+ }
96
+ }
97
+ /**
98
+ * CLI handler for generate command
99
+ */
100
+ export function createGenerateCommand(program) {
101
+ program
102
+ .command('generate')
103
+ .description('Generate TypeScript types from Strapi schema')
104
+ .option('-u, --url <url>', 'Strapi API URL (default: STRAPI_URL env or http://localhost:1337)')
105
+ .option('-t, --token <token>', 'Strapi API token (default: STRAPI_TOKEN env)')
106
+ .option('-o, --output <path>', 'Output directory (default: ./dist)')
107
+ .option('-s, --silent', 'Suppress output messages')
108
+ .option('-f, --force', 'Force regeneration even if schema unchanged')
109
+ .action(async (opts) => {
110
+ const result = await generate({
111
+ url: opts.url,
112
+ token: opts.token,
113
+ output: opts.output,
114
+ silent: opts.silent,
115
+ force: opts.force,
116
+ });
117
+ if (!result.success) {
118
+ console.error('Generation failed:', result.error);
119
+ process.exit(1);
120
+ }
121
+ if (!opts.silent && !result.skipped) {
122
+ console.log('Generation complete!');
123
+ if (result.hash) {
124
+ console.log(`Schema hash: ${result.hash.substring(0, 8)}...`);
125
+ }
126
+ }
127
+ });
128
+ }
129
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Watch command - polls for schema changes and regenerates types
3
+ */
4
+ export interface WatchOptions {
5
+ url?: string;
6
+ token?: string;
7
+ output?: string;
8
+ interval?: number;
9
+ silent?: boolean;
10
+ }
11
+ /**
12
+ * Watch for schema changes
13
+ */
14
+ export declare function watch(options: WatchOptions): Promise<void>;
15
+ /**
16
+ * CLI handler for watch command
17
+ */
18
+ export declare function createWatchCommand(program: {
19
+ command: (...args: any[]) => any;
20
+ }): void;
21
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,YAAY;IACzB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAmGhE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IACxC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;CACnC,GAAG,IAAI,CAiCP"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Watch command - polls for schema changes and regenerates types
3
+ */
4
+ import { createApiClient } from '../utils/api-client.js';
5
+ import { readLocalSchemaHash } from '../utils/file-writer.js';
6
+ import { generate } from './generate.js';
7
+ /**
8
+ * Watch for schema changes
9
+ */
10
+ export async function watch(options) {
11
+ const outputDir = options.output || './dist';
12
+ const interval = options.interval || 5000;
13
+ const client = createApiClient({
14
+ url: options.url,
15
+ token: options.token,
16
+ });
17
+ // Check if Strapi is reachable
18
+ const isReachable = await client.ping();
19
+ if (!isReachable) {
20
+ console.error(`Cannot connect to Strapi at ${options.url || process.env.STRAPI_URL || 'http://localhost:1337'}`);
21
+ console.error('Make sure the Strapi server is running and the strapi-types plugin is enabled.');
22
+ process.exit(1);
23
+ }
24
+ console.log(`Watching for schema changes (polling every ${interval / 1000}s)...`);
25
+ console.log('Press Ctrl+C to stop.\n');
26
+ // Initial generation
27
+ const initialHash = readLocalSchemaHash(outputDir);
28
+ if (!initialHash) {
29
+ console.log('No existing types found. Generating initial types...');
30
+ await generate({
31
+ url: options.url,
32
+ token: options.token,
33
+ output: outputDir,
34
+ silent: options.silent,
35
+ });
36
+ }
37
+ let lastHash = readLocalSchemaHash(outputDir);
38
+ // Start polling
39
+ const poll = async () => {
40
+ try {
41
+ const { hash: remoteHash } = await client.getSchemaHash();
42
+ if (lastHash !== remoteHash) {
43
+ console.log(`Schema change detected (${lastHash?.substring(0, 8) || 'none'} -> ${remoteHash.substring(0, 8)}...)`);
44
+ console.log('Regenerating types...');
45
+ const result = await generate({
46
+ url: options.url,
47
+ token: options.token,
48
+ output: outputDir,
49
+ silent: true,
50
+ });
51
+ if (result.success) {
52
+ console.log('Types regenerated successfully.\n');
53
+ lastHash = remoteHash;
54
+ }
55
+ else {
56
+ console.error('Failed to regenerate types:', result.error);
57
+ }
58
+ }
59
+ }
60
+ catch {
61
+ // Silently ignore connection errors during polling
62
+ // The server might be restarting
63
+ }
64
+ };
65
+ // Poll with recursive setTimeout to avoid overlapping calls
66
+ let timeoutId = null;
67
+ let stopping = false;
68
+ const schedulePoll = () => {
69
+ if (stopping)
70
+ return;
71
+ timeoutId = setTimeout(async () => {
72
+ await poll();
73
+ schedulePoll();
74
+ }, interval);
75
+ };
76
+ await poll();
77
+ schedulePoll();
78
+ // Handle graceful shutdown
79
+ const stop = () => {
80
+ stopping = true;
81
+ if (timeoutId)
82
+ clearTimeout(timeoutId);
83
+ process.exit(0);
84
+ };
85
+ process.on('SIGINT', () => {
86
+ console.log('\nStopping watch...');
87
+ stop();
88
+ });
89
+ process.on('SIGTERM', stop);
90
+ }
91
+ /**
92
+ * CLI handler for watch command
93
+ */
94
+ export function createWatchCommand(program) {
95
+ program
96
+ .command('watch')
97
+ .description('Watch for schema changes and regenerate types automatically')
98
+ .option('-u, --url <url>', 'Strapi API URL (default: STRAPI_URL env or http://localhost:1337)')
99
+ .option('-t, --token <token>', 'Strapi API token (default: STRAPI_TOKEN env)')
100
+ .option('-o, --output <path>', 'Output directory (default: ./strapi-types)')
101
+ .option('-i, --interval <ms>', 'Polling interval in milliseconds (default: 5000)', parseInt)
102
+ .option('-s, --silent', 'Suppress regeneration messages')
103
+ .action(async (opts) => {
104
+ await watch({
105
+ url: opts.url,
106
+ token: opts.token,
107
+ output: opts.output,
108
+ interval: opts.interval,
109
+ silent: opts.silent,
110
+ });
111
+ });
112
+ }
113
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Strapi Types CLI
4
+ *
5
+ * Generate TypeScript types from Strapi schema
6
+ *
7
+ * Usage:
8
+ * npx strapi-types generate --url http://localhost:1337
9
+ * npx strapi-types check --url http://localhost:1337
10
+ * npx strapi-types watch --url http://localhost:1337
11
+ * npx strapi-types generate --local # Use local .d.ts files
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG"}
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Strapi Types CLI
4
+ *
5
+ * Generate TypeScript types from Strapi schema
6
+ *
7
+ * Usage:
8
+ * npx strapi-types generate --url http://localhost:1337
9
+ * npx strapi-types check --url http://localhost:1337
10
+ * npx strapi-types watch --url http://localhost:1337
11
+ * npx strapi-types generate --local # Use local .d.ts files
12
+ */
13
+ import { Command } from 'commander';
14
+ import { readFile } from 'fs/promises';
15
+ import { fileURLToPath } from 'url';
16
+ import * as path from 'path';
17
+ import { createGenerateCommand } from './commands/generate.js';
18
+ import { createCheckCommand } from './commands/check.js';
19
+ import { createWatchCommand } from './commands/watch.js';
20
+ // Read package.json for version (ESM compatible)
21
+ const __filename = fileURLToPath(import.meta.url);
22
+ const __dirname = path.dirname(__filename);
23
+ const packageJsonPath = path.join(__dirname, '../../package.json');
24
+ const packageJson = JSON.parse(await readFile(packageJsonPath, 'utf-8'));
25
+ const program = new Command();
26
+ program
27
+ .name('strapi-types')
28
+ .description('Generate TypeScript types from Strapi schema')
29
+ .version(packageJson.version);
30
+ // Register commands
31
+ createGenerateCommand(program);
32
+ createCheckCommand(program);
33
+ createWatchCommand(program);
34
+ // Parse command line arguments
35
+ program.parse(process.argv);
36
+ // Show help if no command is provided
37
+ if (!process.argv.slice(2).length) {
38
+ program.outputHelp();
39
+ }
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAExD,iDAAiD;AACjD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;AAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAA;AAClE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAA;AAExE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACF,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;AAEjC,oBAAoB;AACpB,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAC3B,kBAAkB,CAAC,OAAO,CAAC,CAAA;AAE3B,+BAA+B;AAC/B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAE3B,sCAAsC;AACtC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChC,OAAO,CAAC,UAAU,EAAE,CAAA;AACxB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * API client for fetching schema from Strapi backend
3
+ */
4
+ import type { SchemaResponse, HashResponse } from '../../shared/strapi-schema-types.js';
5
+ export type { SchemaResponse, HashResponse };
6
+ export interface ApiClientOptions {
7
+ baseUrl: string;
8
+ token?: string;
9
+ timeout?: number;
10
+ }
11
+ export declare class ApiClient {
12
+ private baseUrl;
13
+ private token?;
14
+ private timeout;
15
+ constructor(options: ApiClientOptions);
16
+ /**
17
+ * Fetch the full schema from Strapi
18
+ */
19
+ getSchema(): Promise<SchemaResponse>;
20
+ /**
21
+ * Fetch only the schema hash from Strapi
22
+ */
23
+ getSchemaHash(): Promise<HashResponse>;
24
+ /**
25
+ * Check if the Strapi instance is reachable
26
+ */
27
+ ping(): Promise<boolean>;
28
+ /**
29
+ * Make a request to the Strapi API
30
+ */
31
+ private request;
32
+ }
33
+ /**
34
+ * Create an API client from environment variables or CLI options
35
+ */
36
+ export declare function createApiClient(options: {
37
+ url?: string;
38
+ token?: string;
39
+ timeout?: number;
40
+ }): ApiClient;
41
+ //# sourceMappingURL=api-client.d.ts.map