feat(auth): implement user authentication system
This commit is contained in:
parent
4847ab793a
commit
25cea4fbe8
12051 changed files with 1462377 additions and 0 deletions
21
backend/node_modules/color-string/LICENSE
generated
vendored
Normal file
21
backend/node_modules/color-string/LICENSE
generated
vendored
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
Copyright (c) 2011 Heather Arthur <fayearthur@gmail.com>
|
||||
|
||||
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.
|
||||
|
||||
60
backend/node_modules/color-string/README.md
generated
vendored
Normal file
60
backend/node_modules/color-string/README.md
generated
vendored
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
# color-string
|
||||
|
||||
> library for parsing and generating CSS color strings.
|
||||
|
||||
## Install
|
||||
|
||||
```sh
|
||||
npm install color-string
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Parsing
|
||||
|
||||
```js
|
||||
colorString.get('#FFF') // {model: 'rgb', value: [255, 255, 255, 1]}
|
||||
colorString.get('#FFFA') // {model: 'rgb', value: [255, 255, 255, 0.67]}
|
||||
colorString.get('#FFFFFFAA') // {model: 'rgb', value: [255, 255, 255, 0.67]}
|
||||
colorString.get('hsl(360, 100%, 50%)') // {model: 'hsl', value: [0, 100, 50, 1]}
|
||||
colorString.get('hsl(360 100% 50%)') // {model: 'hsl', value: [0, 100, 50, 1]}
|
||||
colorString.get('hwb(60, 3%, 60%)') // {model: 'hwb', value: [60, 3, 60, 1]}
|
||||
|
||||
colorString.get.rgb('#FFF') // [255, 255, 255, 1]
|
||||
colorString.get.rgb('blue') // [0, 0, 255, 1]
|
||||
colorString.get.rgb('rgba(200, 60, 60, 0.3)') // [200, 60, 60, 0.3]
|
||||
colorString.get.rgb('rgba(200 60 60 / 0.3)') // [200, 60, 60, 0.3]
|
||||
colorString.get.rgb('rgba(200 60 60 / 30%)') // [200, 60, 60, 0.3]
|
||||
colorString.get.rgb('rgb(200, 200, 200)') // [200, 200, 200, 1]
|
||||
colorString.get.rgb('rgb(200 200 200)') // [200, 200, 200, 1]
|
||||
|
||||
colorString.get.hsl('hsl(360, 100%, 50%)') // [0, 100, 50, 1]
|
||||
colorString.get.hsl('hsl(360 100% 50%)') // [0, 100, 50, 1]
|
||||
colorString.get.hsl('hsla(360, 60%, 50%, 0.4)') // [0, 60, 50, 0.4]
|
||||
colorString.get.hsl('hsl(360 60% 50% / 0.4)') // [0, 60, 50, 0.4]
|
||||
|
||||
colorString.get.hwb('hwb(60 3% 60%)') // [60, 3, 60, 1]
|
||||
colorString.get.hwb('hwb(60, 3%, 60%)') // [60, 3, 60, 1]
|
||||
colorString.get.hwb('hwb(60, 3%, 60%, 0.6)') // [60, 3, 60, 0.6]
|
||||
|
||||
colorString.get.rgb('invalid color string') // null
|
||||
```
|
||||
|
||||
### Generation
|
||||
|
||||
```js
|
||||
colorString.to.hex(255, 255, 255) // "#FFFFFF"
|
||||
colorString.to.hex(0, 0, 255, 0.4) // "#0000FF66"
|
||||
colorString.to.hex(0, 0, 255, 0.4) // "#0000FF66"
|
||||
colorString.to.rgb(255, 255, 255) // "rgb(255, 255, 255)"
|
||||
colorString.to.rgb(0, 0, 255, 0.4) // "rgba(0, 0, 255, 0.4)"
|
||||
colorString.to.rgb(0, 0, 255, 0.4) // "rgba(0, 0, 255, 0.4)"
|
||||
colorString.to.rgb.percent(0, 0, 255) // "rgb(0%, 0%, 100%)"
|
||||
colorString.to.keyword(255, 255, 0) // "yellow"
|
||||
colorString.to.hsl(360, 100, 100) // "hsl(360, 100%, 100%)"
|
||||
colorString.to.hwb(50, 3, 15) // "hwb(50, 3%, 15%)"
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
23
backend/node_modules/color-string/index.d.ts
generated
vendored
Normal file
23
backend/node_modules/color-string/index.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
export type Model = 'rgb' | 'hsl' | 'hwb';
|
||||
|
||||
export type ColorString = {
|
||||
get: {
|
||||
(color: string): {model: Model; value: number[]} | null;
|
||||
rgb: (color: string) => number[] | null;
|
||||
hsl: (color: string) => number[] | null;
|
||||
hwb: (color: string) => number[] | null;
|
||||
};
|
||||
to: {
|
||||
hex: (r: number, g: number, b: number, a?: number) => string | null;
|
||||
rgb: {
|
||||
(r: number, g: number, b: number, a?: number): string | null;
|
||||
percent: (r: number, g: number, b: number, a?: number) => string | null;
|
||||
};
|
||||
keyword: (r: number, g: number, b: number, a?: number) => string | null;
|
||||
hsl: (h: number, s: number, l: number, a?: number) => string | null;
|
||||
hwb: (h: number, w: number, b: number, a?: number) => string | null;
|
||||
};
|
||||
};
|
||||
|
||||
declare const colorString: ColorString;
|
||||
export default colorString;
|
||||
231
backend/node_modules/color-string/index.js
generated
vendored
Normal file
231
backend/node_modules/color-string/index.js
generated
vendored
Normal file
|
|
@ -0,0 +1,231 @@
|
|||
import colorNames from 'color-name';
|
||||
|
||||
const reverseNames = Object.create(null);
|
||||
|
||||
// Create a list of reverse color names
|
||||
for (const name in colorNames) {
|
||||
if (Object.hasOwn(colorNames, name)) {
|
||||
reverseNames[colorNames[name]] = name;
|
||||
}
|
||||
}
|
||||
|
||||
const cs = {
|
||||
to: {},
|
||||
get: {},
|
||||
};
|
||||
|
||||
cs.get = function (string) {
|
||||
const prefix = string.slice(0, 3).toLowerCase();
|
||||
let value;
|
||||
let model;
|
||||
switch (prefix) {
|
||||
case 'hsl': {
|
||||
value = cs.get.hsl(string);
|
||||
model = 'hsl';
|
||||
break;
|
||||
}
|
||||
|
||||
case 'hwb': {
|
||||
value = cs.get.hwb(string);
|
||||
model = 'hwb';
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
value = cs.get.rgb(string);
|
||||
model = 'rgb';
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!value) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {model, value};
|
||||
};
|
||||
|
||||
cs.get.rgb = function (string) {
|
||||
if (!string) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const abbr = /^#([a-f\d]{3,4})$/i;
|
||||
const hex = /^#([a-f\d]{6})([a-f\d]{2})?$/i;
|
||||
const rgba = /^rgba?\(\s*([+-]?(?:\d*\.)?\d+(?:e\d+)?)(?=[\s,])\s*(?:,\s*)?([+-]?(?:\d*\.)?\d+(?:e\d+)?)(?=[\s,])\s*(?:,\s*)?([+-]?(?:\d*\.)?\d+(?:e\d+)?)\s*(?:[\s,|/]\s*([+-]?(?:\d*\.)?\d+(?:e\d+)?)(%?)\s*)?\)$/i;
|
||||
const per = /^rgba?\(\s*([+-]?[\d.]+)%\s*,?\s*([+-]?[\d.]+)%\s*,?\s*([+-]?[\d.]+)%\s*(?:[\s,|/]\s*([+-]?[\d.]+)(%?)\s*)?\)$/i;
|
||||
const keyword = /^(\w+)$/;
|
||||
|
||||
let rgb = [0, 0, 0, 1];
|
||||
let match;
|
||||
let i;
|
||||
let hexAlpha;
|
||||
|
||||
if (match = string.match(hex)) {
|
||||
hexAlpha = match[2];
|
||||
match = match[1];
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
// https://jsperf.com/slice-vs-substr-vs-substring-methods-long-string/19
|
||||
const i2 = i * 2;
|
||||
rgb[i] = Number.parseInt(match.slice(i2, i2 + 2), 16);
|
||||
}
|
||||
|
||||
if (hexAlpha) {
|
||||
rgb[3] = Number.parseInt(hexAlpha, 16) / 255;
|
||||
}
|
||||
} else if (match = string.match(abbr)) {
|
||||
match = match[1];
|
||||
hexAlpha = match[3];
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
rgb[i] = Number.parseInt(match[i] + match[i], 16);
|
||||
}
|
||||
|
||||
if (hexAlpha) {
|
||||
rgb[3] = Number.parseInt(hexAlpha + hexAlpha, 16) / 255;
|
||||
}
|
||||
} else if (match = string.match(rgba)) {
|
||||
for (i = 0; i < 3; i++) {
|
||||
rgb[i] = Number.parseFloat(match[i + 1]);
|
||||
}
|
||||
|
||||
if (match[4]) {
|
||||
rgb[3] = match[5] ? Number.parseFloat(match[4]) * 0.01 : Number.parseFloat(match[4]);
|
||||
}
|
||||
} else if (match = string.match(per)) {
|
||||
for (i = 0; i < 3; i++) {
|
||||
rgb[i] = Math.round(Number.parseFloat(match[i + 1]) * 2.55);
|
||||
}
|
||||
|
||||
if (match[4]) {
|
||||
rgb[3] = match[5] ? Number.parseFloat(match[4]) * 0.01 : Number.parseFloat(match[4]);
|
||||
}
|
||||
} else if (match = string.toLowerCase().match(keyword)) {
|
||||
if (match[1] === 'transparent') {
|
||||
return [0, 0, 0, 0];
|
||||
}
|
||||
|
||||
if (!Object.hasOwn(colorNames, match[1])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line unicorn/prefer-spread
|
||||
rgb = colorNames[match[1]].slice();
|
||||
rgb[3] = 1;
|
||||
|
||||
return rgb;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
rgb[i] = clamp(rgb[i], 0, 255);
|
||||
}
|
||||
|
||||
rgb[3] = clamp(rgb[3], 0, 1);
|
||||
|
||||
return rgb;
|
||||
};
|
||||
|
||||
cs.get.hsl = function (string) {
|
||||
if (!string) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const hsl = /^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,?\s*([+-]?[\d.]+)%\s*,?\s*([+-]?[\d.]+)%\s*(?:[,|/]\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:e[+-]?\d+)?)\s*)?\)$/i;
|
||||
const match = string.match(hsl);
|
||||
|
||||
if (match) {
|
||||
const alpha = Number.parseFloat(match[4]);
|
||||
const h = ((Number.parseFloat(match[1]) % 360) + 360) % 360;
|
||||
const s = clamp(Number.parseFloat(match[2]), 0, 100);
|
||||
const l = clamp(Number.parseFloat(match[3]), 0, 100);
|
||||
const a = clamp(Number.isNaN(alpha) ? 1 : alpha, 0, 1);
|
||||
|
||||
return [h, s, l, a];
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
cs.get.hwb = function (string) {
|
||||
if (!string) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const hwb = /^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*[\s,]\s*([+-]?[\d.]+)%\s*[\s,]\s*([+-]?[\d.]+)%\s*(?:[\s,]\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:e[+-]?\d+)?)\s*)?\)$/i;
|
||||
const match = string.match(hwb);
|
||||
|
||||
if (match) {
|
||||
const alpha = Number.parseFloat(match[4]);
|
||||
const h = ((Number.parseFloat(match[1]) % 360) + 360) % 360;
|
||||
const w = clamp(Number.parseFloat(match[2]), 0, 100);
|
||||
const b = clamp(Number.parseFloat(match[3]), 0, 100);
|
||||
const a = clamp(Number.isNaN(alpha) ? 1 : alpha, 0, 1);
|
||||
return [h, w, b, a];
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
|
||||
cs.to.hex = function (...rgba) {
|
||||
return (
|
||||
'#' +
|
||||
hexDouble(rgba[0]) +
|
||||
hexDouble(rgba[1]) +
|
||||
hexDouble(rgba[2]) +
|
||||
(rgba[3] < 1
|
||||
? (hexDouble(Math.round(rgba[3] * 255)))
|
||||
: '')
|
||||
);
|
||||
};
|
||||
|
||||
cs.to.rgb = function (...rgba) {
|
||||
return rgba.length < 4 || rgba[3] === 1
|
||||
? 'rgb(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ')'
|
||||
: 'rgba(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ', ' + rgba[3] + ')';
|
||||
};
|
||||
|
||||
cs.to.rgb.percent = function (...rgba) {
|
||||
const r = Math.round(rgba[0] / 255 * 100);
|
||||
const g = Math.round(rgba[1] / 255 * 100);
|
||||
const b = Math.round(rgba[2] / 255 * 100);
|
||||
|
||||
return rgba.length < 4 || rgba[3] === 1
|
||||
? 'rgb(' + r + '%, ' + g + '%, ' + b + '%)'
|
||||
: 'rgba(' + r + '%, ' + g + '%, ' + b + '%, ' + rgba[3] + ')';
|
||||
};
|
||||
|
||||
cs.to.hsl = function (...hsla) {
|
||||
return hsla.length < 4 || hsla[3] === 1
|
||||
? 'hsl(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%)'
|
||||
: 'hsla(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%, ' + hsla[3] + ')';
|
||||
};
|
||||
|
||||
// Hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax
|
||||
// (hwb have alpha optional & 1 is default value)
|
||||
cs.to.hwb = function (...hwba) {
|
||||
let a = '';
|
||||
if (hwba.length >= 4 && hwba[3] !== 1) {
|
||||
a = ', ' + hwba[3];
|
||||
}
|
||||
|
||||
return 'hwb(' + hwba[0] + ', ' + hwba[1] + '%, ' + hwba[2] + '%' + a + ')';
|
||||
};
|
||||
|
||||
cs.to.keyword = function (...rgb) {
|
||||
return reverseNames[rgb.slice(0, 3)];
|
||||
};
|
||||
|
||||
// Helpers
|
||||
function clamp(number_, min, max) {
|
||||
return Math.min(Math.max(min, number_), max);
|
||||
}
|
||||
|
||||
function hexDouble(number_) {
|
||||
const string_ = Math.round(number_).toString(16).toUpperCase();
|
||||
return (string_.length < 2) ? '0' + string_ : string_;
|
||||
}
|
||||
|
||||
export default cs;
|
||||
47
backend/node_modules/color-string/package.json
generated
vendored
Normal file
47
backend/node_modules/color-string/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
{
|
||||
"name": "color-string",
|
||||
"description": "Parser and generator for CSS color strings",
|
||||
"version": "2.1.4",
|
||||
"author": "Josh Junon (https://github.com/qix-)",
|
||||
"contributors": [
|
||||
"Maxime Thirouin",
|
||||
"Dyma Ywanov <dfcreative@gmail.com>",
|
||||
"Heather Arthur <fayearthur@gmail.com>",
|
||||
"LitoMore (https://github.com/LitoMore)"
|
||||
],
|
||||
"repository": "Qix-/color-string",
|
||||
"type": "module",
|
||||
"exports": "./index.js",
|
||||
"types": "./index.d.ts",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "xo && tsd && node test.js"
|
||||
},
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"index.js",
|
||||
"index.d.ts"
|
||||
],
|
||||
"xo": {
|
||||
"rules": {
|
||||
"no-cond-assign": 0,
|
||||
"operator-linebreak": 0,
|
||||
"@typescript-eslint/ban-types": 0
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"color-name": "^2.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"tsd": "^0.31.2",
|
||||
"xo": "^0.60.0"
|
||||
},
|
||||
"keywords": [
|
||||
"color",
|
||||
"colour",
|
||||
"rgb",
|
||||
"css"
|
||||
]
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue