@akanjs/common 0.0.53 → 0.0.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Logger.mjs +141 -0
- package/applyMixins.mjs +23 -0
- package/capitalize.mjs +6 -0
- package/deepObjectify.mjs +30 -0
- package/index.js +54 -35
- package/index.mjs +36 -0
- package/isDayjs.mjs +4 -0
- package/isQueryEqual.mjs +30 -0
- package/isValidDate.mjs +16 -0
- package/lowerlize.mjs +6 -0
- package/mergeVersion.mjs +4 -0
- package/objectify.mjs +11 -0
- package/package.json +7 -1
- package/pathGet.mjs +7 -0
- package/pathSet.mjs +14 -0
- package/pluralize.mjs +4 -0
- package/randomPick.mjs +4 -0
- package/randomPicks.mjs +16 -0
- package/sleep.mjs +10 -0
- package/splitVersion.mjs +7 -0
- package/types.mjs +0 -0
package/Logger.mjs
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
const logLevels = ["trace", "verbose", "debug", "log", "info", "warn", "error"];
|
|
3
|
+
const clc = {
|
|
4
|
+
bold: (text) => `\x1B[1m${text}\x1B[0m`,
|
|
5
|
+
green: (text) => `\x1B[32m${text}\x1B[39m`,
|
|
6
|
+
yellow: (text) => `\x1B[33m${text}\x1B[39m`,
|
|
7
|
+
red: (text) => `\x1B[31m${text}\x1B[39m`,
|
|
8
|
+
magentaBright: (text) => `\x1B[95m${text}\x1B[39m`,
|
|
9
|
+
cyanBright: (text) => `\x1B[96m${text}\x1B[39m`
|
|
10
|
+
};
|
|
11
|
+
const colorizeMap = {
|
|
12
|
+
trace: clc.bold,
|
|
13
|
+
verbose: clc.cyanBright,
|
|
14
|
+
debug: clc.magentaBright,
|
|
15
|
+
log: clc.green,
|
|
16
|
+
info: clc.green,
|
|
17
|
+
warn: clc.yellow,
|
|
18
|
+
error: clc.red
|
|
19
|
+
};
|
|
20
|
+
class Logger {
|
|
21
|
+
static #ignoreCtxSet = /* @__PURE__ */ new Set([
|
|
22
|
+
"InstanceLoader",
|
|
23
|
+
"RoutesResolver",
|
|
24
|
+
"RouterExplorer",
|
|
25
|
+
"NestFactory",
|
|
26
|
+
"WebSocketsController",
|
|
27
|
+
"GraphQLModule",
|
|
28
|
+
"NestApplication"
|
|
29
|
+
]);
|
|
30
|
+
static level = process.env.NEXT_PUBLIC_LOG_LEVEL ?? "log";
|
|
31
|
+
static #levelIdx = logLevels.findIndex((l) => l === process.env.NEXT_PUBLIC_LOG_LEVEL);
|
|
32
|
+
static #startAt = dayjs();
|
|
33
|
+
static setLevel(level) {
|
|
34
|
+
this.level = level;
|
|
35
|
+
this.#levelIdx = logLevels.findIndex((l) => l === level);
|
|
36
|
+
}
|
|
37
|
+
name;
|
|
38
|
+
constructor(name) {
|
|
39
|
+
this.name = name;
|
|
40
|
+
}
|
|
41
|
+
trace(msg, context = "") {
|
|
42
|
+
if (Logger.#levelIdx <= 0)
|
|
43
|
+
Logger.#printMessages(this.name ?? "App", msg, context, "trace");
|
|
44
|
+
}
|
|
45
|
+
verbose(msg, context = "") {
|
|
46
|
+
if (Logger.#levelIdx <= 1)
|
|
47
|
+
Logger.#printMessages(this.name ?? "App", msg, context, "verbose");
|
|
48
|
+
}
|
|
49
|
+
debug(msg, context = "") {
|
|
50
|
+
if (Logger.#levelIdx <= 2)
|
|
51
|
+
Logger.#printMessages(this.name ?? "App", msg, context, "debug");
|
|
52
|
+
}
|
|
53
|
+
log(msg, context = "") {
|
|
54
|
+
if (Logger.#levelIdx <= 3)
|
|
55
|
+
Logger.#printMessages(this.name ?? "App", msg, context, "log");
|
|
56
|
+
}
|
|
57
|
+
info(msg, context = "") {
|
|
58
|
+
if (Logger.#levelIdx <= 4)
|
|
59
|
+
Logger.#printMessages(this.name ?? "App", msg, context, "info");
|
|
60
|
+
}
|
|
61
|
+
warn(msg, context = "") {
|
|
62
|
+
if (Logger.#levelIdx <= 5)
|
|
63
|
+
Logger.#printMessages(this.name ?? "App", msg, context, "warn");
|
|
64
|
+
}
|
|
65
|
+
error(msg, context = "") {
|
|
66
|
+
if (Logger.#levelIdx <= 6)
|
|
67
|
+
Logger.#printMessages(this.name ?? "App", msg, context, "error");
|
|
68
|
+
}
|
|
69
|
+
raw(msg, method) {
|
|
70
|
+
Logger.rawLog(msg, method);
|
|
71
|
+
}
|
|
72
|
+
rawLog(msg, method) {
|
|
73
|
+
Logger.rawLog(msg, method);
|
|
74
|
+
}
|
|
75
|
+
static trace(msg, context = "") {
|
|
76
|
+
if (Logger.#levelIdx <= 0)
|
|
77
|
+
Logger.#printMessages("App", msg, context, "trace");
|
|
78
|
+
}
|
|
79
|
+
static verbose(msg, context = "") {
|
|
80
|
+
if (Logger.#levelIdx <= 1)
|
|
81
|
+
Logger.#printMessages("App", msg, context, "verbose");
|
|
82
|
+
}
|
|
83
|
+
static debug(msg, context = "") {
|
|
84
|
+
if (Logger.#levelIdx <= 2)
|
|
85
|
+
Logger.#printMessages("App", msg, context, "debug");
|
|
86
|
+
}
|
|
87
|
+
static log(msg, context = "") {
|
|
88
|
+
if (Logger.#levelIdx <= 3)
|
|
89
|
+
Logger.#printMessages("App", msg, context, "log");
|
|
90
|
+
}
|
|
91
|
+
static info(msg, context = "") {
|
|
92
|
+
if (Logger.#levelIdx <= 4)
|
|
93
|
+
Logger.#printMessages("App", msg, context, "info");
|
|
94
|
+
}
|
|
95
|
+
static warn(msg, context = "") {
|
|
96
|
+
if (Logger.#levelIdx <= 5)
|
|
97
|
+
Logger.#printMessages("App", msg, context, "warn");
|
|
98
|
+
}
|
|
99
|
+
static error(msg, context = "") {
|
|
100
|
+
if (Logger.#levelIdx <= 6)
|
|
101
|
+
Logger.#printMessages("App", msg, context, "error");
|
|
102
|
+
}
|
|
103
|
+
static #colorize(msg, logLevel) {
|
|
104
|
+
return colorizeMap[logLevel](msg);
|
|
105
|
+
}
|
|
106
|
+
static #printMessages(name, content, context, logLevel, writeStreamType = logLevel === "error" ? "stderr" : "stdout") {
|
|
107
|
+
if (this.#ignoreCtxSet.has(context))
|
|
108
|
+
return;
|
|
109
|
+
const now = dayjs();
|
|
110
|
+
const processMsg = this.#colorize(
|
|
111
|
+
`[${name ?? "App"}] ${global.process?.pid ?? "window"} -`,
|
|
112
|
+
logLevel
|
|
113
|
+
);
|
|
114
|
+
const timestampMsg = now.format("MM/DD/YYYY, HH:mm:ss A");
|
|
115
|
+
const logLevelMsg = this.#colorize(logLevel.toUpperCase().padStart(7, " "), logLevel);
|
|
116
|
+
const contextMsg = context ? clc.yellow(`[${context}] `) : "";
|
|
117
|
+
const contentMsg = this.#colorize(content, logLevel);
|
|
118
|
+
const timeDiffMsg = clc.yellow(`+${now.diff(Logger.#startAt, "ms")}ms`);
|
|
119
|
+
if (typeof window === "undefined")
|
|
120
|
+
process[writeStreamType].write(
|
|
121
|
+
`${processMsg} ${timestampMsg} ${logLevelMsg} ${contextMsg} ${contentMsg} ${timeDiffMsg}
|
|
122
|
+
`
|
|
123
|
+
);
|
|
124
|
+
else
|
|
125
|
+
console.log(`${processMsg} ${timestampMsg} ${logLevelMsg} ${contextMsg} ${contentMsg} ${timeDiffMsg}
|
|
126
|
+
`);
|
|
127
|
+
}
|
|
128
|
+
static rawLog(msg, method) {
|
|
129
|
+
this.raw(`${msg}
|
|
130
|
+
`, method);
|
|
131
|
+
}
|
|
132
|
+
static raw(msg, method) {
|
|
133
|
+
if (typeof window === "undefined" && method !== "console" && global.process)
|
|
134
|
+
global.process.stdout.write(msg);
|
|
135
|
+
else
|
|
136
|
+
console.log(msg);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
export {
|
|
140
|
+
Logger
|
|
141
|
+
};
|
package/applyMixins.mjs
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const getAllPropertyDescriptors = (objRef) => {
|
|
2
|
+
const descriptors = {};
|
|
3
|
+
let current = objRef.prototype;
|
|
4
|
+
while (current) {
|
|
5
|
+
Object.getOwnPropertyNames(current).forEach((name) => {
|
|
6
|
+
descriptors[name] ??= Object.getOwnPropertyDescriptor(current, name);
|
|
7
|
+
});
|
|
8
|
+
current = Object.getPrototypeOf(current);
|
|
9
|
+
}
|
|
10
|
+
return descriptors;
|
|
11
|
+
};
|
|
12
|
+
const applyMixins = (derivedCtor, constructors, avoidKeys) => {
|
|
13
|
+
constructors.forEach((baseCtor) => {
|
|
14
|
+
Object.entries(getAllPropertyDescriptors(baseCtor)).forEach(([name, descriptor]) => {
|
|
15
|
+
if (name === "constructor" || avoidKeys?.has(name))
|
|
16
|
+
return;
|
|
17
|
+
Object.defineProperty(derivedCtor.prototype, name, { ...descriptor, configurable: true });
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
export {
|
|
22
|
+
applyMixins
|
|
23
|
+
};
|
package/capitalize.mjs
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { isDayjs } from "./isDayjs";
|
|
2
|
+
const deepObjectify = (obj, option = {}) => {
|
|
3
|
+
if (isDayjs(obj) || obj?.constructor === Date) {
|
|
4
|
+
if (!option.serializable && !option.convertDate)
|
|
5
|
+
return obj;
|
|
6
|
+
if (option.convertDate === "string")
|
|
7
|
+
return obj.toISOString();
|
|
8
|
+
else if (option.convertDate === "number")
|
|
9
|
+
return isDayjs(obj) ? obj.toDate().getTime() : obj.getTime();
|
|
10
|
+
else
|
|
11
|
+
return isDayjs(obj) ? obj.toDate() : obj;
|
|
12
|
+
} else if (Array.isArray(obj)) {
|
|
13
|
+
return obj.map((o) => deepObjectify(o, option));
|
|
14
|
+
} else if (obj && typeof obj === "object") {
|
|
15
|
+
const val = {};
|
|
16
|
+
Object.keys(obj).forEach((key) => {
|
|
17
|
+
const fieldValue = obj[key];
|
|
18
|
+
if (fieldValue?.__ModelType__ && !option.serializable)
|
|
19
|
+
val[key] = fieldValue;
|
|
20
|
+
else if (typeof obj[key] !== "function")
|
|
21
|
+
val[key] = deepObjectify(fieldValue, option);
|
|
22
|
+
});
|
|
23
|
+
return val;
|
|
24
|
+
} else {
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
export {
|
|
29
|
+
deepObjectify
|
|
30
|
+
};
|
package/index.js
CHANGED
|
@@ -1,36 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import { randomPicks } from "./randomPicks";
|
|
9
|
-
import { pathSet } from "./pathSet";
|
|
10
|
-
import { isDayjs } from "./isDayjs";
|
|
11
|
-
import { mergeVersion } from "./mergeVersion";
|
|
12
|
-
import { pluralize } from "./pluralize";
|
|
13
|
-
import { applyMixins } from "./applyMixins";
|
|
14
|
-
import { capitalize } from "./capitalize";
|
|
15
|
-
import { Logger } from "./Logger";
|
|
16
|
-
import { lowerlize } from "./lowerlize";
|
|
17
|
-
import { sleep } from "./sleep";
|
|
18
|
-
export {
|
|
19
|
-
Logger,
|
|
20
|
-
applyMixins,
|
|
21
|
-
capitalize,
|
|
22
|
-
deepObjectify,
|
|
23
|
-
isDayjs,
|
|
24
|
-
isQueryEqual,
|
|
25
|
-
isValidDate,
|
|
26
|
-
lowerlize,
|
|
27
|
-
mergeVersion,
|
|
28
|
-
objectify,
|
|
29
|
-
pathGet,
|
|
30
|
-
pathSet,
|
|
31
|
-
pluralize,
|
|
32
|
-
randomPick,
|
|
33
|
-
randomPicks,
|
|
34
|
-
sleep,
|
|
35
|
-
splitVersion
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
36
8
|
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var common_exports = {};
|
|
19
|
+
__export(common_exports, {
|
|
20
|
+
Logger: () => import_Logger.Logger,
|
|
21
|
+
applyMixins: () => import_applyMixins.applyMixins,
|
|
22
|
+
capitalize: () => import_capitalize.capitalize,
|
|
23
|
+
deepObjectify: () => import_deepObjectify.deepObjectify,
|
|
24
|
+
isDayjs: () => import_isDayjs.isDayjs,
|
|
25
|
+
isQueryEqual: () => import_isQueryEqual.isQueryEqual,
|
|
26
|
+
isValidDate: () => import_isValidDate.isValidDate,
|
|
27
|
+
lowerlize: () => import_lowerlize.lowerlize,
|
|
28
|
+
mergeVersion: () => import_mergeVersion.mergeVersion,
|
|
29
|
+
objectify: () => import_objectify.objectify,
|
|
30
|
+
pathGet: () => import_pathGet.pathGet,
|
|
31
|
+
pathSet: () => import_pathSet.pathSet,
|
|
32
|
+
pluralize: () => import_pluralize.pluralize,
|
|
33
|
+
randomPick: () => import_randomPick.randomPick,
|
|
34
|
+
randomPicks: () => import_randomPicks.randomPicks,
|
|
35
|
+
sleep: () => import_sleep.sleep,
|
|
36
|
+
splitVersion: () => import_splitVersion.splitVersion
|
|
37
|
+
});
|
|
38
|
+
module.exports = __toCommonJS(common_exports);
|
|
39
|
+
var import_splitVersion = require("./splitVersion");
|
|
40
|
+
var import_deepObjectify = require("./deepObjectify");
|
|
41
|
+
var import_pathGet = require("./pathGet");
|
|
42
|
+
var import_isQueryEqual = require("./isQueryEqual");
|
|
43
|
+
var import_isValidDate = require("./isValidDate");
|
|
44
|
+
var import_objectify = require("./objectify");
|
|
45
|
+
var import_randomPick = require("./randomPick");
|
|
46
|
+
var import_randomPicks = require("./randomPicks");
|
|
47
|
+
var import_pathSet = require("./pathSet");
|
|
48
|
+
var import_isDayjs = require("./isDayjs");
|
|
49
|
+
var import_mergeVersion = require("./mergeVersion");
|
|
50
|
+
var import_pluralize = require("./pluralize");
|
|
51
|
+
var import_applyMixins = require("./applyMixins");
|
|
52
|
+
var import_capitalize = require("./capitalize");
|
|
53
|
+
var import_Logger = require("./Logger");
|
|
54
|
+
var import_lowerlize = require("./lowerlize");
|
|
55
|
+
var import_sleep = require("./sleep");
|
package/index.mjs
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { splitVersion } from "./splitVersion";
|
|
2
|
+
import { deepObjectify } from "./deepObjectify";
|
|
3
|
+
import { pathGet } from "./pathGet";
|
|
4
|
+
import { isQueryEqual } from "./isQueryEqual";
|
|
5
|
+
import { isValidDate } from "./isValidDate";
|
|
6
|
+
import { objectify } from "./objectify";
|
|
7
|
+
import { randomPick } from "./randomPick";
|
|
8
|
+
import { randomPicks } from "./randomPicks";
|
|
9
|
+
import { pathSet } from "./pathSet";
|
|
10
|
+
import { isDayjs } from "./isDayjs";
|
|
11
|
+
import { mergeVersion } from "./mergeVersion";
|
|
12
|
+
import { pluralize } from "./pluralize";
|
|
13
|
+
import { applyMixins } from "./applyMixins";
|
|
14
|
+
import { capitalize } from "./capitalize";
|
|
15
|
+
import { Logger } from "./Logger";
|
|
16
|
+
import { lowerlize } from "./lowerlize";
|
|
17
|
+
import { sleep } from "./sleep";
|
|
18
|
+
export {
|
|
19
|
+
Logger,
|
|
20
|
+
applyMixins,
|
|
21
|
+
capitalize,
|
|
22
|
+
deepObjectify,
|
|
23
|
+
isDayjs,
|
|
24
|
+
isQueryEqual,
|
|
25
|
+
isValidDate,
|
|
26
|
+
lowerlize,
|
|
27
|
+
mergeVersion,
|
|
28
|
+
objectify,
|
|
29
|
+
pathGet,
|
|
30
|
+
pathSet,
|
|
31
|
+
pluralize,
|
|
32
|
+
randomPick,
|
|
33
|
+
randomPicks,
|
|
34
|
+
sleep,
|
|
35
|
+
splitVersion
|
|
36
|
+
};
|
package/isDayjs.mjs
ADDED
package/isQueryEqual.mjs
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
import { isDayjs } from "./isDayjs";
|
|
3
|
+
const isQueryEqual = (value1, value2) => {
|
|
4
|
+
if (value1 === value2)
|
|
5
|
+
return true;
|
|
6
|
+
if (Array.isArray(value1) && Array.isArray(value2)) {
|
|
7
|
+
if (value1.length !== value2.length)
|
|
8
|
+
return false;
|
|
9
|
+
for (let i = 0; i < value1.length; i++)
|
|
10
|
+
if (!isQueryEqual(value1[i], value2[i]))
|
|
11
|
+
return false;
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
if ([value1, value2].some((val) => val instanceof Date || isDayjs(val)))
|
|
15
|
+
return dayjs(value1).isSame(dayjs(value2));
|
|
16
|
+
if (typeof value1 === "object" && typeof value2 === "object") {
|
|
17
|
+
if (value1 === null || value2 === null)
|
|
18
|
+
return value1 === value2;
|
|
19
|
+
if (Object.keys(value1).length !== Object.keys(value2).length)
|
|
20
|
+
return false;
|
|
21
|
+
for (const key of Object.keys(value1))
|
|
22
|
+
if (!isQueryEqual(value1[key], value2[key]))
|
|
23
|
+
return false;
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
};
|
|
28
|
+
export {
|
|
29
|
+
isQueryEqual
|
|
30
|
+
};
|
package/isValidDate.mjs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
import customParseFormat from "dayjs/plugin/customParseFormat";
|
|
3
|
+
import { isDayjs } from "./isDayjs";
|
|
4
|
+
dayjs.extend(customParseFormat);
|
|
5
|
+
const isValidDate = (d) => {
|
|
6
|
+
const format = "YYYY-MM-DD";
|
|
7
|
+
if (typeof d === "string") {
|
|
8
|
+
return dayjs(d, format).isValid();
|
|
9
|
+
} else if (isDayjs(d))
|
|
10
|
+
return d.isValid();
|
|
11
|
+
else
|
|
12
|
+
return d instanceof Date && !isNaN(d.getTime());
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
isValidDate
|
|
16
|
+
};
|
package/lowerlize.mjs
ADDED
package/mergeVersion.mjs
ADDED
package/objectify.mjs
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@akanjs/common",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.55",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -17,5 +17,11 @@
|
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"dayjs": "^1.11.13",
|
|
19
19
|
"pluralize": "^8.0.0"
|
|
20
|
+
},
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"require": "./index.js",
|
|
24
|
+
"import": "./index.mjs"
|
|
25
|
+
}
|
|
20
26
|
}
|
|
21
27
|
}
|
package/pathGet.mjs
ADDED
package/pathSet.mjs
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const pathSet = (obj, path, value) => {
|
|
2
|
+
if (Object(obj) !== obj)
|
|
3
|
+
return obj;
|
|
4
|
+
if (!Array.isArray(path))
|
|
5
|
+
path = path.toString().match(/[^.[\]]+/g) || [];
|
|
6
|
+
path.slice(0, -1).reduce(
|
|
7
|
+
(a, c, i) => Object(a[c]) === a[c] ? a[c] : a[c] = Math.abs(path[i + 1]) >> 0 === +path[i + 1] ? [] : {},
|
|
8
|
+
obj
|
|
9
|
+
)[path[path.length - 1]] = value;
|
|
10
|
+
return obj;
|
|
11
|
+
};
|
|
12
|
+
export {
|
|
13
|
+
pathSet
|
|
14
|
+
};
|
package/pluralize.mjs
ADDED
package/randomPick.mjs
ADDED
package/randomPicks.mjs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const randomPicks = (arr, count = 1, allowDuplicate = false) => {
|
|
2
|
+
if (!allowDuplicate && arr.length <= count)
|
|
3
|
+
return arr;
|
|
4
|
+
const idxs = [];
|
|
5
|
+
let pickIdx;
|
|
6
|
+
for (let i = 0; i < count; i++) {
|
|
7
|
+
do {
|
|
8
|
+
pickIdx = Math.floor(Math.random() * arr.length);
|
|
9
|
+
} while (!allowDuplicate && idxs.includes(pickIdx));
|
|
10
|
+
idxs.push(pickIdx);
|
|
11
|
+
}
|
|
12
|
+
return idxs.map((idx) => arr[idx]);
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
randomPicks
|
|
16
|
+
};
|
package/sleep.mjs
ADDED
package/splitVersion.mjs
ADDED
package/types.mjs
ADDED
|
File without changes
|