Commit graph

27 commits

Author SHA1 Message Date
Isiah Meadows
85bfd0f77d
Clarify pathname docs, follow spec with fragments (#2448)
* Clarify pathname docs, follow spec with fragments

- Valid URLs must not contain a `#` within its fragment.
  https://github.com/MithrilJS/mithril.js/issues/2445
- Our docs were a little confusing and misleading - `m.pathname` isn't
  aware of URLs, just path names.
- Removed the relevant extension to `m.parseQueryString` required to
  support the hash parsing extension. Now we just shave it off and
  ignore it.
- Fix support for arbitrary prefixes, so prefixes like `?#` are
  handled correctly.
- Add a bunch of tests to cover various areas of confusion and unusual
  edge cases.

* Update with PR [skip ci]
2019-07-03 06:22:25 -04:00
Isiah Meadows
58f1c74394
Streamline route/request path handling and split params + body in requests (#2361)
Fixes #2360
Fixes #1138
Fixes #1788 a little less hackishly
Probably fixes a few other issues I'm not aware of.

This more or less goes with @lhorie's comment here, just with a minor name
change from `query` to `params`:

https://github.com/MithrilJS/mithril.js/issues/1138#issuecomment-231363395

Specifically, here's what this patch entails:

- I changed `data` and `useBody` to `params` and `body` in `m.request`.
  Migration is trivial: just use `params` or `body` depending on which you
  intend to send. Most servers do actually care where the data goes, so you can
  generally pretty easily translate this accordingly. If you *really* need the
  old behavior, pass the old value in `params` and if `method === "GET"` or
  `method === "TRACE"`, also in `body`.
- I opened up all methods to have request bodies.
- I fixed `m.parseQueryString` to prefer later values over earlier values and
  to ensure that objects and arrays are persisted across both hash and query
  param parsing. That method also accepts an existing key/value map to append
  to, to simplify deduplication.
- I normalized path interpolation to be identical between routes and requests.
- I no longer include interpolated values in query strings. If you need to
  duplicate values again, rename the interpolation to be a distinct property
  and pass the value you want to duplicate as it.
- I converted `m.route` to use pre-compiled routes instead of its existing
  system of dynamic runtime checking. This shouldn't have a major effect on
  performance short-term, but it'll ease the migration to built-in userland
  components and make it a little easier to reconcile. It'll also come handy
  for large numbers of routes.
- I added support for matching routes like `"/:file.:ext"` or
  `"/:lang-:region"`, giving each defined semantics.
- I added support for matching against routes with static query strings, such
  as `"/edit?type=image": { ... }`.
- I'm throwing a few new informative errors.
- And I've updated the docs accordingly.

I also made a few drive-by edits:

- I fixed a bug in the `Stream.HALT` warning where it warned all but the first
  usage when the intent was to warn only on first use.
- Some of the tests were erroneously using `Stream.HALT` when they should've
  been using `Stream.SKIP`. I've fixed the tests to only test that
  `Stream.HALT === Stream.SKIP` and that it only warns on first use.
- The `m.request` and `m.jsonp` docs signatures were improved to more clearly
  explain how `m.request(url, options?)` and `m.jsonp(url, options?)` translate
  to `m.request(options)` and `m.jsonp(options)` respectively.

-----

There is some justification to these changes:

- In general, it matters surprisingly more than you would expect how things
  translate to HTTP requests. So the comment there suggesting a thing that
  papers over the difference has led to plenty of confusion in both Gitter and
  in GitHub issues.

- A lot of servers expect a GET with a body and no parameters, and leaving
  `m.request` open to working with that makes it much more flexible.

- Sometimes, servers expect a POST with query parameters *instead* of a JSON
  object. I've seen this quite a bit, even with more popular REST APIs like
  Stack Overflow's.

- I've encountered a few servers that expect both parameters and a body, each
  with distinct semantic meaning, so the separation makes it much easier to
  translate into a request.

- Most of the time, path segments are treated individually, and URL-escaping
  the contents is much less error-prone. It also avoids being potentially
  lossy, and when the variable in question isn't trusted, escaping the path
  segment enables you to pass it through the URL and not risk being redirected
  to unexpected locations, avoiding some risks of vulnerabilities and client
  side crashes.

If you really don't care how the template and parameters translate to an
eventual URL, just pass the same object for the `params` and `body` and use
`:param...` for each segment. Either way, the more explicit nature should help
a lot in making the intent clearer, whether you care or not.
2019-05-29 09:28:40 -04:00
Isiah Meadows
1cc5fa5ba7 "use strict" and other linty fixes 2017-03-03 18:24:38 -05:00
Leo
9d5f686bbd #1579 prevent infinite loop in non-existent default route 2017-02-03 22:21:14 -05:00
Leo Horie
de07a54881 add support for route state #1480 2016-12-17 21:50:04 -05:00
Leo Horie
992aa30ccc fix m.route.link and m.route.set history replacement 2016-12-06 23:29:15 -05:00
Leo Horie
3134202d24 fix tests 2016-12-06 00:09:09 -05:00
Pat Cavit
05e888958d Naively make m.route.set return a Promise 2016-12-05 16:22:52 -08:00
Leo Horie
809d8921c9 bypass route resolution algorithm on non-routed redraws 2016-12-05 11:23:25 -05:00
Leo Horie
2ffd2fb7e4 throttle m.route redraws 2016-12-04 01:53:39 -05:00
Leo Horie
1fe4a08e71 lint 2016-12-02 22:03:23 -05:00
Leo Horie
713c25c9c0 fix #1404 2016-12-01 01:45:07 -05:00
Skyler
27e98e6fc3 Ignore modifier+click and middle click in m.route.link
Currently, middle clicking and ctrl+click change the route in the
current tab. Expected behavior is to open a new tab/window.
2016-10-18 13:56:10 -07:00
Leo Horie
40251c6c16 #1342 update m.route.link target if href changes 2016-10-04 12:19:55 -04:00
Pierre-Yves Gerardy
a1131eb4f2 Lint the router files 2016-09-03 00:32:12 +02:00
Pierre-Yves Gerardy
0539fc651d core router: add debounceAsync(), normalize onhashchange and onpopstate timing. Fix ##1269 2016-09-03 00:17:06 +02:00
Pierre-Yves Gerardy
879b9d6883 Adapt tests for debouncedAsync. 2016-09-02 23:05:34 +02:00
Leo Horie
8ec3a3f2c5 test router using file protocol as start point 2016-08-02 23:21:13 -04:00
Leo Horie
a6c56ff6b9 resolve hook in router 2016-07-11 09:50:00 -04:00
Leo Horie
e8e0bae726 make setPath always async 2016-07-01 13:03:07 -04:00
impinball
b4fb21475c Add editorconfig, resolve differences
This includes newlines, tabs, among other things.
2016-06-18 03:22:12 -04:00
Leo Horie
ddc430a6d3 fix most gcc warnings 2016-06-03 23:55:31 -04:00
Pierre-Yves Gerardy
297e343264 Support non-root base path 2016-05-30 00:07:52 +02:00
Leo Horie
e7420e72e1 more tests 2016-05-24 23:16:43 -04:00
Leo Horie
5265697cb2 semi-working bundle 2016-05-14 01:01:35 -04:00
Leo Horie
d8a402f4f5 utf-8 handling in router 2016-05-13 07:02:32 -04:00
Leo Horie
559369016d initial commit (work in progress) 2016-04-20 20:02:37 -04:00