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)