@anuragpal02/zcl-contracts 0.2.0 → 0.4.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.
package/dist/client.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import { type AuthSessionResponse, type LoginRequest, type LogoutResponse, type SessionResponse, type SignupRequest } from './auth.js';
2
2
  import { type ApiErrorCode } from './common.js';
3
3
  import { type CreateWorkspaceRequest, type Workspace, type WorkspaceMembership } from './workspaces.js';
4
+ import { type Asset, type AssetUpload, type CreateAssetUploadRequest, type CreateAssetUploadResponse, type FinalizeAssetUploadRequest, type ListAssetsResponse } from './assets.js';
5
+ import { type CreateProjectRequest, type LedMapResponse, type Project, type UpdateLedMapRequest, type UpdateProjectRequest } from './projects.js';
4
6
  type FetchLike = (request: Request) => Promise<Response>;
5
7
  export type ZclApiClientOptions = {
6
8
  baseUrl: string;
@@ -36,6 +38,35 @@ export declare function createZclApiClient(options: ZclApiClientOptions): {
36
38
  data: Workspace;
37
39
  }>;
38
40
  };
41
+ projects: {
42
+ list(workspaceId: string, options?: {
43
+ status?: "active" | "archived";
44
+ }): Promise<{
45
+ data: Project[];
46
+ pagination: {
47
+ nextCursor: string | null;
48
+ };
49
+ }>;
50
+ create(workspaceId: string, input: CreateProjectRequest): Promise<{
51
+ data: Project;
52
+ }>;
53
+ get(workspaceId: string, projectId: string): Promise<{
54
+ data: Project;
55
+ }>;
56
+ update(workspaceId: string, projectId: string, input: UpdateProjectRequest): Promise<{
57
+ data: Project;
58
+ }>;
59
+ };
60
+ ledMaps: {
61
+ get(workspaceId: string, projectId: string): Promise<LedMapResponse>;
62
+ update(workspaceId: string, projectId: string, input: UpdateLedMapRequest): Promise<LedMapResponse>;
63
+ };
64
+ assets: {
65
+ createUpload(workspaceId: string, projectId: string, input: CreateAssetUploadRequest): Promise<CreateAssetUploadResponse>;
66
+ uploadObject(upload: AssetUpload, body: BodyInit): Promise<void>;
67
+ finalize(workspaceId: string, projectId: string, assetId: string, input: FinalizeAssetUploadRequest): Promise<Asset>;
68
+ list(workspaceId: string, projectId: string): Promise<ListAssetsResponse>;
69
+ };
39
70
  };
40
71
  export type ZclApiClient = ReturnType<typeof createZclApiClient>;
41
72
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,aAAa,EACnB,MAAM,WAAW,CAAA;AAClB,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,aAAa,CAAA;AACxF,OAAO,EAIL,KAAK,sBAAsB,EAC3B,KAAK,SAAS,EACd,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAA;AAExB,KAAK,SAAS,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAExD,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG;IAChD,UAAU,EAAE,mBAAmB,CAAA;CAChC,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,uBAAuB,EAAE,CAAA;IAC/B,UAAU,EAAE;QACV,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAC1B,CAAA;CACF,CAAA;AAQD,qBAAa,WAAY,SAAQ,KAAK;aAElB,IAAI,EAAE,YAAY;aAElB,MAAM,EAAE,MAAM;aACd,SAAS,CAAC,EAAE,MAAM;gBAHlB,IAAI,EAAE,YAAY,EAClC,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,YAAA;CAKrC;AA8BD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB;;sBAkD3C,aAAa,GAAG,OAAO,CAAC,mBAAmB,CAAC;qBAM7C,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC;kBAM9C,OAAO,CAAC,cAAc,CAAC;;;eAK1B,OAAO,CAAC,eAAe,CAAC;;;gBAKvB,OAAO,CAAC,qBAAqB,CAAC;sBAGxB,sBAAsB,GAAG,OAAO,CAAC;YAAE,IAAI,EAAE,SAAS,CAAA;SAAE,CAAC;;EAQxE;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAA"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -2,6 +2,8 @@ import { z } from 'zod';
2
2
  import { authSessionResponseSchema, loginRequestSchema, logoutResponseSchema, sessionResponseSchema, signupRequestSchema } from './auth.js';
3
3
  import { errorResponseSchema, listResponseSchema } from './common.js';
4
4
  import { createWorkspaceRequestSchema, workspaceMembershipSchema, workspaceSchema } from './workspaces.js';
