Skip to content

Releases: MithrilJS/mithril.js

v2.2.3

24 Jan 20:17
Compare
Choose a tag to compare

Release v2.2.2

Changelog

Patch Changes

Use markdown for the README badges (@pygy)

Use markdown for the README badges.

v2.2.2

25 May 18:30
Compare
Choose a tag to compare

Release v2.2.2

Changelog

Patch Changes

Use markdown for the README badges (@pygy)

Use markdown for the README badges.

v2.2.1

24 May 23:54
Compare
Choose a tag to compare

Release v2.2.1

Changelog

Patch Changes

Move the chat to Zulip (@pygy)

This updates the documentation to link to the new Zulip chat room.

v2.2.0

16 May 08:14
Compare
Choose a tag to compare

Release v2.2.0

Changelog

Minor Changes

m.censor: work around a bunder bug (@kfule)

The internal bundler sometimes mangles the words in RegExp literals incorrectly. Please see below.

Warn about reusing mutated attrs object - fixes #2719 (@StephanHoyer)

Send URLSearchParams as request body without extra configuration (@Coteh)

This PR fixes an oddity I noticed in the way m.request handles URLSearchParams object. It now handles it in the same sort of way XHR and Fetch do it.

Add params: to m.route.Link, fix docs (@dead-claudia)

Add params: to m.route.Link. Minor fix to docs to reflect reality with m.route.Link's disabled: attribute.

Allow Mithril to be loaded in non-browser environments without modification (@dead-claudia)

Recast the global reads to all be guarded with typeof, so that if they aren't defined, they're just null.

Add a m.Fragment = "[" utility for JSX users. (@dead-claudia)

The title says it all, and the diff's obvious. Resolves #2640 and probably others.

Patch Changes

Enable --minimize-semver-change for pr-release (@JAForbes)

Minimizes semver changes on release to the minimum required version bump to satisfy major/minor/patch semver ranges. Minimizes the semver change so that.

Clean up m.route.Link (@barneycarroll)

An attempt at better demonstrating m.route.Link with less text. Fixes #2767.

Runtime-deprecate ospec, change change-log to changelog, fix a few assorted bugs (@dead-claudia)

This PR is in two parts: 1. Revise the build system and some of the local dev setup. Fully split ospec from the repo, and add it as a dependency.

Add meta description to docs (@StephanHoyer)

rework of #2149. added a meta description parser and meta descriptions to all docs pages. because google. built the docs, inspected the output manually.

Fixed badges, consistent naming of Mithril.js (@tbreuss)

use consistent naming of Mithril.js. fix badges in README. Fixes issue #2749.

Catch malformed URI Components (@jdiderik)

Fix for error thrown when a value contains non-valid / malformed URI Component. Example: test=%c5%a1%e8ZM%80%82H. will throw "URI malformed".

Correctly handle invalid escapes in routes based on 0a5ead31c9fbd7b153c521c7f9d3df7bf826ce6c (@StephanHoyer)

fixes #2061. @dead-claudia I just redid your change but slightly different in order to handle a mix of wrong and right encodings properly.

Standardise vnode text representation (@barneycarroll)

This addresses the crucial feature of #2669: text is always represented as virtual text nodes, never as a vnode.text.

Issue 2624 no content 204 parse (@Evoke-PHP)

Added guard so that JSON.parse does not fail on IE11 with no content empty string being parsed. Fixes #2624.

[m.request] work around a bundler bug, fix #2647 (@pygy)

The bundler mangles identifier-like strings within RegExps, this works around the problem by not using such RegExps.

Reject request on XHR timeout (@kevinfiol)

Derived from PR #2581. Allows requests to properly reject on event of a timeout.

Remove extra isLifecycleMethod call from removeAttr (@ZeikJT)

Removing an extra isLifecycleMethod in the removeAttr method, it isn't needed since it's already checked on the previous line.

Fix #2601 (@dead-claudia)

Fix issue where ending a stream in the middle of a stream callback would result in erroneous parent stream state for the rest of that emit. Fixes #2601.

Add streams to releases again, include minified bundle, drop internal stuff from npm (@dead-claudia)

Add stream/stream.js to releases again. Add stream/stream.min.js now that the process is remotely sane now.

