open-index/open-npm huggingface dataset:
npm package: @medjs/mrc-gen
Description: Model, Controller and Route generator
Author: Med-Najjar
Latest version: 1.0.0

# MRC-gen
Models Routes Controllers generator.
MRC-gen is a npm package for express app that can generate model, route or controller file with content, separately or all of them by cli command line.
- To install this package make sure that you have already initialized your project (npm init) and you are in repository app.

1 - Install package:

$ npm install @medjs/mrc-gen

2 - To generate Model file:

$ npx create-model

=> then type the name of your file.

# - NB: The package will generate controllers, Models and Routes directories if they not exist with file inside it. 

3 - To generate controller file:

$ npx create-controller

=> then type the name of your file.

4 - To generate Route file:

$ npx create-route

=> then type the name of your file.

5 - To generate all files:

$ npx create-mrc

=> then type the name of your file.

# You can also install the package globaly:

$ npm i -g @medjs/mrc-gen

# You will be able to use direct command:

$ create-model

$ create-controller

$ create-route

$ create-mrc
npm package: @medley/etag
Description: Medley plugin for automatic ETag generation & conditional GET responses
Author: Nathan Woltman
Latest version: 0.1.0

# @medley/etag

[![npm Version](https://img.shields.io/npm/v/@medley/etag.svg)](https://www.npmjs.com/package/@medley/etag)
[![Build Status](https://travis-ci.org/medleyjs/etag.svg?branch=master)](https://travis-ci.org/medleyjs/etag)
[![Coverage Status](https://coveralls.io/repos/github/medleyjs/etag/badge.svg?branch=master)](https://coveralls.io/github/medleyjs/etag?branch=master)
[![dependencies Status](https://img.shields.io/david/medleyjs/etag.svg)](https://david-dm.org/medleyjs/etag)

[Medley](https://www.npmjs.com/package/@medley/medley) plugin for automatic ETag generation & conditional GET responses.

Generates an `ETag` header for `string` and `Buffer` response bodies and sends a `304 Not Modified` response if the ETag matches the incoming `If-None-Match` header.

## Installation

```sh
npm install @medley/etag
# or
yarn add @medley/etag
```

## Usage

```js
const medley = require('@medley/medley');
const app = medley();

app.register(require('@medley/etag'));

app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(3000);
```
npm package: @medley/serve-favicon
Description: Medley plugin for serving the default favicon
Author: Nathan Woltman
Latest version: 0.1.2

# @medley/serve-favicon

[![npm Version](https://img.shields.io/npm/v/@medley/serve-favicon.svg)](https://www.npmjs.com/package/@medley/serve-favicon)
[![Build Status](https://travis-ci.org/medleyjs/serve-favicon.svg?branch=master)](https://travis-ci.org/medleyjs/serve-favicon)
[![Coverage Status](https://coveralls.io/repos/github/medleyjs/serve-favicon/badge.svg?branch=master)](https://coveralls.io/github/medleyjs/serve-favicon?branch=master)
[![dependencies Status](https://img.shields.io/david/medleyjs/serve-favicon.svg)](https://david-dm.org/medleyjs/serve-favicon)

[Medley](https://www.npmjs.com/package/@medley/medley) plugin for serving the
default favicon (`/favicon.ico`).

## Installation

```sh
npm install @medley/serve-favicon --save
# or
yarn add @medley/serve-favicon
```

## Usage

```js
const medley = require('@medley/medley');
const path = require('path');

const app = medley();

app.register(require('@medley/serve-favicon'), {
  favicon: path.join(__dirname, 'public', 'favicon.ico')
});
```

### Plugin Options

#### `favicon` (required)

Type: `string` | `Buffer`

Either a path string pointing to the favicon file or a Buffer containing the favicon file.

```js
// Using a path string
app.register(require('@medley/serve-favicon'), {
  favicon: path.join(__dirname, 'path/to/favicon.ico')
});

// Using a Buffer
app.register(require('@medley/serve-favicon'), {
  favicon: fs.readFileSync('./path/to/favicon.ico')
});
```

#### `maxAge`

Type: `number`<br>
Default: `31536000` (1 year)

A number **in seconds** indicating how long browsers should cache the favicon.

```js
app.register(require('@medley/serve-favicon'), {
  favicon: path.join(__dirname, 'public', 'favicon.ico'),
  maxAge: 60 * 60 * 24 * 7 // 1 week
});
```
npm package: @medlinker/apitool
Description: 医联前端API工具
Author: qizhang.yang
Latest version: 0.2.0

# `@medlinker/apitool`

> 医联前端 api 工具

## 安装

`npm i @medlinker/apitool`

## 功能特性

1. 基于`axios`二次封装的`request`模块
2. 通过 swagger 接口文档自动生成接口代码工具-`createAPI`。建议和上述封装的`request`模块结合使用。
3. 支持 typescript

## `request`

基于`axios`封装，但是为了兼容 typescript 的声明，将 API 做了较大的改动。

```typescript
import request from '@medlinker/apitool/request'

async function fetch() {
  const res = await request.get('/user/list').setParams({ start: 0, limit: 20 })

  console.log(res)
}
```

### 请求方法

`request.method(url, config)`

method 支持`get`，`post`，`put`，`delete`。

- `url` - 请求地址
- `config` - 继承于 axios 配置，可以传入其他的配置，在回调时可能有用

同时每一个请求网络的方法都支持传入声明，只是不同请求类型的声明参数有所区别。

P 是 URL 请求参数，D 是请求正文，R 是返回值

- `request.get<P={},R={}>(url, config)`
- `request.post<D={},R={}>(url, config)`
- `request.put<D={},R={}>(url, config)`
- `request.delete<P={},R={}>(url, config)`

### `Request`实例

上述的每一个方法都会返回一个 Request 对象实例，每一个实例有以下属性。

#### `.appendParams(params):this`

给请求追加参数

#### `.setParams(params):this`

给请求设置请求参数，会整体覆盖之前的参数

#### `.appendData(params):this`

给请求追加正文数据

#### `.setParams(params):this`

给请求设置正文数据，会整体覆盖之前的正文

#### `.setConfig(config):this`

给请求设置配置参数。

#### `.setHeaders(headers):this`

给请求设置请求头配置。

#### `then`

同`promise` then 方法，会触发发送请求，如果上一次请求没完成则会中断上一次请求。支持`await`

#### `catch`

同`promise` catch 方法，会触发发送请求，如果上一次请求没完成则会中断上一次请求。支持`await`

#### `.cancel()`

如果有正在进行中的请求，则中断当前请求，并抛出一个`CancelError`的异常。

### `.create(config)`

创建一个新的 request 实例，并会将传入的 config 作为默认配置。

- `config` - 继承于 axios 配置，并支持以下额外回调
- `config.onSuccess` - 请求成功后触发
- `config.onError` - 请求失败后触发
- `config.beforeSend` - 请求发送前触发，通常在此添加公共参数，请求头等

```typescript
export type RequestInstanceConfig = RequestBaseConfig & {
  onSuccess?: (data: AxiosResponse, config: RequestInstanceConfig) => Promise<any> | any
  onError?: (error: AxiosError, config: RequestInstanceConfig) => Promise<any> | any
  beforeSend?: (config: RequestBaseConfig) => RequestBaseConfig | Promise<RequestBaseConfig>
}
```

### `.isCancelError(err)`

传入 err 是否是一个中断错误

## `createAPI`

根据 swagger 接口配置生成 api 代码，支持命令和命令行调用

```typescript
import createAPI from '@medlinker/apitool/createAPI'
```

### `createAPI.genCode(swaggerInfo, config)`

- `swaggerInfo` - swagger 接口配置
- `config` - 配置
- `config.dist` - 代码输出文件
- `config.generator` - createAPI 默认只会生成数据声明代码，需要通过钩子来生成方法和头部。[参考下文](#generators)
- `config.requestModule` - request 模块引用，默认使用`@medlinker/apitool/request`。如果你有自定义 request，可以配置`'./request.ts'`这样的相对路径

```typescript
createAPI.genCode(swaggerConfig, {
  dist: path.resolve('./src/api/api.ts'),
  generator: createAPI.generators.get('nextjs'),
  requestModule: './request',
})
```

### generators

通过`createAPI.generators.get(name:string)`来获取 generator.

目前支持以下类型

- `nextjs` nextjs 服务端渲染
- `default`（默认）

### cli

模块安装后支持`createAPI`命令来生成代码，如：

```json
{
  "scripts": {
    "api": "DEBUG=CreateAPI createAPI -u=http://patient-medication-dev.medlinker.com/swagger/doc.json -g=nextjs -r='./request' -d=./client/apis/api.ts"
  }
}
```

通过 `createAPI -h` 来获取完整的命令信息。

如果你想查看调试信息，请在命令前添加`DEBUG=CreateAPI`是内置的 `debug` 模块生效。

## TODO
npm package: @medlinker/data-tracker
Description: 医联数据埋点工具
Author: qizhang.yang
Latest version: 0.2.9

# `@medlinker/data-tracker`

多端埋点工具 [文档](https://wiki.medlinker.com/pages/viewpage.action?pageId=17610632)

## 安装

**NPM 安装（推荐）**

```bash
npm i @medlinker/data-tracker
```

```javascript
import MedDT from '@medlinker/data-tracker/browser';

MedDT.init(...);
```

**全局安装**

下载文件，并通过 script 标签引用。

```html
<script src="/js/med-tracker/browser.js"></script>
```

```typescript
/// <reference types="@medlinker/dt/browser" />

MedDT.init(...);
```

## 使用

### 初始化

模块需要通过调用 `init` 方法完成初始化。只有在初始化后，才能正常上报埋点信息，初始化前的埋点会被忽略。

```javascript
MedDT.init(config);
```

#### config.hash

类型：`boolean`，默认为 false。

当前项目使用使用了 hash 路由

#### config.enable

类型：`boolean`，默认为 true。

是否启用，开发模式下一般设置成 false。

#### config.env

类型：`dev | qa | prod`，默认为 `dev`

项目当前运行的环境，决定了上传的接口。

### 埋点方式

#### 手动上报

通过调用方法来进行上报。

方法：`MedDT.collect(data:UserDataEntity)`

```typescript
interface UserDataEntity {
  /**
   * log_type
   */
  lt?: number;
  /**
   * event_id
   */
  ei?: number;
  /**
   * event_param
   */
  ep?: string;
  /**
   * business
   */
  b?: string;
}
```

```jsx
function Login() {
  return (
    <button
      onClick={() => {
        MedDT.report({
          b: 'someActivity',
          ei: '0',
        });
        // 业务代码逻辑
      }}
    >
      提交
    </button>
  );
}
```

#### 隐式上报

点击事件埋点更建议使用隐式上报。这种方式对业务代码的侵入性会小一些。

```javascript
function Login() {
  return (
    <button
      data-medtrack="b:patient;ei:0;s:web"
      onClick={() => {
          // 业务代码逻辑
        };
      }
    >
      提交
    </button>
  );
}
```

这样每次点击 button 都会将`data-medtrack`携带的信息进行上报。

## API

### `MedDT.init(config)`

初始化配置

### `MedDT.ready()`

调用此方法前的埋点会加入队列直到已经准备完成。一般在获取用户 id 后再调用此方法。

### `MedDT.setUserId(id:string)`

设置当前登录的用户 id

### `MedDT.collect(data: UserDataEntity)`

埋点方法

```typescript
export interface UserDataEntity {
  /**
   * log_type，默认为1
   */
  lt?: number;
  /**
   * event_id 默认为 -1
   */
  ei?: number;
  /**
   * event_param 默认为 ''
   */
  ep?: string;
  /**
   * business 默认为 ''
   */
  b?: string;
}
```

### `MedDT.reset()`

重置 tracker。

## SPA 应用

1. 在路由变化时调用一次 `MedDT.collect()`
2. 用户退出登录后，如果没有刷新页面，可以调用`MedDT.reset()` 重置模块。