feat: docker compose maybe
This commit is contained in:
		
							
								
								
									
										21
									
								
								node_modules/pirates/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								node_modules/pirates/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
MIT License
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2016-2018 Ari Porad
 | 
			
		||||
 | 
			
		||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
of this software and associated documentation files (the "Software"), to deal
 | 
			
		||||
in the Software without restriction, including without limitation the rights
 | 
			
		||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 | 
			
		||||
copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
furnished to do so, subject to the following conditions:
 | 
			
		||||
 | 
			
		||||
The above copyright notice and this permission notice shall be included in all
 | 
			
		||||
copies or substantial portions of the Software.
 | 
			
		||||
 | 
			
		||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 | 
			
		||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
			
		||||
SOFTWARE.
 | 
			
		||||
							
								
								
									
										69
									
								
								node_modules/pirates/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								node_modules/pirates/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
# Pirates [![Coverage][codecov-badge]][codecov-link]
 | 
			
		||||
 | 
			
		||||
### Properly hijack require
 | 
			
		||||
 | 
			
		||||
[codecov-badge]: https://img.shields.io/codecov/c/github/danez/pirates/master.svg?style=flat "codecov"
 | 
			
		||||
[codecov-link]: https://codecov.io/gh/danez/pirates "codecov"
 | 
			
		||||
 | 
			
		||||
## Why?
 | 
			
		||||
 | 
			
		||||
Two reasons:
 | 
			
		||||
1. Babel and istanbul were breaking each other.
 | 
			
		||||
2. Everyone seemed to re-invent the wheel on this, and everyone wanted a solution that was DRY, simple, easy to use,
 | 
			
		||||
and made everything Just Work™, while allowing multiple require hooks, in a fashion similar to calling `super`.
 | 
			
		||||
 | 
			
		||||
For some context, see [the Babel issue thread][] which started this all, then [the nyc issue thread][], where
 | 
			
		||||
