@tanstack/cta-engine 0.14.4 → 0.15.1

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.
@@ -171,7 +171,7 @@ Use the following commands to start your app:
171
171
  % cd ${options.projectName}
172
172
  % ${formatCommand(getPackageManagerScriptCommand(options.packageManager, ['dev']))}
173
173
 
174
- Please check the README.md for more information on testing, styling, adding routes, etc.${errorStatement}`);
174
+ Please check the README.md for more information on testing, styling, adding routes, etc.${errorStatement}`);
175
175
  }
176
176
  export async function createApp(environment, options) {
177
177
  environment.startRun();
package/dist/registry.js CHANGED
@@ -1,5 +1,27 @@
1
+ import { z } from 'zod';
1
2
  import { loadRemoteAddOn } from './custom-add-ons/add-on.js';
2
3
  import { loadStarter } from './custom-add-ons/starter.js';
4
+ const registrySchema = z.object({
5
+ starters: z
6
+ .array(z.object({
7
+ name: z.string(),
8
+ description: z.string(),
9
+ url: z.string(),
10
+ banner: z.string().optional(),
11
+ mode: z.enum(['code-router', 'file-router']),
12
+ framework: z.string(),
13
+ }))
14
+ .optional(),
15
+ 'add-ons': z
16
+ .array(z.object({
17
+ name: z.string(),
18
+ description: z.string(),
19
+ url: z.string(),
20
+ modes: z.array(z.enum(['code-router', 'file-router'])),
21
+ framework: z.string(),
22
+ }))
23
+ .optional(),
24
+ });
3
25
  function absolutizeUrl(originalUrl, relativeUrl) {
4
26
  if (relativeUrl.startsWith('http') || relativeUrl.startsWith('https')) {
5
27
  return relativeUrl;
@@ -11,21 +33,22 @@ export async function getRawRegistry(registryUrl) {
11
33
  const regUrl = registryUrl || process.env.CTA_REGISTRY;
12
34
  if (regUrl) {
13
35
  const registry = (await fetch(regUrl).then((res) => res.json()));
14
- for (const addOn of registry['add-ons']) {
36
+ const parsedRegistry = registrySchema.parse(registry);
37
+ for (const addOn of parsedRegistry['add-ons'] || []) {
15
38
  addOn.url = absolutizeUrl(regUrl, addOn.url);
16
39
  }
17
- for (const starter of registry.starters) {
40
+ for (const starter of parsedRegistry.starters || []) {
18
41
  starter.url = absolutizeUrl(regUrl, starter.url);
19
42
  if (starter.banner) {
20
43
  starter.banner = absolutizeUrl(regUrl, starter.banner);
21
44
  }
22
45
  }
23
- return registry;
46
+ return parsedRegistry;
24
47
  }
25
48
  }
26
49
  async function getAddOns(registry) {
27
50
  const addOns = [];
28
- for (const addOnInfo of registry['add-ons']) {
51
+ for (const addOnInfo of registry['add-ons'] || []) {
29
52
  const addOn = await loadRemoteAddOn(addOnInfo.url);
30
53
  addOns.push(addOn);
31
54
  }
@@ -37,7 +60,7 @@ export async function getRegistryAddOns(registryUrl) {
37
60
  }
38
61
  async function getStarters(registry) {
39
62
  const starters = [];
40
- for (const starterInfo of registry.starters) {
63
+ for (const starterInfo of registry.starters || []) {
41
64
  const starter = await loadStarter(starterInfo.url);
42
65
  starters.push(starter);
43
66
  }
@@ -1,21 +1,81 @@
1
- import type { AddOn, Mode, Starter } from './types';
2
- export type Registry = {
3
- starters: Array<{
1
+ import { z } from 'zod';
2
+ import type { AddOn, Starter } from './types';
3
+ declare const registrySchema: z.ZodObject<{
4
+ starters: z.ZodOptional<z.ZodArray<z.ZodObject<{
5
+ name: z.ZodString;
6
+ description: z.ZodString;
7
+ url: z.ZodString;
8
+ banner: z.ZodOptional<z.ZodString>;
9
+ mode: z.ZodEnum<["code-router", "file-router"]>;
10
+ framework: z.ZodString;
11
+ }, "strip", z.ZodTypeAny, {
4
12
  name: string;
5
13
  description: string;
6
14
  url: string;
7
- banner?: string;
8
- mode: Mode;
9
15
  framework: string;
10
- }>;
11
- 'add-ons': Array<{
16
+ mode: "code-router" | "file-router";
17
+ banner?: string | undefined;
18
+ }, {
12
19
  name: string;
13
20
  description: string;
14
21
  url: string;
15
- modes: Array<Mode>;
16
22
  framework: string;
17
- }>;
18
- };
23
+ mode: "code-router" | "file-router";
24
+ banner?: string | undefined;
25
+ }>, "many">>;
26
+ 'add-ons': z.ZodOptional<z.ZodArray<z.ZodObject<{
27
+ name: z.ZodString;
28
+ description: z.ZodString;
29
+ url: z.ZodString;
30
+ modes: z.ZodArray<z.ZodEnum<["code-router", "file-router"]>, "many">;
31
+ framework: z.ZodString;
32
+ }, "strip", z.ZodTypeAny, {
33
+ name: string;
34
+ description: string;
35
+ url: string;
36
+ framework: string;
37
+ modes: ("code-router" | "file-router")[];
38
+ }, {
39
+ name: string;
40
+ description: string;
41
+ url: string;
42
+ framework: string;
43
+ modes: ("code-router" | "file-router")[];
44
+ }>, "many">>;
45
+ }, "strip", z.ZodTypeAny, {
46
+ starters?: {
47
+ name: string;
48
+ description: string;
49
+ url: string;
50
+ framework: string;
51
+ mode: "code-router" | "file-router";
52
+ banner?: string | undefined;
53
+ }[] | undefined;
54
+ 'add-ons'?: {
55
+ name: string;
56
+ description: string;
57
+ url: string;
58
+ framework: string;
59
+ modes: ("code-router" | "file-router")[];
60
+ }[] | undefined;
61
+ }, {
62
+ starters?: {
63
+ name: string;
64
+ description: string;
65
+ url: string;
66
+ framework: string;
67
+ mode: "code-router" | "file-router";
68
+ banner?: string | undefined;
69
+ }[] | undefined;
70
+ 'add-ons'?: {
71
+ name: string;
72
+ description: string;
73
+ url: string;
74
+ framework: string;
75
+ modes: ("code-router" | "file-router")[];
76
+ }[] | undefined;
77
+ }>;
78
+ export type Registry = z.infer<typeof registrySchema>;
19
79
  export declare function getRawRegistry(registryUrl?: string): Promise<Registry | undefined>;
20
80
  export declare function getRegistryAddOns(registryUrl?: string): Promise<Array<AddOn>>;
21
81
  export declare function getRegistryStarters(registryUrl?: string): Promise<Array<Starter>>;
@@ -23,3 +83,4 @@ export declare function getRegistry(registryUrl?: string): Promise<{
23
83
  addOns: Array<AddOn>;
24
84
  starters: Array<Starter>;
25
85
  }>;
86
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/cta-engine",
3
- "version": "0.14.4",
3
+ "version": "0.15.1",
4
4
  "description": "Tanstack Application Builder Engine",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
package/src/create-app.ts CHANGED
@@ -233,7 +233,7 @@ Use the following commands to start your app:
233
233
  getPackageManagerScriptCommand(options.packageManager, ['dev']),
234
234
  )}
235
235
 
236
- Please check the README.md for more information on testing, styling, adding routes, etc.${errorStatement}`,
236
+ Please check the README.md for more information on testing, styling, adding routes, etc.${errorStatement}`,
237
237
  )
238
238
  }
239
239
 
package/src/registry.ts CHANGED
@@ -1,25 +1,36 @@
1
+ import { z } from 'zod'
1
2
  import { loadRemoteAddOn } from './custom-add-ons/add-on.js'
2
3
  import { loadStarter } from './custom-add-ons/starter.js'
3
4
 
4
- import type { AddOn, Mode, Starter } from './types'
5
+ import type { AddOn, Starter } from './types'
5
6
 
6
- export type Registry = {
7
- starters: Array<{
8
- name: string
9
- description: string
10
- url: string
11
- banner?: string
12
- mode: Mode
13
- framework: string
14
- }>
15
- 'add-ons': Array<{
16
- name: string
17
- description: string
18
- url: string
19
- modes: Array<Mode>
20
- framework: string
21
- }>
22
- }
7
+ const registrySchema = z.object({
8
+ starters: z
9
+ .array(
10
+ z.object({
11
+ name: z.string(),
12
+ description: z.string(),
13
+ url: z.string(),
14
+ banner: z.string().optional(),
15
+ mode: z.enum(['code-router', 'file-router']),
16
+ framework: z.string(),
17
+ }),
18
+ )
19
+ .optional(),
20
+ 'add-ons': z
21
+ .array(
22
+ z.object({
23
+ name: z.string(),
24
+ description: z.string(),
25
+ url: z.string(),
26
+ modes: z.array(z.enum(['code-router', 'file-router'])),
27
+ framework: z.string(),
28
+ }),
29
+ )
30
+ .optional(),
31
+ })
32
+
33
+ export type Registry = z.infer<typeof registrySchema>
23
34
 
24
35
  function absolutizeUrl(originalUrl: string, relativeUrl: string) {
25
36
  if (relativeUrl.startsWith('http') || relativeUrl.startsWith('https')) {
@@ -35,22 +46,23 @@ export async function getRawRegistry(
35
46
  const regUrl = registryUrl || process.env.CTA_REGISTRY
36
47
  if (regUrl) {
37
48
  const registry = (await fetch(regUrl).then((res) => res.json())) as Registry
38
- for (const addOn of registry['add-ons']) {
49
+ const parsedRegistry = registrySchema.parse(registry)
50
+ for (const addOn of parsedRegistry['add-ons'] || []) {
39
51
  addOn.url = absolutizeUrl(regUrl, addOn.url)
40
52
  }
41
- for (const starter of registry.starters) {
53
+ for (const starter of parsedRegistry.starters || []) {
42
54
  starter.url = absolutizeUrl(regUrl, starter.url)
43
55
  if (starter.banner) {
44
56
  starter.banner = absolutizeUrl(regUrl, starter.banner)
45
57
  }
46
58
  }
47
- return registry
59
+ return parsedRegistry
48
60
  }
49
61
  }
50
62
 
51
63
  async function getAddOns(registry: Registry): Promise<Array<AddOn>> {
52
64
  const addOns: Array<AddOn> = []
53
- for (const addOnInfo of registry['add-ons']) {
65
+ for (const addOnInfo of registry['add-ons'] || []) {
54
66
  const addOn = await loadRemoteAddOn(addOnInfo.url)
55
67
  addOns.push(addOn)
56
68
  }
@@ -66,7 +78,7 @@ export async function getRegistryAddOns(
66
78
 
67
79
  async function getStarters(registry: Registry): Promise<Array<Starter>> {
68
80
  const starters: Array<Starter> = []
69
- for (const starterInfo of registry.starters) {
81
+ for (const starterInfo of registry.starters || []) {
70
82
  const starter = await loadStarter(starterInfo.url)
71
83
  starters.push(starter)
72
84
  }