open-index/open-npm huggingface dataset:
npm package: @greenlabs/garter
Description: <img src="docs/garter.svg" alt="garter"      width="200" height="200" align="right" />
Latest version: 1.0.0

# Garter

<img src="docs/garter.svg" alt="garter"
     width="200" height="200" align="right" />

ReScript의 표준 라이브러리라 할 수 있는 Belt는 아직 충분히 성숙하지 않아 필수 유틸리티 함수가 많이 부족합니다.
Garter는 Belt 라이브러리의 부족한 부분을 보완하는 그린랩스의 표준 라이브러리입니다.

하스켈 Prelude가 레퍼런스가 된다는 점에서 [reazen/relude](https://github.com/reazen/relude)와 지향점이 비슷합니다.
다른점은 아래와 같습니다.

1. 내부의 필요에 의해서만 확장합니다.
2. OCaml을 고려하지 않습니다.
3. Pipe First 문법을 사용합니다. (Belt와 같은 이유)
npm package: @greenlabs/greenlabs-design-system
Description: Greenlabs Design System for ReScript
Author: Greenlabs Dev
Latest version: 0.4.20

# Greenlabs Design System

## 📚 Storybook

### 실행방법

1. Build ReScript

```sh
yarn re:watch
```

2. Run Storybook

```sh
yarn storybook
```
npm package: @greenlabs/re-korean-numeral
Description: ReScript module to convert the number to Korean
Author: Greenlabs Dev
Latest version: 0.1.2
Deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.

# re-korean-numeral

`re-korean-numeral`은 숫자를 한글 숫자로 변환해주는 리스트립트(ReScript) 모듈 입니다.

### 예
```
1234 -> 1,234
1234567890 -> 12억 3,456만 7,890
1234567890 -> 12억 3,456만  // 만 이하 절삭
```

## 설치하기

1. 모듈 설치

```shell
npm i @greenlabs/re-korean-numeral
or
yarn add @greenlabs/re-korean-numeral
```

2. `bsconfig.json` 의존성 추가하기

```json
"bs-dependencies": [
  "@greenlabs/re-korean-numeral"
]
```

## 사용방법

1. `fromInt`

```reason
KoreanNumeric.fromInt(1234, ())
// 1,234
```

2. `fromFloat`

```reason
KoreanNumeric.fromFloat(1234567890.1, ~drop=1, ())
// 12억 3,456만
```

3. `fromString`

```reason
KoreanNumeric.fromString("1234567890987654321", ~drop=1, ())
// 123경 4,567조 8,909억 8,765만
```

## 테스트

```shell
npm run test
or
yarn test
```
npm package: @greenlabs/res-tailwindcss
Description: ReScript PPX validates the tailwindcss class names
Author: Greenlabs Dev
Latest version: 0.1.14

# ReScript Tailwindcss

A ReScript PPX, which validates the tailwindcss class names

## Motivation

The [tailwind-ppx](https://github.com/dylanirlbeck/tailwind-ppx) is the only ppx to validate the tailwindcss class names in compile time. But, it was archived, and written by `ocaml-migrate-parsetree`. My team considered taking over the repository and maintaining it but decided to rewrite it from the scratch with `ppxlib` and `menhir`. Additionally, we improve the logic to find the invalid class name with [Spelling Corrector](https://norvig.com/spell-correct.html) algorithm.

Plus, the arbitrary values in the JIT mode of Tailwindcss are supported!

```html
<!-- arbitrary value examples -->
<div className=%twc("p-[75px]")> ... </div>
<div className=%twc("p-[calc(75px)]")> ... </div>
<div className=%twc("p-[calc(100%-40px)]")> ... </div>
<div className=%twc("bg-[#1da1f1]")> ... </div>
<div className=%twc("grid-cols-[1fr,700px,2fr]")> ... </div>
<div className=%twc("translate-x-[calc(-50%+27px)]")> ... </div>
<div className=%twc("!pb-[270px]")> ... </div>
<div className=%twc("after:content-['Hello_World']")> ... </div>
<div className=%twc("peer-checked:[&>svg]:rotate-180")> ... </div>
```

## Install

```
yarn add -D @greenlabs/res-tailwindcss
```

`<path_to_tailwindcss>` should be replaced with the relative location of your generated tailwindcss file from your project root in which the `bsconfig.json` file is located.

```
// bsconfig.json

"ppx-flags": [
  ...,
  ["@greenlabs/res-tailwindcss/ppx", "--path <path_to_tailwindcss>"]
],
```

## Example

```rescript
<input type_="checkbox" className=%twc("peer") />
<div className=%twc("flex justify-center items-center after:content-['Hello_World'] peer-checked:[&>svg]:rotate-180")>
  ...
  <svg />
</div>
```

## Development

1. Create a sandbox with opam

```
opam switch create tailwindcss 4.14.0
```

2. Install dependencies

```
opam install . --deps-only --with-test
```

3. Build

```
opam exec -- dune build
```

4. Test

```
cd rescript

(install dependencies)
yarn

(build --watch)
yarn res:clean && yarn res:watch

(run test --watch)
yarn test:watch
```
npm package: @greenlabs/rescript-date-fns
Description: ReScript bindings to date-fns
Author: Greenlabs Dev
Latest version: 2.30.0

# `rescript-date-fns`

## Getting started

```bash
npm install @greenlabs/rescript-date-fns --save
or
yarn add @greenlabs/rescript-date-fns
```

Add `"@greenlabs/rescript-date-fns"` to `bs-dependencies` in your project's `bsconfig.json`

## Differences from original date-fns API

In bindings the date parameter is moved to last position in a bunch of functions to work better with currying and make better use of pipe operator. Most of these can be seen from types. The ones that have same types but are different from date-fns:

```rs
laterDate |> DateFns.isAfter(earlierDate) /* true */
DateFns.isAfter(earlierDate, laterDate) /* true */

earlierDate |> DateFns.isBefore(laterDate) /* true */
DateFns.isBefore(laterDate, earlierDate) /* true */

middleDate |> DateFns.isWithinRange(earliestDate, latestDate) /* true */
DateFns.isWithinRange(earliestDate, latestDate, middleDate) /* true */
```
npm package: @greenlabs/rescript-hammerjs
Description: ReScript bindings to @egjs/hammerjs
Author: Greenlabs Dev
Latest version: 2.0.0

# `rescript-hammerjs`

ReScript binding of [@egjs/hammerjs](https://github.com/naver/hammer.js)

## Install

```bash
npm i @greenlabs/rescript-hammerjs
or
yarn add @greenlabs/rescript-hammerjs
```

```json
"bs-dependencies": [
  "@greenlabs/rescript-hammerjs"
]
```

## Usage

```rescript
React.useEffect0(_ => {
    let swipeInstance =
      ref.current
      ->Js.Nullable.toOption
      ->Option.mapWithDefault(None, el => Some(el->HammerJs.makeWithElement))

    swipeInstance->Option.forEach(swipeInstance' =>
      HammerJs.on(
        swipeInstance',
        #swipe,
        event => {
          Js.log(event)
        },
      )
    )

    Some(
      _ => {
        swipeInstance->Option.forEach(swipeInstance' => swipeInstance'->HammerJs.destroy)
      },
    )
  })
```
npm package: @greenlabs/rescript-korean-numeral
Description: ReScript module to convert the number to Korean
Author: Greenlabs Dev
Latest version: 0.5.0

# rescript-korean-numeral

[![npm version](https://img.shields.io/npm/v/@greenlabs/rescript-korean-numeral.svg)](https://www.npmjs.com/package/@greenlabs/rescript-korean-numeral)

> `@greenlabs/re-korean-numeral`은 deprecated 되었습니다.
> 새로운 패키지명 `@greenlabs/rescript-korean-numeral`을 이용해서 설치해주세요.

`rescript-korean-numeral`은 숫자를 한글 숫자로 변환해주는 리스트립트(ReScript) 모듈 입니다.

### 예

```
1234 -> 1,234
1234567890 -> 12억 3,456만 7,890
1234567890 -> 12억 3,456만  // 만 이하 절삭
```

### ReScript 버전 별 호환성

| ReScript               | korean-numeral |
| ---------------------- | -------------- |
| >= v12                 | >= v0.5.0      |
| >= v11.1 (BigInt 지원)  | >= v0.4.0      |
| ~< v11.1               | ~< v0.4.0      |

## 설치하기

1. 모듈 설치

```shell
npm i @greenlabs/rescript-korean-numeral
or
yarn add @greenlabs/rescript-korean-numeral
```

2. `rescript.json` 의존성 추가하기

```json
"bs-dependencies": [
  "@greenlabs/rescript-korean-numeral"
]
```

## 사용방법

1. `fromInt`

```rescript
KoreanNumeric.fromInt(1234, ())
// 1,234
```

2. `fromFloat`

```rescript
KoreanNumeric.fromFloat(1234567890.1, ~drop=1, ())
// 12억 3,456만
```

3. `fromString`

```rescript
KoreanNumeric.fromString("1234567890987654321", ~drop=1, ())
// 123경 4,567조 8,909억 8,765만
```

4. `fromBigInt`

> ReScript v11.1.0-rc.6 부터 지원 가능

```rescript
KoreanNumeric.fromBigInt(1234567890987654321n, ~drop=1, ())
// 123경 4,567조 8,909억 8,765만
```

## 테스트

```shell
pnpm test
```
npm package: @greenlabs/rescript-nock
Description: ReScript bindings for Nock
Author: Greenlabs Dev
Latest version: 13.2.0

# `rescript-nock`

ReScript binding of [nock](https://github.com/nock/nock)

## Install

```bash
npm i @greenlabs/rescript-nock --save-dev
or
yarn add @greenlabs/rescript-nock --dev
```

```json
"bs-dev-dependencies": [
  "@greenlabs/rescript-nock"
]
```

## Usage

With [rescript-jest](https://github.com/green-labs/rescript-bindings/packages/rescript-jest)

```rescript
open Jest
open Expect

describe("Test my module", () => {
  let setupNetworkScope = Nock.make("https://greenlabs.co.kr")
    ->Nock.get("/api/communities")
    ->Nock.replyAny(200, {
      "result": "OK"
    })
  describe("When call setup", () => {
    testPromise("Should network is mocked", () => {
      let scope = setupNetworkScope()

      Fetch.fetch("https://greenlabs.co.kr/api/communities")
      ->Promise.then(response => response->Fetch.Response.json)
      ->Promise.thenResolve(response => {
        expect(
          response
          ->Js.Json.decodeObject
          ->Belt.Option.flatMap(
            object => object->Js.Dict.get("result")->Belt.Option.flatMap(Js.Json.decodeString),
          ),
        )->toBe(Some("OK"))
        scope->Nock.done
      })
    })
  })
  
})
```
npm package: @greenlabs/rescript-react-hook-form
Description: ReScript bindings for react-hook-form
Author: Greenlabs Dev
Latest version: 7.31.0

# `rescript-react-hook-form`

## Install

```bash
npm i @greenlabs/rescript-react-hook-form
or
yarn add @greenlabs/rescript-react-hook-form
```

```json
"bs-dependencies": [
  "@greenlabs/rescript-react-hook-form"
]
```

## Usage

### Define module

```rescript
type rec input = {
  id: string,
  password: string,
  hobbies: array<hobby>,
}
and hobby = {value: string}

module Form = ReactHookForm.Make({
  type t = input
})

module FormInput = {
  module Id = Form.MakeInput({
    type t = string
    let name = "id"
    let config = ReactHookForm.Rules.make({
      required: true,
    })
  })

  module Password = Form.MakeInput({
    type t = string
    let name = "password"
    let config = ReactHookForm.Rules.make({
      required: true,
    })
  })

  module Hobbies = Form.MakeInputArray({
    type t = hobby
    let name = "hobbies"
    let config = ReactHookForm.Rules.empty()
  })
}
```

### Example

```rescript
@react.component
let make = () => {
  let form = Form.use(
    ~config={
      defaultValues: {id: "id", password: "", hobbies: []},
    },
  )
  let hobbies = FormInput.Hobbies.useFieldArray(form, ())

  let formState = form->Form.formState
  let isValid = formState.isValid

  let handleClearPassword = _ => {
    form->FormInput.Password.setValue("")
  }

  let handleAddHubby = _ => {
    hobbies->FormInput.Hobbies.append({
      value: `요리`,
    })
  }

  React.useEffect0(() => {
    form->FormInput.Id.focus
    None
  })

  <form
    onSubmit={form->Form.handleSubmit(input => {
      Js.log((input.id, input.password, input.hobbies))
      _ => ()
    })}>
    <label>
      {form->FormInput.Id.renderWithRegister(<input placeholder="id" type_="text" />, ())}
    </label>
    {form
    ->FormInput.Id.error
    ->Belt.Option.mapWithDefault(React.null, error => {
      <p> {error.message->React.string} </p>
    })}
    <label>
      {form->FormInput.Password.renderWithRegister(
        <input placeholder="password" type_="password" />,
        (),
      )}
    </label>
    {form
    ->FormInput.Password.error
    ->Belt.Option.mapWithDefault(React.null, error => {
      <p> {error.message->React.string} </p>
    })}
    {hobbies
    ->FormInput.Hobbies.fields
    ->Belt.Array.mapWithIndex((index, field) => {
      <div key={field->FormInput.Hobbies.id}>
        {form->FormInput.Hobbies.renderWithIndexRegister(
          index,
          <input type_="text" />,
          ~property="value",
          (),
        )}
        <p> {`Current value: ${field.value}`->React.string} </p>
      </div>
    })
    ->React.array}
    <button type_="button" onClick={handleAddHubby}> {`Add new hubby`->React.string} </button>
    <button type_="button" onClick={handleClearPassword}> {`Clear password`->React.string} </button>
    <button disabled={!isValid} type_="submit"> {`Ok`->React.string} </button>
  </form>
}
```
npm package: @greenlabs/rescript-react-linkify
Description: ReScript bindings for React Linkify
Author: Greenlabs Dev
Latest version: 1.0.0

# `rescript-react-linkify`

## Install

```bash
npm i @greenlabs/rescript-react-linkify
or
yarn add @greenlabs/rescript-react-linkify
```

```json
"bs-dependencies": [
  "@greenlabs/rescript-react-linkify"
]
```

## Usage

```rescript
@react.component
let make = () => {
<Linkify
  componentDecorator={(decoratedHref, decoratedText, index) => {
    <a
      target="_blank"
      key={decoratedHref ++ decoratedText ++ Int.toString(index)}
      href={decoratedHref}>
      {decoratedText->React.string}
    </a>
  }}>
  {"Contents"->React.string}
</Linkify>
}
```
npm package: @greenlabs/rescript-use-debounce
Description: ReScript bindings for rescript-use-debounce
Author: Greenlabs Dev
Latest version: 9.0.0

# `rescript-use-debounce`

Binding of [`use-debounce`](https://github.com/xnimorz/use-debounce) package

## Install

```bash
npm i @greenlabs/rescript-use-debounce
or
yarn add @greenlabs/rescript-use-debounce
```

```json
"bs-dependencies": [
  "@greenlabs/rescript-use-debounce"
]
```

## Usage

```rescript
let test = () => {
  let (debouncedCallback, debouncedCallbackMethods) = useDebouncedCallback(e => {
    e->ReactEvent.Synthetic.preventDefault
  }, 500, ~options={maxWait: 500})

  (debouncedCallback, debouncedCallbackMethods.isPending())
}
```

## Note

`flush()`'s type signature is `unit => ReturnType<callback>`, but couldn't find a way to achieve it in ReScript so left the return type as unit.
npm package: @greenmice/maplibre-gl-export
Description: This module adds control which can export PDF and images.
Author: Jin IGARASHI
Latest version: 3.8.6

# maplibre-gl-export

[![version](https://img.shields.io/npm/v/@watergis/maplibre-gl-export.svg)](https://www.npmjs.com/package/@watergis/maplibre-gl-export)

This module adds control which can export PDF and images. It was forked from [mapbox-gl-export](https://github.com/watergis/mapbox-gl-export).

This module is using source code of [mpetroff/print-maps](https://github.com/mpetroff/print-maps). I just adopted this library to normal Mapbox GL Plugin. Thanks so much to develop this library!

## Demo & usage

See [documentation](https://maplibre-gl-export.water-gis.com/).
npm package: @greenpress/admin
Description: Admin panel service for the greenpress open-source platform.<br> Written in Vue.js.
Author: David Meir-Levy
Latest version: 2.0.21

# Greenpress Admin Panel

Admin panel service for the greenpress open-source platform.<br>
Written in Vue.js.

[![Codefresh build status]( https://g.codefresh.io/api/badges/pipeline/greenpress/admin-panel%2Fadmin-panel-main?type=cf-1)]( https://g.codefresh.io/public/accounts/greenpress/pipelines/new/5df22be825b910790c3882e6)
[![npm version](https://badge.fury.io/js/%40greenpress%2Fadmin.svg)](https://badge.fury.io/js/%40greenpress%2Fadmin)
## Usage
### As a Docker container
```
$ docker run -p 3001:3001 greenpress/admin-panel
```
### As Node package
```
$ npm i @greenpress/admin
$ npx greenpress-admin
```

## Development and Independent Usage
In case you would like to run this project manually, for any reason, there are several commands you need to acknowledge:

### Project setup
```
npm install
```

#### Compiles and hot-reloads for development
```
npm run serve
```

#### Compiles and minifies for production
```
npm run build
```

#### Lints and fixes files
```
npm run lint
```

### Vue.js Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).
npm package: @greenpress/api-kit
Description: API-Kit package to help with greenpress infrastructure and reuse capabilities across services
Author: David Meir-Levy
Latest version: 2.0.21

# GreenPress API Kit

This code brings together all greenpress services

## Main Features

### Express

`api-kit` creates Express apps to make the development easier.

### Auth Middlewares

`api-kit` provides simple authentication middlewares from the authentication service, without having to worry about fetching.
npm package: @greenpress/content
Description: Content API for greenpress platform
Author: David Meir-Levy
Latest version: 2.0.21

# Greenpress Content service

A content service for greenpress platform 

[![Codefresh build status]( https://g.codefresh.io/api/badges/pipeline/greenpress/content%2Fmaster?type=cf-1)]( https%3A%2F%2Fg.codefresh.io%2Fpublic%2Faccounts%2Fgreenpress%2Fpipelines%2Fnew%2F5e84c0a1b1f6cd03c8ce58e0)
[![npm version](https://badge.fury.io/js/%40greenpress%2Fcontent.svg)](https://badge.fury.io/js/%40greenpress%2Fcontent)

## Main Features
- manage menus
- manage categories
- manage posts
- manage comments
- manage website configurations
- multi tenancy
- search posts
- post tags 
- auto-migrations for updates

## Dependencies
- Node.js
- npm OR yarn
- MongoDB
- [Authentication-service](https://github.com/greenpress/authentication-service)


## Usage
### As a Docker container
```sh
$ docker run -p 3001:3001 greenpress/content
```
### As Node package
```sh
$ npm i @greenpress/content
$ npx greenpress-content
```

## Development and Independent Usage
In case you would like to run this project manually, for any reason, there are several commands you need to acknowledge:

### Install
```sh
$ npm install
```

### Launch
```sh
$ npm start
```
npm package: @greenpress/mailing
Description: manage mailing operations
Author: David Meir-Levy
Latest version: 2.0.21

# Greenpress Mailing service

An HTTP server to manage mailing providers, templates and sending emails

[![npm version](https://badge.fury.io/js/%40greenpress%2Fmailing.svg)](https://badge.fury.io/js/%40greenpress%2Fmailing)

## Dependencies
- Node.js
- npm OR yarn
- MongoDB
- [Authentication-service](https://github.com/greenpress/authentication-service)
- [Secrets-service](https://github.com/greenpress/secrets-service)

## Usage
### As a Docker container
```sh
$ docker run -p 3001:3001 greenpress/mailing
```
### As Node package
```sh
$ npm i @greenpress/mailing
$ npx greenpress-mailing
```

## Development and Independent Usage
In case you would like to run this project manually, for any reason, there are several commands you need to acknowledge:

### Install
```sh
$ npm install
```

### Launch
```sh
$ npm start
```
npm package: @greenpress/plugins
Description: manage plugins system
Author: David Meir-Levy
Latest version: 2.0.21

# Greenpress plugins system service

An HTTP server to manage 3rd-party plugins for any system, combining frontend and backend plugins.

[![npm version](https://badge.fury.io/js/%40greenpress%2Fplugins.svg)](https://badge.fury.io/js/%40greenpress%2Fplugins)

## Dependencies
- Node.js
- npm OR yarn
- MongoDB
- [Authentication-service](https://github.com/greenpress/authentication-service)
- [Secrets-service](https://github.com/greenpress/secrets-service)

## Usage
### As a Docker container
```sh
$ docker run -p 3001:3001 greenpress/plugins
```

## Development and Independent Usage
In case you would like to run this project manually, for any reason, there are several commands you need to acknowledge:

### Install
```sh
$ npm install
```

### Launch
```sh
$ npm start
```
npm package: @greenpress/secrets
Description: manage encrypted secrets
Author: David Meir-Levy
Latest version: 2.0.21

# Secrets service

An HTTP server to manage internal application secrets 


[![Codefresh build status]( https://g.codefresh.io/api/badges/pipeline/greenpress/secrets%2Fmaster?type=cf-1)]( https%3A%2F%2Fg.codefresh.io%2Fpublic%2Faccounts%2Fgreenpress%2Fpipelines%2Fnew%2F5e84c29035717176303bb23c)
[![npm version](https://badge.fury.io/js/%40greenpress%2Fsecrets.svg)](https://badge.fury.io/js/%40greenpress%2Fsecrets)

## Dependencies
- Node.js
- npm OR yarn
- MongoDB

## Usage
### As a Docker container
```sh
$ docker run -p 3001:3001 greenpress/secrets
```
### As Node package
```sh
$ npm i @greenpress/secrets
$ npx greenpress-secrets
```

## Development and Independent Usage
In case you would like to run this project manually, for any reason, there are several commands you need to acknowledge:

## Install
```sh
$ npm install
```

## Launch
```sh
$ npm start
```
npm package: @greenrenge/interceptors-opentelemetry
Description: Temporal.io SDK interceptors bundle for tracing with opentelemetry
Author: Temporal Technologies Inc.
Latest version: 1.13.2

# `@temporalio/interceptors-opentelemetry`

[![NPM](https://img.shields.io/npm/v/@temporalio/interceptors-opentelemetry?style=for-the-badge)](https://www.npmjs.com/package/@temporalio/interceptors-opentelemetry)

[Temporal](https://temporal.io)'s [TypeScript SDK](https://docs.temporal.io/typescript/introduction) interceptors for tracing Workflow and Activity executions with [OpenTelemetry](https://opentelemetry.io/).

- [Interceptors docs](https://docs.temporal.io/typescript/interceptors)
- [OpenTelemetry Interceptor example setup](https://github.com/temporalio/samples-typescript/tree/main/interceptors-opentelemetry)
npm package: @greentbx/spirit-ui
Description: Modern and simple React design system
Latest version: 0.1.12

# Spirit UI by GreenTBX

Spirit UI is a modern and simple React design system.

GreenTBX's evolution of [Geist UI](https://github.com/geist-org/geist-ui), we've built a design system

[Get started with Spirit UI →](https://spirit.greentbx.com/guides/get-started)

[Spirit UI documentation →](https://spirit.greentbx.com)

## The Spirit

- **Modern:**
- **Simple:**

## Contribute

We warmly welcome contributions! Take a look at CONTRIBUTING.md, or the [architecture notes](/docs/internal/architecture.md) if you want to go for a deeper dive.

## License

MIT