1- /* @flow strict */
2-
31import SelectorSet from 'selector-set'
42import formDataEntries from 'form-data-entries'
53
@@ -22,61 +20,60 @@ function serialize(form: HTMLFormElement): string {
2220class ErrorWithResponse extends Error {
2321 response : SimpleResponse
2422
25- constructor ( message , response ) {
23+ constructor ( message : string , response : SimpleResponse ) {
2624 super ( message )
2725 this . response = response
2826 }
2927}
3028
31- function makeDeferred < T > ( ) : [ Promise < T > , ( ) => T , ( ) => T ] {
32- let resolve
33- let reject
34- const promise = new Promise ( function ( _resolve , _reject ) {
29+ function makeDeferred < T > ( ) : [ Promise < T > , ( ) => void , ( ) => void ] {
30+ let resolve : ( ) => void
31+ let reject : ( ) => void
32+ const promise = new Promise ( function ( _resolve , _reject ) {
3533 resolve = _resolve
3634 reject = _reject
3735 } )
3836
39- // eslint-disable-next-line flowtype/no-flow-fix-me-comments
40- // $FlowFixMe
41- return [ promise , resolve , reject ]
37+ return [ promise as Promise < T > , resolve ! , reject ! ]
4238}
4339
44- type SimpleRequest = {
45- method : string ,
46- url : string ,
47- body : ? FormData ,
40+ interface SimpleRequest {
41+ method : string
42+ url : string
43+ body : FormData | null
4844 headers : Headers
4945}
5046
51- export type SimpleResponse = {
52- url : string ,
53- status : number ,
54- statusText : string ,
55- headers : Headers ,
56- text : string ,
57- // eslint-disable-next-line flowtype/no-weak-types
58- json : { [ string ] : any } ,
47+ export interface SimpleResponse {
48+ url : string
49+ status : number
50+ statusText : string
51+ headers : Headers
52+ text : string
53+ json : { [ key : string ] : unknown }
5954 html : DocumentFragment
6055}
6156
62- type Kicker = {
63- text : ( ) => Promise < SimpleResponse > ,
64- json : ( ) => Promise < SimpleResponse > ,
57+ interface Kicker {
58+ text : ( ) => Promise < SimpleResponse >
59+ json : ( ) => Promise < SimpleResponse >
6560 html : ( ) => Promise < SimpleResponse >
6661}
6762
6863export type RemoteFormHandler = ( form : HTMLFormElement , kicker : Kicker , req : SimpleRequest ) => void | Promise < void >
6964
70- let selectorSet : ? SelectorSet < RemoteFormHandler >
65+ let selectorSet : SelectorSet < RemoteFormHandler >
7166
72- const afterHandlers = [ ]
73- const beforeHandlers = [ ]
67+ type Handler = ( form : HTMLFormElement ) => void
7468
75- export function afterRemote ( fn : ( form : HTMLFormElement ) => mixed ) {
69+ const afterHandlers : Handler [ ] = [ ]
70+ const beforeHandlers : Handler [ ] = [ ]
71+
72+ export function afterRemote ( fn : Handler ) {
7673 afterHandlers . push ( fn )
7774}
7875
79- export function beforeRemote ( fn : ( form : HTMLFormElement ) => mixed ) {
76+ export function beforeRemote ( fn : Handler ) {
8077 beforeHandlers . push ( fn )
8178}
8279
@@ -105,11 +102,11 @@ function handleSubmit(event: Event) {
105102 }
106103
107104 const req = buildRequest ( form )
108- const [ kickerPromise , ultimateResolve , ultimateReject ] = makeDeferred ( )
105+ const [ kickerPromise , ultimateResolve , ultimateReject ] = makeDeferred < SimpleResponse > ( )
109106
110107 event . preventDefault ( )
111108 processHandlers ( matches , form , req , kickerPromise ) . then (
112- async performAsyncSubmit => {
109+ async ( performAsyncSubmit : unknown ) => {
113110 if ( performAsyncSubmit ) {
114111 for ( const handler of beforeHandlers ) {
115112 await handler ( form )
@@ -118,6 +115,7 @@ function handleSubmit(event: Event) {
118115 // TODO: ensure that these exceptions are processed by our global error handler
119116 remoteSubmit ( req )
120117 . then ( ultimateResolve , ultimateReject )
118+ // eslint-disable-next-line @typescript-eslint/no-empty-function
121119 . catch ( ( ) => { } )
122120 . then ( ( ) => {
123121 for ( const handler of afterHandlers ) {
@@ -129,7 +127,7 @@ function handleSubmit(event: Event) {
129127 form . submit ( )
130128 }
131129 } ,
132- err => {
130+ ( err : Error ) => {
133131 // TODO: special "cancel" error object to halt processing and avoid
134132 // submitting the form
135133 form . submit ( )
@@ -143,7 +141,7 @@ function handleSubmit(event: Event) {
143141// Process each handler sequentially until it either completes or calls the
144142// kicker function.
145143async function processHandlers (
146- matches : Array < * > ,
144+ matches : Array < { data : ( form : HTMLFormElement , kicker : Kicker , req : SimpleRequest ) => void } > ,
147145 form : HTMLFormElement ,
148146 req : SimpleRequest ,
149147 kickerPromise : Promise < SimpleResponse >
@@ -165,7 +163,7 @@ async function processHandlers(
165163 html : ( ) => {
166164 req . headers . set ( 'Accept' , 'text/html' )
167165 return kick ( )
168- }
166+ } ,
169167 }
170168 await Promise . race ( [ kickerCalled , match . data . call ( null , form , kicker , req ) ] )
171169 }
@@ -177,7 +175,7 @@ function buildRequest(form: HTMLFormElement): SimpleRequest {
177175 method : form . method || 'GET' ,
178176 url : form . action ,
179177 headers : new Headers ( { 'X-Requested-With' : 'XMLHttpRequest' } ) ,
180- body : null
178+ body : null ,
181179 }
182180
183181 if ( req . method . toUpperCase ( ) === 'GET' ) {
@@ -192,12 +190,12 @@ function buildRequest(form: HTMLFormElement): SimpleRequest {
192190 return req
193191}
194192
195- async function remoteSubmit ( req ) : Promise < SimpleResponse > {
193+ async function remoteSubmit ( req : SimpleRequest ) : Promise < SimpleResponse > {
196194 const response = await window . fetch ( req . url , {
197195 method : req . method ,
198196 body : req . body !== null ? req . body : undefined ,
199197 headers : req . headers ,
200- credentials : 'same-origin'
198+ credentials : 'same-origin' ,
201199 } )
202200
203201 const res : SimpleResponse = {
@@ -207,21 +205,21 @@ async function remoteSubmit(req): Promise<SimpleResponse> {
207205 headers : response . headers ,
208206 text : '' ,
209207 get json ( ) {
210- // eslint-disable-next-line no-shadow
208+ // eslint-disable-next-line no-shadow, @typescript-eslint/no-this-alias
211209 const response : SimpleResponse = this
212210 const data = JSON . parse ( response . text )
213211 delete response . json
214212 response . json = data
215213 return response . json
216214 } ,
217215 get html ( ) {
218- // eslint-disable-next-line no-shadow
216+ // eslint-disable-next-line no-shadow, @typescript-eslint/no-this-alias
219217 const response : SimpleResponse = this
220218 delete response . html
221219
222220 response . html = parseHTML ( document , response . text )
223221 return response . html
224- }
222+ } ,
225223 }
226224
227225 const body = await response . text ( )
0 commit comments