@tanstack/create 0.61.4 → 0.61.6

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 (68) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/create-app.js +64 -3
  3. package/dist/custom-add-ons/add-on.js +59 -1
  4. package/dist/custom-add-ons/starter.js +5 -1
  5. package/dist/frameworks/react/add-ons/clerk/info.json +9 -0
  6. package/dist/frameworks/react/add-ons/convex/info.json +16 -0
  7. package/dist/frameworks/react/add-ons/strapi/README.md +158 -8
  8. package/dist/frameworks/react/add-ons/strapi/assets/_dot_env.local.append +1 -1
  9. package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/block-renderer.tsx +55 -0
  10. package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/index.ts +14 -0
  11. package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +27 -0
  12. package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +19 -0
  13. package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/rich-text.tsx +11 -0
  14. package/dist/frameworks/react/add-ons/strapi/assets/src/components/blocks/slider.tsx +28 -0
  15. package/dist/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +74 -0
  16. package/dist/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +120 -0
  17. package/dist/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +35 -0
  18. package/dist/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +47 -0
  19. package/dist/frameworks/react/add-ons/strapi/assets/src/data/loaders/articles.ts +106 -0
  20. package/dist/frameworks/react/add-ons/strapi/assets/src/data/loaders/index.ts +28 -0
  21. package/dist/frameworks/react/add-ons/strapi/assets/src/data/strapi-sdk.ts +9 -0
  22. package/dist/frameworks/react/add-ons/strapi/assets/src/lib/strapi-utils.ts +25 -0
  23. package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +170 -0
  24. package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +269 -43
  25. package/dist/frameworks/react/add-ons/strapi/assets/src/types/strapi.ts +90 -0
  26. package/dist/frameworks/react/add-ons/strapi/info.json +3 -3
  27. package/dist/frameworks/react/add-ons/strapi/package.json +5 -2
  28. package/dist/frameworks.js +1 -0
  29. package/dist/index.js +1 -1
  30. package/dist/types/custom-add-ons/add-on.d.ts +9 -0
  31. package/dist/types/index.d.ts +1 -1
  32. package/dist/types/types.d.ts +192 -0
  33. package/dist/types.js +10 -0
  34. package/package.json +1 -1
  35. package/src/create-app.ts +77 -3
  36. package/src/custom-add-ons/add-on.ts +72 -1
  37. package/src/custom-add-ons/starter.ts +7 -1
  38. package/src/frameworks/react/add-ons/clerk/info.json +9 -0
  39. package/src/frameworks/react/add-ons/convex/info.json +16 -0
  40. package/src/frameworks/react/add-ons/strapi/README.md +158 -8
  41. package/src/frameworks/react/add-ons/strapi/assets/_dot_env.local.append +1 -1
  42. package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/block-renderer.tsx +55 -0
  43. package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/index.ts +14 -0
  44. package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/media.tsx +27 -0
  45. package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/quote.tsx +19 -0
  46. package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/rich-text.tsx +11 -0
  47. package/src/frameworks/react/add-ons/strapi/assets/src/components/blocks/slider.tsx +28 -0
  48. package/src/frameworks/react/add-ons/strapi/assets/src/components/markdown-content.tsx +74 -0
  49. package/src/frameworks/react/add-ons/strapi/assets/src/components/pagination.tsx +120 -0
  50. package/src/frameworks/react/add-ons/strapi/assets/src/components/search.tsx +35 -0
  51. package/src/frameworks/react/add-ons/strapi/assets/src/components/strapi-image.tsx +47 -0
  52. package/src/frameworks/react/add-ons/strapi/assets/src/data/loaders/articles.ts +106 -0
  53. package/src/frameworks/react/add-ons/strapi/assets/src/data/loaders/index.ts +28 -0
  54. package/src/frameworks/react/add-ons/strapi/assets/src/data/strapi-sdk.ts +9 -0
  55. package/src/frameworks/react/add-ons/strapi/assets/src/lib/strapi-utils.ts +25 -0
  56. package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.$articleId.tsx +170 -0
  57. package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi.tsx +269 -43
  58. package/src/frameworks/react/add-ons/strapi/assets/src/types/strapi.ts +90 -0
  59. package/src/frameworks/react/add-ons/strapi/info.json +3 -3
  60. package/src/frameworks/react/add-ons/strapi/package.json +5 -2
  61. package/src/frameworks.ts +1 -0
  62. package/src/index.ts +1 -1
  63. package/src/types.ts +14 -0
  64. package/tests/custom-add-ons/starter.test.ts +29 -0
  65. package/dist/frameworks/react/add-ons/strapi/assets/src/lib/strapiClient.ts +0 -7
  66. package/dist/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +0 -78
  67. package/src/frameworks/react/add-ons/strapi/assets/src/lib/strapiClient.ts +0 -7
  68. package/src/frameworks/react/add-ons/strapi/assets/src/routes/demo/strapi_.$articleId.tsx +0 -78
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Strapi type definitions
3
+ * These types match the Strapi Cloud Template Blog schema
4
+ */
5
+
6
+ import type { Block } from "@/components/blocks";
7
+
8
+ // Base image type from Strapi media library
9
+ export type TImage = {
10
+ id: number;
11
+ documentId: string;
12
+ alternativeText: string | null;
13
+ url: string;
14
+ };
15
+
16
+ // Author content type
17
+ export type TAuthor = {
18
+ id: number;
19
+ documentId: string;
20
+ name: string;
21
+ email?: string;
22
+ createdAt: string;
23
+ updatedAt: string;
24
+ publishedAt: string;
25
+ };
26
+
27
+ // Category content type
28
+ export type TCategory = {
29
+ id: number;
30
+ documentId: string;
31
+ name: string;
32
+ slug: string;
33
+ description?: string;
34
+ createdAt: string;
35
+ updatedAt: string;
36
+ publishedAt: string;
37
+ };
38
+
39
+ // Article content type
40
+ export type TArticle = {
41
+ id: number;
42
+ documentId: string;
43
+ title: string;
44
+ description: string;
45
+ slug: string;
46
+ cover?: TImage;
47
+ author?: TAuthor;
48
+ category?: TCategory;
49
+ blocks?: Array<Block>;
50
+ createdAt: string;
51
+ updatedAt: string;
52
+ publishedAt: string;
53
+ };
54
+
55
+ // Strapi response wrappers
56
+ export type TStrapiResponseSingle<T> = {
57
+ data: T;
58
+ meta?: {
59
+ pagination?: TStrapiPagination;
60
+ };
61
+ };
62
+
63
+ export type TStrapiResponseCollection<T> = {
64
+ data: Array<T>;
65
+ meta?: {
66
+ pagination?: TStrapiPagination;
67
+ };
68
+ };
69
+
70
+ export type TStrapiPagination = {
71
+ page: number;
72
+ pageSize: number;
73
+ pageCount: number;
74
+ total: number;
75
+ };
76
+
77
+ export type TStrapiError = {
78
+ status: number;
79
+ name: string;
80
+ message: string;
81
+ details?: Record<string, Array<string>>;
82
+ };
83
+
84
+ export type TStrapiResponse<T = null> = {
85
+ data?: T;
86
+ error?: TStrapiError;
87
+ meta?: {
88
+ pagination?: TStrapiPagination;
89
+ };
90
+ };
@@ -11,9 +11,9 @@
11
11
  "routes": [
12
12
  {
13
13
  "url": "/demo/strapi",
14
- "name": "Strapi",
15
- "path": "src/routes/demo.strapi.tsx",
16
- "jsName": "StrapiDemo"
14
+ "name": "Strapi Articles",
15
+ "path": "src/routes/demo/strapi.tsx",
16
+ "jsName": "StrapiArticles"
17
17
  }
18
18
  ]