discussion was moved (as we began to discuss just using the code nyc had developed), and finally to [#1][issue-1]
 | 
			
		||||
where discussion was finally moved.
 | 
			
		||||
 | 
			
		||||
[the Babel issue thread]: https://github.com/babel/babel/pull/3062 "Babel Issue Thread"
 | 
			
		||||
[the nyc issue thread]: https://github.com/bcoe/nyc/issues/70 "NYC Issue Thread"
 | 
			
		||||
[issue-1]: https://github.com/danez/pirates/issues/1 "Issue #1"
 | 
			
		||||
 | 
			
		||||
## Installation
 | 
			
		||||
 | 
			
		||||
    npm install --save pirates
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
Using pirates is really easy:
 | 
			
		||||
```javascript
 | 
			
		||||
// my-module/register.js
 | 
			
		||||
const addHook = require('pirates').addHook;
 | 
			
		||||
// Or if you use ES modules
 | 
			
		||||
// import { addHook } from 'pirates';
 | 
			
		||||
 | 
			
		||||
function matcher(filename) {
 | 
			
		||||
  // Here, you can inspect the filename to determine if it should be hooked or
 | 
			
		||||
  // not. Just return a truthy/falsey. Files in node_modules are automatically ignored,
 | 
			
		||||
  // unless otherwise specified in options (see below).
 | 
			
		||||
 | 
			
		||||
  // TODO: Implement your logic here
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const revert = addHook(
 | 
			
		||||
  (code, filename) => code.replace('@@foo', 'console.log(\'foo\');'),
 | 
			
		||||
  { exts: ['.js'], matcher }
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
// And later, if you want to un-hook require, you can just do:
 | 
			
		||||
revert();
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## API
 | 
			
		||||
 | 
			
		||||
### pirates.addHook(hook, [opts={ [matcher: true], [exts: ['.js']], [ignoreNodeModules: true] }]);
 | 
			
		||||
Add a require hook. `hook` must be a function that takes `(code, filename)`, and returns the modified code. `opts` is
 | 
			
		||||
an optional options object. Available options are: `matcher`, which is a function that accepts a filename, and
 | 
			
		||||
returns a truthy value if the file should be hooked (defaults to a function that always returns true), falsey if
 | 
			
		||||
otherwise; `exts`, which is an array of extensions to hook, they should begin with `.` (defaults to `['.js']`);
 | 
			
		||||
`ignoreNodeModules`, if true, any file in a `node_modules` folder wont be hooked (the matcher also wont be called),
 | 
			
		||||
if false, then the matcher will be called for any files in `node_modules` (defaults to true).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Projects that use Pirates
 | 
			
		||||
 | 
			
		||||
See the [wiki page](https://github.com/danez/pirates/wiki/Projects-using-Pirates). If you add Pirates to your project,
 | 
			
		||||
(And you should! It works best if everyone uses it. Then we can have a happy world full of happy require hooks!), please
 | 
			
		||||
add yourself to the wiki.
 | 
			
		||||
							
								
								
									
										82
									
								
								node_modules/pirates/index.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								node_modules/pirates/index.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,82 @@
 | 
			
		||||
/* (c) 2015 Ari Porad (@ariporad) <http://ariporad.com>. License: ariporad.mit-license.org */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The hook. Accepts the code of the module and the filename.
 | 
			
		||||
 */
 | 
			
		||||
declare type Hook = (code: string, filename: string) => string;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * A matcher function, will be called with path to a file.
 | 
			
		||||
 *
 | 
			
		||||
 * Should return truthy if the file should be hooked, falsy otherwise.
 | 
			
		||||
 */
 | 
			
		||||
declare type Matcher = (path: string) => boolean;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Reverts the hook when called.
 | 
			
		||||
 */
 | 
			
		||||
declare type RevertFunction = () => void;
 | 
			
		||||
interface Options {
 | 
			
		||||
  /**
 | 
			
		||||
   * The extensions to hook. Should start with '.' (ex. ['.js']).
 | 
			
		||||
   *
 | 
			
		||||
   * Takes precedence over `exts`, `extension` and `ext`.
 | 
			
		||||
   *
 | 
			
		||||
   * @alias exts
 | 
			
		||||
   * @alias extension
 | 
			
		||||
   * @alias ext
 | 
			
		||||
   * @default ['.js']
 | 
			
		||||
   */
 | 
			
		||||
  extensions?: ReadonlyArray<string> | string;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The extensions to hook. Should start with '.' (ex. ['.js']).
 | 
			
		||||
   *
 | 
			
		||||
   * Takes precedence over `extension` and `ext`.
 | 
			
		||||
   *
 | 
			
		||||
   * @alias extension
 | 
			
		||||
   * @alias ext
 | 
			
		||||
   * @default ['.js']
 | 
			
		||||
   */
 | 
			
		||||
  exts?: ReadonlyArray<string> | string;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The extensions to hook. Should start with '.' (ex. ['.js']).
 | 
			
		||||
   *
 | 
			
		||||
   * Takes precedence over `ext`.
 | 
			
		||||
   *
 | 
			
		||||
   * @alias ext
 | 
			
		||||
   * @default ['.js']
 | 
			
		||||
   */
 | 
			
		||||
  extension?: ReadonlyArray<string> | string;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The extensions to hook. Should start with '.' (ex. ['.js']).
 | 
			
		||||
   *
 | 
			
		||||
   * @default ['.js']
 | 
			
		||||
   */
 | 
			
		||||
  ext?: ReadonlyArray<string> | string;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * A matcher function, will be called with path to a file.
 | 
			
		||||
   *
 | 
			
		||||
   * Should return truthy if the file should be hooked, falsy otherwise.
 | 
			
		||||
   */
 | 
			
		||||
  matcher?: Matcher | null;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Auto-ignore node_modules. Independent of any matcher.
 | 
			
		||||
   *
 | 
			
		||||
   * @default true
 | 
			
		||||
   */
 | 
			
		||||
  ignoreNodeModules?: boolean;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add a require hook.
 | 
			
		||||
 *
 | 
			
		||||
 * @param hook The hook. Accepts the code of the module and the filename. Required.
 | 
			
		||||
 * @returns The `revert` function. Reverts the hook when called.
 | 
			
		||||
 */
 | 
			
		||||
export declare function addHook(hook: Hook, opts?: Options): RevertFunction;
 | 
			
		||||
export {};
 | 
			
		||||
							
								
								
									
										139
									
								
								node_modules/pirates/lib/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								node_modules/pirates/lib/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,139 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
 | 
			
		||||
Object.defineProperty(exports, "__esModule", {
 | 
			
		||||
  value: true
 | 
			
		||||
});
 | 
			
		||||
exports.addHook = addHook;
 | 
			
		||||
var _module = _interopRequireDefault(require("module"));
 | 
			
		||||
var _path = _interopRequireDefault(require("path"));
 | 
			
		||||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 | 
			
		||||
/* (c) 2015 Ari Porad (@ariporad) <http://ariporad.com>. License: ariporad.mit-license.org */
 | 
			
		||||
 | 
			
		||||
const nodeModulesRegex = /^(?:.*[\\/])?node_modules(?:[\\/].*)?$/;
 | 
			
		||||
// Guard against poorly mocked module constructors.
 | 
			
		||||
const Module = module.constructor.length > 1 ? module.constructor : _module.default;
 | 
			
		||||
const HOOK_RETURNED_NOTHING_ERROR_MESSAGE = '[Pirates] A hook returned a non-string, or nothing at all! This is a' + ' violation of intergalactic law!\n' + '--------------------\n' + 'If you have no idea what this means or what Pirates is, let me explain: ' + 'Pirates is a module that makes is easy to implement require hooks. One of' + " the require hooks you're using uses it. One of these require hooks" + " didn't return anything from it's handler, so we don't know what to" + ' do. You might want to debug this.';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {string} filename The filename to check.
 | 
			
		||||
 * @param {string[]} exts The extensions to hook. Should start with '.' (ex. ['.js']).
 | 
			
		||||
 * @param {Matcher|null} matcher A matcher function, will be called with path to a file. Should return truthy if the file should be hooked, falsy otherwise.
 | 
			
		||||
 * @param {boolean} ignoreNodeModules Auto-ignore node_modules. Independent of any matcher.
 | 
			
		||||
 */
 | 
			
		||||
function shouldCompile(filename, exts, matcher, ignoreNodeModules) {
 | 
			
		||||
  if (typeof filename !== 'string') {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  if (exts.indexOf(_path.default.extname(filename)) === -1) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  const resolvedFilename = _path.default.resolve(filename);
 | 
			
		||||
  if (ignoreNodeModules && nodeModulesRegex.test(resolvedFilename)) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  if (matcher && typeof matcher === 'function') {
 | 
			
		||||
    return !!matcher(resolvedFilename);
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @callback Hook The hook. Accepts the code of the module and the filename.
 | 
			
		||||
 * @param {string} code
 | 
			
		||||
 * @param {string} filename
 | 
			
		||||
 * @returns {string}
 | 
			
		||||
 */
 | 
			
		||||
/**
 | 
			
		||||
 * @callback Matcher A matcher function, will be called with path to a file.
 | 
			
		||||
 *
 | 
			
		||||
 * Should return truthy if the file should be hooked, falsy otherwise.
 | 
			
		||||
 * @param {string} path
 | 
			
		||||
 * @returns {boolean}
 | 
			
		||||
 */
 | 
			
		||||
/**
 | 
			
		||||
 * @callback RevertFunction Reverts the hook when called.
 | 
			
		||||
 * @returns {void}
 | 
			
		||||
 */
 | 
			
		||||
/**
 | 
			
		||||
 * @typedef {object} Options
 | 
			
		||||
 * @property {Matcher|null} [matcher=null] A matcher function, will be called with path to a file.
 | 
			
		||||
 *
 | 
			
		||||
 * Should return truthy if the file should be hooked, falsy otherwise.
 | 
			
		||||
 *
 | 
			
		||||
 * @property {string[]} [extensions=['.js']] The extensions to hook. Should start with '.' (ex. ['.js']).
 | 
			
		||||
 * @property {string[]} [exts=['.js']] The extensions to hook. Should start with '.' (ex. ['.js']).
 | 
			
		||||
 *
 | 
			
		||||
 * @property {string[]} [extension=['.js']] The extensions to hook. Should start with '.' (ex. ['.js']).
 | 
			
		||||
 * @property {string[]} [ext=['.js']] The extensions to hook. Should start with '.' (ex. ['.js']).
 | 
			
		||||
 *
 | 
			
		||||
 * @property {boolean} [ignoreNodeModules=true] Auto-ignore node_modules. Independent of any matcher.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Add a require hook.
 | 
			
		||||
 *
 | 
			
		||||
 * @param {Hook} hook The hook. Accepts the code of the module and the filename. Required.
 | 
			
		||||
 * @param {Options} [opts] Options
 | 
			
		||||
 * @returns {RevertFunction} The `revert` function. Reverts the hook when called.
 | 
			
		||||
 */
 | 
			
		||||
function addHook(hook, opts = {}) {
 | 
			
		||||
  let reverted = false;
 | 
			
		||||
  const loaders = [];
 | 
			
		||||
  const oldLoaders = [];
 | 
			
		||||
  let exts;
 | 
			
		||||
 | 
			
		||||
  // We need to do this to fix #15. Basically, if you use a non-standard extension (ie. .jsx), then
 | 
			
		||||
  // We modify the .js loader, then use the modified .js loader for as the base for .jsx.
 | 
			
		||||
  // This prevents that.
 | 
			
		||||
  const originalJSLoader = Module._extensions['.js'];
 | 
			
		||||
  const matcher = opts.matcher || null;
 | 
			
		||||
  const ignoreNodeModules = opts.ignoreNodeModules !== false;
 | 
			
		||||
  exts = opts.extensions || opts.exts || opts.extension || opts.ext || ['.js'];
 | 
			
		||||
  if (!Array.isArray(exts)) {
 | 
			
		||||
    exts = [exts];
 | 
			
		||||
  }
 | 
			
		||||
  exts.forEach(ext => {
 | 
			
		||||
    if (typeof ext !== 'string') {
 | 
			
		||||
      throw new TypeError(`Invalid Extension: ${ext}`);
 | 
			
		||||
    }
 | 
			
		||||
    const oldLoader = Module._extensions[ext] || originalJSLoader;
 | 
			
		||||
    oldLoaders[ext] = Module._extensions[ext];
 | 
			
		||||
    loaders[ext] = Module._extensions[ext] = function newLoader(mod, filename) {
 | 
			
		||||
      let compile;
 | 
			
		||||
      if (!reverted) {
 | 
			
		||||
        if (shouldCompile(filename, exts, matcher, ignoreNodeModules)) {
 | 
			
		||||
          compile = mod._compile;
 | 
			
		||||
          mod._compile = function _compile(code) {
 | 
			
		||||
            // reset the compile immediately as otherwise we end up having the
 | 
			
		||||
            // compile function being changed even though this loader might be reverted
 | 
			
		||||
            // Not reverting it here leads to long useless compile chains when doing
 | 
			
		||||
            // addHook -> revert -> addHook -> revert -> ...
 | 
			
		||||
            // The compile function is also anyway created new when the loader is called a second time.
 | 
			
		||||
            mod._compile = compile;
 | 
			
		||||
            const newCode = hook(code, filename);
 | 
			
		||||
            if (typeof newCode !== 'string') {
 | 
			
		||||
              throw new Error(HOOK_RETURNED_NOTHING_ERROR_MESSAGE);
 | 
			
		||||
            }
 | 
			
		||||
            return mod._compile(newCode, filename);
 | 
			
		||||
          };
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      oldLoader(mod, filename);
 | 
			
		||||
    };
 | 
			
		||||
  });
 | 
			
		||||
  return function revert() {
 | 
			
		||||
    if (reverted) return;
 | 
			
		||||
    reverted = true;
 | 
			
		||||
    exts.forEach(ext => {
 | 
			
		||||
      // if the current loader for the extension is our loader then unregister it and set the oldLoader again
 | 
			
		||||
      // if not we can not do anything as we cannot remove a loader from within the loader-chain
 | 
			
		||||
      if (Module._extensions[ext] === loaders[ext]) {
 | 
			
		||||
        if (!oldLoaders[ext]) {
 | 
			
		||||
          delete Module._extensions[ext];
 | 
			
		||||
        } else {
 | 
			
		||||
          Module._extensions[ext] = oldLoaders[ext];
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										74
									
								
								node_modules/pirates/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								node_modules/pirates/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "pirates",
 | 
			
		||||
  "description": "Properly hijack require, i.e., properly define require hooks and customizations",
 | 
			
		||||
  "main": "lib/index.js",
 | 
			
		||||
  "types": "index.d.ts",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "clean": "rimraf lib",
 | 
			
		||||
    "build": "babel src -d lib",
 | 
			
		||||
    "test": "cross-env BABEL_ENV=test yarn run build && nyc ava",
 | 
			
		||||
    "lint": "eslint --report-unused-disable-directives .",
 | 
			
		||||
    "prepublishOnly": "yarn run build"
 | 
			
		||||
  },
 | 
			
		||||
  "files": [
 | 
			
		||||
    "lib",
 | 
			
		||||
    "index.d.ts"
 | 
			
		||||
  ],
 | 
			
		||||
  "repository": {
 | 
			
		||||
    "type": "git",
 | 
			
		||||
    "url": "https://github.com/danez/pirates.git"
 | 
			
		||||
  },
 | 
			
		||||
  "engines": {
 | 
			
		||||
    "node": ">= 6"
 | 
			
		||||
  },
 | 
			
		||||
  "author": {
 | 
			
		||||
    "name": "Ari Porad",
 | 
			
		||||
    "email": "ari@ariporad.com",
 | 
			
		||||
    "url": "http://ariporad.com"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@babel/cli": "7.21.0",
 | 
			
		||||
    "@babel/core": "7.21.4",
 | 
			
		||||
    "@babel/preset-env": "7.21.4",
 | 
			
		||||
    "ava": "1.4.1",
 | 
			
		||||
    "babel-core": "7.0.0-bridge.0",
 | 
			
		||||
    "babel-eslint": "10.1.0",
 | 
			
		||||
    "babel-plugin-istanbul": "5.2.0",
 | 
			
		||||
    "cross-env": "5.2.1",
 | 
			
		||||
    "decache": "4.6.1",
 | 
			
		||||
    "eslint": "5.16.0",
 | 
			
		||||
    "eslint-config-prettier": "4.3.0",
 | 
			
		||||
    "eslint-plugin-import": "2.27.5",
 | 
			
		||||
    "eslint-plugin-prettier": "3.4.1",
 | 
			
		||||
    "mock-require": "3.0.3",
 | 
			
		||||
    "nyc": "13.3.0",
 | 
			
		||||
    "prettier": "1.19.1",
 | 
			
		||||
    "rewire": "4.0.1",
 | 
			
		||||
    "rimraf": "3.0.2"
 | 
			
		||||
  },
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "bugs": {
 | 
			
		||||
    "url": "https://github.com/danez/pirates/issues"
 | 
			
		||||
  },
 | 
			
		||||
  "homepage": "https://github.com/danez/pirates#readme",
 | 
			
		||||
  "ava": {
 | 
			
		||||
    "files": [
 | 
			
		||||
      "test/*.js"
 | 
			
		||||
    ],
 | 
			
		||||
    "sources": [
 | 
			
		||||
      "lib/**/*.js"
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "nyc": {
 | 
			
		||||
    "include": [
 | 
			
		||||
      "src/*.js"
 | 
			
		||||
    ],
 | 
			
		||||
    "reporter": [
 | 
			
		||||
      "json",
 | 
			
		||||
      "text"
 | 
			
		||||
    ],
 | 
			
		||||
    "sourceMap": false,
 | 
			
		||||
    "instrument": false
 | 
			
		||||
  },
 | 
			
		||||
  "version": "4.0.6"
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user