build: add jest, tests
This commit is contained in:
1
.eslintignore
Normal file
1
.eslintignore
Normal file
@@ -0,0 +1 @@
|
|||||||
|
tests
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
/** @type {import("@typescript-eslint/utils/dist/ts-eslint/Linter").Linter.Config} c */
|
||||||
module.exports = {
|
module.exports = {
|
||||||
root: true,
|
root: true,
|
||||||
parser: "@typescript-eslint/parser",
|
parser: "@typescript-eslint/parser",
|
||||||
|
|||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -4,3 +4,6 @@ dist
|
|||||||
|
|
||||||
# Packages
|
# Packages
|
||||||
node_modules
|
node_modules
|
||||||
|
|
||||||
|
# Tests
|
||||||
|
coverage
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ console.log(capitalizeFirstChar("lorem ipsum"))
|
|||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[functions/capitalizeFirstChar.ts:32](https://git.resultium.net/public/utils/src/commit/ec41aeb/src/functions/capitalizeFirstChar.ts#L32)
|
[functions/capitalizeFirstChar.ts:32](https://git.resultium.net/public/utils/src/commit/fdb28fa/src/functions/capitalizeFirstChar.ts#L32)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ console.log(classNames("bg-blue-300", isVisible ? "block" : "hidden"))
|
|||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[functions/classNames.ts:34](https://git.resultium.net/public/utils/src/commit/ec41aeb/src/functions/classNames.ts#L34)
|
[functions/classNames.ts:34](https://git.resultium.net/public/utils/src/commit/fdb28fa/src/functions/classNames.ts#L34)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
@@ -112,7 +112,7 @@ console.log(conditionalJoin(["Hello,", isAdmin ? "Administrator" : "User", "!"],
|
|||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[functions/conditionalJoin.ts:35](https://git.resultium.net/public/utils/src/commit/ec41aeb/src/functions/conditionalJoin.ts#L35)
|
[functions/conditionalJoin.ts:35](https://git.resultium.net/public/utils/src/commit/fdb28fa/src/functions/conditionalJoin.ts#L35)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
@@ -160,7 +160,7 @@ console.log(
|
|||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[functions/isDeepWeakEqual.ts:47](https://git.resultium.net/public/utils/src/commit/ec41aeb/src/functions/isDeepWeakEqual.ts#L47)
|
[functions/isDeepWeakEqual.ts:47](https://git.resultium.net/public/utils/src/commit/fdb28fa/src/functions/isDeepWeakEqual.ts#L47)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
@@ -197,7 +197,7 @@ console.log(randomInRange(1, 100))
|
|||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[functions/randomInRange.ts:37](https://git.resultium.net/public/utils/src/commit/ec41aeb/src/functions/randomInRange.ts#L37)
|
[functions/randomInRange.ts:37](https://git.resultium.net/public/utils/src/commit/fdb28fa/src/functions/randomInRange.ts#L37)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
@@ -243,7 +243,7 @@ console.log(removeFromArrayByKeyValue([{ a: "1", b: "0" }, { a: "2", b: "0" }, {
|
|||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[functions/removeFromArrayByKeyValue.ts:40](https://git.resultium.net/public/utils/src/commit/ec41aeb/src/functions/removeFromArrayByKeyValue.ts#L40)
|
[functions/removeFromArrayByKeyValue.ts:40](https://git.resultium.net/public/utils/src/commit/fdb28fa/src/functions/removeFromArrayByKeyValue.ts#L40)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
@@ -282,7 +282,7 @@ console.log(removeObjectProperty({ a: "1", b: "2", c: "3" }, "c"))
|
|||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[functions/removeObjectProperty.ts:33](https://git.resultium.net/public/utils/src/commit/ec41aeb/src/functions/removeObjectProperty.ts#L33)
|
[functions/removeObjectProperty.ts:33](https://git.resultium.net/public/utils/src/commit/fdb28fa/src/functions/removeObjectProperty.ts#L33)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
@@ -330,7 +330,7 @@ console.log(replaceFromArrayByKeyValue([{ a: "1", b: "0" }, { a: "2", b: "0" },
|
|||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[functions/replaceFromArrayByKeyValue.ts:42](https://git.resultium.net/public/utils/src/commit/ec41aeb/src/functions/replaceFromArrayByKeyValue.ts#L42)
|
[functions/replaceFromArrayByKeyValue.ts:42](https://git.resultium.net/public/utils/src/commit/fdb28fa/src/functions/replaceFromArrayByKeyValue.ts#L42)
|
||||||
|
|
||||||
___
|
___
|
||||||
|
|
||||||
@@ -368,4 +368,4 @@ console.log(splitIntoChunks(["a", "b", "c", "d", "e", "f"], 3));
|
|||||||
|
|
||||||
#### Defined in
|
#### Defined in
|
||||||
|
|
||||||
[functions/splitIntoChuks.ts:33](https://git.resultium.net/public/utils/src/commit/ec41aeb/src/functions/splitIntoChuks.ts#L33)
|
[functions/splitIntoChuks.ts:33](https://git.resultium.net/public/utils/src/commit/fdb28fa/src/functions/splitIntoChuks.ts#L33)
|
||||||
|
|||||||
6
jest.config.cjs
Normal file
6
jest.config.cjs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/** @type {import('ts-jest').JestConfigWithTsJest} */
|
||||||
|
module.exports = {
|
||||||
|
preset: "ts-jest",
|
||||||
|
testEnvironment: "node",
|
||||||
|
};
|
||||||
|
|
||||||
@@ -12,8 +12,10 @@
|
|||||||
"build": "pnpm run build:package && pnpm run build:docs",
|
"build": "pnpm run build:package && pnpm run build:docs",
|
||||||
"build:package": "rm -rf dist && tsc --module ESNext --outdir dist/esm && tsc --module commonjs --outdir dist/cjs",
|
"build:package": "rm -rf dist && tsc --module ESNext --outdir dist/esm && tsc --module commonjs --outdir dist/cjs",
|
||||||
"build:docs": "typedoc --includeVersion --sourceLinkTemplate 'https://git.resultium.net/public/utils/src/commit/{gitRevision}/{path}#L{line}' --plugin typedoc-plugin-markdown src",
|
"build:docs": "typedoc --includeVersion --sourceLinkTemplate 'https://git.resultium.net/public/utils/src/commit/{gitRevision}/{path}#L{line}' --plugin typedoc-plugin-markdown src",
|
||||||
"prepublish": "pnpm run build",
|
"prepublish": "pnpm run test && pnpm run build",
|
||||||
"lint": "eslint src"
|
"lint": "eslint src",
|
||||||
|
"test": "jest",
|
||||||
|
"test:coverage": "jest --coverage"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@@ -29,6 +31,7 @@
|
|||||||
},
|
},
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "GPL-3.0-or-later",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@jest/globals": "^29.7.0",
|
||||||
"@types/node": "^20.11.25",
|
"@types/node": "^20.11.25",
|
||||||
"@typescript-eslint/eslint-plugin": "^7.2.0",
|
"@typescript-eslint/eslint-plugin": "^7.2.0",
|
||||||
"@typescript-eslint/parser": "^7.2.0",
|
"@typescript-eslint/parser": "^7.2.0",
|
||||||
@@ -36,7 +39,9 @@
|
|||||||
"eslint-config-prettier": "^9.1.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"eslint-plugin-prefer-arrow": "^1.2.3",
|
"eslint-plugin-prefer-arrow": "^1.2.3",
|
||||||
"eslint-plugin-security": "^2.1.1",
|
"eslint-plugin-security": "^2.1.1",
|
||||||
|
"jest": "^29.7.0",
|
||||||
"prettier": "^3.2.5",
|
"prettier": "^3.2.5",
|
||||||
|
"ts-jest": "^29.1.2",
|
||||||
"typedoc": "^0.25.12",
|
"typedoc": "^0.25.12",
|
||||||
"typedoc-plugin-markdown": "^3.17.1",
|
"typedoc-plugin-markdown": "^3.17.1",
|
||||||
"typescript": "^5.4.2"
|
"typescript": "^5.4.2"
|
||||||
|
|||||||
2008
pnpm-lock.yaml
generated
2008
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -25,7 +25,7 @@
|
|||||||
* let isAdmin = true
|
* let isAdmin = true
|
||||||
*
|
*
|
||||||
* // prints "Hello, Administrator!"
|
* // prints "Hello, Administrator!"
|
||||||
* console.log(conditionalJoin(["Hello,", isAdmin ? "Administrator" : "User", "!"], " "))
|
* console.log(conditionalJoin(["Hello,", isAdmin ? "Administrator!" : "User!"], " "))
|
||||||
* ```
|
* ```
|
||||||
*
|
*
|
||||||
* @param array - strings to join
|
* @param array - strings to join
|
||||||
|
|||||||
@@ -25,4 +25,4 @@ export * from "./functions/randomInRange";
|
|||||||
export * from "./functions/removeFromArrayByKeyValue";
|
export * from "./functions/removeFromArrayByKeyValue";
|
||||||
export * from "./functions/removeObjectProperty";
|
export * from "./functions/removeObjectProperty";
|
||||||
export * from "./functions/replaceFromArrayByKeyValue";
|
export * from "./functions/replaceFromArrayByKeyValue";
|
||||||
export * from "./functions/splitIntoChuks";
|
export * from "./functions/splitIntoChunks";
|
||||||
|
|||||||
6
tests/capitalizeFirstChar.test.ts
Normal file
6
tests/capitalizeFirstChar.test.ts
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import { capitalizeFirstChar } from "../src";
|
||||||
|
import { expect, test } from "@jest/globals";
|
||||||
|
|
||||||
|
test("capitalizes first character of the string", () => {
|
||||||
|
expect(capitalizeFirstChar("lorem ipsum")).toBe("Lorem ipsum");
|
||||||
|
});
|
||||||
10
tests/classNames.test.ts
Normal file
10
tests/classNames.test.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import { expect, test } from "@jest/globals";
|
||||||
|
import { classNames } from "../src";
|
||||||
|
|
||||||
|
test("joins html class strings", () => {
|
||||||
|
let isVisible = false;
|
||||||
|
|
||||||
|
expect(classNames("bg-blue-300", isVisible ? "block" : "hidden")).toBe(
|
||||||
|
"bg-blue-300 hidden",
|
||||||
|
);
|
||||||
|
});
|
||||||
10
tests/conditionalJoin.test.ts
Normal file
10
tests/conditionalJoin.test.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import { expect, test } from "@jest/globals";
|
||||||
|
import { conditionalJoin } from "../src";
|
||||||
|
|
||||||
|
test("conditionally joins strings", () => {
|
||||||
|
let isAdmin = true;
|
||||||
|
|
||||||
|
expect(
|
||||||
|
conditionalJoin(["Hello,", isAdmin ? "Administrator!" : "User!"], " "),
|
||||||
|
).toBe("Hello, Administrator!");
|
||||||
|
});
|
||||||
15
tests/isDeepWeakEqual.test.ts
Normal file
15
tests/isDeepWeakEqual.test.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import { isDeepWeakEqual } from "../src";
|
||||||
|
import { expect, test } from "@jest/globals";
|
||||||
|
|
||||||
|
test("weakly compares objects", () => {
|
||||||
|
expect(isDeepWeakEqual({ a: 1 }, ["lorem"])).toBe(false);
|
||||||
|
|
||||||
|
expect(isDeepWeakEqual({ a: 1 }, { a: 1 })).toBe(true);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
isDeepWeakEqual(
|
||||||
|
{ date: "2024-03-12T18:19:50.548Z" },
|
||||||
|
{ date: new Date(1710267590548) },
|
||||||
|
),
|
||||||
|
).toBe(true);
|
||||||
|
});
|
||||||
7
tests/randomInRange.test.ts
Normal file
7
tests/randomInRange.test.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import { expect, test } from "@jest/globals";
|
||||||
|
import { randomInRange } from "../src";
|
||||||
|
|
||||||
|
test("generates a random number in range", () => {
|
||||||
|
const randomNumber = randomInRange(1, 100);
|
||||||
|
expect(randomNumber >= 1 && randomNumber <= 100).toBeTruthy();
|
||||||
|
});
|
||||||
29
tests/removeFromArrayByKeyValue.test.ts
Normal file
29
tests/removeFromArrayByKeyValue.test.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import { expect, test } from "@jest/globals";
|
||||||
|
import { removeFromArrayByKeyValue } from "../src";
|
||||||
|
|
||||||
|
test("removes an object from an array by key-value object", () => {
|
||||||
|
expect(
|
||||||
|
removeFromArrayByKeyValue(
|
||||||
|
[
|
||||||
|
{ a: "1", b: "0" },
|
||||||
|
{ a: "2", b: "0" },
|
||||||
|
{ a: "3", b: "0" },
|
||||||
|
],
|
||||||
|
{ a: "3" },
|
||||||
|
),
|
||||||
|
).toMatchObject([
|
||||||
|
{ a: "1", b: "0" },
|
||||||
|
{ a: "2", b: "0" },
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
removeFromArrayByKeyValue(
|
||||||
|
[
|
||||||
|
{ a: "1", b: "0" },
|
||||||
|
{ a: "2", b: "0" },
|
||||||
|
{ a: "3", b: "0" },
|
||||||
|
],
|
||||||
|
{ b: "0" },
|
||||||
|
),
|
||||||
|
).toMatchObject([]);
|
||||||
|
});
|
||||||
9
tests/removeObjectProperty.test.ts
Normal file
9
tests/removeObjectProperty.test.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import { expect, test } from "@jest/globals";
|
||||||
|
import { removeObjectProperty } from "../src";
|
||||||
|
|
||||||
|
test("remove object property by provided key", () => {
|
||||||
|
expect(removeObjectProperty({ a: "1", b: "2", c: "3" }, "c")).toMatchObject({
|
||||||
|
a: "1",
|
||||||
|
b: "2",
|
||||||
|
});
|
||||||
|
});
|
||||||
36
tests/replaceFromArrayByKeyValue.test.ts
Normal file
36
tests/replaceFromArrayByKeyValue.test.ts
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
import { expect, test } from "@jest/globals";
|
||||||
|
import { replaceFromArrayByKeyValue } from "../src";
|
||||||
|
|
||||||
|
test("replace from an array by key-value", () => {
|
||||||
|
expect(
|
||||||
|
replaceFromArrayByKeyValue(
|
||||||
|
[
|
||||||
|
{ a: "1", b: "0" },
|
||||||
|
{ a: "2", b: "0" },
|
||||||
|
{ a: "3", b: "0" },
|
||||||
|
],
|
||||||
|
{ a: "3" },
|
||||||
|
{ b: "lorem" },
|
||||||
|
),
|
||||||
|
).toMatchObject([
|
||||||
|
{ a: "1", b: "0" },
|
||||||
|
{ a: "2", b: "0" },
|
||||||
|
{ a: "3", b: "lorem" },
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
replaceFromArrayByKeyValue(
|
||||||
|
[
|
||||||
|
{ a: "1", b: "0" },
|
||||||
|
{ a: "2", b: "0" },
|
||||||
|
{ a: "3", b: "0" },
|
||||||
|
],
|
||||||
|
{ b: "0" },
|
||||||
|
{ a: "lorem" },
|
||||||
|
),
|
||||||
|
).toMatchObject([
|
||||||
|
{ a: "lorem", b: "0" },
|
||||||
|
{ a: "2", b: "0" },
|
||||||
|
{ a: "3", b: "0" },
|
||||||
|
]);
|
||||||
|
});
|
||||||
14
tests/splitIntoChunks.test.ts
Normal file
14
tests/splitIntoChunks.test.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { expect, test } from "@jest/globals";
|
||||||
|
import { splitIntoChunks } from "../src";
|
||||||
|
|
||||||
|
test("splits an array into chunks", () => {
|
||||||
|
// JSON.stringify is being used because there is no way to compare nested arrays in jest
|
||||||
|
expect(
|
||||||
|
JSON.stringify(splitIntoChunks(["a", "b", "c", "d", "e", "f"], 3)),
|
||||||
|
).toBe(
|
||||||
|
JSON.stringify([
|
||||||
|
["a", "b", "c"],
|
||||||
|
["d", "e", "f"],
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user