```ts
import { assert } from 'assert';

export function chunk<T>(items: readonly T[], size: number): T[][] {
  if (size < 1) {
    throw new Error('size must be a positive integer');
  }
  return items.length === 0 ? [] : [...Array(Math.ceil(items.length / size))]
                  .map(() => items.splice(0, size));
}

// Test cases to verify the correctness of the chunk function
function runTests() {

  assert.deepStrictEqual(chunk([], 5), []);
  assert.deepStrictEqual(chunk([1], 2), [[1]]);
  assert.deepStrictEqual(chunk([1, 2, 3, 4], 2), [[1, 2], [3, 4]]);
  console.log('All test cases passed!');
}

runTests();
```