Skip to content

Commit a2b241a

Browse files
committed
refactor javascript to typescript
1 parent 927d9bb commit a2b241a

1 file changed

Lines changed: 39 additions & 41 deletions

File tree

src/index.ts

Lines changed: 39 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/* @flow strict */
2-
31
import SelectorSet from 'selector-set'
42
import formDataEntries from 'form-data-entries'
53

@@ -22,61 +20,60 @@ function serialize(form: HTMLFormElement): string {
2220
class 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

6863
export 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.
145143
async 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

Comments
 (0)