Skip to content

Releases: lukeed/polka

v0.5.0

18 Sep 19:00
Compare
Choose a tag to compare

Breaking

  • Remove Promise around app.listen (#19): dc56b9d, e34a2a4

    The previous polka.listen was a Promise & had structured input, both of which made it unique from existing frameworks. However, it was also a gotcha for projects migrating from existing frameworks.

    Instead, polka.listen now passes all arguments directly to the underling server.listen, which is arguably more "in tune" with the rest of Polka's ideology around native http integration.

    The new method will now rerun the current Polka instance directly, allowing you to continue chaining from it, or allowing you to grab the server or handler values immediately. Previously, .listen() always had to be last in your chain & resolved to nothing.

    // Could not do this before 0.5.0
    const { server, handler } = polka().listen();
    
    // Or this!
    const app = polka().listen(PORT, onAppStart);
    
    app.use('users', require('./users'))
      .get('/', (req, res) => {
        res.end('Pretty cool!');
      });
  • Removed built-in .METHOD() prototype methods for all 34 http.METHODS: 6d5d094

    The large majority of these are never used; eg: ACL, MKCOL, MKCALENDAR, etc.

    These HTTP/1.1 verbs are supported / available to your Polka applications:

    • GET -> .get()
    • POST -> .post()
    • OPTIONS -> .options()
    • DELETE -> .delete()
    • PATCH -> .patch()
    • PUT -> .put()
    • HEAD -> .head()
    • CONNECT -> .connect()
    • TRACE -> .trace()

Features

  • Polka now supports multiple route-specific handlers! (#18): 42574ac, aac1859, a82f571

    This was the most anticipated & most request feature for Polka 🎉

    Put simply, variadic route handlers allows you to chain middleware for specific paths. This was only feasible before through req.path filters on sub-application or global middleware. Routes can now be modular, allowing you to compose/reuse your server route-by-route instead of group-by-group.

    Supporting this dramatically improves compatibility between Express and Polka applications. Most importantly, though, this did not come at the expense of performance~!

    Here's a very basic example using passport, which was often a driver for this feature request:

    const app = polka();
    
    app.post('/login', 
      // This "guards" this route, executing first
      passport.authenticate('local', { failureRedirect: '/login' }),
      // This is the "main" function of this route
      function (req, res) {
        res.redirect('/');
      });
  • NEW @polka/url package: 44a5757, da00320, 87bac82, 17c54a7
    Super lightweight URL parser built specifically for Node.js servers.

Patches

  • (send-type) Lowercase all custom headers keys before parsing (#57): 83731c5

Examples

Chores

v0.4.0

14 May 20:17
Compare
Choose a tag to compare

Minor Changes

  • Add new opts.server option: 276056c, e93ae66, d2f5f96
    This allows Polka to attach to predefined, existing servers. It's an alternative approach to booting Polka and wrapping it with another parent server.

  • Initialize server only when needed: 276056c
    Without this, all sub-applications were preemptively booting up http servers. This meant that all servers were just utilizing memory & never served a purpose, since only the main application's server mattered.

    This change means that the following code sample no longer works:

    let { server } = polka();
    //=> before: "server" was http.Server
    //=> current: "server" is undefined
  • Rename req.pathname to req.path (#29): 7d467f3
    This is for Express compatibility. A lot of popular apps/middlewares rely on req.path (like webpack-dev-server) & it doesn't make to maintain req.pathname and req.path values.

Patches

  • Push root-based middleware group into global middleware: 46285f9
    This is mostly a Express-compatibility thing; funky but a needed workaround for some.

Chores

Examples

  • Added examples/with-nuxtjs: ff27865
  • Added examples/with-graphql: b929ada
  • Added examples/with-sirv: 1284606

v0.3.4

16 Feb 22:20
Compare
Choose a tag to compare

Patches

v0.3.3

09 Feb 19:11
Compare
Choose a tag to compare

Patches

  • FIX: Prevent root-level wildcard routes from stealing middleware requests (#26): dfac4b4

  • Add tests to track middleware-vs-wildcard handling: f4c83d8

  • Update README benchmarks after polka.handler changes: f1a1372

Examples

  • Added examples/with-afterjs: 025614f

v0.3.2

07 Feb 02:07
Compare
Choose a tag to compare

Patches

  • FIX: Defer request property mutations until a sub-group is actually called: 3120116, df98c4c

    Previously, given a global logger, any bware-path would instantly mutate the request object. This means that the information is changed before any part of the loop begins.

    For example, when the global logger actually runs, the wrong URL/pathname is printed.

  • Tests: Chain axios deeply for easier debugging in the future: b0c9c6e

  • Update README benchmarks after polka.handler changes: a9c8d4a

Examples

  • Added examples/with-morgan: e8240a6

    Illustrates the fix in 3120116, preventing regressions.

v0.3.1

03 Feb 04:32
Compare
Choose a tag to compare

Patches

  • FIX: Only mutate req.url and req.pathname if sub-group is known: f4e62bf

    This is an important fix! Any cases of serve-static that were mounted without a basename path were behaving unexpectedly. This is because req.url was mutated as soon as a route-handler was not found, turning incoming assets like /app.js into /, which meant that the target directory's index.html content was always sent.

  • Ensure that sub-groups & basenames always include a leading slash: 531c92d

    This makes it easier & quicker to mutate the req.url and req.pathname values once a sub-group is found.

  • Update README benchmarks after polka.handler changes: d8016cc

Examples

v0.3.0

23 Jan 22:51
Compare
Choose a tag to compare

Features

  • Add onError and onNoMatch options: e431583

  • Mount middleware groups & sub-applications to specific base pathnames (#8): e3c6966

  • Execute sub-applications' included middleware: e3c6966, b23d29f

    We pass off the entire request to the sub-app directly, rather than stealing & reconstructing its routes in the main Polka instance.

  • Offer @polka/send and @polka/send-type response helpers (#5): 815aaef, 2dac7a0

Breaking

  • Remove app.send prototype: 11052b7

    Use @polka/send or @polka/send-type instead.

  • Remove app.start prototype: a24fae2

    Use app.listen instead.

  • Require a base path to mount sub-applications: e3c6966

    • Mutates the req.url once a base app or middleware group has been found
      _ Includes a req.originalUrl value once a base has been matched

Patches

  • Allow asynchronous or dynamically-routed middleware to terminate the response: e3c6966

    A middleware like serve-static can't know ahead of time if it will find a file. Now the app.handler gives it a chance to, rather than exiting immediately.

  • Respond with 404 instead of 405 if no route definition.

Examples

Misc

v0.2.3

23 Jan 22:28
Compare
Choose a tag to compare

Patches

  • Exits the app handler early if no middleware to loop thru: ded9d0b

    Quick little performance win; avoids unnecessary executions.

v0.2.2

16 Jan 06:43
Compare
Choose a tag to compare

Patches

  • Ensure asynchronous middleware functions are awaited: bf626a3, b53874a

    The previous while loop only waited for synchronous res.end or next() calls. If any Promise or Stream based middleware worked, it was purely by luck 😅

  • Update benchmark code & result sets: f8a65b8, f5b3701, 76a0a37

v0.2.1

15 Jan 00:25
Compare
Choose a tag to compare

Patches

  • Ensure req.params is populated with pathname segments only (#6): d64ae9e