open-index/open-npm huggingface dataset:
npm package: @innei/react-tweet
Description: 一个用于在 React 应用中嵌入 Twitter/X 推文的组件库，支持 Next.js、Vite 等框架。
Author: Luis Alvarez
Latest version: 3.4.2

# @innei/react-tweet

一个用于在 React 应用中嵌入 Twitter/X 推文的组件库，支持 Next.js、Vite 等框架。

本项目 fork 自 [vercel/react-tweet](https://github.com/vercel/react-tweet)，并在此基础上进行了独立开发，新增了多项实用功能。

## Fork 新增特性

相比上游仓库，本项目新增了以下功能：

- **Shadow DOM 样式隔离** - 完全隔离外部 CSS 干扰，解决全局样式污染问题
- **可点击卡片** - 整个推文卡片可点击跳转到 Twitter/X
- **自动主题跟随** - 自动检测页面主题（dark/light）并同步到组件
- **重新设计的 UI** - 更现代的视觉风格

## 安装

```bash
npm install @innei/react-tweet
# or
pnpm add @innei/react-tweet
# or
yarn add @innei/react-tweet
```

## 快速开始

```tsx
import { Tweet } from '@innei/react-tweet'
import '@innei/react-tweet/theme.css'

export default function App() {
  return <Tweet id="1628832338187636740" />
}
```

## Shadow DOM 样式隔离

在复杂应用中嵌入推文时，外部 CSS（如 `* { box-sizing }`、`a { color }`、`img { max-width }` 等）可能会影响组件外观。Shadow DOM 隔离功能提供了完整的样式封装。

### 使用 ShadowRoot

使用 `ShadowRoot` 包装组件以隔离外部样式：

```tsx
import { EmbeddedTweet, ShadowRoot } from '@innei/react-tweet'
import '@innei/react-tweet/theme.css'

export default function App() {
  return (
    <ShadowRoot theme="auto">
      <EmbeddedTweet tweet={tweetData} />
    </ShadowRoot>
  )
}
```

### 使用 IsolatedTweet

便捷组件，内置 Shadow DOM 隔离：

```tsx
import { IsolatedTweet } from '@innei/react-tweet'
import '@innei/react-tweet/theme.css'

export default function App() {
  return <IsolatedTweet id="1628832338187636740" theme="auto" />
}
```

### 主题选项

`theme` 属性支持三个值：

- `'auto'`（默认）- 自动跟随页面主题，通过监听 `<html>` 的 `data-theme` 属性、`.dark`/`.light` 类名以及 `prefers-color-scheme` 媒体查询
- `'light'` - 强制浅色主题
- `'dark'` - 强制深色主题

```tsx
// 自动检测页面主题
<ShadowRoot theme="auto">
  <Tweet id="..." />
</ShadowRoot>

// 强制深色主题
<ShadowRoot theme="dark">
  <Tweet id="..." />
</ShadowRoot>
```

### 工作原理

Shadow DOM 创建了一个具有独立样式作用域的隔离 DOM 子树。`ShadowRoot` 组件：

1. 使用 `attachShadow({ mode: 'open' })` 创建 Shadow DOM 边界
2. 通过 `adoptedStyleSheets` 将页面样式表克隆到 Shadow DOM 中
3. 监听 `document.documentElement` 的主题变化并同步到 Shadow DOM 宿主元素

### 浏览器兼容性

- `attachShadow`: 所有现代浏览器
- `adoptedStyleSheets`: Chrome 73+, Firefox 101+, Safari 16.4+

### 限制

- Shadow DOM 需要客户端 JavaScript（SSR 期间不可用）
- 首次渲染可能在 hydration 前短暂显示无样式内容

## API 参考

### Tweet

```tsx
<Tweet
  id="1628832338187636740"
  fallback={<Loading />}         // 可选：加载时显示
  components={customComponents}  // 可选：自定义子组件
/>
```

### IsolatedTweet

```tsx
<IsolatedTweet
  id="1628832338187636740"
  theme="auto"              // 'auto' | 'light' | 'dark'
  className="my-tweet"      // 可选：宿主元素类名
  style={{ maxWidth: 500 }} // 可选：宿主元素样式
/>
```

### ShadowRoot

```tsx
<ShadowRoot
  theme="auto"              // 'auto' | 'light' | 'dark'
  className="shadow-host"   // 可选：宿主元素类名
  style={{ margin: 20 }}    // 可选：宿主元素样式
>
  {children}
</ShadowRoot>
```

## 致谢

本项目基于 [vercel/react-tweet](https://github.com/vercel/react-tweet) 开发，感谢原作者的出色工作。

## License

MIT
npm package: @innei/react-typewriter
Description: A simple component impl typewriter effect.
Author: Innei
Latest version: 0.1.4

# React TypeWriter

Live Demo: <https://innei.github.io/react-typewriter/>

## How to use

```bash
npm i @innei/react-typewriter
```

```tsx
<TypeWriter textArray={[
  '剑指天下，秋收 [Offer]',
  '半夜奋笔疾码，云相伴，”乐“相随。',
  'git push --force # 🐶',
  'debugPrint("Hello World!")',
  'vivo mian() { }；',
  '0.2 + 0.1 // 0.30000000000000004',
  'ReferenceError: girlfriend is not defined',
]} />
```

## Interface

```tsx
interface TypeWriterProps {
  /**
   * 文字列表
   */
  textArray: string[]
  /**
   * 文字速度, 毫秒
   */
  textSpeed?: number
  /**
   * 后缀
   */
  suffix?: string | JSX.Element
  /**
   * 停顿时间
   */
  pauseTime?: number
  /**
   * 重复
   */
  repeat?: boolean
  /**
   * 暂停
   */
  pause?: boolean
  /**
   * 外层标签
   */
  tag?: keyof JSX.IntrinsicElements
}
```

## License

MIT
npm package: @innei/string-width
Description: Get the visual width of a string - the number of columns required to display it
Author: Sindre Sorhus
Latest version: 7.1.1-fork.0

# string-width

> Get the visual width of a string - the number of columns required to display it

Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width. [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) are stripped and doesn't affect the width.

Useful to be able to measure the actual width of command-line output.

## Install

```sh
npm install string-width
```

## Usage

```js
import stringWidth from 'string-width';

stringWidth('a');
//=> 1

stringWidth('古');
//=> 2

stringWidth('\u001B[1m古\u001B[22m');
//=> 2
```

## API

### stringWidth(string, options?)

#### string

Type: `string`

The string to be counted.

#### options

Type: `object`

##### ambiguousIsNarrow

Type: `boolean`\
Default: `true`

Count [ambiguous width characters](https://www.unicode.org/reports/tr11/#Ambiguous) as having narrow width (count of 1) instead of wide width (count of 2).

> Ambiguous characters behave like wide or narrow characters depending on the context (language tag, script identification, associated font, source of data, or explicit markup; all can provide the context). **If the context cannot be established reliably, they should be treated as narrow characters by default.**
> - http://www.unicode.org/reports/tr11/

##### countAnsiEscapeCodes

Type: `boolean`\
Default: `false`

Whether [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code) should be counted.

## Related

- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module
- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string
- [widest-line](https://github.com/sindresorhus/widest-line) - Get the visual width of the widest line in a string
- [get-east-asian-width](https://github.com/sindresorhus/get-east-asian-width) - Determine the East Asian Width of a Unicode character
npm package: @innei/test
Description: Please use pnpm do this.
Author: Innei
Latest version: 1.0.4

# Rollup Typescript library template

Please use pnpm do this.

```sh
pnpm i
```

# Usage

### Package

Bundle your source code via tsc, rollup.

```
yarn package
```

### Dev

Start dev mode by Vite.

```
yarn dev
```

### Delopy

Delopy example to GitHub Pages.

```
yarn delopy
yarn publish
```

# Additional

If you want to bundle React JSX with rollup. Add additional packages.

```
pnpm i -D @babel/preset-react @babel/core @rollup/plugin-babel
```

And, un-comment this in `.babelrc`.

```json
{
  "presets": ["@babel/preset-react"]
}
```

Un-comment this in `rollup.config.js`

```js
import { babel } from '@rollup/plugin-babel'

// ...

plugins: [
    // ...
   babel({}),
  ],
//...
```
npm package: @innellea/postgraphile-plugin-fulltext-filter
Description: Full text searching on tsvector fields for use with postgraphile-plugin-connection-filter
Author: Roland Kiraly
Latest version: 2.0.61

[![Package on npm](https://img.shields.io/npm/v/postgraphile-plugin-fulltext-filter.svg)](https://www.npmjs.com/package/postgraphile-plugin-fulltext-filter)
[![CircleCI](https://circleci.com/gh/mlipscombe/postgraphile-plugin-fulltext-filter/tree/master.svg?style=svg)](https://circleci.com/gh/mlipscombe/postgraphile-plugin-fulltext-filter/tree/master)

# postgraphile-plugin-fulltext-filter
This plugin implements a full text search operator for `tsvector` columns in PostGraphile v4 via @mattbretl's excellent `postgraphile-plugin-connection-filter` plugin.

## Getting Started

### CLI

``` bash
postgraphile --append-plugins postgraphile-plugin-connection-filter,postgraphile-plugin-fulltext-filter
```

See [here](https://www.graphile.org/postgraphile/extending/#loading-additional-plugins) for
more information about loading plugins with PostGraphile.

### Library

``` js
const express = require('express');
const { postgraphile } = require('postgraphile');
const PostGraphileConnectionFilterPlugin = require('postgraphile-plugin-connection-filter');
const PostGraphileFulltextFilterPlugin = require('postgraphile-plugin-fulltext-filter');

const app = express();

app.use(
  postgraphile(pgConfig, schema, {
    appendPlugins: [
      PostGraphileConnectionFilterPlugin,
      PostGraphileFulltextFilterPlugin,
    ],
  })
);

app.listen(5000);
```

## Performance

All `tsvector` columns that aren't @omit'd should have indexes on them:

``` sql
ALTER TABLE posts ADD COLUMN full_text tsvector;
CREATE INDEX full_text_idx ON posts USING gin(full_text);
```

## Operators

This plugin adds the `matches` filter operator to the filter plugin, accepting
a GraphQL String input and using the `@@` operator to perform full-text searches
on `tsvector` columns.

This plugin uses [pg-tsquery](https://github.com/caub/pg-tsquery) to parse the
user input to prevent Postgres throwing on bad user input unnecessarily.

## Fields

For each `tsvector` column, a rank column will be automatically added to the 
GraphQL type for the table by appending `Rank` to the end of the column's name.
For example, a column `full_text` will appear as `fullText` in the GraphQL type,
and a second column, `fullTextRank` will be added to the type as a `Float`.

This rank field can be used for ordering and is automatically added to the orderBy
enum for the table.

## Examples

``` graphql
query {
  allPosts(
    filter: {
      fullText: { matches: 'foo -bar' }
    }
    orderBy: FULL_TEXT_RANK_DESC
  }) {
    ...
    fullTextRank
  }
}
```
npm package: @inner-desktop/braft-convert
Description: A convert helper for Braft Editor.
Author: Margox
Latest version: 2.3.0

# braft-convert
### 与braft-editor搭配使用的数据转换工具


##### 使用方法
```bash
# use yarn
yarn add braft-convert
# use npm
npm install --save braft-convert
```

```javascript
import { convertRawToHTML, convertHTMLToRaw } from 'braft-convert'

const draftRawData = '{"blocks":[{"key":"9hu83","text":"Hello World!","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":6,"length":5,"style":"BOLD"},{"offset":6,"length":5,"style":"COLOR-F32784"}],"entityRanges":[],"data":{}}],"entityMap":{}}'
const htmlString = '<p>Hello <strong><span style="color:#f32784">World</span></strong>!</p>'

convertRawToHTML(JSON.parse(draftRawData))
// <p>Hello <strong><span style="color:#f32784">World</span></strong>!</p>

JSON.stringify(convertHTMLToRaw(htmlString))
// {"blocks":[{"key":"8v6eh","text":"Hello World!","type":"unstyled","depth":0,"inlineStyleRanges":[{"offset":6,"length":5,"style":"BOLD"},{"offset":6,"length":5,"style":"COLOR-F32784"}],"entityRanges":[],"data":{}}],"entityMap":{}}

```
npm package: @inner-desktop/mergeclassnames
Description: Merges class names, whatever the format. Can be a single class, a string with multiple classes separated with space, an array of classes
Author: inner-desktop
Latest version: 1.0.1

# mergeClassNames
Merges class names, whatever the format.
Can be a single class, a string with multiple classes separated with space, an array of classes
Removes duplicates

## Install
```bash
# Install using npm
npm install @maximusft/mergeclassnames@1.0.0 --save
```

## Use
```jsx
import mergeClassNames from 'mergeclassnames';

export default (props) => {
    const { someClassNames } = props;
    /* Expample:
        someClassNames = ['a', false, 'b', 'c', null, ['d', null], () => {}, 'e', undefined, 'c', ['f', false]];
    */
    return (
      <div className="my-component">
        <SomeElement
            className={mergeClassNames('someHardCoreClass', someClassNames)}
        />
        {/*
        Output: <SomeElement className="someHardCoreClass a b c d e f" />
        */}
      </div>
    );
  }
}
```
npm package: @inner-desktop/react-images
Description: A mobile-friendly, highly customizable, carousel component for displaying media in ReactJS
Author: Joss Mackison
Latest version: 1.0.2

# React Images

A mobile-friendly, highly customizable, carousel component for displaying media in ReactJS.

### Getting Started

Start by installing `react-images`

```bash
npm install react-images
```
or
```bash
yarn add react-images
```

**If you were using `0.x` versions:** library was significantly rewritten for `1.x` version and contains several breaking changes.
The best way to upgrade is to read the docs and follow the examples.

### Using the Carousel

Import the carousel from `react-images` at the top of a
component and then use it in the render function.

```jsx
import React from 'react';
import Carousel from 'react-images';

const images = [{ src: 'path/to/image-1.jpg' }, { src: 'path/to/image-2.jpg' }];

class Component extends React.Component {
  render() {
    return <Carousel views={images} />;
  }
}
```

### Using the Modal

Import the modal and optionally the modal gateway from
`react-images` at the top of a component and then use it in
the render function.

The `ModalGateway` will insert the modal just before the
end of your `<body />` tag.

```jsx
import React from 'react';
import Carousel, { Modal, ModalGateway } from 'react-images';

const images = [{ src: 'path/to/image-1.jpg' }, { src: 'path/to/image-2.jpg' }];

class Component extends React.Component {
  state = { modalIsOpen: false };
  toggleModal = () => {
    this.setState(state => ({ modalIsOpen: !state.modalIsOpen }));
  };
  render() {
    const { modalIsOpen } = this.state;

    return (
      <ModalGateway>
        {modalIsOpen ? (
          <Modal onClose={this.toggleModal}>
            <Carousel views={images} />
          </Modal>
        ) : null}
      </ModalGateway>
    );
  }
}
```
npm package: @inner-hero/angular
Description: Inner Hero Design System for Angular
Author: Burak Tasci
Latest version: 1.2.2

# @inner-hero/angular [![npm version](https://badge.fury.io/js/%40inner-hero%2Fangular.svg)](https://www.npmjs.com/package/@inner-hero/angular) [![npm downloads](https://img.shields.io/npm/dm/%40inner-hero%2Fangular.svg)](https://www.npmjs.com/package/@inner-hero/angular)

[![CircleCI](https://circleci.com/gh/deliveryhero/dh-inner-hero-angular.svg?style=svg&circle-token=946e80e1fc7077370ee0e88c8dc8cff7dae31ec2)](https://circleci.com/gh/deliveryhero/dh-inner-hero-angular)
[![tested with jest](https://img.shields.io/badge/tested_with-jest-99424f.svg)](https://github.com/facebook/jest)
[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)
[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)
[![Angular Style Guide](https://mgechev.github.io/angular2-style-guide/images/badge.svg)](https://angular.io/styleguide)

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.

## Code scaffolding

Run `ng generate component component-name --project inner-hero-angular` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project inner-hero-angular`.

> Note: Don't forget to add `--project inner-hero-angular` or else it will be added to the default project in your `angular.json` file.

## Build

Run `ng build inner-hero-angular` to build the project. The build artifacts will be stored in the `dist/` directory.

## Publishing

After building your library with `ng build inner-hero-angular`, go to the dist folder `cd dist/inner-hero-angular` and run `npm publish`.

## Running unit tests

Run `ng test inner-hero-angular` to execute the unit tests via [Karma](https://karma-runner.github.io).

## Further help

To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
npm package: @innerselflabs/failsafe
Description: FailSafe is an error-handling model, inspired by Rust, which treats errors as expected parts of the logic flow in software development, thereby avoiding disruptive throwing and catching, and ensuring functions return expected values or failure types.
Latest version: 0.1.2

# FailSafe

FailSafe is an error-handling model, inspired by Rust, which treats errors as expected parts of the logic flow in software development, thereby avoiding disruptive throwing and catching, and ensuring functions return expected values or failure types.

## Background

In the realm of software development, one universal truth is the inevitability of errors. Whether they originate from faulty code, incorrect APIs, or bad data, errors are omnipresent. They are an integral part of software development, and there's no escaping them.

Software derives its value from interaction with the outside world, and this interaction is a double-edged sword. While it enables software to perform useful functions, it also introduces the potential for errors. In fact, any meaningful interaction or functionality risks failure, reinforcing the idea that errors are not anomalies but rather expected occurrences. This raises the question: Should we refer to errors as "exceptions" or more appropriately as "expectations"?

FailSafe, an error handling model inspired by Rust, seeks to address this question. It encourages better error handling patterns, ensuring errors remain part of the logical flow of the program rather than disrupting it through throwing and catching. By treating errors as "expectations", FailSafe maintains the continuity of the logic flow.

In TypeScript, FailSafe utilizes the `satisfies` keyword. This keyword guarantees that the FailSafe functions you write will certainly return the expected value or failure type. Simultaneously, it allows the precise details of the failure or the value to propagate up the call stack, offering richer error information.

## Philosophy

An essential aspect of FailSafe's philosophy is to abstain from using `throw` in a function. This approach reinforces the idea of treating errors as a part of the normal flow, rather than as exceptions that need to be caught and handled separately.

## Usage

```ts
const safeArrowFunc = (() => {
    const rand = Math.random();
    if (rand > 0.5) {
        return Failure('Too Big' as const); // <-- NOTICE the `as const` here - this lets you beautifully   flow the failure details up to the caller(s) in plain text. It helps immediately at dev time via the string literal type, but also at runtime as a value that can be used to react to the failure.
    } else {
        return Value({ foo: 'some data', baz: rand, qux: [12, 34, 56] });
    }
}) satisfies SafeFunction; // <-- This ensures the function follows the SafeFunction pattern without stopping the deeper details from flowing up the call stack.
```

## References

This video is a great explanation of reasoning for this pattern, and a source of some of the content of this overview. [Video](https://www.youtube.com/watch?v=sbVxq7nNtgo)
npm package: @innerworks-me/iw-mobile-auth
Description: Capacitor plugin that help to retrieve metrics from mobile devices
Latest version: 1.1.2

```markdown
# Metrics Plugin

The `Metrics` plugin is a Capacitor-based solution designed to collect and retrieve essential metrics from mobile devices. This tool is particularly useful for applications requiring detailed analytics, diagnostics, and performance tracking. It integrates seamlessly into Ionic applications using Capacitor.

## Installation

Install the plugin with the following commands:

```bash
npm i @innerworks-me/iw-mobile-auth
npx cap sync
```

This ensures that the plugin is properly integrated into your Capacitor project.

## API Overview

The plugin provides two primary methods for collecting and handling data:

<docgen-index>

* [`textOnChange(...)`](#textonchange)
* [`setOptionalData(...)`](#setOptionalData)
* [`sendCollectedData(...)`](#sendcollecteddata)

</docgen-index>

### API Documentation

<docgen-api>
<!--Update the source file JSDoc comments and rerun docgen to update the docs below-->


### textOnChange(...)

```typescript
textOnChange(typing: any) => Promise<{}>
```

| Param        | Type             |
| ------------ | ---------------- |
| **`typing`** | <code>any</code> |

**Returns:** <code>Promise&lt;{}&gt;</code>

--------------------


### setOptionalData(...)
```typescript
setOptionalData(data: string) => Promise<{}>
```

| Param        | Type             |
| ------------ | ---------------- |
| **`data`** | <code>string</code>|

**Returns:** <code>Promise&lt;{}&gt;</code>

--------------------

### sendCollectedData(...)

```typescript
sendCollectedData(data: any) => Promise<{}>
```

| Param      | Type             |
| ---------- | ---------------- |
| **`data`** | <code>any</code> |

**Returns:** <code>Promise&lt;{}&gt;</code>

**Important Note:** After calling the `sendCollectedData()` function, data collection will be finalized, and any further metrics from `textOnChange()` or `setOptionalData()` will not be included in the payload. 

--------------------

</docgen-api>

## Usage Examples

### Monitoring Text Changes

To monitor text changes and handle input events:

```typescript
import { Metrics } from '@innerworks-me/iw-mobile-auth';

Metrics.textOnChange({ typing: 'Hello, World!' })
```

### Setting Optional Data

To set some optional data into payload, please use this function:

```typescript
import { Metrics } from '@innerworks-me/iw-mobile-auth';

Metrics.setOptionalData({ data: 'Some optional data' })
```

### Sending Collected Data

To send collected data with an associated social ID and project ID:

```typescript
import { Metrics } from '@innerworks-me/iw-mobile-auth';

Metrics.sendCollectedData({
    socialId: '12345',
    projectId: 'ds012w1dk90kw209dks01'
  })
```
npm package: @innet/html
Description: Сonvert jsx elements into html text
Author: Mikhail Lysikov
Latest version: 1.0.1

<a href="https://www.npmjs.com/package/innet">
  <img src="https://raw.githubusercontent.com/d8corp/innet/main/logo.svg" align="left" width="90" height="90" alt="InnetJs logo by Mikhail Lysikov">
</a>

# &nbsp; @innet/html

&nbsp;

[![NPM](https://img.shields.io/npm/v/@innet/html.svg)](https://github.com/d8corp/innet-html/blob/main/CHANGELOG.md)
[![minzipped size](https://img.shields.io/bundlephobia/minzip/@innet/html)](https://bundlephobia.com/result?p=@innet/html)
[![downloads](https://img.shields.io/npm/dm/@innet/html.svg)](https://www.npmjs.com/package/@innet/html)
[![license](https://img.shields.io/npm/l/@innet/html)](https://github.com/d8corp/innet-html/blob/main/LICENSE)

## Abstract

This package helps to convert jsx elements into html text.

[![stars](https://img.shields.io/github/stars/d8corp/innet-html?style=social)](https://github.com/d8corp/innet-html/stargazers)
[![watchers](https://img.shields.io/github/watchers/d8corp/innet-html?style=social)](https://github.com/d8corp/innet-html/watchers)

## Install
npm
```bash
npm i @innet/html
```
yarn
```bash
yarn add @innet/html
```

Or you can include the scripts into the `head`.
```html
<!-- Target (innet) -->
<script defer src="https://unpkg.com/innet/innet.min.js"></script>

<!-- Target (innetHTML) -->
<script defer src="https://unpkg.com/@innet/html/innetHTML.min.js"></script>
```

## Usage

You can use `htmlPlugin` when you want to convert whole app.
```typescript jsx
import innet, { createHandler } from 'innet'
import { htmlPlugin } from '@innet/html'

const handler = createHandler([
  htmlPlugin,
])

innet(<div />, handler)
// '<div></div>'
```

You can combine it with other plugins to handle deep html.
```typescript jsx
import innet, { createHandler } from 'innet'
import { array, arraySync } from '@innet/utils'
import { htmlPlugin } from '@innet/html'

const join = () => arr => arr.join('')
const handler = createHandler([
  htmlPlugin,
  array([
    arraySync,
    join,
  ])
])

innet((
  <>
    <h1>Test</h1>
    <div class={'test'}>
      <span>
        <img src="#" alt="test" />
      </span>
      <p>
        Hello World!
      </p>
    </div>
  </>
), handler)
```

Also, you can use jsx plugin of `html` to handle it inside `html` component

`handler.ts`
```typescript jsx
import { createHandler } from 'innet'
import { array, arraySync, nullish, object, stop } from '@innet/utils'
import html from '@innet/html'

const join = () => arr => arr.join('')

export const handler = createHandler([
  nullish([stop]),
  array([arraySync, join]),
  object([
    jsxPlugins({
      html,
    }),
  ]),
])
```

`index.tsx`
```typescript jsx
import innet from 'innet'
import { handler } from './handler'

innet(<html><base href='test' /><body /></html>, handler)
// <html><base href="test"><body></body></html>
```

## Issues
If you find a bug or have a suggestion, please file an issue on [GitHub](https://github.com/d8corp/innet-html/issues).

[![issues](https://img.shields.io/github/issues-raw/d8corp/innet-html)](https://github.com/d8corp/innet-html/issues)
npm package: @innet/native
Description: Tools to build Mobile Application
Author: Mikhail Lysikov
Latest version: 0.0.21


<a href="https://www.npmjs.com/package/innet">
  <img src="https://raw.githubusercontent.com/d8corp/innet/main/logo.svg" align="left" width="90" height="90" alt="InnetJs logo by Mikhail Lysikov">
</a>

# &nbsp; @innet/native

&nbsp;

[![NPM](https://img.shields.io/npm/v/@innet/native.svg)](https://www.npmjs.com/package/@innet/native)
[![downloads](https://img.shields.io/npm/dm/@innet/native.svg)](https://www.npmtrends.com/@innet/native)
[![tests](https://img.shields.io/github/actions/workflow/status/d8corp/innet-native/node.js.yml?branch=main&label=tests
)](https://github.com/d8corp/innet-native/actions/workflows/node.js.yml)
[![changelog](https://img.shields.io/badge/Changelog-⋮-brightgreen)](https://changelogs.xyz/@innet/native)
[![license](https://img.shields.io/npm/l/@innet/native)](https://github.com/d8corp/innet-native/blob/main/LICENSE)

## Overview
`@innet/native` is a lightweight and reactive mobile application framework built on top of [innet](https://www.npmjs.com/package/innet). It provides a simple, JSX-based API for building highly performant native applications with fine-grained reactivity and minimal boilerplate.

## Issues
If you find a bug or have a suggestion, please file an issue on [GitHub](https://github.com/d8corp/innet-native/issues).

[![issues](https://img.shields.io/github/issues-raw/d8corp/innet-native)](https://github.com/d8corp/innet-native/issues)
npm package: @innet/plugins
Description: innet plugin to provide other plugins
Author: Mikhail Lysikov
Latest version: 0.2.0

<img src="https://raw.githubusercontent.com/d8corp/innet/main/logo.svg" align="left" width="90" height="90" alt="InnetJs logo by Mikhail Lysikov">

# &nbsp; @innet/plugins

&nbsp;

[![NPM](https://img.shields.io/npm/v/@innet/plugins.svg)](https://github.com/d8corp/innet-plugins/blob/master/CHANGELOG.md)
[![minzipped size](https://img.shields.io/bundlephobia/minzip/@innet/plugins)](https://bundlephobia.com/result?p=@innet/plugins)
[![downloads](https://img.shields.io/npm/dm/@innet/plugins.svg)](https://www.npmjs.com/package/@innet/plugins)
[![license](https://img.shields.io/npm/l/@innet/plugins)](https://github.com/d8corp/innet-plugins/blob/master/LICENSE)  
This plugin helps to provide other plugins into a peace of application.

### Installation
npm
```bash
npm i @innet/plugins
```
yarn
```bash
yarn add @innet/plugins
```

Or you can include the scripts into the `head`.
```html
<!-- Dependencies (watchState, innet) -->
<script defer src="https://unpkg.com/watch-state/watch-state.min.js"></script>
<script defer src="https://unpkg.com/innet/innet.min.js"></script>

<!-- Target (innetPlugins) -->
<script defer src="https://unpkg.com/@innet/plugins/innet-plugins.min.js"></script>
```

### Using
Provide the plugin to `innet`
```typescript jsx
import innet from 'innet'
import plugins from '@innet/plugins'
import app from './app'

innet(app, undefined, {plugins})
```

Then you can use `plugins` to include any plugin inside the content.
```typescript jsx
import to from '@innet/to'

export default (
  <>
    <plugins div={to('span')}><div /></plugins>
    <plugins div={to('p')}><div /></plugins>
  </>
)
```
You get this
```html
<span></span><p></p>
```
### Issues
If you find a bug or have a suggestion, please file an issue on [GitHub](https://github.com/d8corp/innet-plugins/issues).  
[![issues](https://img.shields.io/github/issues-raw/d8corp/innet-plugins)](https://github.com/d8corp/innet-plugins/issues)
> ---
[![stars](https://img.shields.io/github/stars/d8corp/innet-plugins?style=social)](https://github.com/d8corp/innet-plugins/stargazers)
[![watchers](https://img.shields.io/github/watchers/d8corp/innet-plugins?style=social)](https://github.com/d8corp/innet-plugins/watchers)
npm package: @innet/portal
Description: innet plugin to render a content into separate HTML Element
Author: Mikhail Lysikov
Latest version: 0.1.0

<img src="https://raw.githubusercontent.com/d8corp/innet/main/logo.svg" align="left" width="90" height="90" alt="InnetJs logo by Mikhail Lysikov">

# &nbsp; @innet/portal

&nbsp;

[![NPM](https://img.shields.io/npm/v/@innet/portal.svg)](https://github.com/d8corp/innet-portal/blob/master/CHANGELOG.md)
[![minzipped size](https://img.shields.io/bundlephobia/minzip/@innet/portal)](https://bundlephobia.com/result?p=@innet/portal)
[![downloads](https://img.shields.io/npm/dm/@innet/portal.svg)](https://www.npmjs.com/package/@innet/portal)
[![license](https://img.shields.io/npm/l/@innet/portal)](https://github.com/d8corp/innet-portal/blob/master/LICENSE)

This plugin helps to render a content into separate HTML Element.

### Installation
npm
```bash
npm i @innet/portal
```
yarn
```bash
yarn add @innet/portal
```

Or you can include the scripts into the `head`.
```html
<!-- Dependencies (watchState, innet) -->
<script defer src="https://unpkg.com/watch-state/watch-state.min.js"></script>
<script defer src="https://unpkg.com/innet/innet.min.js"></script>

<!-- Target (innetPortal) -->
<script defer src="https://unpkg.com/@innet/portal/innet-portal.min.js"></script>
```

### Using
Provide the plugin to `innet`
```typescript jsx
import innet from 'innet'
import portal from '@innet/portal'
import app from './app'

innet(app, undefined, {portal})
```
`app.tsx`
```typescript jsx
import innet from 'innet'

const div = document.createElement('div')

export default (
  <div>
    test1
    <portal parent={div}>
      test2
    </portal>
  </div>
)
```

### Issues
If you find a bug or have a suggestion, please file an issue on [GitHub](https://github.com/d8corp/innet-portal/issues).  
[![issues](https://img.shields.io/github/issues-raw/d8corp/innet-portal)](https://github.com/d8corp/innet-portal/issues)
> ---
[![stars](https://img.shields.io/github/stars/d8corp/innet-portal?style=social)](https://github.com/d8corp/innet-portal/stargazers)
[![watchers](https://img.shields.io/github/watchers/d8corp/innet-portal?style=social)](https://github.com/d8corp/innet-portal/watchers)
npm package: @innet/switch
Description: JSX plugin of switch
Author: Mikhail Lysikov
Latest version: 1.0.0

<a href="https://www.npmjs.com/package/innet">
  <img src="https://raw.githubusercontent.com/d8corp/innet/main/logo.svg" align="left" width="90" height="90" alt="InnetJs logo by Mikhail Lysikov">
</a>

# &nbsp; @innet/switch

&nbsp;

[![NPM](https://img.shields.io/npm/v/@innet/switch.svg)](https://www.npmjs.com/package/@innet/switch)
[![downloads](https://img.shields.io/npm/dm/@innet/switch.svg)](https://www.npmtrends.com/@innet/switch)
[![changelog](https://img.shields.io/badge/Changelog-⋮-brightgreen)](https://changelogs.xyz/@innet/switch)
[![license](https://img.shields.io/npm/l/@innet/switch)](https://github.com/d8corp/innet-switch/blob/main/LICENSE)

## Abstract
`switch` is a [jsx plugin](https://www.npmjs.com/package/@innet/jsx).  
It helps to select the first children that does not return `undefined`.

[![stars](https://img.shields.io/github/stars/d8corp/innet-switch?style=social)](https://github.com/d8corp/innet-switch/stargazers)
[![watchers](https://img.shields.io/github/watchers/d8corp/innet-switch?style=social)](https://github.com/d8corp/innet-switch/watchers)

## Install
npm
```bash
npm i @innet/switch
```
yarn
```bash
yarn add @innet/switch
```

## switchSync
Use it if you do not want to handle promises.

```typescript jsx
import innet, { createHandler } from 'innet'
import { switchSync } from '@innet/switch'
import { jsxPlugins } from '@innet/jsx'
import { object } from '@innet/utils'

const handler = createHandler([
  object([
    jsxPlugins({
      switch: switchSync,
    }),
  ]),
])

const app = (
  <switch>
    {undefined}
    test1
    {'test2'}
  </switch>
)

innet(app, handler)
// 'test1'
```

## switchAsync
Use it when you want to handle promises.  
It waits while a promise ends and the continues the checking.

```typescript jsx
import innet, { createHandler } from 'innet'
import { switchAsync } from '@innet/switch'
import { jsxPlugins } from '@innet/jsx'
import { object } from '@innet/utils'

const handler = createHandler([
  object([
    jsxPlugins({
      switch: switchAsync,
    }),
  ]),
])

const app = (
  <switch>
    {undefined}
    {new Promise(resolve => resolve('test1'))}
    {'test2'}
  </switch>
)

await innet(app, handler)
// 'test1'
```

Change `resolve('test1')` to `resolve(undefined)` and you get `test2`

## Issues
If you find a bug or have a suggestion, please file an issue on [GitHub](https://github.com/d8corp/innet-switch/issues).

[![issues](https://img.shields.io/github/issues-raw/d8corp/innet-switch)](https://github.com/d8corp/innet-switch/issues)
npm package: @innet/to
Description: innet plugin to switch JSX Elements type
Author: Mikhail Lysikov
Latest version: 0.2.0

<img src="https://raw.githubusercontent.com/d8corp/innet/main/logo.svg" align="left" width="90" height="90" alt="InnetJs logo by Mikhail Lysikov">

# &nbsp; @innet/to

&nbsp;

[![NPM](https://img.shields.io/npm/v/@innet/to.svg)](https://github.com/d8corp/innet-to/blob/master/CHANGELOG.md)
[![minzipped size](https://img.shields.io/bundlephobia/minzip/@innet/to)](https://bundlephobia.com/result?p=@innet/to)
[![downloads](https://img.shields.io/npm/dm/@innet/to.svg)](https://www.npmjs.com/package/@innet/to)
[![license](https://img.shields.io/npm/l/@innet/to)](https://github.com/d8corp/innet-to/blob/master/LICENSE)  
This plugin helps to change types of JSX Elements.

### Installation
npm
```bash
npm i @innet/to
```
yarn
```bash
yarn add @innet/to
```

Or you can include the scripts into the `head`.
```html
<!-- Dependencies (watchState, innet) -->
<script defer src="https://unpkg.com/watch-state/watch-state.min.js"></script>
<script defer src="https://unpkg.com/innet/innet.min.js"></script>

<!-- Target (innetTo) -->
<script defer src="https://unpkg.com/@innet/to/innet-to.min.js"></script>
```

### Using
You can change each element to another.  
For example `div` to `span`:
```typescript jsx
import innet from 'innet'
import to from '@innet/to'
import app from './app'

innet(app, undefined, {div: to('span')})
```
`app.tsx`
```typescript jsx
import innet from 'innet'
export default (
  <div>
    <div />
  </div>
)
```
You will get
```html
<span>
  <span></span>
</span>
```
You can use `Template` or `Component` as the argument
```typescript jsx
function Link (props, children) {...}

innet(<div><a href=''>click me</a></div>, undefined, {
  a: to(Link)
})
```
Any `a` element will be switched to `Link` template.

Also, you can change only peace of application with [@innet/plugins](https://www.npmjs.com/package/@innet/plugins)
```typescript jsx
import innet from 'innet'
import to from '@innet/to'
import plugins from '@innet/plugins'

function Link (props, children) {...}

function PeaceOfApp (props, children) {
  return (
    <plugins a={to(Link)}>{children}</plugins>
  )
}

innet((
  <>
    <a href="/">usual link</a>
    <PeaceOfApp>
      <a href="/">custom link</a>
    </PeaceOfApp>
  </>
), undefined, {plugins})
```

### Issues
If you find a bug or have a suggestion, please file an issue on [GitHub](https://github.com/d8corp/innet-to/issues).  
[![issues](https://img.shields.io/github/issues-raw/d8corp/innet-to)](https://github.com/d8corp/innet-to/issues)
> ---
[![stars](https://img.shields.io/github/stars/d8corp/innet-to?style=social)](https://github.com/d8corp/innet-to/stargazers)
[![watchers](https://img.shields.io/github/watchers/d8corp/innet-to?style=social)](https://github.com/d8corp/innet-to/watchers)
npm package: @innetmonitoring/node-red-contrib-r-nodes
Description: Node RED modules for the statistical computing language R
Author: Michael Blättler
Latest version: 0.1.2
Deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.

# node-red-contrib-R-nodes

A set of nodes which allows you to use the statistical computing language R in
node RED.

## Installation

Execute `npm install @innetmonitoring/node-red-contrib-r-nodes` inside your
Node RED root directory.

## Setup your R-Server

Install R on the computer you'd like to use as the R server. It can be
downloaded on the [R Project Website](https://www.r-project.org/).

After installation of R install all requirements/libraries required for the
remote code execution. Start R and execute the following commands:

```R
install.packages('RJSONIO')
install.packages('Rserve')
```

## Start your R-Server

Start the R interpreter and run the following commands to start `Rserve`.

```R
library(Rserve)
Rserve()
```

## Available Nodes

### R Server

This is a configuration node to set up a connection to a host running R and
RServe.

### R Script

The R Script node provides the possibility to write R code directly
in node RED. When the node receives a `msg` it is copied to the R server and
your script is executed afterwards. You can manipulate the `msg` object
with default R code. After the code is successfully executed, the `msg` object
is copied back to node red and emitted at the nodes output.

#### Sample R code

Here is some sample code on how to access the `msg` object in R:

```R
data <- msg$payload$data;
msg$payload$mean <- mean(data);
msg$payload$median <- median(data);
```

__Caution:__  
The variable type is not converted by this node. You have to make sure, the
data types of the members you want to access or manipulate are represented by
the correct datatype (e.g. array of floats).

## Example

A working example flow can be found on the [nodeRED flow repository](https://flows.nodered.org/flow/96b312540d537d708eb4d35b94684c42).
npm package: @inneuron/claude-skills
Description: Custom slash commands for Claude Code
Author: az-iar
Latest version: 1.0.0

# Claude Code Skills

Custom slash commands for [Claude Code](https://claude.ai/code).

## Skills

| Command | Description |
|---|---|
| `/tag` | Create and push a semver git tag. Auto-detects bump type from conventional commits. |
| `/pr` | Create a pull request with auto-generated title and summary from commits. |
| `/check` | Run pre-push quality checks (pint, stan, format, lint, tests). |
| `/sync` | Sync `main` and `dev` branches by merging and pushing. |
| `/clean-worktrees` | Remove all git worktrees under `.claude/worktrees/`. |

## Install

```bash
bunx @inneuron/claude-skills
```

or

```bash
npx @inneuron/claude-skills
```

## Uninstall

```bash
bunx @inneuron/claude-skills uninstall
```

## Update

Re-run the install command to update to the latest version:

```bash
bunx @inneuron/claude-skills@latest
```
npm package: @inngageregistry/inngage-ionic-capacitor
Description: Inngage SDK (Capacitor) - 100% TS, mobile-only
Author: Inngage Developer
Latest version: 1.0.2

# @inngageregistry/inngage-ionic-capacitor

Inngage Package for Ionic Capacitor applications for marketing campaign optimization using Push Notification and In App Messages channels.

## Install

```bash
npm install @inngageregistry/inngage-ionic-capacitor
npx cap sync
```

## API

<docgen-index>



</docgen-index>

<docgen-api>
<!--Update the source file JSDoc comments and rerun docgen to update the docs below-->



</docgen-api>
npm package: @inngageregistry/inngage-ionic-capacitor-cap3
Description: Inngage SDK (Capacitor v3)
Author: Inngage Developer
Latest version: 1.0.0

# @inngageregistry/inngage-ionic-capacitor

Inngage Package for Ionic Capacitor applications for marketing campaign optimization using Push Notification and In App Messages channels.

## Install

```bash
npm install @inngageregistry/inngage-ionic-capacitor
npx cap sync
```

## API

<docgen-index>



</docgen-index>

<docgen-api>
<!--Update the source file JSDoc comments and rerun docgen to update the docs below-->



</docgen-api>
npm package: @inngest-tools/core
Description: Static analysis engine for Inngest step functions
Latest version: 0.2.0

# @inngest-tools/core

Static analysis engine for [Inngest](https://www.inngest.com/) step functions. Parses TypeScript source code using [ts-morph](https://ts-morph.com/) to extract function definitions, triggers, steps, event sends, and event waits.

## Installation

```bash
npm install @inngest-tools/core
```

## Usage

```typescript
import { analyzeProject } from '@inngest-tools/core'

const result = analyzeProject('./src', {
  tsConfigPath: './tsconfig.json',
  ignore: ['**/*.test.ts'],
})

console.log(`${result.functions.length} functions found`)
console.log(`${Object.keys(result.eventMap).length} events tracked`)

for (const fn of result.functions) {
  console.log(`${fn.id} (${fn.relativePath}:${fn.line})`)
  console.log(`  triggers: ${fn.triggers.map(t => t.type === 'event' ? t.event : t.cron).join(', ')}`)
  console.log(`  steps: ${fn.steps.map(s => `${s.type}(${s.id})`).join(', ')}`)
  console.log(`  sends: ${fn.sends.map(s => s.eventName).join(', ')}`)
}
```

## API

### `analyzeProject(targetDir, options?): ProjectAnalysis`

Analyzes all Inngest functions in the target directory.

**Options:**
- `tsConfigPath` — Path to tsconfig.json (auto-detected if omitted)
- `ignore` — Glob patterns to exclude
- `include` — Glob patterns to include

### Key Types

```typescript
interface ProjectAnalysis {
  functions: InngestFunction[]
  eventMap: EventMap
  diagnostics: AnalysisDiagnostic[]
  analyzedFiles: number
  analysisTimeMs: number
}

interface InngestFunction {
  id: string
  filePath: string
  triggers: Trigger[]        // event / cron triggers
  steps: Step[]              // step.run / sleep / waitForEvent etc.
  sends: EventSend[]         // inngest.send / step.sendEvent
  waitsFor: EventWait[]      // step.waitForEvent
  config: FunctionConfig     // concurrency / throttle / retries etc.
}
```

## Related Packages

- [`inngest-tools`](https://www.npmjs.com/package/inngest-tools) — CLI
- [`@inngest-tools/viz`](https://www.npmjs.com/package/@inngest-tools/viz) — Visualization
- [`@inngest-tools/lint`](https://www.npmjs.com/package/@inngest-tools/lint) — Linter

## License

MIT
npm package: @inngest-tools/lint
Description: Linter for Inngest step functions
Latest version: 0.1.2

# @inngest-tools/lint

Linter for [Inngest](https://www.inngest.com/) step functions. Detects anti-patterns, configuration mistakes, and best practice violations.

## Installation

```bash
npm install @inngest-tools/lint @inngest-tools/core
```

## Usage

```typescript
import { analyzeProject } from '@inngest-tools/core'
import {
  lint,
  builtinRules,
  builtinProjectRules,
  formatText,
  formatJson,
  formatSarif,
} from '@inngest-tools/lint'

const analysis = analyzeProject('./src')

const result = lint(analysis, builtinRules, builtinProjectRules, {
  rules: {
    'no-nested-steps': 'error',
    'sleep-duration-warn': 'off',
  },
})

// ESLint-style text output
console.log(formatText(result))

// JSON output
console.log(formatJson(result, { pretty: true }))

// SARIF output (GitHub Code Scanning)
fs.writeFileSync('results.sarif', formatSarif(result))
```

## Built-in Rules

**Correctness**

| Rule | Default | Description |
|---|---|---|
| `no-nested-steps` | error | `step.*` called inside another `step.run()` |
| `unique-step-ids` | error | Duplicate step IDs within the same function |
| `unique-function-ids` | error | Duplicate function IDs across the project |
| `valid-cron` | error | Invalid cron expression |

**Best Practice**

| Rule | Default | Description |
|---|---|---|
| `event-has-listener` | warning | Sent event has no listener |
| `no-orphan-functions` | warning | Event-triggered function has no sender |
| `no-side-effects-outside-steps` | warning | Function with no steps re-executes all logic on retry |

**Performance**

| Rule | Default | Description |
|---|---|---|
| `sleep-duration-warn` | warning | Sleep duration exceeds threshold (default: 7 days) |
| `concurrency-config` | warning | Invalid concurrency / throttle / rateLimit config |

## Custom Rules

```typescript
import type { LintRule } from '@inngest-tools/lint'

const myRule: LintRule = {
  id: 'my-custom-rule',
  description: 'My custom lint rule',
  defaultSeverity: 'warning',
  category: 'best-practice',
  check(fn, analysis) {
    const diagnostics = []
    if (fn.steps.length > 10) {
      diagnostics.push({
        ruleId: 'my-custom-rule',
        severity: 'warning',
        message: `Function "${fn.id}" has ${fn.steps.length} steps. Consider splitting.`,
        filePath: fn.filePath,
        line: fn.line,
      })
    }
    return diagnostics
  },
}

const result = lint(analysis, [...builtinRules, myRule], builtinProjectRules)
```

## Related Packages

- [`inngest-tools`](https://www.npmjs.com/package/inngest-tools) — CLI
- [`@inngest-tools/core`](https://www.npmjs.com/package/@inngest-tools/core) — Analysis engine
- [`@inngest-tools/viz`](https://www.npmjs.com/package/@inngest-tools/viz) — Visualization

## License

MIT
npm package: @inngest-tools/viz
Description: Visualization renderers for Inngest function graphs
Latest version: 0.1.2

# @inngest-tools/viz

Visualization renderers for [Inngest](https://www.inngest.com/) function graphs. Builds a dependency graph from analysis results and renders it in multiple formats.

## Installation

```bash
npm install @inngest-tools/viz @inngest-tools/core
```

## Usage

```typescript
import { analyzeProject } from '@inngest-tools/core'
import { buildGraph, renderGraph, listFormats } from '@inngest-tools/viz'

const analysis = analyzeProject('./src')
const graph = buildGraph(analysis)

// Render via registry
const mermaid = renderGraph('mermaid', graph, { direction: 'TB' })
const html = renderGraph('html', graph, { title: 'My Project' })

// List available formats
console.log(listFormats()) // ['mermaid', 'json', 'dot', 'html']
```

### Direct renderer imports

```typescript
import { renderMermaid } from '@inngest-tools/viz'
import { renderDot } from '@inngest-tools/viz'
import { renderHtml } from '@inngest-tools/viz'
import { renderJson } from '@inngest-tools/viz'
```

## Output Formats

| Format | Description |
|---|---|
| `mermaid` | Mermaid notation for Markdown rendering (GitHub, Notion, etc.) |
| `dot` | Graphviz DOT format — convert with `dot -Tpng graph.dot -o graph.png` |
| `json` | VizGraph as JSON for programmatic use |
| `html` | Interactive D3.js force-directed graph with filtering, dragging, zoom |

## Options

```typescript
buildGraph(analysis, {
  showOrphans: true,      // Include unconnected nodes
  clusterByFile: false,   // Group nodes by file path
})

renderGraph('mermaid', graph, {
  direction: 'LR',       // LR | TB | RL | BT
})
```

## Related Packages

- [`inngest-tools`](https://www.npmjs.com/package/inngest-tools) — CLI
- [`@inngest-tools/core`](https://www.npmjs.com/package/@inngest-tools/core) — Analysis engine
- [`@inngest-tools/lint`](https://www.npmjs.com/package/@inngest-tools/lint) — Linter

## License

MIT