@tanstack/cta-engine 0.15.0 → 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.
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.15.0",
3
+ "version": "0.15.1",
4
4
  "description": "Tanstack Application Builder Engine",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
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
  }