@@ -2,7 +2,7 @@ import fs from 'node:fs';
2
2
import axios , { AxiosResponse } from 'axios' ;
3
3
import FormData from 'form-data' ;
4
4
import jwt from 'jsonwebtoken' ;
5
- import * as S from 'microstruct ' ;
5
+ import { z } from 'zod ' ;
6
6
7
7
export class UpdateAddonError extends Error {
8
8
constructor ( message : string ) {
@@ -89,12 +89,12 @@ function throwBadResponse(path: string, response: AxiosResponse): never {
89
89
90
90
type APIParams = Pick < UpdateAddonParams , 'apiKey' | 'apiSecret' | 'baseURL' > ;
91
91
92
- async function apiFetch < T > (
92
+ async function apiFetch < T , Schema extends z . ZodType < T > > (
93
93
{ apiKey, apiSecret, baseURL } : Readonly < APIParams > ,
94
94
method : string ,
95
95
path : string ,
96
96
body : Readonly < Record < string , unknown > > | FormData | null ,
97
- validator : S . Struct < T > ,
97
+ schema : Schema ,
98
98
) : Promise < T > {
99
99
try {
100
100
const response = await axios ( {
@@ -105,10 +105,11 @@ async function apiFetch<T>(
105
105
} ,
106
106
data : body ,
107
107
} ) ;
108
- if ( ! S . is ( response . data , validator ) ) {
108
+ const result = schema . safeParse ( response . data ) ;
109
+ if ( ! result . success ) {
109
110
throwBadResponse ( path , response ) ;
110
111
}
111
- return response . data ;
112
+ return result . data ;
112
113
} catch ( error : unknown ) {
113
114
if ( axios . isAxiosError ( error ) && error . response ) {
114
115
throwBadResponse ( path , error . response ) ;
@@ -118,14 +119,14 @@ async function apiFetch<T>(
118
119
}
119
120
}
120
121
121
- const uploadStruct = S . type ( {
122
- uuid : S . string ( ) ,
123
- processed : S . boolean ( ) ,
124
- valid : S . boolean ( ) ,
125
- validation : S . nullable ( S . record ( S . string ( ) , S . unknown ( ) ) ) ,
122
+ const uploadSchema = z . object ( {
123
+ uuid : z . string ( ) ,
124
+ processed : z . boolean ( ) ,
125
+ valid : z . boolean ( ) ,
126
+ validation : z . record ( z . string ( ) , z . unknown ( ) ) . nullable ( ) ,
126
127
} ) ;
127
128
128
- type Upload = S . Infer < typeof uploadStruct > ;
129
+ type Upload = z . infer < typeof uploadSchema > ;
129
130
130
131
function createUpload (
131
132
apiParams : Readonly < APIParams > ,
@@ -134,16 +135,16 @@ function createUpload(
134
135
const formData = new FormData ( ) ;
135
136
formData . append ( 'upload' , upload ) ;
136
137
formData . append ( 'channel' , channel ) ;
137
- return apiFetch ( apiParams , 'POST' , 'upload/' , formData , uploadStruct ) ;
138
+ return apiFetch ( apiParams , 'POST' , 'upload/' , formData , uploadSchema ) ;
138
139
}
139
140
140
141
function getUpload ( apiParams : Readonly < APIParams > , uuid : string ) : Promise < Upload > {
141
- return apiFetch ( apiParams , 'GET' , `upload/${ uuid } /` , null , uploadStruct ) ;
142
+ return apiFetch ( apiParams , 'GET' , `upload/${ uuid } /` , null , uploadSchema ) ;
142
143
}
143
144
144
- const versionStruct = S . type ( { id : S . number ( ) } ) ;
145
+ const versionSchema = z . object ( { id : z . number ( ) } ) ;
145
146
146
- type Version = S . Infer < typeof versionStruct > ;
147
+ type Version = z . infer < typeof versionSchema > ;
147
148
148
149
function createVersion (
149
150
apiParams : Readonly < APIParams > ,
@@ -155,7 +156,7 @@ function createVersion(
155
156
release_notes ?: Readonly < Record < string , string > > ;
156
157
} > ,
157
158
) : Promise < Version > {
158
- return apiFetch ( apiParams , 'POST' , `addon/${ addonId } /versions/` , body , versionStruct ) ;
159
+ return apiFetch ( apiParams , 'POST' , `addon/${ addonId } /versions/` , body , versionSchema ) ;
159
160
}
160
161
161
162
function patchVersion (
@@ -166,7 +167,7 @@ function patchVersion(
166
167
) : Promise < Version > {
167
168
const formData = new FormData ( ) ;
168
169
formData . append ( 'source' , source ) ;
169
- return apiFetch ( apiParams , 'PATCH' , `addon/${ addonId } /versions/${ id } /` , formData , versionStruct ) ;
170
+ return apiFetch ( apiParams , 'PATCH' , `addon/${ addonId } /versions/${ id } /` , formData , versionSchema ) ;
170
171
}
171
172
172
173
function waitForValidation ( apiParams : Readonly < APIParams > , uuid : string ) : Promise < void > {
@@ -176,7 +177,7 @@ function waitForValidation(apiParams: Readonly<APIParams>, uuid: string): Promis
176
177
if ( intervalId ) {
177
178
clearTimeout ( intervalId ) ;
178
179
}
179
- reject ( new UpdateAddonError ( 'Validation Timeout ' ) ) ;
180
+ reject ( new UpdateAddonError ( 'Validation timeout ' ) ) ;
180
181
} , 300000 ) ; // 5 minutes
181
182
const poll = ( ) =>
182
183
void getUpload ( apiParams , uuid )
@@ -186,7 +187,7 @@ function waitForValidation(apiParams: Readonly<APIParams>, uuid: string): Promis
186
187
if ( valid ) {
187
188
resolve ( ) ;
188
189
} else {
189
- reject ( new UpdateAddonError ( `Validation Error : ${ JSON . stringify ( validation ) } ` ) ) ;
190
+ reject ( new UpdateAddonError ( `Validation error : ${ JSON . stringify ( validation ) } ` ) ) ;
190
191
}
191
192
} else {
192
193
intervalId = setTimeout ( poll , 1000 ) ; // 1 second
0 commit comments