19
19
  }
@@ -1,5 +1,8 @@
1
1
  {
2
2
  "dependencies": {
3
- "@strapi/client": "^1.5.0"
3
+ "@strapi/client": "^1.6.0",
4
+ "react-markdown": "^9.0.1",
5
+ "remark-gfm": "^4.0.0",
6
+ "use-debounce": "^10.0.0"
4
7
  }
5
- }
8
+ }
package/src/frameworks.ts CHANGED
@@ -111,6 +111,7 @@ export function scanAddOnDirectories(addOnsDirectories: Array<string>) {
111
111
  addOns.push({
112
112
  ...info,
113
113
  id: dir,
114
+ version: info.version ?? '0.0.0',
114
115
  packageAdditions,
115
116
  packageTemplate,
116
117
  readme,
package/src/index.ts CHANGED
@@ -61,7 +61,7 @@ export {
61
61
  export { formatCommand, handleSpecialURL } from './utils.js'
62
62
 
63
63
  export { initStarter, compileStarter } from './custom-add-ons/starter.js'
64
- export { initAddOn, compileAddOn } from './custom-add-ons/add-on.js'
64
+ export { initAddOn, compileAddOn, devAddOn } from './custom-add-ons/add-on.js'
65
65
  export {
66
66
  createAppOptionsFromPersisted,
67
67
  createSerializedOptionsFromPersisted,
package/src/types.ts CHANGED
@@ -92,6 +92,18 @@ export const AddOnBaseSchema = z.object({
92
92
  createSpecialSteps: z.array(z.string()).optional(),
93
93
  postInitSpecialSteps: z.array(z.string()).optional(),
94
94
  options: AddOnOptionsSchema.optional(),
95
+ envVars: z
96
+ .array(
97
+ z.object({
98
+ name: z.string(),
99
+ description: z.string().optional(),
100
+ required: z.boolean().optional(),
101
+ default: z.string().optional(),
102
+ secret: z.boolean().optional(),
103
+ file: z.enum(['.env', '.env.local']).optional(),
104
+ }),
105
+ )
106
+ .optional(),
95
107
  default: z.boolean().optional(),
96
108
  })
97
109
 
@@ -207,6 +219,8 @@ export interface Options {
207
219
  addOnOptions: Record<string, Record<string, any>>
208
220
  starter?: Starter | undefined
209
221
  routerOnly?: boolean
222
+ includeExamples?: boolean
223
+ envVarValues?: Record<string, string>
210
224
  }
211
225
 
212
226
  export type SerializedOptions = Omit<
@@ -55,4 +55,33 @@ describe('readOrGenerateStarterInfo', () => {
55
55
  })
56
56
  expect(starterInfo.name).toEqual('test-starter')
57
57
  })
58
+
59
+ it('should backfill version when missing', async () => {
60
+ fs.mkdirSync(process.cwd(), { recursive: true })
61
+ fs.writeFileSync(
62
+ 'starter-info.json',
63
+ JSON.stringify({
64
+ framework: 'test',
65
+ chosenAddOns: [],
66
+ starter: undefined,
67
+ name: 'test-starter',
68
+ mode: 'code-router',
69
+ typescript: true,
70
+ tailwind: true,
71
+ git: true,
72
+ }),
73
+ )
74
+ const starterInfo = await readOrGenerateStarterInfo({
75
+ framework: 'test',
76
+ version: 1,
77
+ chosenAddOns: [],
78
+ starter: undefined,
79
+ projectName: 'test',
80
+ mode: 'code-router',
81
+ typescript: true,
82
+ tailwind: true,
83
+ git: true,
84
+ })
85
+ expect(starterInfo.version).toEqual('0.0.1')
86
+ })
58
87
  })
@@ -1,7 +0,0 @@
1
- import { strapi } from "@strapi/client";
2
-
3
- export const strapiClient = strapi({
4
- baseURL: import.meta.env.VITE_STRAPI_URL,
5
- });
6
-
7
- export const articles = strapiClient.collection("articles");
@@ -1,78 +0,0 @@
1
- import { articles } from '#/lib/strapiClient'
2
- import { createFileRoute, Link } from '@tanstack/react-router'
3
-
4
- export const Route = createFileRoute('/demo/strapi_/$articleId')({
5
- component: RouteComponent,
6
- loader: async ({ params }) => {
7
- const { data: article } = await articles.findOne(params.articleId)
8
- return article
9
- },
10
- })
11
-
12
- function RouteComponent() {
13
- const article = Route.useLoaderData()
14
-
15
- return (
16
- <div className="min-h-screen bg-gradient-to-b from-slate-900 via-slate-800 to-slate-900 p-8">
17
- <div className="max-w-4xl mx-auto">
18
- <Link
19
- to="/demo/strapi"
20
- className="inline-flex items-center text-cyan-400 hover:text-cyan-300 mb-6 transition-colors"
21
- >
22
- <svg
23
- xmlns="http://www.w3.org/2000/svg"
24
- className="h-5 w-5 mr-2"
25
- viewBox="0 0 20 20"
26
- fill="currentColor"
27
- >
28
- <path
29
- fillRule="evenodd"
30
- d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z"
31
- clipRule="evenodd"
32
- />
33
- </svg>
34
- Back to Articles
35
- </Link>
36
-
37
- <article className="bg-slate-800/50 backdrop-blur-sm border border-slate-700 rounded-xl p-8">
38
- <h1 className="text-4xl font-bold text-white mb-4">
39
- {article?.title || 'Untitled'}
40
- </h1>
41
-
42
- {article?.createdAt && (
43
- <p className="text-sm text-cyan-400/70 mb-6">
44
- Published on{' '}
45
- {new Date(article?.createdAt).toLocaleDateString('en-US', {
46
- year: 'numeric',
47
- month: 'long',
48
- day: 'numeric',
49
- })}
50
- </p>
51
- )}
52
-
53
- {article?.description && (
54
- <div className="mb-6">
55
- <h2 className="text-xl font-semibold text-gray-300 mb-3">
56
- Description
57
- </h2>
58
- <p className="text-gray-400 leading-relaxed">
59
- {article?.description}
60
- </p>
61
- </div>
62
- )}
63
-
64
- {article?.content && (
65
- <div>
66
- <h2 className="text-xl font-semibold text-gray-300 mb-3">
67
- Content
68
- </h2>
69
- <div className="text-gray-400 leading-relaxed whitespace-pre-wrap">
70
- {article?.content}
71
- </div>
72
- </div>
73
- )}
74
- </article>
75
- </div>
76
- </div>
77
- )
78
- }
@@ -1,7 +0,0 @@
1
- import { strapi } from "@strapi/client";
2
-
3
- export const strapiClient = strapi({
4
- baseURL: import.meta.env.VITE_STRAPI_URL,
5
- });
6
-
7
- export const articles = strapiClient.collection("articles");
@@ -1,78 +0,0 @@
1
- import { articles } from '#/lib/strapiClient'
2
- import { createFileRoute, Link } from '@tanstack/react-router'
3
-
4
- export const Route = createFileRoute('/demo/strapi_/$articleId')({
5
- component: RouteComponent,
6
- loader: async ({ params }) => {
7
- const { data: article } = await articles.findOne(params.articleId)
8
- return article
9
- },
10
- })
11
-
12
- function RouteComponent() {
13
- const article = Route.useLoaderData()
14
-
15
- return (
16
- <div className="min-h-screen bg-gradient-to-b from-slate-900 via-slate-800 to-slate-900 p-8">
17
- <div className="max-w-4xl mx-auto">
18
- <Link
19
- to="/demo/strapi"
20
- className="inline-flex items-center text-cyan-400 hover:text-cyan-300 mb-6 transition-colors"
21
- >
22
- <svg
23
- xmlns="http://www.w3.org/2000/svg"
24
- className="h-5 w-5 mr-2"
25
- viewBox="0 0 20 20"
26
- fill="currentColor"
27
- >
28
- <path
29
- fillRule="evenodd"
30
- d="M9.707 16.707a1 1 0 01-1.414 0l-6-6a1 1 0 010-1.414l6-6a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l4.293 4.293a1 1 0 010 1.414z"
31
- clipRule="evenodd"
32
- />
33
- </svg>
34
- Back to Articles
35
- </Link>
36
-
37
- <article className="bg-slate-800/50 backdrop-blur-sm border border-slate-700 rounded-xl p-8">
38
- <h1 className="text-4xl font-bold text-white mb-4">
39
- {article?.title || 'Untitled'}
40
- </h1>
41
-
42
- {article?.createdAt && (
43
- <p className="text-sm text-cyan-400/70 mb-6">
44
- Published on{' '}
45
- {new Date(article?.createdAt).toLocaleDateString('en-US', {
46
- year: 'numeric',
47
- month: 'long',
48
- day: 'numeric',
49
- })}
50
- </p>
51
- )}
52
-
53
- {article?.description && (
54
- <div className="mb-6">
55
- <h2 className="text-xl font-semibold text-gray-300 mb-3">
56
- Description
57
- </h2>
58
- <p className="text-gray-400 leading-relaxed">
59
- {article?.description}
60
- </p>
61
- </div>
62
- )}
63
-
64
- {article?.content && (
65
- <div>
66
- <h2 className="text-xl font-semibold text-gray-300 mb-3">
67
- Content
68
- </h2>
69
- <div className="text-gray-400 leading-relaxed whitespace-pre-wrap">
70
- {article?.content}
71
- </div>
72
- </div>
73
- )}
74
- </article>
75
- </div>
76
- </div>
77
- )
78
- }