Make errors and their messages more accurate and helpful (@dead-claudia)

I updated error messages to be much more helpful.

Fix assertion descriptions (@soulofmischief)

I moved the return statement to the end of define() so that it returns even if the comparison fails.

Fix branch target (@dead-claudia)

https://github.com/MithrilJS/mithril.js/runs/6199543939?check_suite_focus=true.

Automate mithril's release workflow (@JAForbes)

Automated releases, pre-releases, (code) rollbacks and recovery, npm publishing, change log management just by using normal github flow.

rework jsx docs (@StephanHoyer)

Add Simple Application Flems Supporting v2.0.4 and up (@tbreuss)

Added Flems for Simple Application supporting v2.0.4 of Mithril.js. Fixes Issue #2710.

Make example work with webpack v5.69.1 (@StephanHoyer)

fixes #2634.

2604: correct and move text about statements in view method (@kevinfiol)

Addresses #2604.

Fix lint errors (@StephanHoyer)

WIP: Update modularisation details in Installation docs (@orbitbot)

added link to flems.io as an easier way to just try out the framework. -. Documentation has grown a bit stale.

Added power support for the travis.yml file with ppc64le (@sreekanth370)

Added power support for the travis.yml file with ppc64le. This is part of the Ubuntu distribution for ppc64le.

Updated babel/webpack docs to work with latest versions (@pereriksson)

As a developer I tried setting up Mithril with Babel and Webpack but failed because of a variety of errors.

[docs] route redirection using the history API (@pygy)

This is an attempt at fixing #1759, but there may be more to be added. Feedback welcome. ping @dontwork.

Bump path-parse from 1.0.6 to 1.0.7 (@dependabot[bot])

Bumps path-parse from 1.0.6 to 1.0.7. Commits. See full diff in compare view.

Bump glob-parent from 5.1.0 to 5.1.2 (@dependabot[bot])

Bumps glob-parent from 5.1.0 to 5.1.2. Release notes. Sourced from glob-parent's releases. v5.1.2. Bug Fixes.

Bump ajv from 6.10.2 to 6.12.6 (@dependabot[bot])

Bumps ajv from 6.10.2 to 6.12.6. Release notes. Sourced from ajv's releases. v6.12.6. Fix performance issue of "url" format.

Update standalone usage (@ghost)

Avoid double encoding of function signatures - fixes #2720 (@StephanHoyer)

Show previous versions (@mike-ward)

Add Dropdown that shows links to archived versions of the documentation.

docs: improve m.request return value description (@GAumala)

In the m.request return value description, add a line informing that error status codes cause the promise to reject.

A note on JSX events (@pereriksson)

Naming JSX events according to their documentation produces unexpected results with incorrectly named events when using JSX with Mithril.

Document route resolution cancellation, fixes #1759 (@barneycarroll)

Also...

Read more

v1.1.7

23 Sep 23:26
Compare
Choose a tag to compare

Ordinarily, I would not have released this, but it includes a backport of a security fix from v2.0.3. If you're stuck on v1.x, you should really update to this ASAP.

Bug fixes

v2.0.4

18 Aug 18:33
Compare
Choose a tag to compare

v2.0.3