5
+ import { assetSchema, createAssetUploadRequestSchema, createAssetUploadResponseSchema, finalizeAssetUploadRequestSchema, listAssetsResponseSchema } from './assets.js';
6
+ import { createProjectRequestSchema, ledMapResponseSchema, projectSchema, updateLedMapRequestSchema, updateProjectRequestSchema } from './projects.js';
5
7
  const workspaceListResponseSchema = listResponseSchema(workspaceSchema.extend({
6
8
  membership: workspaceMembershipSchema
7
9
  }));
@@ -49,6 +51,10 @@ export function createZclApiClient(options) {
49
51
  headers.set('content-type', 'application/json');
50
52
  body = JSON.stringify(requestBody);
51
53
  }
54
+ const method = (requestInitBase.method ?? 'GET').toUpperCase();
55
+ if (method !== 'GET' && method !== 'HEAD') {
56
+ headers.set('x-zcl-csrf', '1');
57
+ }
52
58
  const requestInit = {
53
59
  ...requestInitBase,
54
60
  headers,
@@ -101,6 +107,63 @@ export function createZclApiClient(options) {
101
107
  body: createWorkspaceRequestSchema.parse(input)
102
108
  });
103
109
  }
110
+ },
111
+ projects: {
112
+ list(workspaceId, options = {}) {
113
+ const query = options.status ? `?status=${options.status}` : '';
114
+ return request(`/workspaces/${workspaceId}/projects${query}`, listResponseSchema(projectSchema));
115
+ },
116
+ create(workspaceId, input) {
117
+ return request(`/workspaces/${workspaceId}/projects`, z.object({ data: projectSchema }), {
118
+ method: 'POST',
119
+ body: createProjectRequestSchema.parse(input)
120
+ });
121
+ },
122
+ get(workspaceId, projectId) {
123
+ return request(`/workspaces/${workspaceId}/projects/${projectId}`, z.object({ data: projectSchema }));
124
+ },
125
+ update(workspaceId, projectId, input) {
126
+ return request(`/workspaces/${workspaceId}/projects/${projectId}`, z.object({ data: projectSchema }), {
127
+ method: 'PATCH',
128
+ body: updateProjectRequestSchema.parse(input)
129
+ });
130
+ }
131
+ },
132
+ ledMaps: {
133
+ get(workspaceId, projectId) {
134
+ return request(`/workspaces/${workspaceId}/projects/${projectId}/led-map`, ledMapResponseSchema);
135
+ },
136
+ update(workspaceId, projectId, input) {
137
+ return request(`/workspaces/${workspaceId}/projects/${projectId}/led-map`, ledMapResponseSchema, {
138
+ method: 'PATCH',
139
+ body: updateLedMapRequestSchema.parse(input)
140
+ });
141
+ }
142
+ },
143
+ assets: {
144
+ createUpload(workspaceId, projectId, input) {
145
+ return request(`/workspaces/${workspaceId}/projects/${projectId}/assets/uploads`, createAssetUploadResponseSchema, {
146
+ method: 'POST',
147
+ body: createAssetUploadRequestSchema.parse(input)
148
+ });
149
+ },
150
+ async uploadObject(upload, body) {
151
+ const headers = new Headers(upload.requiredHeaders);
152
+ headers.set('x-zcl-csrf', '1');
153
+ const response = await fetcher(new Request(upload.uploadUrl, { method: 'PUT', headers, body, credentials: 'include' }));
154
+ if (!response.ok) {
155
+ throw new ZclApiError('internal_error', 'Asset upload failed', response.status);
156
+ }
157
+ },
158
+ finalize(workspaceId, projectId, assetId, input) {
159
+ return request(`/workspaces/${workspaceId}/projects/${projectId}/assets/${assetId}/finalize`, assetSchema, {
160
+ method: 'POST',
161
+ body: finalizeAssetUploadRequestSchema.parse(input)
162
+ });
163
+ },
164
+ list(workspaceId, projectId) {
165
+ return request(`/workspaces/${workspaceId}/projects/${projectId}/assets`, listAssetsResponseSchema);
166
+ }
104
167
  }
105
168
  };
106
169
  }
@@ -15,8 +15,30 @@ export declare const ledPanelSchema: z.ZodObject<{
15
15
  height: z.ZodNumber;
16
16
  x: z.ZodNumber;
17
17
  y: z.ZodNumber;
18
+ color: z.ZodOptional<z.ZodString>;
19
+ showLabel: z.ZodOptional<z.ZodBoolean>;
18
20
  }, z.core.$strip>;
