Open3

snippet

ゆぬきゆぬき

パンくずリスト
ul 派と ol 派がいる。順序があるから ol
現在のパスには、aria-current を付与。これもpage派とlocation派がいる。

<nav aria-label="breadcrumbs">
  <ol>
    <li>
      <a href="/">home</a>
    </li>
    <li aria-current="location">
      <a href="test">test</a>
    </li>
  </ol>
</nav>
ゆぬきゆぬき

一度呼び出したメソッドを呼び出せなくする型。

type Expand<T> = T extends infer U ? { [K in keyof U]: U[K] } : never;

type Consumable<Methods extends { [key: string]: Function }> = {
  [P in keyof Methods]: (
    ...value: Parameters<Methods[P]>
  ) => Consumable<Expand<Omit<Methods, P>>>;
};

const obj = {} as Consumable<{ a: () => void; b: () => void }>;

obj.a().b(); // 以降 a も b も呼び出せない。
ゆぬきゆぬき

papaparse をサーバーサイドで呼ぶ際は、FileReadable に変換して渡す。
complete() が非同期で実行されるため、パース結果が得られていないうちに後続処理が走り、不便。
確実に使うためにPromise でラップして終わるのを待つ。

async function parseAsync<T>(file: File, config: ParseLocalConfig<T, File>) {
  const arrayBuffer = await file.arrayBuffer();
  const buffer = Buffer.from(arrayBuffer);
  const stream = Readable.from(buffer);
  return new Promise((resolve, reject) => {
    Papa.parse(stream, {
      ...config,
      complete: (results) => {
        resolve(config.complete?.(results, file));
      },
      error: (error) => {
        reject(config.error?.(error, file));
      },
    });
  });
}