open-index/open-npm huggingface dataset:
npm package: @qeelyn-pb/ims-js
Description: ims-js components and api
Latest version: 1.1.0

# @qeelyn-pb/ims-js

本项目是pb业务后台共用组件和api的封装

## Install

```bash
$ npm i @qeelyn-pb/ims-js --save
```

## Usage

## Development

### graphql config

本项目通过[Graphql插件](https://github.com/JetBrains/js-graphql-intellij-plugin)来配置开发环境.

请根据`graphql.config.yaml`配置本地环境.

文件位置：`script/gqlgen.ts`

### graphql开发

根据配置远程拉取读取生成.graphql文件

```bash
pnpm gqlgen:schema-ast
```

运行生成文件

```bash
pnpm gqlgen
```

监听文件修改实时更新

```bash
pnpm gqlgen:watch
```
npm package: @qeepsake/expo-in-app-purchases
Description: Expo unimodule for accepting in-app purchases
Author: 650 Industries, Inc.
Latest version: 1.1.0

# expo-in-app-purchases

`expo-in-app-purchases` allows you to accept payments for in-app products.

# API documentation

- [Documentation for the main branch](https://github.com/expo/expo/blob/main/docs/pages/versions/unversioned/sdk/in-app-purchases.mdx)
- [Documentation for the latest stable release](https://docs.expo.dev/versions/latest/sdk/in-app-purchases/)

# Installation

You must ensure that you have [installed and configured the `react-native-unimodules` package](https://github.com/expo/expo/tree/main/packages/react-native-unimodules) before continuing.

### Add the package to your dependencies

```
npx expo install expo-in-app-purchases
```

### Configure for iOS

Run `npx pod-install` after installing the npm package.

### Configure for Android

No additional set up necessary.

# Contributing

Contributions are very welcome! Please refer to guidelines described in the [contributing guide](https://github.com/expo/expo#contributing).
npm package: @qeepsake/rails-guid
Description: Tiny (zero dependancy) utility to create and extract rails guid strings in JavaScript 🛤
Author: lukebrandonfarrell
Latest version: 1.4.0

# Rails Guid for JavaScript
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-)
<!-- ALL-CONTRIBUTORS-BADGE:END -->

> Zero dependancy utility for creating and extracting rails GUIDs from a string.

[![NPM](https://img.shields.io/npm/v/@qeepsake/rails-guid.svg)](https://www.npmjs.com/package/@qeepsake/rails-guid) [![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)

## Install

```bash
npm install --save @qeepsake/rails-guid
```

## Usage

### Extracting Rails GUID

You can use `extractRailsId` to extract a Rails GUID from a string:

```js
import { extractRailsId } from '@qeepsake/rails-guid';

const guid = "gid://qeepsake-rails/Model/55587";
extractRailsId(guid) // -> 55587
```

### Creating Rails GUID

You can use the `createRailsId` to create Rails GUID:

```js
import { createRailsId } from '@qeepsake/rails-guid';

const id = 55587 || "55587";
createRailsId(id, "Model") // -> gid://qeepsake-rails/Model/55587
```

### Tetsing for Extracted Rails ID

```js
import { isExtractedRailsId } from '@qeepsake/rails-guid';

isExtractedRailsId("55587") // => true
isExtractedRailsId("gid://qeepsake-rails/Model/55587") // => false
```

### Testing for Rails Global ID

You can use `isRailsId`` to test if a string is a valid Rails Global ID:

```js
import { isRailsId } from '@qeepsake/rails-guid';

isRailsId("gid://qeepsake-rails/User/1")  // => true
isRailsId("gid://someotherapp/User/1")   // => true
isRailsId("User/1")                      // => false
```

This function tests if the string conforms to the general Rails gid structure: `gid://<ANY_APP_NAME>/<MODEL_NAME>/<ID>`.

## License

MIT © [lukebrandonfarrell](https://github.com/lukebrandonfarrell)

## Contributors ✨

Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
  <tr>
    <td align="center"><a href="http://www.lukebrandonfarrell.com"><img src="https://avatars3.githubusercontent.com/u/18139277?v=4" width="100px;" alt=""/><br /><sub><b>Luke Brandon Farrell</b></sub></a><br /><a href="#projectManagement-lukebrandonfarrell" title="Project Management">📆</a> <a href="https://github.com/qeepsake/rails-guid/commits?author=lukebrandonfarrell" title="Code">💻</a></td>
  </tr>
</table>

<!-- markdownlint-enable -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
npm package: @qeepsake/react-native-custom-alerts
Description: A library to define alerts to be used all accoss an application.
Author: Sagar Raja Shakya
Latest version: 1.0.0

# React Native Custom Alerts

This library provides the ability to define alerts which can be used all across an application. Instead of having a separate function for all these alerts, we can define them when the application starts and easily use them wherever we need them.

## Install

```sh
 npm install @qeepsake/react-native-custom-alerts
```

or

```sh
 yarn add @qeepsake/react-native-custom-alerts
```

## Usage

You need to register you alerts when the application starts.

```js
import {CustomAlert} from 'react-native-custom-alerts';

CustomAlert.setup('my-custom-alert', 'Title', 'Message', buttons, options);
CustomAlert.setup('my-second-alert', 'Title', 'Message', buttons, options);
```

Now, you can place the alert you want to show elsewhere in your application.

```js
import {CustomAlert} from 'react-native-custom-alerts';

CustomAlert.alert('my-second-alert');
```

## Methods

### setup()

```js
static setup(name, title, message?, buttons?, options?)
```

### alert()

```js
static alert(name)
```

## License

This project is licensed under the MIT License
npm package: @qeepsake/react-native-file-utils
Description: Extract the MIME type of a file with React Native on iOS and Android (uses Java and Obj-C, not Node)
Author: Thomas Brian
Latest version: 1.3.5

# Qeepsake React Native File Utils

Extracts information from image and video files including MIME type, duration (video), dimensions, and timestamp. The library work on iOS and Android and uses Java and Obj-C native library (not Node).

## Installation

```sh
npm install @qeepsake/react-native-file-utils
```

## Usage

### Get the duration of video file

Gets the duration of the video in seconds.

```js
import { getVideoDuration } from '@qeepsake/react-native-file-utils';

const durationMs = await getVideoDuration('file://<media-path>');
```

### Get the media file dimensions in pixels

Gets the horizontal (x) and vertical (y) pixels of the media item, either image or video. The returned media dimensions includes an object with both the horizontal (x) length in pixels and vertical (y) length in pixels.

```js
import { getDimensions } from '@qeepsake/react-native-file-utils';

const mediaDimensions = await getDimensions('file://<media-path>', 'video');
```

### Get the MIME type of a media item file

Gets the MIME type of the media file at the passed Uri.

```js
import { getMimeType } from '@qeepsake/react-native-file-utils';

const mimeType = await getMimeType('file://<media-path>');
```

### Get the timestamp of a media item file

Gets the string timestamp of the media file from the passed Uri. The timestamp is usually a date retrieved
from either the Exif date if the original datetime of the media is available or by the creation/last modified
timestamp from the file itself.

```js
import { getTimestamp } from '@qeepsake/react-native-file-utils';

const timestamp = await getTimestamp('file://<media-path>', 'video');
```

## Supported Schemes

In this table, you can see what type of URI can be handled by each method.

| Method Name      | iOS                             | Android    |
| -----------      | ----------------------          | ---------- |
| getTimestamp     | `file://`, `assets-library://`  | `file://`, `content://`
| getVideoDuration | `file://`                       | `file://`
| getMimeType      | `file://`, `ph://`              | `file://`, `content://`
| getDimensions    | `file://`,                      | `file://`
## Contributing

See the [contributing guide](CONTRIBUTING.md) to learn how to contribute to the repository and the development workflow.

## License

MIT
npm package: @qeepsake/react-native-launch-arguments
Description: Get launch arguments for testing with Detox and Appium 🚀
Author: Luke Farrell
Latest version: 3.0.0

# React Native Launch Arguments

React Native module to get launch arguments. It makes passing parameters from testing tool such as Detox to react native super easy.

Mostly it's made for using
* [`launchArgs parameter of device.launchApp method`](https://github.com/wix/Detox/blob/master/docs/APIRef.DeviceObjectAPI.md#7-additional-launch-arguments) of [Detox](https://github.com/wix/Detox/)
* [`optionalIntentArguments (Android)` and `processArguments (iOS)`](http://appium.io/docs/en/writing-running-appium/caps/) parameters with [Appium](http://appium.io/)

**iOS**: it takes data from `[[NSProcessInfo processInfo] arguments]`

**Android**: it takes data from `currentActivity.getIntent().getBundleExtra("launchArgs")` for detox and `intent.getExtras()` for ADB params


## Getting started

```sh
npm i @qeepsake/react-native-launch-arguments
cd ios && pod install && cd ..
```

## Usage

In JS:

```js
import { LaunchArguments } from "@qeepsake/react-native-launch-arguments";
LaunchArguments.value();
```

In TS:

```ts
import { LaunchArguments } from "@qeepsake/react-native-launch-arguments";
interface MyExpectedArgs {
  authToken?: string;
  skipAuth?: boolean;
}
LaunchArguments.value<MyExpectedArgs>();
```
## License

MIT © [qeepsake](https://github.com/Qeepsake)

## Contributors ✨

Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
  <tr>
    <td align="center">
      <a href="http://www.lukebrandonfarrell.com">
        <img src="https://avatars3.githubusercontent.com/u/18139277?v=4" width="100px;" alt=""/><br />
        <sub><b>Luke Brandon Farrell</b></sub>
      </a>
      <br />
      <a href="#projectManagement-lukebrandonfarrell" title="Project Management">📆</a> 
      <a href="https://github.com/aspect-apps/use-redux-effect/commits?author=lukebrandonfarrell" title="Code">💻</a>
    </td>
    <td align="center">
      <a href="https://github.com/iamolegga">
        <img src="https://avatars3.githubusercontent.com/u/5501657?v=4" width="100px;" alt=""/><br />
        <sub><b>iamolegga</b></sub>
      </a>
      <br />
      <a href="#projectManagement-iamolegga" title="Project Management">📆</a> 
      <a href="https://github.com/aspect-apps/use-redux-effect/commits?author=iamolegga" title="Code">💻</a> 
      <a href="https://github.com/aspect-apps/use-redux-effect/commits?author=iamolegga" title="Documentation">📖</a>
    </td>
  </tr>
</table>

<!-- markdownlint-enable -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
npm package: @qeepsake/react-native-marketing-version
Description: Set the version in package.json, android/app/build.gradle and info.plist
Author: Novom Interactive
Latest version: 1.1.6

# React Native Marketing Version

 [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

This tool allows you to easily update the marketing version of a React Native application. Following files will be updated:

- **./package.json**
- **./android/app/src/main/AndroidManifest.xml**
- **./android/app/build.gradle**
- **./ios/<app_name>/Info.plist**
## Setup and Usage

There are two ways to install react-native-marketing-version: globally and locally.

### Local Installation

This is the recommended way to install react-native-marketing-version.

```bash
npm install @qeepsake/react-native-marketing-version --save-dev
-- or --
yarn add @qeepsake/react-native-marketing-version --dev
```

You can then use this command in your project directory to run react-native-marketing-version:

npm:

```bash
$ npm run set-version <version>
-- or --
$ yarn set-version <version>
```

### Global Installation

This installation method allows you to use react-native-marketing-version in any project.

```bash
npm install -g react-native-marketing-version
-- or --
yarn global add react-native-marketing-version
```

You can then use this command in your project directory to run react-native-marketing-version:

```bash
set-version <version>
```

## Behaviour

When invoked, react-native-marketing-version will make the following changes to your project files:

- The **version** attribute in `package.json` will be updated with the specified version.
- It will update the **version name** in both `build.gradle` and `AndroidManifest.xml`. `react-native-marketing-version` will only write in the `AndroidManifest.xml` if `android:versionName` is already in the file.
- It will update the **CFBundleShortVersionString** ("Version") in `Info.plist`.

## License

This software uses the [MIT license](LICENSE.txt).
npm package: @qeepsake/react-navigation-overlay
Description: Don't we all wish that React Navigation had awesome Overlays like React Native Navigation ? Now it does 💪
Author: Aspect Apps Limited
Latest version: 3.0.0

# React Navigation Overlay

This library attempts to add support for "Overlays" to React Navigation similar to the `showOverlay` API in React Native Navigation.

## Install

```sh
npm i @qeepsake/react-navigation-overlay
```

## Usage

Add the `ReactNavigationOverlay` component to the top of your tree inside your `NavigationContainer`. This will allow the Overlays to be displayed.

```js
import { ReactNavigationOverlay } from "react-navigation-overlay";

<NavigationContainer>
  ...
  <ReactNavigationOverlay />
</NavigationContainer>;
```

Display an overlay by using the `Overlay.show()` method, and passing your component and any props.

```js
Overlay.show(MyFirstOverlay, { title: "..." })

...

const MyFirstOverlay = ({ title }) => {
    return ...;
}
```

## Authors

- [**Luke Brandon Farrell**](https://lukebrandonfarrell.com/) - _Author_

## License

This project is licensed under the MIT License
npm package: @qeepsake/ts-string-as-enum
Description: Convert string to enum type with TypeScript ⚡️
Author: Qeepsake Inc.
Latest version: 1.0.1

# Convert String to Enum with TypeScript

Tiny (zero dependencies) utility to Convert string to enum type with TypeScript ⚡️
## Install

```bash
npm install --save @qeepsake/ts-string-as-enum
```

## Usage

```ts
export declare enum Colors {
    /** JSDoc */
    Blue = "Blue",
    /** JSDoc */
    Red = "Red",
    /** JSDoc */
    Green = "Green",
}

tsStringAsEnum(Colors, 'blue'); // -> Colors.Blue
```

## License

MIT © [lukebrandonfarrell](https://github.com/lukebrandonfarrell)
## Contributors ✨

Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
  <tr>
    <td align="center"><a href="http://www.lukebrandonfarrell.com"><img src="https://avatars3.githubusercontent.com/u/18139277?v=4" width="100px;" alt=""/><br /><sub><b>Luke Brandon Farrell</b></sub></a><br /><a href="#projectManagement-lukebrandonfarrell" title="Project Management">📆</a> <a href="https://github.com/qeepsake/rails-guid/commits?author=lukebrandonfarrell" title="Code">💻</a></td>
  </tr>
</table>

<!-- markdownlint-enable -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
npm package: @qelos/admin
Description: Admin panel service for the qelos open-source platform.<br> Written in Vue.js.
Author: David Meir-Levy
Latest version: 3.9.0

# Qelos Admin Panel

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

## Usage
### As a Docker container
```
$ docker run -p 3001:3001 qelos/admin-panel
```
### As Node package
```
$ npm i @qelos/admin
$ npx qelos-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: @qelos/api-kit
Description: API-Kit package to help with qelos infrastructure and reuse capabilities across services
Author: David Meir-Levy
Latest version: 3.11.10

# Qelos API Kit

This code brings together all Qelos 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: @qelos/assets
Description: manage assets like images and static files on remote servers
Author: David Meir-Levy
Latest version: 3.8.0

# Qelos Assets service

An HTTP server to manage static assets on several assets providers

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

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

## 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: @qelos/auth
Description: Express Passport authentication service
Author: David Meir-Levy
Latest version: 3.8.0

# Qelos Authentication service

An HTTP server (back end only) with DB support & auth features 

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

## 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
```

## Main Features
- es6
- express
- mongoose
- passport
- validator
- signin / signup
- token and refresh-tokens
- optional roles by environment variables
- email verification

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


## Future development
- email verification (next phase, support of multiple email services APIs)
- reset password
npm package: @qelos/cache-manager
Description: cache manager library for backend services, using redis or internal memory.
Latest version: 3.11.10

# @qelos/cache-manager

cache manager library for backend services, using redis or internal memory.

## Simple Installation Example

### Install
```bash
$ npm install @qelos/cache-manager
```

```typescript
import {createCacheManager} from '@qelos/cache-manager';
import {redisUrl} from './config';

const cacher = redisUrl ?
  require('@qelos/cache-manager/dist/redis-cache').createRedisCache(redisUrl) :
  require('@qelos/cache-manager/dist/memory-cache').createMemoryCache()

const cacheManager = createCacheManager(cacher);
```

## Get item from cache
```typescript
const value = await cacheManager.getItem('your-cache-key');
```

## Set item to cache
The value must in a string
```typescript

await cacheManager.setItem('your-cache-key', 'new value to store in cache');
```


## Wrap a fallback to get an item

In this method, you can specify a key.
If the key doesn't exist inside the cache store, it will fall back to the function, return its value and store it inside the cache store.

```typescript
const value = await cacheManager.wrap('your-cache-key', async () => {
  const data = await someDatabase.query('select * from MyTable where id = X')
  return JSON.stringify(data);
});
```

### Custom cache options


```typescript

await cacheManager.setItem('your-cache-key', 'new value to store in cache', {
  ttl: 1000 // in seconds
});
```
npm package: @qelos/content
Description: Content API for qelos platform
Author: David Meir-Levy
Latest version: 3.8.1

# Qelos Content service

A content service for qelos platform 

## Main Features
- 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
```

## 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: @qelos/drafts
Description: drafts service for the qelos api
Author: David Meir-Levy
Latest version: 3.9.0

# Qelos Drafts service

## Main Features
- ES6
- manage dynamic drafts

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

## Usage

## 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: @qelos/gateway
Description: Qelos pure gateway
Author: David Meir-Levy
Latest version: 3.7.4

# Qelos plugins system service

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

## 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 qelos/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: @qelos/mongo-crud
Description: Create a fully CRUD API and UI using MongoDB and QELOS Plugin-Play
Author: David Meir-Levy
Latest version: 0.1.3

# @qelos/mongo-crud

Create a fully CRUD API and UI using MongoDB and QELOS Plugin-Play

### Installation

Create a boilerplate plugin project.
```shell
$ npm init play@latest
```

Then, on existing project - install both mongodb and this library
```shell
$ npm install @qelos/mongo-crud mongodb
```

### Basic Usage

Here's an example of tasks and groups:
```ts
import {provideMongo, CrudModel} from '@qelos/mongo-crud';

provideMongo(process.env.MONGODB_URL || 'mongodb://localhost/db');

const task = new CrudModel('task')
const group = new CrudModel('group')

task.schema({
  title: {
    type: String,
  },
  content: {
    type: String,
  },
  isDone: {
    type: Boolean,
  },
  group: {
    type: String,
    ref: 'group'
  }
})
task.screen(
  'list',
  'rows-list',
  `<h3>{{ row.title }}</h3>
{{ row.content }}
{{ row.isDone ? 'Done!' : 'Not done' }}
<actions>
  <ql-button for="edit">Edit</ql-button>
  <ql-button for="remove">Edit</ql-button>
</actions>`
)
task.execute();

group.schema({
  title: {
    type: String,
  },
  description: {
    type: String,
  }
})
group.execute();
```

After running this server, and connect it to an existing plugin to a QELOS app, the app will include all CRUD screens, UI, operations, and more.
npm package: @qelos/plugin-netlify-api
Description: Netlify build plugin: proxy /api/* to Qelos API and inject config
Author: David Meir-Levy
Latest version: 1.1.2

# @qelos/plugin-netlify-api

Netlify build plugin for Qelos frontend apps: proxies `/api/*` to your Qelos API and injects config.

## Setup

In your site’s `netlify.toml`, add the plugin next to your existing `[build]` / `[build.environment]`:

```toml
[build]
  command = "npm run build"
  publish = "dist"

[build.environment]
  QELOS_API_IP = "http://159.203.152.168"

[[plugins]]
  package = "@qelos/plugin-netlify-api"
```

**Nuxt / static frameworks (required):** Netlify evaluates `dist/_redirects` **before** `netlify.toml`. Nitro’s `netlify-static` preset emits a catch‑all `/*` rule, so the API rule must be **first** in `_redirects`. Add an npm **`postbuild`** script (runs after `nuxt build` when Netlify runs `npm run build`):

```json
{
  "scripts": {
    "build": "nuxt build",
    "postbuild": "qelos-netlify-patch-redirects"
  }
}
```

If your publish directory is not `dist`, set `QELOS_NETLIFY_PUBLISH` to that folder name (relative to the app root).

## How it proxies (default)

**Default:** the bundled serverless function **`qelos-api-proxy`** — `/api/*` is rewritten to `/.netlify/functions/qelos-api-proxy`. That runs your Node proxy (correct `Host` / `x-forwarded-host`, optional `x-bypass-admin`, etc.).

**Optional — CDN direct to API:** set **`use_cdn_proxy = true`** to rewrite `/api/*` → `${QELOS_API_IP}/api/:splat` at the edge **without** invoking the function (faster, but no per-request logic in `qelos-api-proxy.ts`).

```toml
[[plugins]]
  package = "@qelos/plugin-netlify-api"

  [plugins.inputs]
    api_url = "http://159.203.152.168"
    bypass_admin = true
    use_cdn_proxy = false
```

- **api_url** — Qelos API base URL (same as `QELOS_API_IP` / `API_HOST`).
- **bypass_admin** — If `true`, adds header `x-bypass-admin: true` (function mode: in the proxy; CDN mode: on the redirect when supported).
- **use_cdn_proxy** — If `true`, edge proxy only (no `qelos-api-proxy` function). Default **false**.
- **use_function_proxy** — Deprecated; set **`false`** to get the same as `use_cdn_proxy = true`.

## What it does

- **Environment:** Sets `QELOS_API_IP`, `QELOS_NETLIFY_PROXY_MODE` (`function` unless CDN).
- **Redirects:** Injects `/api/*` into `netlify.toml` and **`postbuild`** updates `publish/_redirects` so Nuxt’s catch‑all does not win.
- **Unless `use_cdn_proxy`:** copies `qelos-api-proxy.ts` into your Netlify functions directory.

No need to commit redirects yourself; the plugin and `postbuild` maintain them each build.
npm package: @qelos/plugins
Description: manage plugins system
Author: David Meir-Levy
Latest version: 3.7.4

# Qelos plugins system service

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

## 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 qelos/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: @qelos/sdk
Description: SDK for Qelos API
Author: David Meir-Levy
Latest version: 3.11.10

# @qelos/sdk

SDK to use Qelos common API endpoints.

Can be used for both backend and frontend applications.

## Installation

```shell
npm install @qelos/sdk
```

## Usage

### Main SDK

```typescript
// my-sdk.ts
import QelosSDK from '@qelos/sdk';

const sdk = new QelosSDK({appUrl: 'https://yourdomain.com', fetch: window.fetch});
export default sdk;
```

### Administrator SDK

```typescript
import QelosAdministratorSDK from '@qelos/sdk/administrator';

const adminSdk = new QelosAdministratorSDK({
  appUrl: 'https://yourdomain.com',
  fetch: window.fetch
});
```

### Importing Types

```typescript
import { QelosSDKOptions } from '@qelos/sdk/types';
import { IWorkspace } from '@qelos/sdk/workspaces';
import { IAppConfiguration } from '@qelos/sdk/configurations';
import { ILayout, LayoutKind } from '@qelos/sdk/administrator/layouts';
```

**Note:** You can inject a fetch-like function, such as `node-fetch` or any fetch equivalent.

### Available Exports

- `@qelos/sdk` - Main SDK class
- `@qelos/sdk/administrator` - Administrator SDK
- `@qelos/sdk/administrator/*` - Administrator submodules (layouts, manage-configurations, etc.)
- `@qelos/sdk/workspaces` - Workspaces module and types
- `@qelos/sdk/configurations` - Configurations module and types
- `@qelos/sdk/types` - SDK types

### Backward Compatibility

For backward compatibility, the following imports still work:
- `@qelos/sdk/dist/*` - Direct dist imports
- `@qelos/sdk/src/*` - Direct source imports

However, it's recommended to use the clean import paths listed above.

**Note:** Clean import paths require TypeScript's `moduleResolution` to be set to `"node16"`, `"nodenext"`, or `"bundler"`. If you're using the legacy `"node"` module resolution, continue using the `/dist` paths.

### Basic usage of SDK instance:
```typescript jsx
// MyPostsList.tsx
import sdk from './my-sdk';

function MyPostsList() {
  const [posts, setPosts] = useState([]);
  const [querySearch, setQuery] = useState([]);
  useEffect(() => {
    sdk.posts.getList({q: querySearch, limit: 50});
  }, [querySearch]);

  return (
    <div>
      <input type="text" placeholder="Search posts" onChange={e => setQuery(e.target.value)}/>
      {
        posts.map(post => <PostItem post={post} key={post._id}/>)
      }
    </div>
  )
}
```

Enjoy!
npm package: @qelos/secrets
Description: manage encrypted secrets
Author: David Meir-Levy
Latest version: 3.8.0

# Secrets service

An HTTP server to manage internal application secrets 

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

## Usage
### As a Docker container
```sh
$ docker run -p 3001:3001 qelos/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: @qelos/web-sdk
Description: Frontend Web SDK for Qelos API
Author: David Meir-Levy
Latest version: 3.11.10

# @qelos/web-sdk

A package to manage communication between a Plugin MFE to a QELOS application host.
## Installation

```shell
npm install @qelos/web-sdk
```

## Usage

```typescript
import { authorize, code } from "@qelos/web-sdk";

// authorize your micro-frontend application 
// to recognize the user and tenant of host application:
const { user, tenant } = authorize();


// add the "code" parameter given from this web-sdk
// it's a code created for this specific intercation with the user:
fetch('/api/you-own-api', {
  headers: { code }
})
```

Enjoy!
npm package: @qentah/timedtask
Description: Executes an asynchronous task synchronously with a timeout
Author: Qentah
Latest version: 1.0.1

[![Publish to npm](https://github.com/Qentah/timedTask/actions/workflows/publish.yml/badge.svg)](https://github.com/Qentah/timedTask/actions/workflows/publish.yml)
# timedTask

A Node.js utility to synchronously execute asynchronous tasks with timeout management.

## Description

`timedTask` allows you to run an asynchronous (callback-style) function in a synchronous way, enforcing a maximum execution time. If the task does not complete within the given time, a `TimeoutError` is thrown.

> ⚠️ Warning: This module uses [`deasync`](https://www.npmjs.com/package/deasync), which blocks the Node.js event loop. Use only in scripts, migrations, or contexts where blocking is acceptable.

## Installation

```bash
npm install deasync
```

Copy the `index.js` file into your project or import it as a module.

## Usage

```js
const { timedTask, TimeOutError } = require('./index');

try {
    const result = timedTask(cb => setTimeout(() => cb(null, 42), 500), { ms: 1000 });
    console.log(result); // 42
} catch (err) {
    if (err instanceof TimeOutError) {
        console.error('The task timed out.');
    } else {
        console.error('Task execution error:', err);
    }
}
```

### Parameters

- **task**: Asynchronous function taking a callback `(err, result)`.
- **option.ms**: Maximum duration in milliseconds (default: 1000 ms).

### Exceptions

- `TimeoutError`: If the task exceeds the timeout.
- Any error returned by the task.

## Advanced Example

```js
const fs = require('fs');
const { timedTask } = require('./index');

const data = timedTask(cb => fs.readFile('file.txt', 'utf8', cb), { ms: 2000 });
console.log(data);
```

## License

MIT
npm package: @qes-test/eslint-config
Description: ESLint configuration for QES projects
Author: QES Team
Latest version: 1.0.16

# @qes-test/eslint-config

一个基于 ESLint 的代码规范配置包，提供了完整的 TypeScript、Vue.js 和 Prettier 集成配置。

## 安装

```bash
npm install --save-dev @qes-test/eslint-config
```

## 使用方法

### 基本配置

在你的项目中创建 `eslint.config.mjs` 文件：

```javascript
import { defineConfig } from '@qes-test/eslint-config'

export default defineConfig([
  {
    // 你的自定义规则覆盖
    rules: {
      // 在这里添加或覆盖规则
    }
  }
])
```

### 与现有项目集成

如果你已经有 ESLint 配置，可以这样集成：

```javascript
import { defineConfig } from '@qes-test/eslint-config'

export default defineConfig([
  // 使用基础配置
  ...(await defineConfig()),
  {
    // 项目特定的规则覆盖
    rules: {
      'vue/no-unused-vars': 'warn',
      '@typescript-eslint/no-explicit-any': 'off'
    }
  }
])
```

## 特性

- ✅ **TypeScript 支持** - 完整的 TypeScript 语法检查和类型检查
- ✅ **Vue.js 支持** - Vue 3 组件规范和最佳实践
- ✅ **Prettier 集成** - 自动代码格式化
- ✅ **导入排序** - 自动排序 import 语句
- ✅ **代码质量** - 检测潜在的错误和代码质量问题
- ✅ **可扩展** - 易于自定义和扩展

## 包含的插件

- `@typescript-eslint/eslint-plugin` - TypeScript 语法检查
- `@typescript-eslint/parser` - TypeScript 解析器
- `eslint-plugin-vue` - Vue.js 组件规范
- `eslint-plugin-prettier` - Prettier 集成
- `eslint-config-prettier` - 禁用与 Prettier 冲突的规则
- `eslint-plugin-perfectionist` - 代码排序和格式化
- `eslint-plugin-command` - 注释命令支持

## 要求

- Node.js >= 16
- ESLint >= 8.0.0
- TypeScript >= 4.0.0 (如果使用 TypeScript)

## 配置说明

### TypeScript 配置

包包含了完整的 TypeScript 支持，包括：

- 类型检查 (`@typescript-eslint/typedef`)
- 严格的类型规则
- 导入/导出类型检查

### Vue.js 配置

针对 Vue 3 的优化配置：

- 组件结构规范
- 模板语法检查
- 组合式 API 支持

### Prettier 集成

自动格式化配置，确保代码风格一致。

## 许可证

MIT
npm package: @qes-test/stylelint-config
Description: A stylelint configuration package for QES projects
Latest version: 1.0.3

# @qes-test/stylelint-config

一个基于 Stylelint 的代码规范配置包，提供了完整的 CSS、SCSS 和 Vue 文件样式检查配置。

## 安装

```bash
npm install --save-dev @qes-test/stylelint-config
```

## 使用方法

### 基本配置

在你的项目中创建 `stylelint.config.mjs` 文件：

```javascript
export default {
  extends: ['@qes-test/stylelint-config'],
  root: true
}
```

### 与现有项目集成

如果你已经有 Stylelint 配置，可以这样集成：

```javascript
export default {
  extends: [
    '@qes-test/stylelint-config'
    // 你的其他配置
  ],
  rules: {
    // 在这里添加或覆盖规则
  }
}
```

## 特性

- ✅ **CSS 支持** - 完整的 CSS 语法检查和规范
- ✅ **SCSS 支持** - SCSS 语法检查和最佳实践
- ✅ **Vue 支持** - Vue 单文件组件样式检查
- ✅ **Prettier 集成** - 自动代码格式化
- ✅ **属性排序** - 自动排序 CSS 属性
- ✅ **代码质量** - 检测潜在的样式问题和代码质量问题
- ✅ **可扩展** - 易于自定义和扩展

## 包含的插件

- `stylelint-config-standard` - 标准样式规范
- `stylelint-config-recess-order` - CSS 属性排序
- `stylelint-scss` - SCSS 语法支持
- `stylelint-prettier` - Prettier 集成
- `@stylistic/stylelint-plugin` - 代码风格检查
- `stylelint-order` - 属性排序插件

## 要求

- Node.js >= 16
- Stylelint >= 16.0.0

## 配置说明

### CSS 配置

包包含了完整的 CSS 支持，包括：

- 标准 CSS 语法检查
- 属性排序规则
- 代码风格规范

### SCSS 配置

针对 SCSS 的优化配置：

- SCSS 语法检查
- 变量和 mixin 支持
- 嵌套规则检查

### Vue 配置

针对 Vue 单文件组件的配置：

- Vue 特定伪类支持 (`:deep`, `:global`)
- Vue 特定伪元素支持 (`v-deep`, `v-global`, `v-slotted`)
- 组件样式规范

## 规则说明

### 主要规则

- `order/order` - CSS 属性排序规则
- `prettier/prettier` - Prettier 格式化规则
- `selector-class-pattern` - 类名命名规范
- `at-rule-no-unknown` - 未知 at 规则检查

### 忽略的文件

默认忽略以下文件类型：

- JavaScript 文件 (`.js`, `.jsx`)
- TypeScript 文件 (`.ts`, `.tsx`)
- JSON 文件 (`.json`)
- Markdown 文件 (`.md`)

## 许可证

MIT
npm package: @qest/cache-async-adapter
Description: Async cache Redis or local with the same interface which can be further expanded
Author: QEST
Latest version: 1.0.2

# Cache

Async cache Redis or local with the same interface
which can be further expanded

Use memory storage 
```typescript
import {CacheAdapterType, CacheFactory} from "@qest/cache-async-adapter";

const cacheLocal = new CacheFactory().create(CacheAdapterType.Local);

await cacheLocal.set('key1', {data: 'hello'}, 10000); // time in ms
console.log(await cacheLocal.get('key1')); // {data: 'hello'}
```

Use Redis storage
```typescript
import {CacheAdapterType, CacheFactory} from "@qest/cache-async-adapter";
const redisConfig = {
    port: 6379,
    host: '127.0.0.1',
};

const cacheRedis =  new CacheFactory().create(CacheAdapterType.Redis, redisConfig);

await cacheRedis.set('key1', {data: 'hello Redis'}, 10000); // time in ms
console.log(await cacheRedis.get('key1')); // {data: 'hello Redis'}
```

###  All functions

##### get: <T>(key: string) => Promise<T>;
Example: 
```typescript
await cacheLocal.get('key1')
```
##### set: (key: string, values: object, msInterval?: number) => Promise<void>;
Example: 
```typescript
await cacheLocal.set('key1', {data: 'hello'}, 10000); // time in ms
```

##### invalidate: (key: string) => Promise<void>;
Example: 
```typescript
await cacheLocal.invalidate('key1')
```

##### invalidateAll: () => Promise<void>;
Example: 
```typescript
await cacheLocal.invalidateAll()
```

##### scan: <T>(key: string) => Promise<T[]>;
Example: 
```typescript
await cacheLocal.set('key1', {data: '1'}); 
await cacheLocal.set('key2', {data: '2'});
cacheRedis.scan(`key:*`); // return [key1: {data: 1}', key2: {data: 2}]   
```
####  scanKeys: <T>(regex: string) => Promise<string[]>;  

Example: 
```typescript
await cacheLocal.set('key1', {data: 'hello'}); 
await cacheLocal.set('key2', {data: 'hello'});
cacheRedis.scanKeys(`key:*`); // return ['key1', 'key2']    
```

####  invalidateByKeys: (keys: string[]) => Promise<void>;
Example: 
```typescript
await cacheLocal.invalidateByKeys(['key1'])
```
npm package: @qest/custom-tslint-rules
Description: The TSlint rule for set prevented imports. It is necessary to set a directory (**dir**), which will be checked.
Author: QEST
Latest version: 0.0.1

# prevent-imports
The TSlint rule for set prevented imports.
It is necessary to set a directory (**dir**), which will be checked.

Next is necessary to set an array of **imports**, which is not allowed to use in code or set argument **"not-outside-import"** to **true** for forbidden usage of imports outside of the directory.

Prevented imports can be written with a regular expression.

It is also possible to exclude files with optional argument **exclude-files**.

### Schema of rule
```sh
Joi.object()
.keys({
    dir: Joi.string().required(),
    imports: Joi.array()
        .items(Joi.string())
        .min(1),
    'not-outside-import': Joi.boolean(),
    'exclude-files': Joi.array().items(Joi.string()),
})
.or('imports', 'not-outside-import');
```

### Example of usage at tslint.json
```sh
"prevent-imports": [
  true,
  {
    "dir": "./src/services",
    "imports": [".*di/services"],
    "exclude-files": [".*test.ts", ".*test-hooks.ts"]
  },
  {
    "dir": "./src/utils",
    "not-outside-import": true
  }
]
```

# valid-code-structure
The TSlint rule for valid naming of files.

allowed filenames are:
 - 'index.ts'
 - 'interfaces.ts'
 - 'test.ts'
 - 'test-hooks.ts'
 - 'schema.ts'
 - 'error.ts'
 - 'migration.ts'
 - 'interfaces.yml'
 - 'module.yml'

It is possible to exclude some directories with argument **exclude-dirs**.

### Schema of rule
```sh
Joi.object().keys({
  'exclude-dirs': Joi.array().items(Joi.string()),
}
```

### Example of usage at tslint.json
```sh
"valid-code-structure": [
  true,
  {
    "exclude-dirs": ["./scripts"]
  }
],
```
npm package: @qest/eslint-config-base
Description: Base eslint configuration
Author: Lukas Vaic
Latest version: 1.0.0

# @qest/eslint-config-base

This aims to provide easy and consistent settings for all our react projects.

Package should take into cosideration tsconfig as well as prettier and enforce their rules trough eslint.

## instalation

``` bash
yarn add -D eslint @qest/eslint-config-base
```

``` js
// .eslintrc.js
module.exports = {
  extends: ["@qest/base"],
  rules: [
      //...any overrides
  ]
};
```

``` js
// .prettierrc.js
module.exports = {
  ...require('@qest/eslint-config-base/.prettierrc'),
  //...any overrides
};
```
npm package: @qest/eslint-config-react
Description: All in one eslint config for React
Author: Lukas Vaic
Latest version: 1.0.2

# @qest/eslint-config-react

This package extends [@qest/eslint-config-base](https://github.com/qest-cz/eslint-config-base)

This aims to provide easy and consistent settings for all our react projects.

Package should take into cosideration tsconfig as well as prettier and enforce their rules trough eslint.

## instalation

``` bash
yarn add -D eslint prettier @qest/eslint-config-react
```

``` js
// .eslintrc.js
module.exports = {
  extends: ["@qest/react"],
  rules: [
      //...any overrides
  ]
};
```

``` js
// .prettierrc.js
module.exports = {
  ...require('@qest/eslint-config-react/.prettierrc'),
  //...any overrides
};
npm package: @qest/redux-oidc
Description: A package for managing OpenID Connect authentication in redux apps
Author: Maximilian Mantz
Latest version: 5.1.1

# redux-oidc
[![Build Status](https://travis-ci.org/maxmantz/redux-oidc.svg?branch=master)](https://travis-ci.org/maxmantz/redux-oidc)

A package for managing OpenID-Connect authentication in ReactJS / Redux apps. It wraps the popular oidc-client library to redux actions and reducers.

### Description

This package handles [OpenID-Connect](http://openid.net/connect/) authentication in [redux](http://redux.js.org/) apps. It enables redux apps to authenticate with an external OIDC authentication provider and handles the actions of the OpenID [implicit flow](http://openid.net/specs/openid-connect-implicit-1_0.html) or [authorization code flow](https://developer.okta.com/blog/2018/04/10/oauth-authorization-code-grant-type).

It uses the oidc-client-js library to manage OpenID Connect functionality.

It contains the following parts:
- *CallbackComponent*: A react component processing the signin callback from the OpenID-Connect provider,
- *SignoutCallbackComponent*: A react component processing the signout callback from the OpenID-Connect provider,
- *reducers & actions*: reducers and actions to handle OIDC events,
- *helpers*: create helpers to manage the oidc-client-js library

### Installation
`npm install --save redux-oidc`

#### Peer dependencies
This package wraps [oidc-client-js](https://github.com/IdentityModel/oidc-client-js) to use with ReactJS / Redux apps.
Install oidc-client like this:

`npm install --save oidc-client`

In addition there is a peer dependency for [immutable.js](https://facebook.github.io/immutable-js/), if you want to use it.

#### babel-polyfill
You need the [babel-polyfill](https://babeljs.io/docs/usage/polyfill/) in your build configuration for this package to work.


### Version 4 released
*BREAKING CHANGE*: `immutable` is no longer a dependency. If you are using the immutable reducer, please check out the [docs](https://github.com/maxmantz/redux-oidc/blob/master/docs/API.md#immutable-reducer).

#### Documentation
You can find the docs for version 3 here:
- [API docs](docs/API.md),
- [actions](docs/Actions.md),
- [example app](https://github.com/maxmantz/redux-oidc-example)

#### Note for react-native users
This library doesn't fully support react-native apps. Please use [this](https://github.com/FormidableLabs/react-native-app-auth) library instead.

### Version 2

Check out the [wiki](https://github.com/maxmantz/redux-oidc/wiki) for further information for Version 2 (deprecated).

### Sample app
There is a sample application demonstrating the use of this package [here](https://github.com/maxmantz/redux-oidc-example).

### Tests
You have to install immutableJS for all the tests to pass: `npm install immutable --no-save`.
Then run `npm run test`.
npm package: @qest/style-helpers
Description: Set of helper functions for easier work with styled components.
Author: Lukáš Vaic
Latest version: 1.2.3

# @qest/style-helpers

Set of helper functions for easier work with styled components.

## Preferred usage

You should import `createStyleHelpers` and pass your `Theme` interface into it and then use created object.

```tsx
// style-helpers.ts
import createStyleHelpers from '@qest/style-helpers';

const initializedStyleHelpers = createStyleHelpers<Theme>();

export const { color, resolution, util, baseUnit, transition, cssCondition, media } = initializedStyleHelpers; 
```

```tsx
// styled.ts
import styled, { css } from 'styled-components';
import { color, media, baseUnit } from '../style-helpers';

export const Heading = styled.h1`
    color: ${color("blue")};
    ${media.min(
        'screenMdMin',
        css`
            margin-bottom: ${baseUnit(2)};
        `,
    )};
`;
```

## Available functions

-   color
-   resolution
-   util
-   baseUnit
-   transition
-   cssCondition
-   media

## Expected theme format

Selectors expect this format of theme.

```tsx
const SCREEN_XLL = 1600;
const SCREEN_XL = 1200;
const SCREEN_LG = 992;
const SCREEN_MD = 768;
const SCREEN_SM = 576;
const SCREEN_XS = 480;

const theme = {
    colors: {
        white: '#fff',
    },
    resolution: {
        screenLg: `${SCREEN_LG}px`,
        screenLgMax: `${SCREEN_XL - 1}px`,
        screenLgMin: `${SCREEN_LG}px`,
        screenMd: `${SCREEN_MD}px`,
        screenMdMax: `${SCREEN_LG - 1}px`,
        screenMdMin: `${SCREEN_MD}px`,
        screenSm: `${SCREEN_SM}px`,
        screenSmMax: `${SCREEN_MD}px`,
        screenSmMin: `${SCREEN_SM}px`,
        screenXl: `${SCREEN_XL}px`,
        screenXlMax: `${SCREEN_XLL - 1}px`,
        screenXlMin: `${SCREEN_XL}px`,
        screenXll: `${SCREEN_XLL}px`,
        screenXllMin: `${SCREEN_XLL}px`,
        screenXs: `${SCREEN_XS}px`,
        screenXsMax: `${SCREEN_SM - 1}px`,
        screenXsMin: `${SCREEN_XS}px`,
    },
    utils: {
        baseUnit: 8,
    },
};
```

## React-native

For react-native use imports from `native` folder

```tsx
import createStyleHelpers from '@qest/style-helpers/native';
```
npm package: @qest/tsconfig-react
Description: Basic tsconfig for react applications
Author: Lukas Vaic
Latest version: 1.1.0

# @qest/tsconfig-react

This aims to provide easy and consistent typescript settings for all our react projects.

## instalation

``` bash
yarn add -D typescript @qest/tsconfig-react
```

``` js
// tsconfig.json
module.exports = {
  "extends": "@qest/tsconfig-react",
  // "compilerOptions": {
  //   "baseUrl": "src",
  //   "paths": {
  //     "assets/*": [
  //       "assets/*"
  //     ],
  //     "components/*": [
  //       "components/*"
  //     ],
  //     "layouts/*": [
  //       "layouts/*"
  //     ],
  //     "styles/*": [
  //       "styles/*"
  //     ],
  //     "utils/*": [
  //       "utils/*"
  //     ],
  //     "hooks/*": [
  //       "hooks/*"
  //     ]
  //   }
  // }
};
```
npm package: @qest/use-selectors
Description: Little wrapper around useSelector, that lets you select multiple values in single hook.
Author: Lukáš Vaic
Latest version: 1.0.0

# @qest/use-selectors   

Little wrapper around useSelector, that lets you select multiple values in single hook.

## Preferred usage

You should import `initializeUseSelectors` and pass your `Redux` interface into it and then use created function.

```tsx
// utils/useSelectors.ts
import { initializeUseSelectors } from '@qest/useSelectors';
import { ReduxType } from '../yourLocalPathToReduxType';

const initializedUseSelectors = initializeUseSelectors<ReduxType>();

export default initializedUseSelectors;
```

```tsx
// UserList.tsx
import React from 'react';
import useSelectors from 'utils/useSelectors';

const UserList = (props: Props) => {
    const {loading, users} = useSelectors({
        loading: selectLoading,
        users: (state)=> state.users.data
    });

    return null;
};

export default UserList;
```

## no types/pure js usage

```tsx
// UserList.tsx
import React from 'react';
import useSelectors from '@qest/use-selectors';

const UserList = (props: Props) => {
    const {loading, users} = useSelectors({
        loading: selectLoading,
        users: (state)=> state.users.data
    });

    return null;
};

export default UserList;
```