28 Jul 01:07
Compare
Choose a tag to compare
  • Ensure vnodes are removed correctly in the face of onbeforeremove resolving after new nodes are added (#2492 @isiahmeadows)
  • Fix prototype pollution vulnerability in m.parseQueryString (#2494 @isiahmeadows)

v2.0.2 was skipped as it had a critical flaw and was immediately unpublished.

v2.0.1

24 Jul 09:31
Compare
Choose a tag to compare

This is really what v2.0.0 was supposed to be, but the npm upload got botched the first time around.

Breaking changes

  • API: Component vnode children are not normalized into vnodes on ingestion; normalization only happens if and when they are ingested by the view (#2155 (thanks to @magikstm for related optimization #2064))
  • API: m.redraw() is always asynchronous (#1592)
  • API: m.mount() will only render its own root when called, it will not trigger a redraw() (#1592)
  • API: Assigning to vnode.state (as in vnode.state = ...) is no longer supported. Instead, an error is thrown if vnode.state changes upon the invocation of a lifecycle hook.
  • API: m.request will no longer reject the Promise on server errors (eg. status >= 400) if the caller supplies an extract callback. This gives applications more control over handling server responses.
  • hyperscript: when attributes have a null or undefined value, they are treated as if they were absent. #1773 (#2174)
  • API: m.request errors no longer copy response fields to the error, but instead assign the parsed JSON response to error.response and the HTTP status code error.code.
  • hyperscript: when an attribute is defined on both the first and second argument (as a CSS selector and an attrs field, respectively), the latter takes precedence, except for class attributes that are still added together. #2172 (#2174)
  • cast className using toString (#2309)
  • render: call attrs' hooks last, with express exception of onbeforeupdate to allow attrs to block components from even diffing (#2297)
  • API: m.withAttr removed. (#2317)
  • request: data has now been split to params and body and useBody has been removed in favor of just using body. (#2361)
  • route, request: Interpolated arguments are URL-escaped (and for declared routes, URL-unescaped) automatically. If you want to use a raw route parameter, use a variadic parameter like in /asset/:path.../view. This was previously only available in m.route route definitions, but it's now usable in both that and where paths are accepted. (#2361)
  • route, request: Interpolated arguments are not appended to the query string. This means m.request({url: "/api/user/:id/get", params: {id: user.id}}) would result in a request like GET /api/user/1/get, not one like GET /api/user/1/get?id=1. If you really need it in both places, pass the same value via two separate parameters with the non-query-string parameter renamed, like in m.request({url: "/api/user/:urlID/get", params: {id: user.id, urlID: user.id}}). (#2361)
  • route, request: m.route.set, m.request, and m.jsonp all use the same path template syntax now, and vary only in how they receive their parameters. Furthermore, declared routes in m.route shares the same syntax and semantics, but acts in reverse as if via pattern matching. (#2361)
  • request: options.responseType now defaults to "json" if extract is absent, and deserialize receives the parsed response, not the raw string. If you want the old behavior, use responseType: "text". (#2335)
  • request: set Content-Type: application/json; charset=utf-8 for all XHR methods by default, provided they have a body that's != null (#2361, #2421)
    • This can cause CORS issues when issuing GET with bodies, but you can address them through configuring CORS appropriately.
    • Previously, it was only set for all non-GET methods and only when useBody: true was passed (the default), and it was always set for them. Now it's automatically omitted when no body is present, so the hole is slightly broadened.
  • route: query parameters in hash strings are no longer supported (#2448 @isiahmeadows)
    • It's technically invalid in hashes, so I'd rather push people to keep in line with spec.
  • render: validate all elements are either keyed or unkeyed, and treat null/undefined/booleans as strictly unkeyed (#2452 @isiahmeadows)
    • Gives a nice little perf boost with keyed fragments.
    • Minor, but imperceptible impact (within the margin of error) with unkeyed fragments.
    • Also makes the model a lot more consistent - all values are either keyed or unkeyed.
  • vnodes: normalize boolean children to null/undefined at the vnode level, always stringify non-object children that aren't holes (#2452 @isiahmeadows)
    • Previously, true was equivalent to "true" and false was equivalent to "".
    • Previously, numeric children weren't coerced. Now, they are.
    • Unlikely to break most components, but it could break some users.
    • This increases consistency with how booleans are handled with children, so it should be more intuitive.
  • route: key parameter for routes now only works globally for components (#2458 @isiahmeadows)
    • Previously, it worked for route resolvers, too.
    • This lets you ensure global layouts used in render still render by diff.
  • redraw: mithril/redraw now just exposes the m.redraw callback (#2458 @isiahmeadows)
    • The .schedule, .unschedule, and .render properties of the former redrawService are all removed.
    • If you want to know how to work around it, look at the call to mount in Mithril's source for m.route. That should help you in finding ways around the removed feature. (It doesn't take that much more code.)
  • api: m.version has been removed. If you really need the version for whatever reason, just read the version field of mithril/package.json directly. (#2466 @isiahmeadows)
  • route: m.route.prefix(...) is now m.route.prefix = .... (#2469 @isiahmeadows)
    • This is a fully fledged property, so you can not only write to it, but you can also read from it.
    • This aligns better with user intuition.
  • route: m.route.link function removed in favor of m.route.Link component. (#2469 @isiahmeadows)
    • An optional options object is accepted as an attribute. This was initially targeting the old m.route.link function and was transferred to this. (#1930)
    • The new component handles many more edge cases around user interaction, including accessibility.
    • Link navigation can be disabled and cancelled.
    • Link targets can be trivially changed.

News

  • Mithril now only officially supports IE11, Firefox ESR, and the last two versions of Chrome/FF/Edge/Safari. (#2296)
  • API: Introduction of m.redraw.sync() (#1592)
  • API: Event handlers may also be objects with handleEvent methods (#1949, #2222).
  • API: m.request better error message on JSON parse error - (#2195, @codeclown)
  • API: m.request supports timeout as attr - (#1966)
  • API: m.request supports responseType as attr - (#2193)
  • Mocks: add limited support for the DOMParser API (#2097)
  • API: add support for raw SVG in m.trust() string (#2097)
  • render/core: remove the DOM nodes recycling pool (#2122)
  • render/core: revamp the core diff engine, and introduce a longest-increasing-subsequence-based logic to minimize DOM operations when re-ordering keyed nodes.
  • docs: Emphasize Closure Components for stateful components, use them for all stateful component examples.
  • API: ES module bundles are now available for mithril and mithril/stream (#2194 @porsager).
    • All of the m.* properties from mithril are re-exported as named exports in addition to being attached to m.
    • m() itself from mithril is exported as the default export.
    • mithril/stream's primary export is exported as the de...
Read more

(Unpublished)

24 Jul 09:26
Compare
Choose a tag to compare
(Unpublished) Pre-release
Pre-release

When publishing, the npm upload got interrupted and it didn't publish properly. So I unpublished it. Don't try installing this version - it won't work!

v2.0.0-rc.9

17 Jul 02:11
Compare
Choose a tag to compare
v2.0.0-rc.9 Pre-release
Pre-release

This is a hotfix release for critical issues discovered in v2.0.0-rc.8.

  • It did not previously censor magic attributes, causing lifecycle hooks to be double-called. #2471
  • I named the m.route.Link selector argument component: when it should've been called selector:. #2475 (This is the only breaking change.)
  • Routing prevention via ev.preventDefault() was critically broken, and button values and modifier state was incorrectly tested for. #2476

I also included various docs fixes in this release to clear up some confusion.

v2.0.0-rc

Breaking changes

  • API: Component vnode children are not normalized into vnodes on ingestion; normalization only happens if and when they are ingested by the view (#2155 (thanks to @magikstm for related optimization #2064))
  • API: m.redraw() is always asynchronous (#1592)
  • API: m.mount() will only render its own root when called, it will not trigger a redraw() (#1592)
  • API: Assigning to vnode.state (as in vnode.state = ...) is no longer supported. Instead, an error is thrown if vnode.state changes upon the invocation of a lifecycle hook.
  • API: m.request will no longer reject the Promise on server errors (eg. status >= 400) if the caller supplies an extract callback. This gives applications more control over handling server responses.
  • hyperscript: when attributes have a null or undefined value, they are treated as if they were absent. #1773 (#2174)
  • API: m.request errors no longer copy response fields to the error, but instead assign the parsed JSON response to error.response and the HTTP status code error.code.
  • hyperscript: when an attribute is defined on both the first and second argument (as a CSS selector and an attrs field, respectively), the latter takes precedence, except for class attributes that are still added together. #2172 (#2174)
  • render: Align custom elements to work like normal elements, minus all the HTML-specific magic. (#2221)
  • cast className using toString (#2309)
  • render: call attrs' hooks first, with express exception of onbeforeupdate to allow attrs to block components from even diffing (#2297)
  • API: m.withAttr removed. (#2317)
  • request: data has now been split to params and body and useBody has been removed in favor of just using body. (#2361)
  • route, request: Interpolated arguments are URL-escaped (and for declared routes, URL-unescaped) automatically. If you want to use a raw route parameter, use a variadic parameter like in /asset/:path.../view. This was previously only available in m.route route definitions, but it's now usable in both that and where paths are accepted. (#2361)
  • route, request: Interpolated arguments are not appended to the query string. This means m.request({url: "/api/user/:id/get", params: {id: user.id}}) would result in a request like GET /api/user/1/get, not one like GET /api/user/1/get?id=1. If you really need it in both places, pass the same value via two separate parameters with the non-query-string parameter renamed, like in m.request({url: "/api/user/:urlID/get", params: {id: user.id, urlID: user.id}}). (#2361)
  • route, request: m.route.set, m.request, and m.jsonp all use the same path template syntax now, and vary only in how they receive their parameters. Furthermore, declared routes in m.route shares the same syntax and semantics, but acts in reverse as if via pattern matching. (#2361)
  • request: options.responseType now defaults to "json" if extract is absent, and deserialize receives the parsed response, not the raw string. If you want the old behavior, use responseType: "text". (#2335)
  • request: set Content-Type: application/json; charset=utf-8 for all XHR methods by default, provided they have a body that's != null (#2361, #2421)
    • This can cause CORS issues when issuing GET with bodies, but you can address them through configuring CORS appropriately.
    • Previously, it was only set for all non-GET methods and only when useBody: true was passed (the default), and it was always set for them. Now it's automatically omitted when no body is present, so the hole is slightly broadened.
  • route: query parameters in hash strings are no longer supported (#2448 @isiahmeadows)
    • It's technically invalid in hashes, so I'd rather push people to keep in line with spec.
  • render: validate all elements are either keyed or unkeyed, and treat null/undefined/booleans as strictly unkeyed (#2452 @isiahmeadows)
    • Gives a nice little perf boost with keyed fragments.
    • Minor, but imperceptible impact (within the margin of error) with unkeyed fragments.
    • Also makes the model a lot more consistent - all values are either keyed or unkeyed.
  • vnodes: normalize boolean children to null/undefined at the vnode level, always stringify non-object children that aren't holes (#2452 @isiahmeadows)
    • Previously, true was equivalent to "true" and false was equivalent to "".
    • Previously, numeric children weren't coerced. Now, they are.
    • Unlikely to break most components, but it could break some users.
    • This increases consistency with how booleans are handled with children, so it should be more intuitive.
  • route: key parameter for routes now only works globally for components (#2458 @isiahmeadows)
    • Previously, it worked for route resolvers, too.
    • This lets you ensure global layouts used in render still render by diff.
  • redraw: mithril/redraw now just exposes the m.redraw callback (#2458 @isiahmeadows)
    • The .schedule, .unschedule, and .render properties of the former redrawService are all removed.
    • If you want to know how to work around it, look at the call to mount in Mithril's source for m.route. That should help you in finding ways around the removed feature. (It doesn't take that much more code.)
  • api: m.version has been removed. If you really need the version for whatever reason, just read the version field of mithril/package.json directly. (#2466 @isiahmeadows)
  • route: m.route.prefix(...) is now m.route.prefix = .... (#2469 @isiahmeadows)
    • This is a fully fledged property, so you can not only write to it, but you can also read from it.
    • This aligns better with user intuition.
  • route: m.route.link function removed in favor of m.route.Link component. (#2469 @isiahmeadows)
    • An optional options object is accepted as an attribute. This was initially targeting the old m.route.link function and was transferred to this. (#1930)
    • The new component handles many more edge cases around user interaction, including accessibility.
    • Link navigation can be disabled and cancelled.
    • Link targets can be trivially changed.
  • API: Full DOM no longer required to execute require("mithril"). You just need to set the necessary globals to something, even if null or undefined, so they can be properly used. (#2469 @isiahmeadows)
    • This enables isomorphic use of m.route.Link and m.route.prefix.
    • This enables isomorphic use of m.request, provided the background: true option is set and that an XMLHttpRequest polyfill is included as necessary.
    • Note that methods requiring DOM operations will still throw errors, such as m.render(...), m.redraw(), and m.route(...).

News

  • Mithril now only officially supports IE11, Firefox ESR, and the last two versions of Chrome/FF/Edge/Safari. (#2296)
  • API: Introduction of m.redraw.sync() (#1592)
  • API: Event handlers may also be objects with handleEvent methods (#1949, #2222).
  • API: `m.reques...
Read more