open-index/open-npm huggingface dataset:
npm package: @lemonaderoom/foundation
Description: TypeScript Foundation Library
Author: lemo-nade-room
Latest version: 0.0.32

# @lemonaderoom/foundation

[![NPM version](https://img.shields.io/npm/v/@lemonaderoom/foundation.svg?style=flat)](https://npmjs.org/package/@lemonaderoom/foundation)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

TypeScript Foundation Libraryです。

## 特長

- SwiftのEquatableに似たEquatable型
  - Equatableを継承すると等価比較可能になる
- Clonable型
  - Clonableを継承すると複製可能になる
- Codable型
  - Codableを継承するとJSONシリアライズ可能になる
- Comparable型
  - 比較メソッドを持つinterface
- SwiftとScalaとJavaに似たOptional型
  - 型安全なnullとundefinedのラッパー
  - mapやflatMap等が使用可能
  - Scalaのようなfor-yieldが可能
- SwiftのResultとScalaのEitherに似たResult型
  - mapやflatMap等が使用可能
- Range型
  - 1...  のOpenRange
  - 1..< 5のRange
  - 1... 4のClosedRange
- Updatable
  - Scalaみたいにcopyメソッドが使える
- Sequence
  - ScalaやSwiftっぽい配列Wrapper
- Set
  - ScalaやSwiftっぽいSetWrapper
- Dictionary
  - ScalaやSwiftっぽいMapWrapper

## インストール

以下のコマンドを使用して、npm経由でパッケージをプロジェクトにインストールします:

```bash
npm i -D @lemonaderoom/foundation
```

もしくは、yarnを使用する場合は次のコマンドを使用します:

```bash
yarn add @lemonaderoom/foundation
```

## 使い方

テストコードをご覧ください

- [Equatable](src/equality/equatable.test.ts)
- [Clonable](src/clone/clonable.test.ts)
- [Updatable](src/update/updatable.test.ts)
- [Codable](src/codable/JSONEncodable.test.ts)
- [Comparable](src/compare/iComparable.test.ts)
- [Range](src/range/range.test.ts)
- [Optional](src/optional/optional.test.ts)
  - [Some](src/optional/some.test.ts)
  - [None](src/optional/none.test.ts)
  - [for-yield](src/for/optional-for.test.ts)
- [Either](src/result/result.test.ts)
  - [Success](src/result/success.test.ts)
  - [Failure](src/result/failure.test.ts)
- [Sequence](src/sequence/sequence.test.ts)
- [Set](src/set/set.test.ts)

## テストの実行

テストは[vitest](https://github.com/vitest-dev/vitest)を使用して実行できます。以下のコマンドでテストを実行します。

```bash
npm test
```

## 継承関係

```mermaid
classDiagram
    Equatable <|-- Clonable
    Clonable <|-- Updatable
    Updatable <|-- Codable
    Comparable : 
    Clonable <|-- Optional
    Clonable <|-- Either
    Updatable <|-- Range
    Clonable <|-- Sequence
    Clonable <|-- Set
 
```

## ライセンス

このプロジェクトはMITライセンスの元で公開されています。詳細は[LICENSE](LICENSE)ファイルをご覧ください。
npm package: @lemonaderoom/lesource
Description: HTTP Resource CRUD Manager
Author: Tanaka Yoichiro
Latest version: 0.0.18

# HTTP RESTful API Resource

## 概要

RESTful APIのエンドポイントに対してアクセスできる抽象化ライブラリです。

## インストール

```sh
npm i -D @lemonaderoom/lesource
```

## 使い方

### モデルの定義

JSONに相互変換可能なモデルを定義します。zodを使用すると楽になります。

#### Encodableに準拠

Encodableをimplementsし、encode()メソッドを実装します。encode()メソッドでは、JSONに変換可能なオブジェクトを返します。

#### Decodableに準拠

Decodableに準拠するには、static decode(json: unknown): Selfを実装する必要があります。

Decodableに準拠しなくても、`type Decoder<T> = (json: unknown) => T`に準拠する関数を用意することで使用することもできます。

```ts
import { Encodable, encodeArray } from '@lemonaderoom/lesource';
import { z } from "zod" // npm i -D zod

/** ZodによるUserの定義 */
export const UserSchema = z.object({
    id: z.number(),
    name: z.string(),
    birthday: z.string().datetime(),
})

/** Encodable, Decodableに準拠したモデル */
export class User implements Encodable {
    constructor(
        readonly id: number,
        readonly name: string,
        readonly birthday: Date,
    ) {}

    encode(): unknown {
        return {
            id: this.id,
            name: this.name,
            birthday: this.birthday.toISOString(),
        }
    }

    static decode(json: unknown): User {
        const schema = UserSchema.parse(json)
        return new User(
            schema.id,
            schema.name,
            new Date(schema.birthday),
        )
    }
}
```

### HTTPResourceFactoryの生成

HTTPResourceFactoryを生成します。HTTPResourceFactoryは、HTTPResourceを生成するファクトリです。

```ts
import { HTTPResourceFactory } from '@lemonaderoom/lesource';

const rootResource = new HTTPResourceFactory({
    baseURL: 'https://example.com/api/v1',
    headers: {
        'Content-Type': 'application/json',
    },
    beforeRequest: (config) => {
        // リクエスト前に実行される処理
        return config
    },
})
```