Skip to content

Releases: mjackson/remix-the-web

form-data-parser v0.7.0

25 Jan 18:57
Compare
Choose a tag to compare
  • BREAKING CHANGE: Override parseFormData signature so the upload handler is always last in the argument list. parserOptions are now an optional 2nd arg.
import { parseFormData } from '@mjackson/form-data-parser';

// before
await parseFormData(
  request,
  (fileUpload) => {
    // ...
  },
  { maxFileSize },
);

// after
await parseFormData(request, { maxFileSize }, (fileUpload) => {
  // ...
});
  • Upgrade multipart-parser to v0.8 to fix an issue where errors would crash the process when maxFileSize was exceeded (see #28)
  • Add an example of how to use form-data-parser together with file-storage to handle multipart uploads on Node.js
  • Expand FileUploadHandler interface to support returning Blob from the upload handler, which is the superclass of File

file-storage v0.5.0

25 Jan 19:34
Compare
Choose a tag to compare
  • Add fileStorage.put(key, file) method as a convenience around fileStorage.set(key, file) + fileStorage.get(key), which is a very common pattern when you need immediate access to the file you just put in storage
// before
await fileStorage.set(key, file);
let newFile = await fileStorage.get(key)!;

// after
let newFile = await fileStorage.put(key, file);

tar-parser v0.2.1

24 Jan 01:12
Compare
Choose a tag to compare
  • Add support for environments that do not support ReadableStream.prototype[Symbol.asyncIterator] (i.e. Safari), see #46

multipart-parser v0.8.0

24 Jan 19:34
Compare
Choose a tag to compare

This release improves error handling and simplifies some of the internals of the parser.

  • BREAKING CHANGE: Change parseMultipartRequest and parseMultipart interfaces from for await...of to await + callback API.
import { parseMultipartRequest } from '@mjackson/multipart-parser';

// before
for await (let part of parseMultipartRequest(request)) {
  // ...
}

// after
await parseMultipartRequest(request, (part) => {
  // ...
});

This change greatly simplifies the implementation of parseMultipartRequest/parseMultipart and fixes a subtle bug that did not properly catch parse errors when maxFileSize was exceeded (see #28).

  • Add MaxHeaderSizeExceededError and MaxFileSizeExceededError to make it easier to have finer-grained error handling.
import * as http from 'node:http';
import {
  MultipartParseError,
  MaxFileSizeExceededError,
  parseMultipartRequest,
} from '@mjackson/multipart-parser/node';

const tenMb = 10 * Math.pow(2, 20);

const server = http.createServer(async (req, res) => {
  try {
    await parseMultipartRequest(req, { maxFileSize: tenMb }, (part) => {
      // ...
    });
  } catch (error) {
    if (error instanceof MaxFileSizeExceededError) {
      res.writeHead(413);
      res.end(error.message);
    } else if (error instanceof MultipartParseError) {
      res.writeHead(400);
      res.end('Invalid multipart request');
    } else {
      console.error(error);
      res.writeHead(500);
      res.end('Internal Server Error');
    }
  }
});

form-data-parser v0.6.0

15 Jan 03:43
Compare
Choose a tag to compare
  • Allow upload handlers to run in parallel. Fixes #44

file-storage v0.4.1

10 Jan 21:57
Compare
Choose a tag to compare
  • Fix missing types for file-storage/local in npm package

file-storage v0.4.0

08 Jan 01:57
Compare
Choose a tag to compare
  • Fixes race conditions with concurrent calls to set
  • Shards storage directories for more scalable file systems

tar-parser v0.2.0

07 Jan 16:46
Compare
Choose a tag to compare
  • Fixed a bug that hangs the process when trying to read zero-length entries.

headers v0.9.0

20 Dec 15:32
Compare
Choose a tag to compare

This release tightens up the type safety and brings SuperHeaders more in line with the built-in Headers interface.

  • BREAKING CHANGE: The mutation methods headers.set() and headers.append() no longer accept anything other than a string as the 2nd arg. This follows the native Headers interface more closely.
// before
let headers = new SuperHeaders();
headers.set('Content-Type', { mediaType: 'text/html' });

// after
headers.set('Content-Type', 'text/html');

// if you need the previous behavior, use the setter instead of set()
headers.contentType = { mediaType: 'text/html' };

Similarly, the constructor no longer accepts non-string values in an array init value.

// before
let headers = new SuperHeaders([['Content-Type', { mediaType: 'text/html' }]]);

// after
let headers = new SuperHeaders([['Content-Type', 'text/html']]);

// if you need the previous behavior, use the object init instead
let headers = new SuperHeaders({ contentType: { mediaType: 'text/html' } });
  • BREAKING CHANGE: headers.get() returns null for uninitialized custom header values instead of undefined. This follows the native Headers interface more closely.
// before
let headers = new SuperHeaders();
headers.get('Host'); // null
headers.get('Content-Type'); // undefined

// after
headers.get('Host'); // null
headers.get('Content-Type'); // null
  • BREAKING CHANGE: Removed ability to initialize AcceptLanguage with undefined weight values.
// before
let h1 = new AcceptLanguage({ 'en-US': undefined });
let h2 = new AcceptLanguage([['en-US', undefined]]);

// after
let h3 = new AcceptLanguage({ 'en-US': 1 });
  • All setters now also accept undefined | null in addition to string and custom object values. Setting a header to undefined | null is the same as using headers.delete().
let headers = new SuperHeaders({ contentType: 'text/html' });
headers.get('Content-Type'); // 'text/html'

headers.contentType = null; // same as headers.delete('Content-Type');
headers.get('Content-Type'); // null
  • Allow setting date headers (date, expires, ifModifiedSince, ifUnmodifiedSince, and lastModified) using numbers.
let ms = new Date().getTime();
let headers = new SuperHeaders({ lastModified: ms });
headers.date = ms;
  • Added AcceptLanguage.prototype.accepts(language), AcceptLanguage.prototype.getWeight(language),
    AcceptLanguage.prototype.getPreferred(languages)
import { AcceptLanguage } from '@mjackson/headers';

let header = new AcceptLanguage({ 'en-US': 1, en: 0.9 });

header.accepts('en-US'); // true
header.accepts('en-GB'); // true
header.accepts('en'); // true
header.accepts('fr'); // false

header.getWeight('en-US'); // 1
header.getWeight('en-GB'); // 0.9

header.getPreferred(['en-GB', 'en-US']); // 'en-US'
  • Added Accept support
import { Accept } from '@mjackson/headers';

let header = new Accept({ 'text/html': 1, 'text/*': 0.9 });

header.accepts('text/html'); // true
header.accepts('text/plain'); // true
header.accepts('text/*'); // true
header.accepts('image/jpeg'); // false

header.getWeight('text/html'); // 1
header.getWeight('text/plain'); // 0.9

header.getPreferred(['text/html', 'text/plain']); // 'text/html'
  • Added Accept-Encoding support
import { AcceptEncoding } from '@mjackson/headers';

let header = new AcceptEncoding({ gzip: 1, deflate: 0.9 });

header.accepts('gzip'); // true
header.accepts('deflate'); // true
header.accepts('identity'); // true
header.accepts('br'); // false

header.getWeight('gzip'); // 1
header.getWeight('deflate'); // 0.9

header.getPreferred(['gzip', 'deflate']); // 'gzip'
  • Added SuperHeaders.prototype (getters and setters) for:
    • accept
    • acceptEncoding
    • acceptRanges
    • connection
    • contentEncoding
    • contentLanguage
    • etag
    • host
    • location
    • referer

multipart-parser v0.7.2

12 Dec 19:25
Compare
Choose a tag to compare
  • Fix dependency on headers in package.json