21
+ export declare const ledBoundsSchema: z.ZodObject<{
22
+ minX: z.ZodNumber;
23
+ minY: z.ZodNumber;
24
+ maxX: z.ZodNumber;
25
+ maxY: z.ZodNumber;
26
+ width: z.ZodNumber;
27
+ height: z.ZodNumber;
28
+ aspectRatio: z.ZodNumber;
29
+ }, z.core.$strip>;
30
+ export declare const ledPanelsSchema: z.ZodArray<z.ZodObject<{
31
+ id: z.ZodString;
32
+ name: z.ZodString;
33
+ width: z.ZodNumber;
34
+ height: z.ZodNumber;
35
+ x: z.ZodNumber;
36
+ y: z.ZodNumber;
37
+ color: z.ZodOptional<z.ZodString>;
38
+ showLabel: z.ZodOptional<z.ZodBoolean>;
39
+ }, z.core.$strip>>;
19
40
  export declare const ledMapSchema: z.ZodObject<{
41
+ projectId: z.ZodString;
20
42
  version: z.ZodNumber;
21
43
  panels: z.ZodArray<z.ZodObject<{
22
44
  id: z.ZodString;
@@ -25,8 +47,10 @@ export declare const ledMapSchema: z.ZodObject<{
25
47
  height: z.ZodNumber;
26
48
  x: z.ZodNumber;
27
49
  y: z.ZodNumber;
50
+ color: z.ZodOptional<z.ZodString>;
51
+ showLabel: z.ZodOptional<z.ZodBoolean>;
28
52
  }, z.core.$strip>>;
29
- bounds: z.ZodObject<{
53
+ bounds: z.ZodNullable<z.ZodObject<{
30
54
  minX: z.ZodNumber;
31
55
  minY: z.ZodNumber;
32
56
  maxX: z.ZodNumber;
@@ -34,6 +58,48 @@ export declare const ledMapSchema: z.ZodObject<{
34
58
  width: z.ZodNumber;
35
59
  height: z.ZodNumber;
36
60
  aspectRatio: z.ZodNumber;
61
+ }, z.core.$strip>>;
62
+ createdAt: z.ZodString;
63
+ updatedAt: z.ZodString;
64
+ }, z.core.$strip>;
65
+ export declare const updateLedMapRequestSchema: z.ZodObject<{
66
+ expectedVersion: z.ZodNumber;
67
+ panels: z.ZodArray<z.ZodObject<{
68
+ id: z.ZodString;
69
+ name: z.ZodString;
70
+ width: z.ZodNumber;
71
+ height: z.ZodNumber;
72
+ x: z.ZodNumber;
73
+ y: z.ZodNumber;
74
+ color: z.ZodOptional<z.ZodString>;
75
+ showLabel: z.ZodOptional<z.ZodBoolean>;
76
+ }, z.core.$strip>>;
77
+ }, z.core.$strip>;
78
+ export declare const ledMapResponseSchema: z.ZodObject<{
79
+ data: z.ZodObject<{
80
+ projectId: z.ZodString;
81
+ version: z.ZodNumber;
82
+ panels: z.ZodArray<z.ZodObject<{
83
+ id: z.ZodString;
84
+ name: z.ZodString;
85
+ width: z.ZodNumber;
86
+ height: z.ZodNumber;
87
+ x: z.ZodNumber;
88
+ y: z.ZodNumber;
89
+ color: z.ZodOptional<z.ZodString>;
90
+ showLabel: z.ZodOptional<z.ZodBoolean>;
91
+ }, z.core.$strip>>;
92
+ bounds: z.ZodNullable<z.ZodObject<{
93
+ minX: z.ZodNumber;
94
+ minY: z.ZodNumber;
95
+ maxX: z.ZodNumber;
96
+ maxY: z.ZodNumber;
97
+ width: z.ZodNumber;
98
+ height: z.ZodNumber;
99
+ aspectRatio: z.ZodNumber;
100
+ }, z.core.$strip>>;
101
+ createdAt: z.ZodString;
102
+ updatedAt: z.ZodString;
37
103
  }, z.core.$strip>;
38
104
  }, z.core.$strip>;
39
105
  export declare const projectSchema: z.ZodObject<{
@@ -60,9 +126,25 @@ export declare const createProjectRequestSchema: z.ZodObject<{
60
126
  workspace: "workspace";
61
127
  }>>;
62
128
  }, z.core.$strip>;
129
+ export declare const updateProjectRequestSchema: z.ZodObject<{
130
+ name: z.ZodOptional<z.ZodString>;
131
+ visibility: z.ZodOptional<z.ZodEnum<{
132
+ private: "private";
133
+ workspace: "workspace";
134
+ }>>;
135
+ status: z.ZodOptional<z.ZodEnum<{
136
+ deleted: "deleted";
137
+ active: "active";
138
+ archived: "archived";
139
+ }>>;
140
+ }, z.core.$strip>;
63
141
  export type CreateProjectRequest = z.input<typeof createProjectRequestSchema>;
142
+ export type UpdateProjectRequest = z.infer<typeof updateProjectRequestSchema>;
143
+ export type LedBounds = z.infer<typeof ledBoundsSchema>;
64
144
  export type LedMap = z.infer<typeof ledMapSchema>;
145
+ export type LedMapResponse = z.infer<typeof ledMapResponseSchema>;
65
146
  export type LedPanel = z.infer<typeof ledPanelSchema>;
147
+ export type UpdateLedMapRequest = z.infer<typeof updateLedMapRequestSchema>;
66
148
  export type Project = z.infer<typeof projectSchema>;
67
149
  export type ProjectStatus = z.infer<typeof projectStatusSchema>;
68
150
  export type ProjectVisibility = z.infer<typeof projectVisibilitySchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,uBAAuB;;;EAAmC,CAAA;AACvE,eAAO,MAAM,mBAAmB;;;;EAA4C,CAAA;AAE5E,eAAO,MAAM,cAAc;;;;;;;iBAOzB,CAAA;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;iBAYvB,CAAA;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;iBASxB,CAAA;AAEF,eAAO,MAAM,0BAA0B;;;;;;iBAGrC,CAAA;AAEF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAC7E,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AACjD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AACrD,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AACnD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAC/D,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA"}
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,eAAO,MAAM,uBAAuB;;;EAAmC,CAAA;AACvE,eAAO,MAAM,mBAAmB;;;;EAA4C,CAAA;AAE5E,eAAO,MAAM,cAAc;;;;;;;;;iBASzB,CAAA;AAEF,eAAO,MAAM,eAAe;;;;;;;;iBAQ1B,CAAA;AAMF,eAAO,MAAM,eAAe;;;;;;;;;kBAGgC,CAAA;AAsB5D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;iBAiCrB,CAAA;AAEJ,eAAO,MAAM,yBAAyB;;;;;;;;;;;;iBAGpC,CAAA;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAiC,CAAA;AAElE,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;iBASxB,CAAA;AAEF,eAAO,MAAM,0BAA0B;;;;;;iBAGrC,CAAA;AAEF,eAAO,MAAM,0BAA0B;;;;;;;;;;;iBASpC,CAAA;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAC7E,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAA;AAC7E,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AACvD,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAA;AACjD,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AACjE,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AACrD,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAC3E,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAA;AACnD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAC/D,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAA"}
package/dist/projects.js CHANGED
@@ -1,28 +1,86 @@
1
1
  import { z } from 'zod';
2
- import { idSchema, isoDateSchema } from './common.js';
2
+ import { apiSuccessSchema, idSchema, isoDateSchema } from './common.js';
3
3
  export const projectVisibilitySchema = z.enum(['private', 'workspace']);
4
4
  export const projectStatusSchema = z.enum(['active', 'archived', 'deleted']);
5
5
  export const ledPanelSchema = z.object({
6
- id: z.string().min(1),
7
- name: z.string().min(1),
8
- width: z.number().int().positive(),
9
- height: z.number().int().positive(),
10
- x: z.number().int(),
11
- y: z.number().int()
6
+ id: z.string().trim().min(1).max(80),
7
+ name: z.string().trim().min(1).max(120),
8
+ width: z.number().int().positive().max(100000),
9
+ height: z.number().int().positive().max(100000),
10
+ x: z.number().int().min(-1000000).max(1000000),
11
+ y: z.number().int().min(-1000000).max(1000000),
12
+ color: z.string().trim().min(1).max(64).optional(),
13
+ showLabel: z.boolean().optional()
14
+ });
15
+ export const ledBoundsSchema = z.object({
16
+ minX: z.number(),
17
+ minY: z.number(),
18
+ maxX: z.number(),
19
+ maxY: z.number(),
20
+ width: z.number().positive(),
21
+ height: z.number().positive(),
22
+ aspectRatio: z.number().positive()
12
23
  });
13
- export const ledMapSchema = z.object({
24
+ function hasUniquePanelIds(panels) {
25
+ return new Set(panels.map((panel) => panel.id)).size === panels.length;
26
+ }
27
+ export const ledPanelsSchema = z
28
+ .array(ledPanelSchema)
29
+ .max(200)
30
+ .refine(hasUniquePanelIds, 'LED panel ids must be unique');
31
+ function boundsMatchPanels(bounds, panels) {
32
+ const minX = Math.min(...panels.map((panel) => panel.x));
33
+ const minY = Math.min(...panels.map((panel) => panel.y));
34
+ const maxX = Math.max(...panels.map((panel) => panel.x + panel.width));
35
+ const maxY = Math.max(...panels.map((panel) => panel.y + panel.height));
36
+ const width = maxX - minX;
37
+ const height = maxY - minY;
38
+ const aspectRatio = width / height;
39
+ return (bounds.minX === minX &&
40
+ bounds.minY === minY &&
41
+ bounds.maxX === maxX &&
42
+ bounds.maxY === maxY &&
43
+ bounds.width === width &&
44
+ bounds.height === height &&
45
+ Math.abs(bounds.aspectRatio - aspectRatio) < 1e-9);
46
+ }
47
+ export const ledMapSchema = z
48
+ .object({
49
+ projectId: idSchema,
14
50
  version: z.number().int().nonnegative(),
15
- panels: z.array(ledPanelSchema),
16
- bounds: z.object({
17
- minX: z.number(),
18
- minY: z.number(),
19
- maxX: z.number(),
20
- maxY: z.number(),
21
- width: z.number().positive(),
22
- height: z.number().positive(),
23
- aspectRatio: z.number().positive()
24
- })
51
+ panels: ledPanelsSchema,
52
+ bounds: ledBoundsSchema.nullable(),
53
+ createdAt: isoDateSchema,
54
+ updatedAt: isoDateSchema
55
+ })
56
+ .superRefine((map, context) => {
57
+ if (map.panels.length === 0 && map.bounds !== null) {
58
+ context.addIssue({
59
+ code: 'custom',
60
+ path: ['bounds'],
61
+ message: 'Empty LED maps must have null bounds'
62
+ });
63
+ }
64
+ if (map.panels.length > 0 && map.bounds === null) {
65
+ context.addIssue({
66
+ code: 'custom',
67
+ path: ['bounds'],
68
+ message: 'Non-empty LED maps must include bounds'
69
+ });
70
+ }
71
+ if (map.panels.length > 0 && map.bounds !== null && !boundsMatchPanels(map.bounds, map.panels)) {
72
+ context.addIssue({
73
+ code: 'custom',
74
+ path: ['bounds'],
75
+ message: 'LED map bounds must match panels'
76
+ });
77
+ }
78
+ });
79
+ export const updateLedMapRequestSchema = z.object({
80
+ expectedVersion: z.number().int().nonnegative(),
81
+ panels: ledPanelsSchema
25
82
  });
83
+ export const ledMapResponseSchema = apiSuccessSchema(ledMapSchema);
26
84
  export const projectSchema = z.object({
27
85
  id: idSchema,
28
86
  workspaceId: idSchema,
@@ -37,3 +95,10 @@ export const createProjectRequestSchema = z.object({
37
95
  name: z.string().min(1).max(120),
38
96
  visibility: projectVisibilitySchema.default('private')
39
97
  });
98
+ export const updateProjectRequestSchema = z
99
+ .object({
100
+ name: z.string().min(1).max(120).optional(),
101
+ visibility: projectVisibilitySchema.optional(),
102
+ status: projectStatusSchema.optional()
103
+ })
104
+ .refine((input) => input.name !== undefined || input.visibility !== undefined || input.status !== undefined, 'At least one field is required');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anuragpal02/zcl-contracts",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -15,7 +15,9 @@
15
15
  "import": "./dist/client.js"
16
16
  }
17
17
  },
18
- "files": ["dist"],
18
+ "files": [
19
+ "dist"
20
+ ],
19
21
  "publishConfig": {
20
22
  "access": "public",
21
23
  "registry": "https://registry.npmjs.org/"
@@ -23,6 +25,7 @@
23
25
  "scripts": {
24
26
  "prebuild": "node -e \"fs.rmSync('dist', { recursive: true, force: true })\"",
25
27
  "build": "tsc -p tsconfig.json",
28
+ "prepack": "npm run build",
26
29
  "test": "vitest run",
27
30
  "typecheck": "tsc -p tsconfig.json --noEmit"
28
31
  },