mirror of
https://github.com/certd/certd.git
synced 2026-05-17 13:57:31 +08:00
chore: code format
This commit is contained in:
@@ -1,51 +1,51 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import { diff } from '../diff';
|
||||
import { diff } from "../diff";
|
||||
|
||||
describe('diff function', () => {
|
||||
it('should return an empty object when comparing identical objects', () => {
|
||||
describe("diff function", () => {
|
||||
it("should return an empty object when comparing identical objects", () => {
|
||||
const obj1 = { a: 1, b: { c: 2 } };
|
||||
const obj2 = { a: 1, b: { c: 2 } };
|
||||
expect(diff(obj1, obj2)).toEqual(undefined);
|
||||
});
|
||||
|
||||
it('should detect simple changes in primitive values', () => {
|
||||
it("should detect simple changes in primitive values", () => {
|
||||
const obj1 = { a: 1, b: 2 };
|
||||
const obj2 = { a: 1, b: 3 };
|
||||
expect(diff(obj1, obj2)).toEqual({ b: 3 });
|
||||
});
|
||||
|
||||
it('should detect nested object changes', () => {
|
||||
it("should detect nested object changes", () => {
|
||||
const obj1 = { a: 1, b: { c: 2, d: 4 } };
|
||||
const obj2 = { a: 1, b: { c: 3, d: 4 } };
|
||||
expect(diff(obj1, obj2)).toEqual({ b: { c: 3 } });
|
||||
});
|
||||
|
||||
it('should handle array changes', () => {
|
||||
it("should handle array changes", () => {
|
||||
const obj1 = { a: [1, 2, 3], b: 2 };
|
||||
const obj2 = { a: [1, 2, 4], b: 2 };
|
||||
expect(diff(obj1, obj2)).toEqual({ a: [1, 2, 4] });
|
||||
});
|
||||
|
||||
it('should handle added keys', () => {
|
||||
it("should handle added keys", () => {
|
||||
const obj1 = { a: 1 };
|
||||
const obj2 = { a: 1, b: 2 };
|
||||
expect(diff(obj1, obj2)).toEqual({ b: 2 });
|
||||
});
|
||||
|
||||
it('should handle removed keys', () => {
|
||||
it("should handle removed keys", () => {
|
||||
const obj1 = { a: 1, b: 2 };
|
||||
const obj2 = { a: 1 };
|
||||
expect(diff(obj1, obj2)).toEqual(undefined);
|
||||
});
|
||||
|
||||
it('should handle boolean value changes', () => {
|
||||
it("should handle boolean value changes", () => {
|
||||
const obj1 = { a: true, b: false };
|
||||
const obj2 = { a: true, b: true };
|
||||
expect(diff(obj1, obj2)).toEqual({ b: true });
|
||||
});
|
||||
|
||||
it('should handle null and undefined values', () => {
|
||||
it("should handle null and undefined values", () => {
|
||||
const obj1 = { a: null, b: undefined };
|
||||
const obj2: any = { a: 1, b: undefined };
|
||||
expect(diff(obj1, obj2)).toEqual({ a: 1 });
|
||||
|
||||
@@ -1,21 +1,17 @@
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
import { getElementVisibleRect } from '../dom';
|
||||
import { getElementVisibleRect } from "../dom";
|
||||
|
||||
describe('getElementVisibleRect', () => {
|
||||
describe("getElementVisibleRect", () => {
|
||||
// 设置浏览器视口尺寸的 mock
|
||||
beforeEach(() => {
|
||||
vi.spyOn(document.documentElement, 'clientHeight', 'get').mockReturnValue(
|
||||
800,
|
||||
);
|
||||
vi.spyOn(window, 'innerHeight', 'get').mockReturnValue(800);
|
||||
vi.spyOn(document.documentElement, 'clientWidth', 'get').mockReturnValue(
|
||||
1000,
|
||||
);
|
||||
vi.spyOn(window, 'innerWidth', 'get').mockReturnValue(1000);
|
||||
vi.spyOn(document.documentElement, "clientHeight", "get").mockReturnValue(800);
|
||||
vi.spyOn(window, "innerHeight", "get").mockReturnValue(800);
|
||||
vi.spyOn(document.documentElement, "clientWidth", "get").mockReturnValue(1000);
|
||||
vi.spyOn(window, "innerWidth", "get").mockReturnValue(1000);
|
||||
});
|
||||
|
||||
it('should return default rect if element is undefined', () => {
|
||||
it("should return default rect if element is undefined", () => {
|
||||
expect(getElementVisibleRect()).toEqual({
|
||||
bottom: 0,
|
||||
height: 0,
|
||||
@@ -26,7 +22,7 @@ describe('getElementVisibleRect', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('should return default rect if element is null', () => {
|
||||
it("should return default rect if element is null", () => {
|
||||
expect(getElementVisibleRect(null)).toEqual({
|
||||
bottom: 0,
|
||||
height: 0,
|
||||
@@ -37,7 +33,7 @@ describe('getElementVisibleRect', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('should return correct visible rect when element is fully visible', () => {
|
||||
it("should return correct visible rect when element is fully visible", () => {
|
||||
const element = {
|
||||
getBoundingClientRect: () => ({
|
||||
bottom: 400,
|
||||
@@ -59,7 +55,7 @@ describe('getElementVisibleRect', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('should return correct visible rect when element is partially off-screen at the top', () => {
|
||||
it("should return correct visible rect when element is partially off-screen at the top", () => {
|
||||
const element = {
|
||||
getBoundingClientRect: () => ({
|
||||
bottom: 200,
|
||||
@@ -81,7 +77,7 @@ describe('getElementVisibleRect', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('should return correct visible rect when element is partially off-screen at the right', () => {
|
||||
it("should return correct visible rect when element is partially off-screen at the right", () => {
|
||||
const element = {
|
||||
getBoundingClientRect: () => ({
|
||||
bottom: 400,
|
||||
@@ -103,7 +99,7 @@ describe('getElementVisibleRect', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('should return all zeros when element is completely off-screen', () => {
|
||||
it("should return all zeros when element is completely off-screen", () => {
|
||||
const element = {
|
||||
getBoundingClientRect: () => ({
|
||||
bottom: 1200,
|
||||
|
||||
@@ -1,127 +1,119 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import {
|
||||
getFirstNonNullOrUndefined,
|
||||
isBoolean,
|
||||
isEmpty,
|
||||
isHttpUrl,
|
||||
isObject,
|
||||
isUndefined,
|
||||
isWindow,
|
||||
} from '../inference';
|
||||
import { getFirstNonNullOrUndefined, isBoolean, isEmpty, isHttpUrl, isObject, isUndefined, isWindow } from "../inference";
|
||||
|
||||
describe('isHttpUrl', () => {
|
||||
describe("isHttpUrl", () => {
|
||||
it("should return true when given 'http://example.com'", () => {
|
||||
expect(isHttpUrl('http://example.com')).toBe(true);
|
||||
expect(isHttpUrl("http://example.com")).toBe(true);
|
||||
});
|
||||
|
||||
it("should return true when given 'https://example.com'", () => {
|
||||
expect(isHttpUrl('https://example.com')).toBe(true);
|
||||
expect(isHttpUrl("https://example.com")).toBe(true);
|
||||
});
|
||||
|
||||
it("should return false when given 'ftp://example.com'", () => {
|
||||
expect(isHttpUrl('ftp://example.com')).toBe(false);
|
||||
expect(isHttpUrl("ftp://example.com")).toBe(false);
|
||||
});
|
||||
|
||||
it("should return false when given 'example.com'", () => {
|
||||
expect(isHttpUrl('example.com')).toBe(false);
|
||||
expect(isHttpUrl("example.com")).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('isUndefined', () => {
|
||||
it('isUndefined should return true for undefined values', () => {
|
||||
describe("isUndefined", () => {
|
||||
it("isUndefined should return true for undefined values", () => {
|
||||
expect(isUndefined()).toBe(true);
|
||||
});
|
||||
|
||||
it('isUndefined should return false for null values', () => {
|
||||
it("isUndefined should return false for null values", () => {
|
||||
expect(isUndefined(null)).toBe(false);
|
||||
});
|
||||
|
||||
it('isUndefined should return false for defined values', () => {
|
||||
it("isUndefined should return false for defined values", () => {
|
||||
expect(isUndefined(0)).toBe(false);
|
||||
expect(isUndefined('')).toBe(false);
|
||||
expect(isUndefined("")).toBe(false);
|
||||
expect(isUndefined(false)).toBe(false);
|
||||
});
|
||||
|
||||
it('isUndefined should return false for objects and arrays', () => {
|
||||
it("isUndefined should return false for objects and arrays", () => {
|
||||
expect(isUndefined({})).toBe(false);
|
||||
expect(isUndefined([])).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('isEmpty', () => {
|
||||
it('should return true for empty string', () => {
|
||||
expect(isEmpty('')).toBe(true);
|
||||
describe("isEmpty", () => {
|
||||
it("should return true for empty string", () => {
|
||||
expect(isEmpty("")).toBe(true);
|
||||
});
|
||||
|
||||
it('should return true for empty array', () => {
|
||||
it("should return true for empty array", () => {
|
||||
expect(isEmpty([])).toBe(true);
|
||||
});
|
||||
|
||||
it('should return true for empty object', () => {
|
||||
it("should return true for empty object", () => {
|
||||
expect(isEmpty({})).toBe(true);
|
||||
});
|
||||
|
||||
it('should return false for non-empty string', () => {
|
||||
expect(isEmpty('hello')).toBe(false);
|
||||
it("should return false for non-empty string", () => {
|
||||
expect(isEmpty("hello")).toBe(false);
|
||||
});
|
||||
|
||||
it('should return false for non-empty array', () => {
|
||||
it("should return false for non-empty array", () => {
|
||||
expect(isEmpty([1, 2, 3])).toBe(false);
|
||||
});
|
||||
|
||||
it('should return false for non-empty object', () => {
|
||||
it("should return false for non-empty object", () => {
|
||||
expect(isEmpty({ a: 1 })).toBe(false);
|
||||
});
|
||||
|
||||
it('should return true for null or undefined', () => {
|
||||
it("should return true for null or undefined", () => {
|
||||
expect(isEmpty(null)).toBe(true);
|
||||
expect(isEmpty()).toBe(true);
|
||||
});
|
||||
|
||||
it('should return false for number or boolean', () => {
|
||||
it("should return false for number or boolean", () => {
|
||||
expect(isEmpty(0)).toBe(false);
|
||||
expect(isEmpty(true)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('isWindow', () => {
|
||||
it('should return true for the window object', () => {
|
||||
describe("isWindow", () => {
|
||||
it("should return true for the window object", () => {
|
||||
expect(isWindow(window)).toBe(true);
|
||||
});
|
||||
|
||||
it('should return false for other objects', () => {
|
||||
it("should return false for other objects", () => {
|
||||
expect(isWindow({})).toBe(false);
|
||||
expect(isWindow([])).toBe(false);
|
||||
expect(isWindow(null)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('isBoolean', () => {
|
||||
it('should return true for boolean values', () => {
|
||||
describe("isBoolean", () => {
|
||||
it("should return true for boolean values", () => {
|
||||
expect(isBoolean(true)).toBe(true);
|
||||
expect(isBoolean(false)).toBe(true);
|
||||
});
|
||||
|
||||
it('should return false for non-boolean values', () => {
|
||||
it("should return false for non-boolean values", () => {
|
||||
expect(isBoolean(null)).toBe(false);
|
||||
expect(isBoolean(42)).toBe(false);
|
||||
expect(isBoolean('string')).toBe(false);
|
||||
expect(isBoolean("string")).toBe(false);
|
||||
expect(isBoolean({})).toBe(false);
|
||||
expect(isBoolean([])).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('isObject', () => {
|
||||
it('should return true for objects', () => {
|
||||
describe("isObject", () => {
|
||||
it("should return true for objects", () => {
|
||||
expect(isObject({})).toBe(true);
|
||||
expect(isObject({ a: 1 })).toBe(true);
|
||||
});
|
||||
|
||||
it('should return false for non-objects', () => {
|
||||
it("should return false for non-objects", () => {
|
||||
expect(isObject(null)).toBe(false);
|
||||
expect(isObject(42)).toBe(false);
|
||||
expect(isObject('string')).toBe(false);
|
||||
expect(isObject("string")).toBe(false);
|
||||
expect(isObject(true)).toBe(false);
|
||||
expect(isObject([1, 2, 3])).toBe(true);
|
||||
expect(isObject(new Date())).toBe(true);
|
||||
@@ -129,55 +121,32 @@ describe('isObject', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('getFirstNonNullOrUndefined', () => {
|
||||
describe('getFirstNonNullOrUndefined', () => {
|
||||
it('should return the first non-null and non-undefined value for a number array', () => {
|
||||
expect(getFirstNonNullOrUndefined<number>(undefined, null, 0, 42)).toBe(
|
||||
0,
|
||||
);
|
||||
expect(getFirstNonNullOrUndefined<number>(null, undefined, 42, 123)).toBe(
|
||||
42,
|
||||
);
|
||||
describe("getFirstNonNullOrUndefined", () => {
|
||||
describe("getFirstNonNullOrUndefined", () => {
|
||||
it("should return the first non-null and non-undefined value for a number array", () => {
|
||||
expect(getFirstNonNullOrUndefined<number>(undefined, null, 0, 42)).toBe(0);
|
||||
expect(getFirstNonNullOrUndefined<number>(null, undefined, 42, 123)).toBe(42);
|
||||
});
|
||||
|
||||
it('should return the first non-null and non-undefined value for a string array', () => {
|
||||
expect(
|
||||
getFirstNonNullOrUndefined<string>(undefined, null, '', 'hello'),
|
||||
).toBe('');
|
||||
expect(
|
||||
getFirstNonNullOrUndefined<string>(null, undefined, 'test', 'world'),
|
||||
).toBe('test');
|
||||
it("should return the first non-null and non-undefined value for a string array", () => {
|
||||
expect(getFirstNonNullOrUndefined<string>(undefined, null, "", "hello")).toBe("");
|
||||
expect(getFirstNonNullOrUndefined<string>(null, undefined, "test", "world")).toBe("test");
|
||||
});
|
||||
|
||||
it('should return undefined if all values are null or undefined', () => {
|
||||
it("should return undefined if all values are null or undefined", () => {
|
||||
expect(getFirstNonNullOrUndefined(undefined, null)).toBeUndefined();
|
||||
expect(getFirstNonNullOrUndefined(null)).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should work with a single value', () => {
|
||||
it("should work with a single value", () => {
|
||||
expect(getFirstNonNullOrUndefined(42)).toBe(42);
|
||||
expect(getFirstNonNullOrUndefined()).toBeUndefined();
|
||||
expect(getFirstNonNullOrUndefined(null)).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should handle mixed types correctly', () => {
|
||||
expect(
|
||||
getFirstNonNullOrUndefined<number | object | string>(
|
||||
undefined,
|
||||
null,
|
||||
'test',
|
||||
123,
|
||||
{ key: 'value' },
|
||||
),
|
||||
).toBe('test');
|
||||
expect(
|
||||
getFirstNonNullOrUndefined<number | object | string>(
|
||||
null,
|
||||
undefined,
|
||||
[1, 2, 3],
|
||||
'string',
|
||||
),
|
||||
).toEqual([1, 2, 3]);
|
||||
it("should handle mixed types correctly", () => {
|
||||
expect(getFirstNonNullOrUndefined<number | object | string>(undefined, null, "test", 123, { key: "value" })).toBe("test");
|
||||
expect(getFirstNonNullOrUndefined<number | object | string>(null, undefined, [1, 2, 3], "string")).toEqual([1, 2, 3]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,116 +1,109 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import {
|
||||
capitalizeFirstLetter,
|
||||
kebabToCamelCase,
|
||||
toCamelCase,
|
||||
toLowerCaseFirstLetter,
|
||||
} from '../letter';
|
||||
import { capitalizeFirstLetter, kebabToCamelCase, toCamelCase, toLowerCaseFirstLetter } from "../letter";
|
||||
|
||||
describe('capitalizeFirstLetter', () => {
|
||||
it('should capitalize the first letter of a string', () => {
|
||||
expect(capitalizeFirstLetter('hello')).toBe('Hello');
|
||||
expect(capitalizeFirstLetter('world')).toBe('World');
|
||||
describe("capitalizeFirstLetter", () => {
|
||||
it("should capitalize the first letter of a string", () => {
|
||||
expect(capitalizeFirstLetter("hello")).toBe("Hello");
|
||||
expect(capitalizeFirstLetter("world")).toBe("World");
|
||||
});
|
||||
|
||||
it('should handle empty strings', () => {
|
||||
expect(capitalizeFirstLetter('')).toBe('');
|
||||
it("should handle empty strings", () => {
|
||||
expect(capitalizeFirstLetter("")).toBe("");
|
||||
});
|
||||
|
||||
it('should handle single character strings', () => {
|
||||
expect(capitalizeFirstLetter('a')).toBe('A');
|
||||
expect(capitalizeFirstLetter('b')).toBe('B');
|
||||
it("should handle single character strings", () => {
|
||||
expect(capitalizeFirstLetter("a")).toBe("A");
|
||||
expect(capitalizeFirstLetter("b")).toBe("B");
|
||||
});
|
||||
|
||||
it('should not change the case of other characters', () => {
|
||||
expect(capitalizeFirstLetter('hElLo')).toBe('HElLo');
|
||||
it("should not change the case of other characters", () => {
|
||||
expect(capitalizeFirstLetter("hElLo")).toBe("HElLo");
|
||||
});
|
||||
});
|
||||
|
||||
describe('toLowerCaseFirstLetter', () => {
|
||||
it('should convert the first letter to lowercase', () => {
|
||||
expect(toLowerCaseFirstLetter('CommonAppName')).toBe('commonAppName');
|
||||
expect(toLowerCaseFirstLetter('AnotherKeyExample')).toBe(
|
||||
'anotherKeyExample',
|
||||
);
|
||||
describe("toLowerCaseFirstLetter", () => {
|
||||
it("should convert the first letter to lowercase", () => {
|
||||
expect(toLowerCaseFirstLetter("CommonAppName")).toBe("commonAppName");
|
||||
expect(toLowerCaseFirstLetter("AnotherKeyExample")).toBe("anotherKeyExample");
|
||||
});
|
||||
|
||||
it('should return the same string if the first letter is already lowercase', () => {
|
||||
expect(toLowerCaseFirstLetter('alreadyLowerCase')).toBe('alreadyLowerCase');
|
||||
it("should return the same string if the first letter is already lowercase", () => {
|
||||
expect(toLowerCaseFirstLetter("alreadyLowerCase")).toBe("alreadyLowerCase");
|
||||
});
|
||||
|
||||
it('should handle empty strings', () => {
|
||||
expect(toLowerCaseFirstLetter('')).toBe('');
|
||||
it("should handle empty strings", () => {
|
||||
expect(toLowerCaseFirstLetter("")).toBe("");
|
||||
});
|
||||
|
||||
it('should handle single character strings', () => {
|
||||
expect(toLowerCaseFirstLetter('A')).toBe('a');
|
||||
expect(toLowerCaseFirstLetter('a')).toBe('a');
|
||||
it("should handle single character strings", () => {
|
||||
expect(toLowerCaseFirstLetter("A")).toBe("a");
|
||||
expect(toLowerCaseFirstLetter("a")).toBe("a");
|
||||
});
|
||||
|
||||
it('should handle strings with only one uppercase letter', () => {
|
||||
expect(toLowerCaseFirstLetter('A')).toBe('a');
|
||||
it("should handle strings with only one uppercase letter", () => {
|
||||
expect(toLowerCaseFirstLetter("A")).toBe("a");
|
||||
});
|
||||
|
||||
it('should handle strings with special characters', () => {
|
||||
expect(toLowerCaseFirstLetter('!Special')).toBe('!Special');
|
||||
expect(toLowerCaseFirstLetter('123Number')).toBe('123Number');
|
||||
it("should handle strings with special characters", () => {
|
||||
expect(toLowerCaseFirstLetter("!Special")).toBe("!Special");
|
||||
expect(toLowerCaseFirstLetter("123Number")).toBe("123Number");
|
||||
});
|
||||
});
|
||||
|
||||
describe('toCamelCase', () => {
|
||||
it('should return the key if parentKey is empty', () => {
|
||||
expect(toCamelCase('child', '')).toBe('child');
|
||||
describe("toCamelCase", () => {
|
||||
it("should return the key if parentKey is empty", () => {
|
||||
expect(toCamelCase("child", "")).toBe("child");
|
||||
});
|
||||
|
||||
it('should combine parentKey and key in camel case', () => {
|
||||
expect(toCamelCase('child', 'parent')).toBe('parentChild');
|
||||
it("should combine parentKey and key in camel case", () => {
|
||||
expect(toCamelCase("child", "parent")).toBe("parentChild");
|
||||
});
|
||||
|
||||
it('should handle empty key and parentKey', () => {
|
||||
expect(toCamelCase('', '')).toBe('');
|
||||
it("should handle empty key and parentKey", () => {
|
||||
expect(toCamelCase("", "")).toBe("");
|
||||
});
|
||||
|
||||
it('should handle key with capital letters', () => {
|
||||
expect(toCamelCase('Child', 'parent')).toBe('parentChild');
|
||||
expect(toCamelCase('Child', 'Parent')).toBe('ParentChild');
|
||||
it("should handle key with capital letters", () => {
|
||||
expect(toCamelCase("Child", "parent")).toBe("parentChild");
|
||||
expect(toCamelCase("Child", "Parent")).toBe("ParentChild");
|
||||
});
|
||||
});
|
||||
|
||||
describe('kebabToCamelCase', () => {
|
||||
it('should convert kebab-case to camelCase correctly', () => {
|
||||
expect(kebabToCamelCase('my-component-name')).toBe('myComponentName');
|
||||
describe("kebabToCamelCase", () => {
|
||||
it("should convert kebab-case to camelCase correctly", () => {
|
||||
expect(kebabToCamelCase("my-component-name")).toBe("myComponentName");
|
||||
});
|
||||
|
||||
it('should handle multiple consecutive hyphens', () => {
|
||||
expect(kebabToCamelCase('my--component--name')).toBe('myComponentName');
|
||||
it("should handle multiple consecutive hyphens", () => {
|
||||
expect(kebabToCamelCase("my--component--name")).toBe("myComponentName");
|
||||
});
|
||||
|
||||
it('should trim leading and trailing hyphens', () => {
|
||||
expect(kebabToCamelCase('-my-component-name-')).toBe('myComponentName');
|
||||
it("should trim leading and trailing hyphens", () => {
|
||||
expect(kebabToCamelCase("-my-component-name-")).toBe("myComponentName");
|
||||
});
|
||||
|
||||
it('should preserve the case of the first word', () => {
|
||||
expect(kebabToCamelCase('My-component-name')).toBe('MyComponentName');
|
||||
it("should preserve the case of the first word", () => {
|
||||
expect(kebabToCamelCase("My-component-name")).toBe("MyComponentName");
|
||||
});
|
||||
|
||||
it('should convert a single word correctly', () => {
|
||||
expect(kebabToCamelCase('component')).toBe('component');
|
||||
it("should convert a single word correctly", () => {
|
||||
expect(kebabToCamelCase("component")).toBe("component");
|
||||
});
|
||||
|
||||
it('should return an empty string if input is empty', () => {
|
||||
expect(kebabToCamelCase('')).toBe('');
|
||||
it("should return an empty string if input is empty", () => {
|
||||
expect(kebabToCamelCase("")).toBe("");
|
||||
});
|
||||
|
||||
it('should handle strings with no hyphens', () => {
|
||||
expect(kebabToCamelCase('mycomponentname')).toBe('mycomponentname');
|
||||
it("should handle strings with no hyphens", () => {
|
||||
expect(kebabToCamelCase("mycomponentname")).toBe("mycomponentname");
|
||||
});
|
||||
|
||||
it('should handle strings with only hyphens', () => {
|
||||
expect(kebabToCamelCase('---')).toBe('');
|
||||
it("should handle strings with only hyphens", () => {
|
||||
expect(kebabToCamelCase("---")).toBe("");
|
||||
});
|
||||
|
||||
it('should handle mixed case inputs', () => {
|
||||
expect(kebabToCamelCase('my-Component-Name')).toBe('myComponentName');
|
||||
it("should handle mixed case inputs", () => {
|
||||
expect(kebabToCamelCase("my-Component-Name")).toBe("myComponentName");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import { StateHandler } from '../state-handler';
|
||||
import { StateHandler } from "../state-handler";
|
||||
|
||||
describe('stateHandler', () => {
|
||||
it('should resolve when condition is set to true', async () => {
|
||||
describe("stateHandler", () => {
|
||||
it("should resolve when condition is set to true", async () => {
|
||||
const handler = new StateHandler();
|
||||
|
||||
// 模拟异步设置 condition 为 true
|
||||
@@ -16,7 +16,7 @@ describe('stateHandler', () => {
|
||||
expect(handler.isConditionTrue()).toBe(true);
|
||||
});
|
||||
|
||||
it('should resolve immediately if condition is already true', async () => {
|
||||
it("should resolve immediately if condition is already true", async () => {
|
||||
const handler = new StateHandler();
|
||||
handler.setConditionTrue(); // 提前设置为 true
|
||||
|
||||
@@ -25,7 +25,7 @@ describe('stateHandler', () => {
|
||||
expect(handler.isConditionTrue()).toBe(true);
|
||||
});
|
||||
|
||||
it('should reject when condition is set to false after waiting', async () => {
|
||||
it("should reject when condition is set to false after waiting", async () => {
|
||||
const handler = new StateHandler();
|
||||
|
||||
// 模拟异步设置 condition 为 false
|
||||
@@ -38,7 +38,7 @@ describe('stateHandler', () => {
|
||||
expect(handler.isConditionTrue()).toBe(false);
|
||||
});
|
||||
|
||||
it('should reset condition to false', () => {
|
||||
it("should reset condition to false", () => {
|
||||
const handler = new StateHandler();
|
||||
handler.setConditionTrue(); // 设置为 true
|
||||
handler.reset(); // 重置为 false
|
||||
@@ -46,7 +46,7 @@ describe('stateHandler', () => {
|
||||
expect(handler.isConditionTrue()).toBe(false);
|
||||
});
|
||||
|
||||
it('should resolve when condition is set to true after reset', async () => {
|
||||
it("should resolve when condition is set to true after reset", async () => {
|
||||
const handler = new StateHandler();
|
||||
handler.reset(); // 确保初始为 false
|
||||
|
||||
|
||||
@@ -17,9 +17,9 @@ describe("traverseTreeValues", () => {
|
||||
{ name: "B" },
|
||||
{
|
||||
name: "C",
|
||||
children: [{ name: "D" }, { name: "E" }]
|
||||
}
|
||||
]
|
||||
children: [{ name: "D" }, { name: "E" }],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "F",
|
||||
@@ -27,33 +27,33 @@ describe("traverseTreeValues", () => {
|
||||
{ name: "G" },
|
||||
{
|
||||
name: "H",
|
||||
children: [{ name: "I" }]
|
||||
}
|
||||
]
|
||||
}
|
||||
children: [{ name: "I" }],
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
it("traverses tree and returns all node values", () => {
|
||||
const values = traverseTreeValues<Node, NodeValue>(sampleTree, (node) => node.name, {
|
||||
childProps: "children"
|
||||
const values = traverseTreeValues<Node, NodeValue>(sampleTree, node => node.name, {
|
||||
childProps: "children",
|
||||
});
|
||||
expect(values).toEqual(["A", "B", "C", "D", "E", "F", "G", "H", "I"]);
|
||||
});
|
||||
|
||||
it("handles empty tree", () => {
|
||||
const values = traverseTreeValues<Node, NodeValue>([], (node) => node.name);
|
||||
const values = traverseTreeValues<Node, NodeValue>([], node => node.name);
|
||||
expect(values).toEqual([]);
|
||||
});
|
||||
|
||||
it("handles tree with only root node", () => {
|
||||
const rootNode = { name: "A" };
|
||||
const values = traverseTreeValues<Node, NodeValue>([rootNode], (node) => node.name);
|
||||
const values = traverseTreeValues<Node, NodeValue>([rootNode], node => node.name);
|
||||
expect(values).toEqual(["A"]);
|
||||
});
|
||||
|
||||
it("handles tree with only leaf nodes", () => {
|
||||
const leafNodes = [{ name: "A" }, { name: "B" }, { name: "C" }];
|
||||
const values = traverseTreeValues<Node, NodeValue>(leafNodes, (node) => node.name);
|
||||
const values = traverseTreeValues<Node, NodeValue>(leafNodes, node => node.name);
|
||||
expect(values).toEqual(["A", "B", "C"]);
|
||||
});
|
||||
});
|
||||
@@ -62,10 +62,10 @@ describe("filterTree", () => {
|
||||
const tree = [
|
||||
{
|
||||
id: 1,
|
||||
children: [{ id: 2 }, { id: 3, children: [{ id: 4 }, { id: 5 }, { id: 6 }] }, { id: 7 }]
|
||||
children: [{ id: 2 }, { id: 3, children: [{ id: 4 }, { id: 5 }, { id: 6 }] }, { id: 7 }],
|
||||
},
|
||||
{ id: 8, children: [{ id: 9 }, { id: 10 }] },
|
||||
{ id: 11 }
|
||||
{ id: 11 },
|
||||
];
|
||||
|
||||
it("should return all nodes when condition is always true", () => {
|
||||
@@ -79,18 +79,18 @@ describe("filterTree", () => {
|
||||
});
|
||||
|
||||
it("should return nodes with even id values", () => {
|
||||
const result = filterTree(tree, (node) => node.id % 2 === 0);
|
||||
const result = filterTree(tree, node => node.id % 2 === 0);
|
||||
expect(result).toEqual([{ id: 8, children: [{ id: 10 }] }]);
|
||||
});
|
||||
|
||||
it("should return nodes with odd id values and their ancestors", () => {
|
||||
const result = filterTree(tree, (node) => node.id % 2 === 1);
|
||||
const result = filterTree(tree, node => node.id % 2 === 1);
|
||||
expect(result).toEqual([
|
||||
{
|
||||
id: 1,
|
||||
children: [{ id: 3, children: [{ id: 5 }] }, { id: 7 }]
|
||||
children: [{ id: 3, children: [{ id: 5 }] }, { id: 7 }],
|
||||
},
|
||||
{ id: 11 }
|
||||
{ id: 11 },
|
||||
]);
|
||||
});
|
||||
|
||||
@@ -102,18 +102,18 @@ describe("filterTree", () => {
|
||||
{ name: "leaf 1" },
|
||||
{
|
||||
name: "branch",
|
||||
children: [{ name: "leaf 2" }, { name: "leaf 3" }]
|
||||
children: [{ name: "leaf 2" }, { name: "leaf 3" }],
|
||||
},
|
||||
{ name: "leaf 4" }
|
||||
]
|
||||
}
|
||||
{ name: "leaf 4" },
|
||||
],
|
||||
},
|
||||
];
|
||||
const result = filterTree(tree, (node) => node.name.includes("leaf") || node.name === "root");
|
||||
const result = filterTree(tree, node => node.name.includes("leaf") || node.name === "root");
|
||||
expect(result).toEqual([
|
||||
{
|
||||
name: "root",
|
||||
children: [{ name: "leaf 1" }, { name: "leaf 4" }]
|
||||
}
|
||||
children: [{ name: "leaf 1" }, { name: "leaf 4" }],
|
||||
},
|
||||
]);
|
||||
});
|
||||
});
|
||||
@@ -136,18 +136,18 @@ describe("mapTree", () => {
|
||||
name: "node5",
|
||||
children: [
|
||||
{ id: 6, name: "node6" },
|
||||
{ id: 7, name: "node7" }
|
||||
]
|
||||
{ id: 7, name: "node7" },
|
||||
],
|
||||
},
|
||||
{ id: 8, name: "node8" }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
{ id: 8, name: "node8" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
const newTree = mapTree(tree, (node) => ({
|
||||
const newTree = mapTree(tree, node => ({
|
||||
...node,
|
||||
name: `${node.name}-new`
|
||||
name: `${node.name}-new`,
|
||||
}));
|
||||
|
||||
expect(newTree).toEqual([
|
||||
@@ -166,14 +166,14 @@ describe("mapTree", () => {
|
||||
name: "node5-new",
|
||||
children: [
|
||||
{ id: 6, name: "node6-new" },
|
||||
{ id: 7, name: "node7-new" }
|
||||
]
|
||||
{ id: 7, name: "node7-new" },
|
||||
],
|
||||
},
|
||||
{ id: 8, name: "node8-new" }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
{ id: 8, name: "node8-new" },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,60 +1,60 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import { uniqueByField } from '../unique';
|
||||
import { uniqueByField } from "../unique";
|
||||
|
||||
describe('uniqueByField', () => {
|
||||
it('should return an array with unique items based on id field', () => {
|
||||
describe("uniqueByField", () => {
|
||||
it("should return an array with unique items based on id field", () => {
|
||||
const items = [
|
||||
{ id: 1, name: 'Item 1' },
|
||||
{ id: 2, name: 'Item 2' },
|
||||
{ id: 3, name: 'Item 3' },
|
||||
{ id: 1, name: 'Duplicate Item' },
|
||||
{ id: 1, name: "Item 1" },
|
||||
{ id: 2, name: "Item 2" },
|
||||
{ id: 3, name: "Item 3" },
|
||||
{ id: 1, name: "Duplicate Item" },
|
||||
];
|
||||
|
||||
const uniqueItems = uniqueByField(items, 'id');
|
||||
const uniqueItems = uniqueByField(items, "id");
|
||||
|
||||
expect(uniqueItems).toHaveLength(3);
|
||||
expect(uniqueItems).toEqual([
|
||||
{ id: 1, name: 'Item 1' },
|
||||
{ id: 2, name: 'Item 2' },
|
||||
{ id: 3, name: 'Item 3' },
|
||||
{ id: 1, name: "Item 1" },
|
||||
{ id: 2, name: "Item 2" },
|
||||
{ id: 3, name: "Item 3" },
|
||||
]);
|
||||
});
|
||||
|
||||
it('should return an empty array when input array is empty', () => {
|
||||
it("should return an empty array when input array is empty", () => {
|
||||
const items: any[] = []; // Empty array
|
||||
|
||||
const uniqueItems = uniqueByField(items, 'id');
|
||||
const uniqueItems = uniqueByField(items, "id");
|
||||
|
||||
// Assert expected results
|
||||
expect(uniqueItems).toEqual([]);
|
||||
});
|
||||
|
||||
it('should handle arrays with only one item correctly', () => {
|
||||
const items = [{ id: 1, name: 'Item 1' }];
|
||||
it("should handle arrays with only one item correctly", () => {
|
||||
const items = [{ id: 1, name: "Item 1" }];
|
||||
|
||||
const uniqueItems = uniqueByField(items, 'id');
|
||||
const uniqueItems = uniqueByField(items, "id");
|
||||
|
||||
// Assert expected results
|
||||
expect(uniqueItems).toHaveLength(1);
|
||||
expect(uniqueItems).toEqual([{ id: 1, name: 'Item 1' }]);
|
||||
expect(uniqueItems).toEqual([{ id: 1, name: "Item 1" }]);
|
||||
});
|
||||
|
||||
it('should preserve the order of the first occurrence of each item', () => {
|
||||
it("should preserve the order of the first occurrence of each item", () => {
|
||||
const items = [
|
||||
{ id: 2, name: 'Item 2' },
|
||||
{ id: 1, name: 'Item 1' },
|
||||
{ id: 3, name: 'Item 3' },
|
||||
{ id: 1, name: 'Duplicate Item' },
|
||||
{ id: 2, name: "Item 2" },
|
||||
{ id: 1, name: "Item 1" },
|
||||
{ id: 3, name: "Item 3" },
|
||||
{ id: 1, name: "Duplicate Item" },
|
||||
];
|
||||
|
||||
const uniqueItems = uniqueByField(items, 'id');
|
||||
const uniqueItems = uniqueByField(items, "id");
|
||||
|
||||
// Assert expected results (order of first occurrences preserved)
|
||||
expect(uniqueItems).toEqual([
|
||||
{ id: 2, name: 'Item 2' },
|
||||
{ id: 1, name: 'Item 1' },
|
||||
{ id: 3, name: 'Item 3' },
|
||||
{ id: 2, name: "Item 2" },
|
||||
{ id: 1, name: "Item 1" },
|
||||
{ id: 3, name: "Item 3" },
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
+11
-15
@@ -1,30 +1,26 @@
|
||||
import { expect, it } from 'vitest';
|
||||
import { expect, it } from "vitest";
|
||||
|
||||
import { updateCSSVariables } from '../update-css-variables';
|
||||
import { updateCSSVariables } from "../update-css-variables";
|
||||
|
||||
it('updateCSSVariables should update CSS variables in :root selector', () => {
|
||||
it("updateCSSVariables should update CSS variables in :root selector", () => {
|
||||
// 模拟初始的内联样式表内容
|
||||
const initialStyleContent = ':root { --primaryColor: red; }';
|
||||
const initialStyleContent = ":root { --primaryColor: red; }";
|
||||
document.head.innerHTML = `<style id="custom-styles">${initialStyleContent}</style>`;
|
||||
|
||||
// 要更新的CSS变量和它们的新值
|
||||
const updatedVariables = {
|
||||
fontSize: '16px',
|
||||
primaryColor: 'blue',
|
||||
secondaryColor: 'green',
|
||||
fontSize: "16px",
|
||||
primaryColor: "blue",
|
||||
secondaryColor: "green",
|
||||
};
|
||||
|
||||
// 调用函数来更新CSS变量
|
||||
updateCSSVariables(updatedVariables, 'custom-styles');
|
||||
updateCSSVariables(updatedVariables, "custom-styles");
|
||||
|
||||
// 获取更新后的样式内容
|
||||
const styleElement = document.querySelector('#custom-styles');
|
||||
const updatedStyleContent = styleElement ? styleElement.textContent : '';
|
||||
const styleElement = document.querySelector("#custom-styles");
|
||||
const updatedStyleContent = styleElement ? styleElement.textContent : "";
|
||||
|
||||
// 检查更新后的样式内容是否包含正确的更新值
|
||||
expect(
|
||||
updatedStyleContent?.includes('primaryColor: blue;') &&
|
||||
updatedStyleContent?.includes('secondaryColor: green;') &&
|
||||
updatedStyleContent?.includes('fontSize: 16px;'),
|
||||
).toBe(true);
|
||||
expect(updatedStyleContent?.includes("primaryColor: blue;") && updatedStyleContent?.includes("secondaryColor: green;") && updatedStyleContent?.includes("fontSize: 16px;")).toBe(true);
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import { bindMethods, getNestedValue } from '../util';
|
||||
import { bindMethods, getNestedValue } from "../util";
|
||||
|
||||
class TestClass {
|
||||
public value: string;
|
||||
@@ -19,42 +19,42 @@ class TestClass {
|
||||
}
|
||||
}
|
||||
|
||||
describe('bindMethods', () => {
|
||||
it('should bind methods to the instance correctly', () => {
|
||||
const instance = new TestClass('initial');
|
||||
describe("bindMethods", () => {
|
||||
it("should bind methods to the instance correctly", () => {
|
||||
const instance = new TestClass("initial");
|
||||
|
||||
// 解构方法
|
||||
const { getValue } = instance;
|
||||
|
||||
// 检查 getValue 是否能正确调用,并且 this 绑定了 instance
|
||||
expect(getValue()).toBe('initial');
|
||||
expect(getValue()).toBe("initial");
|
||||
});
|
||||
|
||||
it('should bind multiple methods', () => {
|
||||
const instance = new TestClass('initial');
|
||||
it("should bind multiple methods", () => {
|
||||
const instance = new TestClass("initial");
|
||||
|
||||
const { getValue, setValue } = instance;
|
||||
|
||||
// 检查 getValue 和 setValue 方法是否正确绑定了 this
|
||||
setValue('newValue');
|
||||
expect(getValue()).toBe('newValue');
|
||||
setValue("newValue");
|
||||
expect(getValue()).toBe("newValue");
|
||||
});
|
||||
|
||||
it('should not bind non-function properties', () => {
|
||||
const instance = new TestClass('initial');
|
||||
it("should not bind non-function properties", () => {
|
||||
const instance = new TestClass("initial");
|
||||
|
||||
// 检查普通属性是否保持原样
|
||||
expect(instance.value).toBe('initial');
|
||||
expect(instance.value).toBe("initial");
|
||||
});
|
||||
|
||||
it('should not bind constructor method', () => {
|
||||
const instance = new TestClass('test');
|
||||
it("should not bind constructor method", () => {
|
||||
const instance = new TestClass("test");
|
||||
|
||||
// 检查 constructor 是否没有被绑定
|
||||
expect(instance.constructor.name).toBe('TestClass');
|
||||
expect(instance.constructor.name).toBe("TestClass");
|
||||
});
|
||||
|
||||
it('should not bind getter/setter properties', () => {
|
||||
it("should not bind getter/setter properties", () => {
|
||||
class TestWithGetterSetter {
|
||||
get value() {
|
||||
return this._value;
|
||||
@@ -64,7 +64,7 @@ describe('bindMethods', () => {
|
||||
this._value = newValue;
|
||||
}
|
||||
|
||||
private _value: string = 'test';
|
||||
private _value: string = "test";
|
||||
|
||||
constructor() {
|
||||
bindMethods(this);
|
||||
@@ -75,11 +75,11 @@ describe('bindMethods', () => {
|
||||
const { value } = instance;
|
||||
|
||||
// Getter 和 setter 不应被绑定
|
||||
expect(value).toBe('test');
|
||||
expect(value).toBe("test");
|
||||
});
|
||||
});
|
||||
|
||||
describe('getNestedValue', () => {
|
||||
describe("getNestedValue", () => {
|
||||
interface UserProfile {
|
||||
age: number;
|
||||
name: string;
|
||||
@@ -100,57 +100,57 @@ describe('getNestedValue', () => {
|
||||
user: {
|
||||
profile: {
|
||||
age: 25,
|
||||
name: 'Alice',
|
||||
name: "Alice",
|
||||
},
|
||||
settings: {
|
||||
theme: 'dark',
|
||||
theme: "dark",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
it('should get a nested value when the path is valid', () => {
|
||||
const result = getNestedValue(data, 'user.profile.name');
|
||||
expect(result).toBe('Alice');
|
||||
it("should get a nested value when the path is valid", () => {
|
||||
const result = getNestedValue(data, "user.profile.name");
|
||||
expect(result).toBe("Alice");
|
||||
});
|
||||
|
||||
it('should return undefined for non-existent property', () => {
|
||||
const result = getNestedValue(data, 'user.profile.gender');
|
||||
it("should return undefined for non-existent property", () => {
|
||||
const result = getNestedValue(data, "user.profile.gender");
|
||||
expect(result).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should return undefined when accessing a non-existent deep path', () => {
|
||||
const result = getNestedValue(data, 'user.nonexistent.field');
|
||||
it("should return undefined when accessing a non-existent deep path", () => {
|
||||
const result = getNestedValue(data, "user.nonexistent.field");
|
||||
expect(result).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should return undefined if a middle level is undefined', () => {
|
||||
const result = getNestedValue({ user: undefined }, 'user.profile.name');
|
||||
it("should return undefined if a middle level is undefined", () => {
|
||||
const result = getNestedValue({ user: undefined }, "user.profile.name");
|
||||
expect(result).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should return the correct value for a nested setting', () => {
|
||||
const result = getNestedValue(data, 'user.settings.theme');
|
||||
expect(result).toBe('dark');
|
||||
it("should return the correct value for a nested setting", () => {
|
||||
const result = getNestedValue(data, "user.settings.theme");
|
||||
expect(result).toBe("dark");
|
||||
});
|
||||
|
||||
it('should work for a single-level path', () => {
|
||||
const result = getNestedValue({ a: 1, b: 2 }, 'b');
|
||||
it("should work for a single-level path", () => {
|
||||
const result = getNestedValue({ a: 1, b: 2 }, "b");
|
||||
expect(result).toBe(2);
|
||||
});
|
||||
|
||||
it('should return the entire object if path is empty', () => {
|
||||
expect(() => getNestedValue(data, '')()).toThrow();
|
||||
it("should return the entire object if path is empty", () => {
|
||||
expect(() => getNestedValue(data, "")()).toThrow();
|
||||
});
|
||||
|
||||
it('should handle paths with array indexes', () => {
|
||||
const complexData = { list: [{ name: 'Item1' }, { name: 'Item2' }] };
|
||||
const result = getNestedValue(complexData, 'list.1.name');
|
||||
expect(result).toBe('Item2');
|
||||
it("should handle paths with array indexes", () => {
|
||||
const complexData = { list: [{ name: "Item1" }, { name: "Item2" }] };
|
||||
const result = getNestedValue(complexData, "list.1.name");
|
||||
expect(result).toBe("Item2");
|
||||
});
|
||||
|
||||
it('should return undefined when accessing an out-of-bounds array index', () => {
|
||||
const complexData = { list: [{ name: 'Item1' }] };
|
||||
const result = getNestedValue(complexData, 'list.2.name');
|
||||
it("should return undefined when accessing an out-of-bounds array index", () => {
|
||||
const complexData = { list: [{ name: "Item1" }] };
|
||||
const result = getNestedValue(complexData, "list.2.name");
|
||||
expect(result).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
import { openWindow } from '../window';
|
||||
import { openWindow } from "../window";
|
||||
|
||||
describe('openWindow', () => {
|
||||
describe("openWindow", () => {
|
||||
// 保存原始的 window.open 函数
|
||||
let originalOpen: typeof window.open;
|
||||
|
||||
@@ -14,9 +14,9 @@ describe('openWindow', () => {
|
||||
window.open = originalOpen;
|
||||
});
|
||||
|
||||
it('should call window.open with correct arguments', () => {
|
||||
const url = 'https://example.com';
|
||||
const options = { noopener: true, noreferrer: true, target: '_blank' };
|
||||
it("should call window.open with correct arguments", () => {
|
||||
const url = "https://example.com";
|
||||
const options = { noopener: true, noreferrer: true, target: "_blank" };
|
||||
|
||||
window.open = vi.fn();
|
||||
|
||||
@@ -24,10 +24,6 @@ describe('openWindow', () => {
|
||||
openWindow(url, options);
|
||||
|
||||
// 验证 window.open 是否被正确地调用
|
||||
expect(window.open).toHaveBeenCalledWith(
|
||||
url,
|
||||
options.target,
|
||||
'noopener=yes,noreferrer=yes',
|
||||
);
|
||||
expect(window.open).toHaveBeenCalledWith(url, options.target, "noopener=yes,noreferrer=yes");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -72,7 +72,7 @@ function diff<T extends Record<string, any>>(obj1: T, obj2: T): DiffResult<T> {
|
||||
const diffResult: any = {};
|
||||
|
||||
const keys = new Set([...Object.keys(o1), ...Object.keys(o2)]);
|
||||
keys.forEach((key) => {
|
||||
keys.forEach(key => {
|
||||
const valueDiff = findDifferences(o1[key], o2[key]);
|
||||
if (valueDiff !== undefined) {
|
||||
diffResult[key] = valueDiff;
|
||||
|
||||
@@ -19,7 +19,7 @@ export function getElementVisibleRect(element?: HTMLElement | null | undefined):
|
||||
left: 0,
|
||||
right: 0,
|
||||
top: 0,
|
||||
width: 0
|
||||
width: 0,
|
||||
};
|
||||
}
|
||||
const rect = element.getBoundingClientRect();
|
||||
@@ -39,7 +39,7 @@ export function getElementVisibleRect(element?: HTMLElement | null | undefined):
|
||||
left,
|
||||
right,
|
||||
top,
|
||||
width: Math.max(0, right - left)
|
||||
width: Math.max(0, right - left),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ async function loadNprogress() {
|
||||
nProgressInstance = await import("nprogress");
|
||||
nProgressInstance.configure({
|
||||
showSpinner: true,
|
||||
speed: 300
|
||||
speed: 300,
|
||||
});
|
||||
return nProgressInstance;
|
||||
}
|
||||
|
||||
@@ -3,10 +3,7 @@
|
||||
* @param {object=} errorExt - Additional Information you can pass to the err object
|
||||
* @return { Promise }
|
||||
*/
|
||||
export async function to<T, U = Error>(
|
||||
promise: Readonly<Promise<T>>,
|
||||
errorExt?: object,
|
||||
): Promise<[null, T] | [U, undefined]> {
|
||||
export async function to<T, U = Error>(promise: Readonly<Promise<T>>, errorExt?: object): Promise<[null, T] | [U, undefined]> {
|
||||
try {
|
||||
const data = await promise;
|
||||
const result: [null, T] = [null, data];
|
||||
|
||||
@@ -13,7 +13,7 @@ interface TreeConfigOptions {
|
||||
function traverseTreeValues<T, V>(tree: T[], getValue: (node: T) => V, options?: TreeConfigOptions): V[] {
|
||||
const result: V[] = [];
|
||||
const { childProps } = options || {
|
||||
childProps: "children"
|
||||
childProps: "children",
|
||||
};
|
||||
|
||||
const dfs = (treeNode: T) => {
|
||||
@@ -45,7 +45,7 @@ function traverseTreeValues<T, V>(tree: T[], getValue: (node: T) => V, options?:
|
||||
*/
|
||||
function filterTree<T extends Record<string, any>>(tree: T[], filter: (node: T) => boolean, options?: TreeConfigOptions): T[] {
|
||||
const { childProps } = options || {
|
||||
childProps: "children"
|
||||
childProps: "children",
|
||||
};
|
||||
|
||||
const _filterTree = (nodes: T[]): T[] => {
|
||||
@@ -71,9 +71,9 @@ function filterTree<T extends Record<string, any>>(tree: T[], filter: (node: T)
|
||||
*/
|
||||
function mapTree<T, V extends Record<string, any>>(tree: T[], mapper: (node: T) => V, options?: TreeConfigOptions): V[] {
|
||||
const { childProps } = options || {
|
||||
childProps: "children"
|
||||
childProps: "children",
|
||||
};
|
||||
return tree.map((node) => {
|
||||
return tree.map(node => {
|
||||
const mapperNode: Record<string, any> = mapper(node);
|
||||
if (mapperNode[childProps]) {
|
||||
mapperNode[childProps] = mapTree(mapperNode[childProps], mapper, options);
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
function uniqueByField<T>(arr: T[], key: keyof T): T[] {
|
||||
const seen = new Map<any, T>();
|
||||
return arr.filter((item) => {
|
||||
return arr.filter(item => {
|
||||
const value = item[key];
|
||||
return seen.has(value) ? false : (seen.set(value, item), true);
|
||||
});
|
||||
|
||||
@@ -2,7 +2,7 @@ export function bindMethods<T extends object>(instance: T): void {
|
||||
const prototype = Object.getPrototypeOf(instance);
|
||||
const propertyNames = Object.getOwnPropertyNames(prototype);
|
||||
|
||||
propertyNames.forEach((propertyName) => {
|
||||
propertyNames.forEach(propertyName => {
|
||||
const descriptor = Object.getOwnPropertyDescriptor(prototype, propertyName);
|
||||
const propertyValue = instance[propertyName as keyof T];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user