@bosunski/laravel-cloud-sdk 0.1.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.
@@ -0,0 +1,257 @@
1
+ import { z } from 'zod';
2
+ import { createJsonApiCollectionSchema, createJsonApiResponseSchema, JsonApiResourceSchema, } from '../types/jsonApi.js';
3
+ const instanceAttributesSchema = z
4
+ .object({
5
+ name: z.string(),
6
+ type: z.string(),
7
+ size: z.string(),
8
+ scaling_type: z.string(),
9
+ min_replicas: z.number(),
10
+ max_replicas: z.number(),
11
+ uses_scheduler: z.boolean(),
12
+ uses_sleep_mode: z.boolean().optional(),
13
+ sleep_timeout: z.number().nullable().optional(),
14
+ uses_octane: z.boolean().optional(),
15
+ uses_inertia_ssr: z.boolean().optional(),
16
+ scaling_cpu_threshold_percentage: z.number().nullable().optional(),
17
+ scaling_memory_threshold_percentage: z.number().nullable().optional(),
18
+ created_at: z.string(),
19
+ })
20
+ .passthrough();
21
+ const instanceResourceSchema = JsonApiResourceSchema.extend({
22
+ type: z.literal('instances'),
23
+ attributes: instanceAttributesSchema,
24
+ });
25
+ const instanceResponseSchema = createJsonApiResponseSchema(instanceResourceSchema);
26
+ const instanceCollectionSchema = createJsonApiCollectionSchema(instanceResourceSchema);
27
+ const backgroundProcessSchema = z
28
+ .object({
29
+ type: z.string(),
30
+ processes: z.number().min(1),
31
+ command: z.string().optional(),
32
+ config: z.record(z.string(), z.any()).optional(),
33
+ })
34
+ .strict();
35
+ const mapInstance = (resource) => {
36
+ const parsed = instanceResourceSchema.parse(resource);
37
+ const { attributes } = parsed;
38
+ return {
39
+ id: parsed.id,
40
+ name: attributes.name,
41
+ type: attributes.type,
42
+ size: attributes.size,
43
+ scalingType: attributes.scaling_type,
44
+ minReplicas: attributes.min_replicas,
45
+ maxReplicas: attributes.max_replicas,
46
+ usesScheduler: attributes.uses_scheduler,
47
+ usesSleepMode: attributes.uses_sleep_mode,
48
+ sleepTimeout: attributes.sleep_timeout ?? null,
49
+ usesOctane: attributes.uses_octane,
50
+ usesInertiaSsr: attributes.uses_inertia_ssr,
51
+ scalingCpuThresholdPercentage: attributes.scaling_cpu_threshold_percentage ?? null,
52
+ scalingMemoryThresholdPercentage: attributes.scaling_memory_threshold_percentage ?? null,
53
+ createdAt: attributes.created_at,
54
+ raw: parsed,
55
+ };
56
+ };
57
+ const serializeInstanceList = (response) => ({
58
+ data: response.data.map(mapInstance),
59
+ included: response.included,
60
+ meta: response.meta,
61
+ links: response.links,
62
+ });
63
+ const serializeInstanceResponse = (response) => ({
64
+ data: mapInstance(response.data),
65
+ included: response.included,
66
+ meta: response.meta,
67
+ links: response.links,
68
+ });
69
+ const createInstanceSchema = z
70
+ .object({
71
+ name: z.string().min(3).max(40),
72
+ type: z.string(),
73
+ size: z.string(),
74
+ scalingType: z.string(),
75
+ maxReplicas: z.number().min(1),
76
+ minReplicas: z.number().min(1),
77
+ usesScheduler: z.boolean(),
78
+ usesSleepMode: z.boolean().optional(),
79
+ sleepTimeout: z.number().optional(),
80
+ usesOctane: z.boolean().optional(),
81
+ usesInertiaSsr: z.boolean().optional(),
82
+ scalingCpuThresholdPercentage: z.number().min(50).max(95).nullable().optional(),
83
+ scalingMemoryThresholdPercentage: z
84
+ .number()
85
+ .min(50)
86
+ .max(95)
87
+ .nullable()
88
+ .optional(),
89
+ backgroundProcesses: z.array(backgroundProcessSchema).optional(),
90
+ })
91
+ .strict();
92
+ const updateInstanceSchema = z
93
+ .object({
94
+ name: z.string().min(3).max(40).optional(),
95
+ size: z.string().optional(),
96
+ scalingType: z.string().optional(),
97
+ maxReplicas: z.number().min(1).optional(),
98
+ minReplicas: z.number().min(1).optional(),
99
+ usesScheduler: z.boolean().optional(),
100
+ usesSleepMode: z.boolean().optional(),
101
+ sleepTimeout: z.number().optional(),
102
+ usesOctane: z.boolean().optional(),
103
+ usesInertiaSsr: z.boolean().optional(),
104
+ scalingCpuThresholdPercentage: z
105
+ .number()
106
+ .min(50)
107
+ .max(95)
108
+ .nullable()
109
+ .optional(),
110
+ scalingMemoryThresholdPercentage: z
111
+ .number()
112
+ .min(50)
113
+ .max(95)
114
+ .nullable()
115
+ .optional(),
116
+ backgroundProcesses: z.array(backgroundProcessSchema).optional(),
117
+ })
118
+ .strict();
119
+ const mapBackgroundProcesses = (processes) => processes?.map((process) => ({
120
+ type: process.type,
121
+ processes: process.processes,
122
+ command: process.command,
123
+ config: process.config,
124
+ }));
125
+ const mapCreatePayload = (payload) => {
126
+ const body = {
127
+ name: payload.name,
128
+ type: payload.type,
129
+ size: payload.size,
130
+ scaling_type: payload.scalingType,
131
+ max_replicas: payload.maxReplicas,
132
+ min_replicas: payload.minReplicas,
133
+ uses_scheduler: payload.usesScheduler,
134
+ };
135
+ if (payload.usesSleepMode !== undefined) {
136
+ body.uses_sleep_mode = payload.usesSleepMode;
137
+ }
138
+ if (payload.sleepTimeout !== undefined) {
139
+ body.sleep_timeout = payload.sleepTimeout;
140
+ }
141
+ if (payload.usesOctane !== undefined) {
142
+ body.uses_octane = payload.usesOctane;
143
+ }
144
+ if (payload.usesInertiaSsr !== undefined) {
145
+ body.uses_inertia_ssr = payload.usesInertiaSsr;
146
+ }
147
+ if (payload.scalingCpuThresholdPercentage !== undefined) {
148
+ body.scaling_cpu_threshold_percentage = payload.scalingCpuThresholdPercentage;
149
+ }
150
+ if (payload.scalingMemoryThresholdPercentage !== undefined) {
151
+ body.scaling_memory_threshold_percentage =
152
+ payload.scalingMemoryThresholdPercentage;
153
+ }
154
+ if (payload.backgroundProcesses) {
155
+ body.background_processes = mapBackgroundProcesses(payload.backgroundProcesses);
156
+ }
157
+ return body;
158
+ };
159
+ const mapUpdatePayload = (payload) => {
160
+ const body = {};
161
+ const assign = (key, value) => {
162
+ if (value !== undefined) {
163
+ body[key] = value;
164
+ }
165
+ };
166
+ assign('name', payload.name);
167
+ assign('size', payload.size);
168
+ assign('scaling_type', payload.scalingType);
169
+ assign('max_replicas', payload.maxReplicas);
170
+ assign('min_replicas', payload.minReplicas);
171
+ assign('uses_scheduler', payload.usesScheduler);
172
+ assign('uses_sleep_mode', payload.usesSleepMode);
173
+ assign('sleep_timeout', payload.sleepTimeout);
174
+ assign('uses_octane', payload.usesOctane);
175
+ assign('uses_inertia_ssr', payload.usesInertiaSsr);
176
+ assign('scaling_cpu_threshold_percentage', payload.scalingCpuThresholdPercentage);
177
+ assign('scaling_memory_threshold_percentage', payload.scalingMemoryThresholdPercentage);
178
+ if (payload.backgroundProcesses) {
179
+ assign('background_processes', mapBackgroundProcesses(payload.backgroundProcesses));
180
+ }
181
+ return body;
182
+ };
183
+ export class InstancesResource {
184
+ client;
185
+ constructor(client) {
186
+ this.client = client;
187
+ }
188
+ async list(environmentId, options) {
189
+ const query = {};
190
+ if (options?.include?.length) {
191
+ query.include = options.include.join(',');
192
+ }
193
+ if (options?.filter?.name) {
194
+ query['filter[name]'] = options.filter.name;
195
+ }
196
+ if (options?.filter?.type) {
197
+ query['filter[type]'] = options.filter.type;
198
+ }
199
+ if (options?.filter?.size) {
200
+ query['filter[size]'] = options.filter.size;
201
+ }
202
+ if (options?.filter?.scalingType) {
203
+ query['filter[scaling_type]'] = options.filter.scalingType;
204
+ }
205
+ if (options?.page?.number !== undefined) {
206
+ query['page[number]'] = options.page.number;
207
+ }
208
+ if (options?.page?.size !== undefined) {
209
+ query['page[size]'] = options.page.size;
210
+ }
211
+ const response = await this.client.request({
212
+ path: `/environments/${environmentId}/instances`,
213
+ method: 'GET',
214
+ query,
215
+ schema: instanceCollectionSchema,
216
+ });
217
+ return serializeInstanceList(response);
218
+ }
219
+ async create(environmentId, payload) {
220
+ const parsedPayload = createInstanceSchema.parse(payload);
221
+ const response = await this.client.request({
222
+ path: `/environments/${environmentId}/instances`,
223
+ method: 'POST',
224
+ json: mapCreatePayload(parsedPayload),
225
+ schema: instanceResponseSchema,
226
+ });
227
+ return serializeInstanceResponse(response);
228
+ }
229
+ async retrieve(instanceId, options) {
230
+ const query = options?.include?.length
231
+ ? { include: options.include.join(',') }
232
+ : undefined;
233
+ const response = await this.client.request({
234
+ path: `/instances/${instanceId}`,
235
+ method: 'GET',
236
+ query,
237
+ schema: instanceResponseSchema,
238
+ });
239
+ return serializeInstanceResponse(response);
240
+ }
241
+ async update(instanceId, payload) {
242
+ const parsedPayload = updateInstanceSchema.parse(payload);
243
+ const response = await this.client.request({
244
+ path: `/instances/${instanceId}`,
245
+ method: 'PATCH',
246
+ json: mapUpdatePayload(parsedPayload),
247
+ schema: instanceResponseSchema,
248
+ });
249
+ return serializeInstanceResponse(response);
250
+ }
251
+ async delete(instanceId) {
252
+ await this.client.request({
253
+ path: `/instances/${instanceId}`,
254
+ method: 'DELETE',
255
+ });
256
+ }
257
+ }
@@ -0,0 +1,211 @@
1
+ import { z } from 'zod';
2
+ export declare const JsonApiLinkSchema: z.ZodObject<{
3
+ href: z.ZodOptional<z.ZodString>;
4
+ rel: z.ZodOptional<z.ZodString>;
5
+ describedby: z.ZodOptional<z.ZodString>;
6
+ title: z.ZodOptional<z.ZodString>;
7
+ type: z.ZodOptional<z.ZodString>;
8
+ hreflang: z.ZodOptional<z.ZodString>;
9
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
10
+ }, z.core.$loose>;
11
+ export declare const JsonApiResourceIdentifierSchema: z.ZodObject<{
12
+ type: z.ZodString;
13
+ id: z.ZodString;
14
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
15
+ }, z.core.$strip>;
16
+ export declare const JsonApiRelationshipSchema: z.ZodObject<{
17
+ data: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
18
+ type: z.ZodString;
19
+ id: z.ZodString;
20
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
21
+ }, z.core.$strip>, z.ZodArray<z.ZodObject<{
22
+ type: z.ZodString;
23
+ id: z.ZodString;
24
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
25
+ }, z.core.$strip>>]>>;
26
+ links: z.ZodOptional<z.ZodObject<{
27
+ related: z.ZodOptional<z.ZodObject<{
28
+ href: z.ZodOptional<z.ZodString>;
29
+ rel: z.ZodOptional<z.ZodString>;
30
+ describedby: z.ZodOptional<z.ZodString>;
31
+ title: z.ZodOptional<z.ZodString>;
32
+ type: z.ZodOptional<z.ZodString>;
33
+ hreflang: z.ZodOptional<z.ZodString>;
34
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
35
+ }, z.core.$loose>>;
36
+ self: z.ZodOptional<z.ZodObject<{
37
+ href: z.ZodOptional<z.ZodString>;
38
+ rel: z.ZodOptional<z.ZodString>;
39
+ describedby: z.ZodOptional<z.ZodString>;
40
+ title: z.ZodOptional<z.ZodString>;
41
+ type: z.ZodOptional<z.ZodString>;
42
+ hreflang: z.ZodOptional<z.ZodString>;
43
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
44
+ }, z.core.$loose>>;
45
+ }, z.core.$strip>>;
46
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
47
+ }, z.core.$loose>;
48
+ export declare const JsonApiResourceSchema: z.ZodObject<{
49
+ id: z.ZodString;
50
+ type: z.ZodString;
51
+ attributes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
52
+ relationships: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
53
+ data: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
54
+ type: z.ZodString;
55
+ id: z.ZodString;
56
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
57
+ }, z.core.$strip>, z.ZodArray<z.ZodObject<{
58
+ type: z.ZodString;
59
+ id: z.ZodString;
60
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
61
+ }, z.core.$strip>>]>>;
62
+ links: z.ZodOptional<z.ZodObject<{
63
+ related: z.ZodOptional<z.ZodObject<{
64
+ href: z.ZodOptional<z.ZodString>;
65
+ rel: z.ZodOptional<z.ZodString>;
66
+ describedby: z.ZodOptional<z.ZodString>;
67
+ title: z.ZodOptional<z.ZodString>;
68
+ type: z.ZodOptional<z.ZodString>;
69
+ hreflang: z.ZodOptional<z.ZodString>;
70
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
71
+ }, z.core.$loose>>;
72
+ self: z.ZodOptional<z.ZodObject<{
73
+ href: z.ZodOptional<z.ZodString>;
74
+ rel: z.ZodOptional<z.ZodString>;
75
+ describedby: z.ZodOptional<z.ZodString>;
76
+ title: z.ZodOptional<z.ZodString>;
77
+ type: z.ZodOptional<z.ZodString>;
78
+ hreflang: z.ZodOptional<z.ZodString>;
79
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
80
+ }, z.core.$loose>>;
81
+ }, z.core.$strip>>;
82
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
83
+ }, z.core.$loose>>>;
84
+ links: z.ZodOptional<z.ZodObject<{
85
+ self: z.ZodOptional<z.ZodObject<{
86
+ href: z.ZodOptional<z.ZodString>;
87
+ rel: z.ZodOptional<z.ZodString>;
88
+ describedby: z.ZodOptional<z.ZodString>;
89
+ title: z.ZodOptional<z.ZodString>;
90
+ type: z.ZodOptional<z.ZodString>;
91
+ hreflang: z.ZodOptional<z.ZodString>;
92
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
93
+ }, z.core.$loose>>;
94
+ }, z.core.$strip>>;
95
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
96
+ }, z.core.$loose>;
97
+ export declare const createJsonApiResponseSchema: <TSchema extends z.ZodTypeAny>(schema: TSchema) => z.ZodObject<{
98
+ data: TSchema;
99
+ included: z.ZodOptional<z.ZodArray<z.ZodObject<{
100
+ id: z.ZodString;
101
+ type: z.ZodString;
102
+ attributes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
103
+ relationships: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
104
+ data: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
105
+ type: z.ZodString;
106
+ id: z.ZodString;
107
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
108
+ }, z.core.$strip>, z.ZodArray<z.ZodObject<{
109
+ type: z.ZodString;
110
+ id: z.ZodString;
111
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
112
+ }, z.core.$strip>>]>>;
113
+ links: z.ZodOptional<z.ZodObject<{
114
+ related: z.ZodOptional<z.ZodObject<{
115
+ href: z.ZodOptional<z.ZodString>;
116
+ rel: z.ZodOptional<z.ZodString>;
117
+ describedby: z.ZodOptional<z.ZodString>;
118
+ title: z.ZodOptional<z.ZodString>;
119
+ type: z.ZodOptional<z.ZodString>;
120
+ hreflang: z.ZodOptional<z.ZodString>;
121
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
122
+ }, z.core.$loose>>;
123
+ self: z.ZodOptional<z.ZodObject<{
124
+ href: z.ZodOptional<z.ZodString>;
125
+ rel: z.ZodOptional<z.ZodString>;
126
+ describedby: z.ZodOptional<z.ZodString>;
127
+ title: z.ZodOptional<z.ZodString>;
128
+ type: z.ZodOptional<z.ZodString>;
129
+ hreflang: z.ZodOptional<z.ZodString>;
130
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
131
+ }, z.core.$loose>>;
132
+ }, z.core.$strip>>;
133
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
134
+ }, z.core.$loose>>>;
135
+ links: z.ZodOptional<z.ZodObject<{
136
+ self: z.ZodOptional<z.ZodObject<{
137
+ href: z.ZodOptional<z.ZodString>;
138
+ rel: z.ZodOptional<z.ZodString>;
139
+ describedby: z.ZodOptional<z.ZodString>;
140
+ title: z.ZodOptional<z.ZodString>;
141
+ type: z.ZodOptional<z.ZodString>;
142
+ hreflang: z.ZodOptional<z.ZodString>;
143
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
144
+ }, z.core.$loose>>;
145
+ }, z.core.$strip>>;
146
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
147
+ }, z.core.$loose>>>;
148
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
149
+ links: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
150
+ }, z.core.$strip>;
151
+ export declare const createJsonApiCollectionSchema: <TSchema extends z.ZodTypeAny>(schema: TSchema) => z.ZodObject<{
152
+ data: z.ZodArray<TSchema>;
153
+ included: z.ZodOptional<z.ZodArray<z.ZodObject<{
154
+ id: z.ZodString;
155
+ type: z.ZodString;
156
+ attributes: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
157
+ relationships: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
158
+ data: z.ZodOptional<z.ZodUnion<readonly [z.ZodObject<{
159
+ type: z.ZodString;
160
+ id: z.ZodString;
161
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
162
+ }, z.core.$strip>, z.ZodArray<z.ZodObject<{
163
+ type: z.ZodString;
164
+ id: z.ZodString;
165
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
166
+ }, z.core.$strip>>]>>;
167
+ links: z.ZodOptional<z.ZodObject<{
168
+ related: z.ZodOptional<z.ZodObject<{
169
+ href: z.ZodOptional<z.ZodString>;
170
+ rel: z.ZodOptional<z.ZodString>;
171
+ describedby: z.ZodOptional<z.ZodString>;
172
+ title: z.ZodOptional<z.ZodString>;
173
+ type: z.ZodOptional<z.ZodString>;
174
+ hreflang: z.ZodOptional<z.ZodString>;
175
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
176
+ }, z.core.$loose>>;
177
+ self: z.ZodOptional<z.ZodObject<{
178
+ href: z.ZodOptional<z.ZodString>;
179
+ rel: z.ZodOptional<z.ZodString>;
180
+ describedby: z.ZodOptional<z.ZodString>;
181
+ title: z.ZodOptional<z.ZodString>;
182
+ type: z.ZodOptional<z.ZodString>;
183
+ hreflang: z.ZodOptional<z.ZodString>;
184
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
185
+ }, z.core.$loose>>;
186
+ }, z.core.$strip>>;
187
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
188
+ }, z.core.$loose>>>;
189
+ links: z.ZodOptional<z.ZodObject<{
190
+ self: z.ZodOptional<z.ZodObject<{
191
+ href: z.ZodOptional<z.ZodString>;
192
+ rel: z.ZodOptional<z.ZodString>;
193
+ describedby: z.ZodOptional<z.ZodString>;
194
+ title: z.ZodOptional<z.ZodString>;
195
+ type: z.ZodOptional<z.ZodString>;
196
+ hreflang: z.ZodOptional<z.ZodString>;
197
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
198
+ }, z.core.$loose>>;
199
+ }, z.core.$strip>>;
200
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
201
+ }, z.core.$loose>>>;
202
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
203
+ links: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
204
+ }, z.core.$strip>;
205
+ export type JsonApiResource = z.infer<typeof JsonApiResourceSchema>;
206
+ export type JsonApiResponse<T> = {
207
+ data: T;
208
+ included?: JsonApiResource[];
209
+ meta?: Record<string, unknown>;
210
+ links?: Record<string, unknown>;
211
+ };
@@ -0,0 +1,57 @@
1
+ import { z } from 'zod';
2
+ export const JsonApiLinkSchema = z
3
+ .object({
4
+ href: z.string().optional(),
5
+ rel: z.string().optional(),
6
+ describedby: z.string().optional(),
7
+ title: z.string().optional(),
8
+ type: z.string().optional(),
9
+ hreflang: z.string().optional(),
10
+ meta: z.record(z.string(), z.any()).optional(),
11
+ })
12
+ .passthrough();
13
+ export const JsonApiResourceIdentifierSchema = z.object({
14
+ type: z.string(),
15
+ id: z.string(),
16
+ meta: z.record(z.string(), z.any()).optional(),
17
+ });
18
+ export const JsonApiRelationshipSchema = z
19
+ .object({
20
+ data: z
21
+ .union([
22
+ JsonApiResourceIdentifierSchema,
23
+ z.array(JsonApiResourceIdentifierSchema),
24
+ ])
25
+ .optional(),
26
+ links: z
27
+ .object({
28
+ related: JsonApiLinkSchema.optional(),
29
+ self: JsonApiLinkSchema.optional(),
30
+ })
31
+ .optional(),
32
+ meta: z.record(z.string(), z.any()).optional(),
33
+ })
34
+ .passthrough();
35
+ export const JsonApiResourceSchema = z
36
+ .object({
37
+ id: z.string(),
38
+ type: z.string(),
39
+ attributes: z.record(z.string(), z.any()).optional(),
40
+ relationships: z
41
+ .record(z.string(), JsonApiRelationshipSchema)
42
+ .optional(),
43
+ links: z
44
+ .object({
45
+ self: JsonApiLinkSchema.optional(),
46
+ })
47
+ .optional(),
48
+ meta: z.record(z.string(), z.any()).optional(),
49
+ })
50
+ .passthrough();
51
+ export const createJsonApiResponseSchema = (schema) => z.object({
52
+ data: schema,
53
+ included: z.array(JsonApiResourceSchema).optional(),
54
+ meta: z.record(z.string(), z.any()).optional(),
55
+ links: z.record(z.string(), z.any()).optional(),
56
+ });
57
+ export const createJsonApiCollectionSchema = (schema) => createJsonApiResponseSchema(z.array(schema));
@@ -0,0 +1,4 @@
1
+ export type QueryPrimitive = string | number | boolean | null | undefined;
2
+ export type QueryValue = QueryPrimitive | QueryPrimitive[];
3
+ export type QueryParams = Record<string, QueryValue> | undefined;
4
+ export declare const buildSearchParams: (query: QueryParams) => string;
@@ -0,0 +1,29 @@
1
+ const normalizeValue = (value) => {
2
+ if (value === null || value === undefined) {
3
+ return null;
4
+ }
5
+ return typeof value === 'string' ? value : String(value);
6
+ };
7
+ export const buildSearchParams = (query) => {
8
+ if (!query) {
9
+ return '';
10
+ }
11
+ const params = new URLSearchParams();
12
+ for (const [key, rawValue] of Object.entries(query)) {
13
+ if (Array.isArray(rawValue)) {
14
+ for (const item of rawValue) {
15
+ const normalized = normalizeValue(item);
16
+ if (normalized !== null) {
17
+ params.append(key, normalized);
18
+ }
19
+ }
20
+ continue;
21
+ }
22
+ const normalized = normalizeValue(rawValue);
23
+ if (normalized !== null) {
24
+ params.append(key, normalized);
25
+ }
26
+ }
27
+ const serialized = params.toString();
28
+ return serialized ? `?${serialized}` : '';
29
+ };
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@bosunski/laravel-cloud-sdk",
3
+ "version": "0.1.1",
4
+ "description": "TypeScript client for the Laravel Cloud API",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "unpkg": "./dist/index.js",
10
+ "jsdelivr": "./dist/index.js",
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "keywords": [
21
+ "laravel",
22
+ "cloud",
23
+ "sdk",
24
+ "api",
25
+ "typescript"
26
+ ],
27
+ "author": "Bosun Egberinde",
28
+ "license": "MIT",
29
+ "dependencies": {
30
+ "zod": "^4.1.12"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "^20.12.12",
34
+ "typescript": "^5.4.0",
35
+ "vitest": "^1.2.0"
36
+ },
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "engines": {
41
+ "node": ">=18"
42
+ },
43
+ "scripts": {
44
+ "build": "tsc -p tsconfig.json",
45
+ "typecheck": "tsc --noEmit",
46
+ "test": "vitest run",
47
+ "release": "pnpm version patch && pnpm run typecheck && pnpm run test && pnpm run build && pnpm publish --access public"
48
+ }
49
+ }