unpoly-rails 0.34.2 → 0.35.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of unpoly-rails might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -2
- data/lib/assets/javascripts/unpoly/browser.coffee +41 -48
- data/lib/assets/javascripts/unpoly/bus.coffee +2 -1
- data/lib/assets/javascripts/unpoly/dom.coffee +2 -1
- data/lib/assets/javascripts/unpoly/form.coffee +4 -18
- data/lib/assets/javascripts/unpoly/motion.coffee +2 -4
- data/lib/assets/javascripts/unpoly/protocol.coffee +15 -8
- data/lib/assets/javascripts/unpoly/util.coffee +21 -40
- data/lib/unpoly/rails/version.rb +1 -1
- data/spec_app/Gemfile.lock +1 -1
- data/spec_app/spec/javascripts/helpers/to_have_request_method.js.coffee +9 -1
- data/spec_app/spec/javascripts/up/dom_spec.js.coffee +109 -92
- data/spec_app/spec/javascripts/up/form_spec.js.coffee +7 -23
- data/spec_app/spec/javascripts/up/link_spec.js.coffee +16 -18
- data/spec_app/spec/javascripts/up/modal_spec.js.coffee +42 -46
- data/spec_app/spec/javascripts/up/motion_spec.js.coffee +249 -295
- data/spec_app/spec/javascripts/up/popup_spec.js.coffee +27 -29
- data/spec_app/spec/javascripts/up/proxy_spec.js.coffee +3 -5
- data/spec_app/spec/javascripts/up/util_spec.js.coffee +1 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f765b71ac71515b46543844c603128f24a494056
|
4
|
+
data.tar.gz: e69ba489c3e0307680d05ace76eaa64216271f7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b1593da8cf468285b2f3d7041890f8900f94caac29c88bd30a51a99accb1ee7a3a2d002ec2f14c3a2fcc86c96cae00f51252424e3a2b160d5c1ee485c0e67c4
|
7
|
+
data.tar.gz: 150c3aafcc1cd83e2d66d7222bfdf570aef1b56645f4c1d0aabb6d7e2965fb9ed2d59041ff2d71d324546411462ee60feab3f3cb8de10471ec300ec57de1410f
|
data/CHANGELOG.md
CHANGED
@@ -6,16 +6,32 @@ All notable changes to this project will be documented in this file.
|
|
6
6
|
This project mostly adheres to [Semantic Versioning](http://semver.org/).
|
7
7
|
|
8
8
|
|
9
|
+
Unreleased
|
10
|
+
----------
|
11
|
+
|
12
|
+
### Compatible changes
|
13
|
+
|
14
|
+
- Remove a use of global `$` that prevented Unpoly from being used with with [`jQuery.noConflict()`](https://api.jquery.com/jquery.noconflict/).
|
15
|
+
- Fix a bug where replacing the `<body>` element would lose the body class and other attributes
|
16
|
+
- Fix a bug where Unpoly would set the document title to a `<title>` tag of an inline SVG image.
|
17
|
+
|
18
|
+
|
19
|
+
### Incompatible changes
|
20
|
+
|
21
|
+
- Drop support for IE 9, which hasn't been supported on any platform since January 2016.
|
22
|
+
- Drop support for IE 10, which hasn't been supported since January 2016 on any platform except
|
23
|
+
Windows Vista, and Vista is end-of-life in April 2017.
|
24
|
+
|
25
|
+
|
9
26
|
0.34.2
|
10
27
|
------
|
11
28
|
|
12
|
-
|
29
|
+
### Compatible changes
|
13
30
|
|
14
31
|
- The scroll positions of two [viewports](/up-viewport) with the same selector is now restored correctly when going back in history.
|
15
32
|
- Fix a bug where new modals and popups would sometime flash at full opacity before starting their opening animation.
|
16
33
|
|
17
34
|
|
18
|
-
|
19
35
|
0.34.1
|
20
36
|
------
|
21
37
|
|
@@ -4,13 +4,10 @@ Browser support
|
|
4
4
|
|
5
5
|
Unpoly supports all modern browsers. It degrades gracefully with old versions of Internet Explorer:
|
6
6
|
|
7
|
-
|
7
|
+
IE11, Edge
|
8
8
|
: Full support
|
9
9
|
|
10
|
-
IE
|
11
|
-
: Page updates that change browser history fall back to a classic page load.
|
12
|
-
|
13
|
-
IE 8
|
10
|
+
IE 10 or lower
|
14
11
|
: Unpoly prevents itself from booting itself, leaving you with a classic server-side application.
|
15
12
|
|
16
13
|
|
@@ -78,12 +75,7 @@ up.browser = (($) ->
|
|
78
75
|
@internal
|
79
76
|
###
|
80
77
|
puts = (stream, args...) ->
|
81
|
-
|
82
|
-
console[stream](args...)
|
83
|
-
else
|
84
|
-
# IE <= 9 cannot pass varargs to console.log using Function#apply because IE
|
85
|
-
message = sprintf(args...)
|
86
|
-
console[stream](message)
|
78
|
+
console[stream](args...)
|
87
79
|
|
88
80
|
CONSOLE_PLACEHOLDERS = /\%[odisf]/g
|
89
81
|
|
@@ -149,22 +141,19 @@ up.browser = (($) ->
|
|
149
141
|
url = ->
|
150
142
|
location.href
|
151
143
|
|
152
|
-
|
153
|
-
|
154
|
-
# while keeping all relevant desktop and mobile browsers.
|
155
|
-
u.isUndefined(document.addEventListener)
|
156
|
-
|
157
|
-
isIE9OrWorse = u.memoize ->
|
158
|
-
isIE8OrWorse() || navigator.appVersion.indexOf('MSIE 9.') != -1
|
144
|
+
isIE10OrWorse = u.memoize ->
|
145
|
+
!window.atob
|
159
146
|
|
160
147
|
###*
|
161
148
|
Returns whether this browser supports manipulation of the current URL
|
162
149
|
via [`history.pushState`](https://developer.mozilla.org/en-US/docs/Web/API/History/pushState).
|
163
150
|
|
164
|
-
When
|
165
|
-
`pushState` (e.g. through [`up.follow()`](/up.follow)), it will gracefully
|
151
|
+
When `pushState` (e.g. through [`up.follow()`](/up.follow)), it will gracefully
|
166
152
|
fall back to a full page load.
|
167
153
|
|
154
|
+
Note that Unpoly will not use `pushState` if the initial page was loaded with
|
155
|
+
a request method other than GET.
|
156
|
+
|
168
157
|
@function up.browser.canPushState
|
169
158
|
@return {Boolean}
|
170
159
|
@experimental
|
@@ -179,8 +168,7 @@ up.browser = (($) ->
|
|
179
168
|
# 2. Some browsers have a bug where the initial request method is used for all
|
180
169
|
# subsequently pushed states. That means if the user reloads the page on a later
|
181
170
|
# GET state, the browser will wrongly attempt a POST request.
|
182
|
-
# Modern Firefoxes, Chromes and IE10+ don't seem to be affected by this
|
183
|
-
# but we saw this behavior with Safari 8 and IE9 (IE9 can't do pushState anyway).
|
171
|
+
# Modern Firefoxes, Chromes and IE10+ don't seem to be affected by this.
|
184
172
|
#
|
185
173
|
# The way that we work around this is that we don't support pushState if the
|
186
174
|
# initial request method was anything other than GET (but allow the rest of the
|
@@ -198,7 +186,7 @@ up.browser = (($) ->
|
|
198
186
|
|
199
187
|
@function up.browser.canCssTransition
|
200
188
|
@return {Boolean}
|
201
|
-
@
|
189
|
+
@internal
|
202
190
|
###
|
203
191
|
canCssTransition = u.memoize ->
|
204
192
|
'transition' of document.documentElement.style
|
@@ -208,7 +196,7 @@ up.browser = (($) ->
|
|
208
196
|
|
209
197
|
@function up.browser.canInputEvent
|
210
198
|
@return {Boolean}
|
211
|
-
@
|
199
|
+
@internal
|
212
200
|
###
|
213
201
|
canInputEvent = u.memoize ->
|
214
202
|
'oninput' of document.createElement('input')
|
@@ -225,20 +213,32 @@ up.browser = (($) ->
|
|
225
213
|
!!window.FormData
|
226
214
|
|
227
215
|
###*
|
228
|
-
Returns whether this browser supports
|
229
|
-
|
230
|
-
in `console` functions.
|
216
|
+
Returns whether this browser supports the [`DOMParser`](https://developer.mozilla.org/en-US/docs/Web/API/DOMParser)
|
217
|
+
interface.
|
231
218
|
|
232
|
-
|
219
|
+
@function up.browser.canDomParser
|
220
|
+
@return {Boolean}
|
221
|
+
@internal
|
222
|
+
###
|
223
|
+
canDomParser = u.memoize ->
|
224
|
+
!!window.DOMParser
|
233
225
|
|
234
|
-
|
226
|
+
###*
|
227
|
+
Returns whether this browser supports the [`debugging console`](https://developer.mozilla.org/en-US/docs/Web/API/Console).
|
235
228
|
|
236
|
-
@function up.browser.
|
229
|
+
@function up.browser.canConsole
|
237
230
|
@return {Boolean}
|
238
231
|
@internal
|
239
232
|
###
|
240
|
-
|
241
|
-
|
233
|
+
canConsole = u.memoize ->
|
234
|
+
window.console &&
|
235
|
+
console.debug &&
|
236
|
+
console.info &&
|
237
|
+
console.warn &&
|
238
|
+
console.error &&
|
239
|
+
console.group &&
|
240
|
+
console.groupCollapsed &&
|
241
|
+
console.groupEnd
|
242
242
|
|
243
243
|
isRecentJQuery = u.memoize ->
|
244
244
|
version = $.fn.jquery
|
@@ -293,16 +293,14 @@ up.browser = (($) ->
|
|
293
293
|
@stable
|
294
294
|
###
|
295
295
|
isSupported = ->
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
console[method] ?= (args...) -> puts('log', args...)
|
305
|
-
console.log ?= u.noop # Cannot be faked
|
296
|
+
!isIE10OrWorse() &&
|
297
|
+
isRecentJQuery() &&
|
298
|
+
canConsole() &&
|
299
|
+
canPushState() &&
|
300
|
+
canDomParser() &&
|
301
|
+
canFormData() &&
|
302
|
+
canCssTransition() &&
|
303
|
+
canInputEvent()
|
306
304
|
|
307
305
|
###*
|
308
306
|
@internal
|
@@ -328,14 +326,9 @@ up.browser = (($) ->
|
|
328
326
|
knife: eval(Knife?.point)
|
329
327
|
url: url
|
330
328
|
loadPage: loadPage
|
331
|
-
whenConfirmed: whenConfirmed
|
332
329
|
canPushState: canPushState
|
333
|
-
|
334
|
-
canInputEvent: canInputEvent
|
335
|
-
canFormData: canFormData
|
336
|
-
canLogSubstitution: canLogSubstitution
|
330
|
+
whenConfirmed: whenConfirmed
|
337
331
|
isSupported: isSupported
|
338
|
-
installPolyfills: installPolyfills
|
339
332
|
puts: puts
|
340
333
|
sprintf: sprintf
|
341
334
|
sprintfWithFormattedArgs: sprintfWithFormattedArgs
|
@@ -437,7 +437,6 @@ up.bus = (($) ->
|
|
437
437
|
if up.browser.isSupported()
|
438
438
|
# Can't decouple this via the event bus, since up.bus would require
|
439
439
|
# up.browser.isSupported() and up.browser would require up.on()
|
440
|
-
up.browser.installPolyfills()
|
441
440
|
emit('up:framework:boot', message: 'Booting framework')
|
442
441
|
emit('up:framework:booted', message: 'Framework booted')
|
443
442
|
# User-provided compiler definitions will be registered once this function terminates.
|
@@ -447,6 +446,8 @@ up.bus = (($) ->
|
|
447
446
|
# The following event will cause Unpoly to compile the <body>
|
448
447
|
emit('up:app:boot', message: 'Booting user application')
|
449
448
|
emit('up:app:booted', message: 'User application booted')
|
449
|
+
else
|
450
|
+
console.log?("Unpoly doesn't support this browser. Framework was not booted.")
|
450
451
|
|
451
452
|
###*
|
452
453
|
This event is [emitted](/up.emit) when Unpoly [starts to boot](/up.boot).
|
@@ -415,7 +415,8 @@ up.dom = (($) ->
|
|
415
415
|
parseResponse = (html) ->
|
416
416
|
# jQuery cannot construct transient elements that contain <html> or <body> tags
|
417
417
|
htmlElement = u.createElementFromHtml(html)
|
418
|
-
title: ->
|
418
|
+
title: ->
|
419
|
+
htmlElement.querySelector("head title")?.textContent
|
419
420
|
first: (selector) ->
|
420
421
|
# Although we cannot have a jQuery collection from an entire HTML document,
|
421
422
|
# we can use jQuery's Sizzle engine to grep through a DOM tree.
|
@@ -131,34 +131,25 @@ up.form = (($) ->
|
|
131
131
|
options.restoreScroll = u.option(options.restoreScroll, u.castedAttr($form, 'up-restore-scroll'))
|
132
132
|
options.origin = u.option(options.origin, $form)
|
133
133
|
options.layer = u.option(options.layer, $form.attr('up-layer'), 'auto')
|
134
|
-
options.data =
|
134
|
+
options.data = u.requestDataFromForm($form)
|
135
135
|
options = u.merge(options, up.motion.animateOptions(options, $form))
|
136
136
|
|
137
|
-
hasFileInputs = $form.find('input[type=file]').length
|
138
|
-
canAjaxSubmit = !hasFileInputs || u.isFormData(options.data)
|
139
|
-
canHistoryOption = up.browser.canPushState() || options.history == false
|
140
|
-
|
141
137
|
if options.validate
|
142
138
|
options.headers ||= {}
|
143
139
|
options.transition = false
|
144
140
|
options.failTransition = false
|
145
141
|
options.headers[up.protocol.config.validateHeader] = options.validate
|
146
|
-
# If a form has file inputs and the browser does not support FormData,
|
147
|
-
# we cannot offer inline validations.
|
148
|
-
unless canAjaxSubmit
|
149
|
-
return u.unresolvablePromise()
|
150
142
|
|
151
143
|
up.feedback.start($form)
|
152
144
|
|
153
|
-
# If we can't
|
154
|
-
|
155
|
-
unless canAjaxSubmit && canHistoryOption
|
145
|
+
# If we can't update the location URL, fall back to a vanilla form submission.
|
146
|
+
unless up.browser.canPushState() || options.history == false
|
156
147
|
$form.get(0).submit()
|
157
148
|
return u.unresolvablePromise()
|
158
149
|
|
159
150
|
promise = up.replace(target, url, options)
|
160
151
|
promise.always -> up.feedback.stop($form)
|
161
|
-
|
152
|
+
promise
|
162
153
|
|
163
154
|
###*
|
164
155
|
Observes form fields and runs a callback when a value changes.
|
@@ -285,11 +276,6 @@ up.form = (($) ->
|
|
285
276
|
# we always bind to both events in case another script manually triggers it.
|
286
277
|
changeEvents = 'input change'
|
287
278
|
|
288
|
-
unless up.browser.canInputEvent()
|
289
|
-
# In case this browser doesn't support input, we listen
|
290
|
-
# to all sorts of events that might change form controls.
|
291
|
-
changeEvents += ' keypress paste cut click propertychange'
|
292
|
-
|
293
279
|
$field.on(changeEvents, check)
|
294
280
|
|
295
281
|
# return destructor
|
@@ -78,16 +78,14 @@ up.motion = (($) ->
|
|
78
78
|
###*
|
79
79
|
Returns whether Unpoly will perform animations.
|
80
80
|
|
81
|
-
|
82
|
-
[CSS transitions](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions)
|
83
|
-
and if [`up.motion.config.enabled`](/up.motion.config) is set to `true` (which is the default).
|
81
|
+
Set [`up.motion.config.enabled`](/up.motion.config) `false` in order to disable animations globally.
|
84
82
|
|
85
83
|
@function up.motion.isEnabled
|
86
84
|
@return {Boolean}
|
87
85
|
@stable
|
88
86
|
###
|
89
87
|
isEnabled = ->
|
90
|
-
config.enabled
|
88
|
+
config.enabled
|
91
89
|
|
92
90
|
###*
|
93
91
|
Applies the given animation to the given element.
|
@@ -28,13 +28,14 @@ Unpoly requires an additional response header to detect redirects, which are
|
|
28
28
|
otherwise undetectable for any AJAX client.
|
29
29
|
|
30
30
|
After the form's action performs a redirect, the next response should include the new
|
31
|
-
URL in
|
31
|
+
URL in the HTTP headers:
|
32
32
|
|
33
33
|
```http
|
34
|
+
X-Up-Method: GET
|
34
35
|
X-Up-Location: /current-url
|
35
36
|
```
|
36
37
|
|
37
|
-
The **simplest implementation** is to set
|
38
|
+
The **simplest implementation** is to set these headers for every request.
|
38
39
|
|
39
40
|
|
40
41
|
\#\#\# Optimizing responses
|
@@ -131,14 +132,19 @@ but you can adapt it for other languages:
|
|
131
132
|
|
132
133
|
\#\#\# Signaling the initial request method
|
133
134
|
|
134
|
-
This is a edge case you might or might not care about:
|
135
135
|
If the initial page was loaded with a non-`GET` HTTP method, Unpoly prefers to make a full
|
136
|
-
page load when you try to update a fragment. Once
|
136
|
+
page load when you try to update a fragment. Once the next page was loaded with a `GET` method,
|
137
137
|
Unpoly will restore its standard behavior.
|
138
138
|
|
139
|
-
|
140
|
-
|
141
|
-
|
139
|
+
This fixes two edge cases you might or might not care about:
|
140
|
+
|
141
|
+
1. Unpoly replaces the initial page state so it can later restore it when the user
|
142
|
+
goes back to that initial URL. However, if the initial request was a POST,
|
143
|
+
Unpoly will wrongly assume that it can restore the state by reloading with GET.
|
144
|
+
2. Some browsers have a bug where the initial request method is used for all
|
145
|
+
subsequently pushed states. That means if the user reloads the page on a later
|
146
|
+
GET state, the browser will wrongly attempt a POST request.
|
147
|
+
Modern Firefoxes, Chromes and IE10+ don't seem to be affected by this.
|
142
148
|
|
143
149
|
In order to allow Unpoly to detect the HTTP method of the initial page load,
|
144
150
|
the server must set a cookie:
|
@@ -180,7 +186,8 @@ up.protocol = (($) ->
|
|
180
186
|
@internal
|
181
187
|
###
|
182
188
|
methodFromXhr = (xhr) ->
|
183
|
-
xhr.getResponseHeader(config.methodHeader)
|
189
|
+
if method = xhr.getResponseHeader(config.methodHeader)
|
190
|
+
u.normalizeMethod(method)
|
184
191
|
|
185
192
|
###*
|
186
193
|
Server-side companion libraries like unpoly-rails set this cookie so we
|
@@ -196,44 +196,18 @@ up.util = (($) ->
|
|
196
196
|
classes = classString.split(' ')
|
197
197
|
select classes, (klass) -> isPresent(klass) && !klass.match(/^up-/)
|
198
198
|
|
199
|
+
openTagPattern = (tag) ->
|
200
|
+
new RegExp("<#{tag}(?: [^>]*)?>", 'i')
|
201
|
+
|
199
202
|
# jQuery's implementation of $(...) cannot create elements that have
|
200
203
|
# an <html> or <body> tag. So we're using native elements.
|
201
204
|
# Also IE9 cannot set innerHTML on a <html> or <head> element.
|
202
205
|
createElementFromHtml = (html) ->
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
capture = (pattern) -> "(#{pattern})"
|
208
|
-
|
209
|
-
titlePattern = new RegExp(
|
210
|
-
openTag('title') +
|
211
|
-
capture(anything) +
|
212
|
-
closeTag('title'),
|
213
|
-
'i')
|
214
|
-
|
215
|
-
bodyPattern = new RegExp(
|
216
|
-
openTag('body') +
|
217
|
-
capture(anything) +
|
218
|
-
closeTag('body'),
|
219
|
-
'i')
|
220
|
-
|
221
|
-
if bodyMatch = html.match(bodyPattern)
|
222
|
-
|
223
|
-
htmlElement = document.createElement('html')
|
224
|
-
bodyElement = createElement('body', bodyMatch[1])
|
225
|
-
htmlElement.appendChild(bodyElement)
|
226
|
-
|
227
|
-
if titleMatch = html.match(titlePattern)
|
228
|
-
headElement = createElement('head')
|
229
|
-
htmlElement.appendChild(headElement)
|
230
|
-
titleElement = createElement('title', titleMatch[1])
|
231
|
-
headElement.appendChild(titleElement)
|
232
|
-
|
233
|
-
htmlElement
|
234
|
-
|
206
|
+
bodyPattern = openTagPattern('body')
|
207
|
+
return if html.match(bodyPattern)
|
208
|
+
parser = new DOMParser()
|
209
|
+
parser.parseFromString(html, 'text/html')
|
235
210
|
else
|
236
|
-
|
237
211
|
# we possibly received a layout-less fragment
|
238
212
|
createElement('div', html)
|
239
213
|
|
@@ -544,7 +518,7 @@ up.util = (($) ->
|
|
544
518
|
@internal
|
545
519
|
###
|
546
520
|
isFormData = (object) ->
|
547
|
-
|
521
|
+
object instanceof FormData
|
548
522
|
|
549
523
|
###*
|
550
524
|
Converts the given array-like argument into an array.
|
@@ -1646,8 +1620,9 @@ up.util = (($) ->
|
|
1646
1620
|
###
|
1647
1621
|
requestDataAsArray = (data) ->
|
1648
1622
|
if isFormData(data)
|
1649
|
-
# Until FormData#entries is implemented in all major browsers
|
1650
|
-
# we
|
1623
|
+
# Until FormData#entries is implemented in all major browsers we must give up here.
|
1624
|
+
# However, up.form will prefer to serialize forms as arrays, so we should be good
|
1625
|
+
# in most cases. We only use FormData for forms with file inputs.
|
1651
1626
|
up.fail('Cannot convert FormData into an array')
|
1652
1627
|
else
|
1653
1628
|
query = requestDataAsQuery(data)
|
@@ -1669,8 +1644,9 @@ up.util = (($) ->
|
|
1669
1644
|
###
|
1670
1645
|
requestDataAsQuery = (data) ->
|
1671
1646
|
if isFormData(data)
|
1672
|
-
# Until FormData#entries is implemented in all major browsers
|
1673
|
-
# we
|
1647
|
+
# Until FormData#entries is implemented in all major browsers we must give up here.
|
1648
|
+
# However, up.form will prefer to serialize forms as arrays, so we should be good
|
1649
|
+
# in most cases. We only use FormData for forms with file inputs.
|
1674
1650
|
up.fail('Cannot convert FormData into a query string')
|
1675
1651
|
else if isPresent(data)
|
1676
1652
|
query = $.param(data)
|
@@ -1689,11 +1665,16 @@ up.util = (($) ->
|
|
1689
1665
|
requestDataFromForm = (form) ->
|
1690
1666
|
$form = $(form)
|
1691
1667
|
hasFileInputs = $form.find('input[type=file]').length
|
1692
|
-
|
1668
|
+
# We try to stick with an array representation, whose contents we can inspect.
|
1669
|
+
# We cannot inspect FormData on IE11 because it has no support for `FormData.entries`.
|
1670
|
+
# Inspection is needed to generate a cache key (see `up.proxy`) and to make
|
1671
|
+
# vanilla requests when `pushState` is unavailable (see `up.browser.loadPage`).
|
1672
|
+
if hasFileInputs
|
1693
1673
|
new FormData($form.get(0))
|
1694
1674
|
else
|
1695
1675
|
$form.serializeArray()
|
1696
1676
|
|
1677
|
+
|
1697
1678
|
###*
|
1698
1679
|
Adds a key/value pair to the given request data representation.
|
1699
1680
|
|
@@ -2096,6 +2077,6 @@ up.util = (($) ->
|
|
2096
2077
|
flatten: flatten
|
2097
2078
|
isTruthy: isTruthy
|
2098
2079
|
|
2099
|
-
)(
|
2080
|
+
)(jQuery)
|
2100
2081
|
|
2101
2082
|
up.fail = up.util.fail
|