Skip to content

Commit a82d005

Browse files
authored
Merge pull request #20 from github/remove-dependencies
Remove dependencies
2 parents 312e7d8 + 8c3e7c8 commit a82d005

File tree

5 files changed

+39
-42
lines changed

5 files changed

+39
-42
lines changed

package-lock.json

Lines changed: 0 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,5 @@
4848
"karma-mocha-reporter": "^2.2.5",
4949
"mocha": "^6.2.2"
5050
},
51-
"dependencies": {
52-
"form-data-entries": "^1.0.4",
53-
"selector-set": "^1.1.5"
54-
}
51+
"dependencies": {}
5552
}

src/index.js

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
/* @flow strict */
22

3-
import SelectorSet from 'selector-set'
4-
import formDataEntries from 'form-data-entries'
5-
63
// Parse HTML text into document fragment.
74
function parseHTML(document: Document, html: string): DocumentFragment {
85
const template = document.createElement('template')
@@ -12,7 +9,7 @@ function parseHTML(document: Document, html: string): DocumentFragment {
129

1310
function serialize(form: HTMLFormElement): string {
1411
const params = new URLSearchParams()
15-
const entries = 'entries' in FormData.prototype ? new FormData(form).entries() : formDataEntries(form)
12+
const entries = new FormData(form).entries()
1613
for (const [name, value] of [...entries]) {
1714
params.append(name, value.toString())
1815
}
@@ -65,9 +62,9 @@ type Kicker = {
6562
html: () => Promise<SimpleResponse>
6663
}
6764

68-
export type RemoteFormHandler = (form: HTMLFormElement, kicker: Kicker, req: SimpleRequest) => void | Promise<void>
65+
export type RemoteFormHandler = (form: HTMLFormElement, kicker: Kicker, req: SimpleRequest) => void
6966

70-
let selectorSet: ?SelectorSet<RemoteFormHandler>
67+
let formHandlers: Map<string, RemoteFormHandler[]>
7168

7269
const afterHandlers = []
7370
const beforeHandlers = []
@@ -81,26 +78,39 @@ export function beforeRemote(fn: (form: HTMLFormElement) => mixed) {
8178
}
8279

8380
export function remoteForm(selector: string, fn: RemoteFormHandler) {
84-
if (!selectorSet) {
85-
selectorSet = new SelectorSet()
81+
if (!formHandlers) {
82+
formHandlers = new Map<string, RemoteFormHandler[]>()
8683
document.addEventListener('submit', handleSubmit)
8784
}
88-
selectorSet.add(selector, fn)
85+
const handlers = formHandlers.get(selector) || []
86+
formHandlers.set(selector, [...handlers, fn])
8987
}
9088

9189
export function remoteUninstall(selector: string, fn: RemoteFormHandler) {
92-
if (selectorSet) {
93-
selectorSet.remove(selector, fn)
90+
if (formHandlers) {
91+
const handlers = formHandlers.get(selector) || []
92+
formHandlers.set(selector, handlers.filter(x => x !== fn))
93+
}
94+
}
95+
96+
function getMatches(el: HTMLElement): RemoteFormHandler[] {
97+
const results = []
98+
for (const selector of formHandlers.keys()) {
99+
if (el.matches(selector)) {
100+
const handlers = formHandlers.get(selector) || []
101+
results.push(...handlers)
102+
}
94103
}
104+
return results
95105
}
96106

97107
function handleSubmit(event: Event) {
98108
if (!(event.target instanceof HTMLFormElement)) {
99109
return
100110
}
101111
const form = event.target
102-
const matches = selectorSet && selectorSet.matches(form)
103-
if (!matches || matches.length === 0) {
112+
const matches = getMatches(form)
113+
if (matches.length === 0) {
104114
return
105115
}
106116

@@ -143,7 +153,7 @@ function handleSubmit(event: Event) {
143153
// Process each handler sequentially until it either completes or calls the
144154
// kicker function.
145155
async function processHandlers(
146-
matches: Array<*>,
156+
matches: RemoteFormHandler[],
147157
form: HTMLFormElement,
148158
req: SimpleRequest,
149159
kickerPromise: Promise<SimpleResponse>
@@ -167,7 +177,7 @@ async function processHandlers(
167177
return kick()
168178
}
169179
}
170-
await Promise.race([kickerCalled, match.data.call(null, form, kicker, req)])
180+
await Promise.race([kickerCalled, match(form, kicker, req)])
171181
}
172182
return kickerWasCalled
173183
}

test/karma.config.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,9 @@ function checker(request, response, next) {
2222

2323
module.exports = function(config) {
2424
config.set({
25+
basePath: '..',
2526
frameworks: ['mocha', 'chai'],
26-
files: [
27-
'../node_modules/form-data-entries/index.umd.js',
28-
'../node_modules/selector-set/selector-set.js',
29-
'../dist/index.umd.js',
30-
'test.js'
31-
],
27+
files: [{pattern: 'dist/index.esm.js', type: 'module'}, {pattern: 'test/test.js', type: 'module'}],
3228
reporters: ['mocha'],
3329
port: 9876,
3430
colors: true,

test/test.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const {remoteForm: _remoteForm, remoteUninstall} = window.remoteForm
1+
import {remoteForm as _remoteForm, remoteUninstall} from '../dist/index.esm.js'
22

33
describe('remoteForm', function() {
44
let htmlForm
@@ -63,17 +63,21 @@ describe('remoteForm', function() {
6363
})
6464

6565
it('chained handlers', function(done) {
66-
let previousCallbackCalled = false
66+
let callbacksCalled = 0
67+
6768
remoteForm('.remote-widget', async function() {
68-
await new Promise(resolve => setTimeout(resolve, 10))
69-
previousCallbackCalled = true
69+
callbacksCalled++
70+
71+
if (callbacksCalled === 2) {
72+
done()
73+
}
7074
})
7175

7276
remoteForm('.my-remote-form', async function() {
73-
if (previousCallbackCalled) {
77+
callbacksCalled++
78+
79+
if (callbacksCalled === 2) {
7480
done()
75-
} else {
76-
done(new Error('The previous remote form callback was not called'))
7781
}
7882
})
7983

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy