@ekim088/toolkit 0.3.0 → 0.4.0

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/README.md CHANGED
@@ -4,12 +4,37 @@ A simple JavaScript utility library. See [documentation](docs).
4
4
 
5
5
  ## Installation
6
6
 
7
+ Install via npm or yarn:
8
+
7
9
  ```
8
10
  yarn add @ekim088/toolkit
9
11
  ```
10
12
 
11
13
  ## Usage
12
14
 
15
+ This package supports for barrel and subpath imports:
16
+
13
17
  ```
14
18
  import { clone } from '@ekim088/toolkit';
15
19
  ```
20
+
21
+ or
22
+
23
+ ```
24
+ import { clone } from '@ekim088/toolkit/clone';
25
+ ```
26
+
27
+ ## Releasing
28
+
29
+ Releases are automated using [changesets](https://github.com/changesets/changesets):
30
+
31
+ 1. In your feature PR, run `yarn changeset` to pick the bump type
32
+ (major/minor/patch) and add a description of your changes. Commit the
33
+ generated markdown file in `.changeset/` with your changes. **Only changes
34
+ that impact the published package require a changeset.**
35
+ 2. When the PR merges to `main`, the Release workflow opens (or updates) a
36
+ "Version Packages" PR that aggregates all pending changesets: it bumps the
37
+ version, updates `CHANGELOG.md`, and regenerates the typedoc output in
38
+ `docs/`.
39
+ 3. Merge the "Version Packages" PR to publish to npm. A Discord notification
40
+ confirms the publish.
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Chunks an array into sub-arrays of at most `chunkSize` items.
3
+ * @template T
4
+ * @param {T[]} array The array to chunk.
5
+ * @param {number} chunkSize The max number of items per chunk.
6
+ * @returns {T[][]} The chunked array.
7
+ */
8
+ export declare function chunk<T>(array: readonly T[], chunkSize: number): T[][];
@@ -3,4 +3,4 @@
3
3
  * @param {*} value The value to clone.
4
4
  * @returns {*} A copy of the value.
5
5
  */
6
- export default function clone<T = unknown>(value: T): T;
6
+ export declare function clone<T = unknown>(value: T): T;
@@ -0,0 +1,17 @@
1
+ import { type RecursivePartial } from './typeUtils.js';
2
+ export type ObjectFactoryConfig = {
3
+ /**
4
+ * If `true`, deeply merges overrides into the default object.
5
+ */
6
+ mergeDeep?: boolean;
7
+ };
8
+ export type ObjectFactoryFn<T extends object> = (overrides?: RecursivePartial<T>, config?: ObjectFactoryConfig) => T;
9
+ /**
10
+ * Creates a factory function that returns an object of a given type.
11
+ * @param {object} defaultObj The default object to return when calling the
12
+ * factory function.
13
+ * @returns {Function} A factory function that returns a new object of a given
14
+ * type. Accepts an object argument that shallowly overrides properties on the
15
+ * default object.
16
+ */
17
+ export declare function createObjectFactory<T extends object>(defaultObj: T): ObjectFactoryFn<T>;
@@ -1,9 +1,17 @@
1
- export { default as clone } from './clone';
2
- export { default as isBoolean } from './isBoolean';
3
- export { default as isDeepEqual } from './isDeepEqual';
4
- export { default as isNumber } from './isNumber';
5
- export { default as isObject } from './isObject';
6
- export { default as isString } from './isString';
7
- export { default as memoizeOne, type MemoizedFn, type EqualityFn, } from './memoizeOne';
8
- export { default as merge, type Merged } from './merge';
9
- export * from './typeUtils';
1
+ export * from './chunk.js';
2
+ export * from './clone.js';
3
+ export * from './createObjectFactory.js';
4
+ export * from './isBoolean.js';
5
+ export * from './isDeepEqual.js';
6
+ export * from './isNullish.js';
7
+ export * from './isNumber.js';
8
+ export * from './isObject.js';
9
+ export * from './isString.js';
10
+ export * from './isUndefined.js';
11
+ export * from './memoizeOne.js';
12
+ export * from './merge.js';
13
+ export * from './pick.js';
14
+ export * from './shuffle.js';
15
+ export * from './truthy.js';
16
+ export * from './typeUtils.js';
17
+ export * from './uuid.js';
@@ -3,4 +3,4 @@
3
3
  * @param {*} value The value to test.
4
4
  * @returns {boolean} `true` if the value is a boolean.
5
5
  */
6
- export default function isBoolean(value: unknown): value is boolean;
6
+ export declare function isBoolean(value: unknown): value is boolean;
@@ -5,4 +5,4 @@
5
5
  * @param {*} b An argument to test.
6
6
  * @returns {boolean} `true` if `a` and `b` are deeply equal.
7
7
  */
8
- export default function isDeepEqual(a: unknown, b: unknown): boolean;
8
+ export declare function isDeepEqual(a: unknown, b: unknown): boolean;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tests if a value is `null` or `undefined`.
3
+ * @param {*} value The value to test.
4
+ * @returns {boolean} `true` if the value is `null` or `undefined`.
5
+ */
6
+ export declare function isNullish(value: unknown): value is null | undefined;
@@ -3,4 +3,4 @@
3
3
  * @param {*} value The value to test.
4
4
  * @returns {boolean} `true` if the value is a number.
5
5
  */
6
- export default function isNumber(value: unknown): value is number;
6
+ export declare function isNumber(value: unknown): value is number;
@@ -4,4 +4,4 @@
4
4
  * @returns {boolean} `true` if the value is an object. Returns `false` for
5
5
  * arrays and `null`.
6
6
  */
7
- export default function isObject(value: unknown): value is object;
7
+ export declare function isObject(value: unknown): value is object;
@@ -3,4 +3,4 @@
3
3
  * @param {*} value The value to test.
4
4
  * @returns {boolean} `true` if the value is a string.
5
5
  */
6
- export default function isString(value: unknown): value is string;
6
+ export declare function isString(value: unknown): value is string;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tests if a value is `undefined`.
3
+ * @param {*} value The value to test.
4
+ * @returns {boolean} `true` if the value is `undefined`.
5
+ */
6
+ export declare function isUndefined(value: unknown): value is undefined;
@@ -15,4 +15,4 @@ export type EqualityFn<T extends (...args: any) => unknown> = (newArgs: Paramete
15
15
  * if the equality function returns `true`.
16
16
  * @returns {Function} The memoized function.
17
17
  */
18
- export default function memoizeOne<T extends (...args: any) => unknown>(fn: T, equalityFn?: EqualityFn<T>): MemoizedFn<T>;
18
+ export declare function memoizeOne<T extends (...args: any) => unknown>(fn: T, equalityFn?: EqualityFn<T>): MemoizedFn<T>;
@@ -8,4 +8,4 @@ export type Merged<T extends object[]> = T extends [
8
8
  * @param {object[]} objects Any number of object literals to merge.
9
9
  * @returns {object} A new object with the properties of its source objects.
10
10
  */
11
- export default function merge<T extends object[]>(...objects: T): Merged<T>;
11
+ export declare function merge<T extends object[]>(...objects: T): Merged<T>;
@@ -0,0 +1,10 @@
1
+ import { type ValueOf } from './typeUtils.js';
2
+ /**
3
+ * Returns an object with only the properties that pass a given test.
4
+ * @param {object} obj The object to parse.
5
+ * @param {Function} predicate A test function called against each object
6
+ * property. Properties that return a falsy result will not be included.
7
+ * @returns {object} A new object containing only the properties that passed the
8
+ * test.
9
+ */
10
+ export declare function pick<T extends object>(obj: T, predicate: (val: ValueOf<T>, key: keyof T) => boolean): Partial<T>;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Shuffles the items in an array.
3
+ * @template T
4
+ * @param {T[]} array The array to shuffle.
5
+ * @returns {T[]} The chunked array.
6
+ */
7
+ export declare function shuffle<T = unknown>(array: T[]): T[];
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Tests if a value is truthy. Can be passed as the callback to an Array
3
+ * `filter()` method to correctly infer the type of the resulting array items.
4
+ * ```
5
+ * const arr: (string | undefined)[] = [];
6
+ * const truthyArr1: string[] = arr.filter(Boolean); // TS error
7
+ * const truthyArr2: string[] = arr.filter(truthy); // no TS error
8
+ * ```
9
+ * @param {*} value The value to test.
10
+ * @returns {boolean} `true` if the value is truthy.
11
+ */
12
+ export declare function truthy<TruthyValue>(value: TruthyValue | null | undefined | '' | 0 | false): value is TruthyValue;
@@ -1,13 +1,13 @@
1
- /**
2
- * Derives the item type from an array.
3
- */
4
- export type ItemType<T> = T extends (infer U)[] ? U : never;
5
1
  /**
6
2
  * Declares an object and its nested objects as partials.
7
3
  */
8
4
  export type RecursivePartial<T> = {
9
5
  [P in keyof T]?: T[P] extends Record<keyof any, unknown> ? RecursivePartial<T[P]> : T[P];
10
6
  };
7
+ /**
8
+ * Derives the item type from an array or object.
9
+ */
10
+ export type ValueOf<T> = T extends (infer U)[] ? U : T extends object ? T[keyof T] : never;
11
11
  /**
12
12
  * Makes a readonly object mutable.
13
13
  */
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generates a random UUID.
3
+ * @returns {string} A UUID.
4
+ */
5
+ export declare function uuid(): string;
package/lib/chunk.js ADDED
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Chunks an array into sub-arrays of at most `chunkSize` items.
3
+ * @template T
4
+ * @param {T[]} array The array to chunk.
5
+ * @param {number} chunkSize The max number of items per chunk.
6
+ * @returns {T[][]} The chunked array.
7
+ */
8
+ export function chunk(array, chunkSize) {
9
+ const result = [];
10
+ if (chunkSize < 1) {
11
+ return [];
12
+ }
13
+ for (let i = 0; i < array.length; i += chunkSize) {
14
+ result.push([...array.slice(i, i + chunkSize)]);
15
+ }
16
+ return result;
17
+ }
package/lib/clone.js CHANGED
@@ -1,4 +1,4 @@
1
- import isObject from './isObject';
1
+ import { isObject } from './isObject.js';
2
2
  function cloneObject(obj) {
3
3
  const clonedObj = {};
4
4
  for (const key in obj) {
@@ -13,7 +13,7 @@ function cloneObject(obj) {
13
13
  * @param {*} value The value to clone.
14
14
  * @returns {*} A copy of the value.
15
15
  */
16
- export default function clone(value) {
16
+ export function clone(value) {
17
17
  if (Array.isArray(value)) {
18
18
  return value.map(item => clone(item));
19
19
  }
@@ -0,0 +1,22 @@
1
+ import { clone } from './clone.js';
2
+ import { merge } from './merge.js';
3
+ /**
4
+ * Creates a factory function that returns an object of a given type.
5
+ * @param {object} defaultObj The default object to return when calling the
6
+ * factory function.
7
+ * @returns {Function} A factory function that returns a new object of a given
8
+ * type. Accepts an object argument that shallowly overrides properties on the
9
+ * default object.
10
+ */
11
+ export function createObjectFactory(defaultObj) {
12
+ const defaultCopy = clone(defaultObj);
13
+ return (overrides, { mergeDeep } = {}) => {
14
+ const newObject = clone(defaultCopy);
15
+ if (overrides) {
16
+ return mergeDeep
17
+ ? merge(newObject, overrides)
18
+ : { ...newObject, ...overrides };
19
+ }
20
+ return newObject;
21
+ };
22
+ }
package/lib/index.js CHANGED
@@ -1,9 +1,17 @@
1
- export { default as clone } from './clone';
2
- export { default as isBoolean } from './isBoolean';
3
- export { default as isDeepEqual } from './isDeepEqual';
4
- export { default as isNumber } from './isNumber';
5
- export { default as isObject } from './isObject';
6
- export { default as isString } from './isString';
7
- export { default as memoizeOne, } from './memoizeOne';
8
- export { default as merge } from './merge';
9
- export * from './typeUtils';
1
+ export * from './chunk.js';
2
+ export * from './clone.js';
3
+ export * from './createObjectFactory.js';
4
+ export * from './isBoolean.js';
5
+ export * from './isDeepEqual.js';
6
+ export * from './isNullish.js';
7
+ export * from './isNumber.js';
8
+ export * from './isObject.js';
9
+ export * from './isString.js';
10
+ export * from './isUndefined.js';
11
+ export * from './memoizeOne.js';
12
+ export * from './merge.js';
13
+ export * from './pick.js';
14
+ export * from './shuffle.js';
15
+ export * from './truthy.js';
16
+ export * from './typeUtils.js';
17
+ export * from './uuid.js';
package/lib/isBoolean.js CHANGED
@@ -3,6 +3,6 @@
3
3
  * @param {*} value The value to test.
4
4
  * @returns {boolean} `true` if the value is a boolean.
5
5
  */
6
- export default function isBoolean(value) {
6
+ export function isBoolean(value) {
7
7
  return typeof value === 'boolean';
8
8
  }
@@ -1,4 +1,4 @@
1
- import isObject from './isObject';
1
+ import { isObject } from './isObject.js';
2
2
  /**
3
3
  * Tests if two arguments are equal. Object literals and arrays are tested for
4
4
  * deep equality while other objects are tested for strict equality.
@@ -6,7 +6,7 @@ import isObject from './isObject';
6
6
  * @param {*} b An argument to test.
7
7
  * @returns {boolean} `true` if `a` and `b` are deeply equal.
8
8
  */
9
- export default function isDeepEqual(a, b) {
9
+ export function isDeepEqual(a, b) {
10
10
  if (typeof a !== typeof b) {
11
11
  return false;
12
12
  }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests if a value is `null` or `undefined`.
3
+ * @param {*} value The value to test.
4
+ * @returns {boolean} `true` if the value is `null` or `undefined`.
5
+ */
6
+ export function isNullish(value) {
7
+ return value == null;
8
+ }
package/lib/isNumber.js CHANGED
@@ -3,6 +3,6 @@
3
3
  * @param {*} value The value to test.
4
4
  * @returns {boolean} `true` if the value is a number.
5
5
  */
6
- export default function isNumber(value) {
6
+ export function isNumber(value) {
7
7
  return typeof value === 'number';
8
8
  }
package/lib/isObject.js CHANGED
@@ -4,6 +4,6 @@
4
4
  * @returns {boolean} `true` if the value is an object. Returns `false` for
5
5
  * arrays and `null`.
6
6
  */
7
- export default function isObject(value) {
7
+ export function isObject(value) {
8
8
  return !!value && value.constructor === Object;
9
9
  }
package/lib/isString.js CHANGED
@@ -3,6 +3,6 @@
3
3
  * @param {*} value The value to test.
4
4
  * @returns {boolean} `true` if the value is a string.
5
5
  */
6
- export default function isString(value) {
6
+ export function isString(value) {
7
7
  return typeof value === 'string';
8
8
  }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests if a value is `undefined`.
3
+ * @param {*} value The value to test.
4
+ * @returns {boolean} `true` if the value is `undefined`.
5
+ */
6
+ export function isUndefined(value) {
7
+ return typeof value === 'undefined';
8
+ }
package/lib/memoizeOne.js CHANGED
@@ -1,4 +1,4 @@
1
- import isDeepEqual from './isDeepEqual';
1
+ import { isDeepEqual } from './isDeepEqual.js';
2
2
  /**
3
3
  * Returns a memoized function that caches the last result of a function call.
4
4
  * The cached result is returned if the function arguments remain the same. Only
@@ -9,7 +9,7 @@ import isDeepEqual from './isDeepEqual';
9
9
  * if the equality function returns `true`.
10
10
  * @returns {Function} The memoized function.
11
11
  */
12
- export default function memoizeOne(fn, equalityFn) {
12
+ export function memoizeOne(fn, equalityFn) {
13
13
  let cache = null;
14
14
  function memoizedFn(...args) {
15
15
  if (cache &&
package/lib/merge.js CHANGED
@@ -1,11 +1,11 @@
1
- import isObject from './isObject';
1
+ import { isObject } from './isObject.js';
2
2
  /**
3
3
  * Deeply merges a list of objects into a single object. For duplicate
4
4
  * properties, subsequent occurrences overwrite the previous.
5
5
  * @param {object[]} objects Any number of object literals to merge.
6
6
  * @returns {object} A new object with the properties of its source objects.
7
7
  */
8
- export default function merge(...objects) {
8
+ export function merge(...objects) {
9
9
  const mergedObj = {};
10
10
  objects.forEach(obj => {
11
11
  Object.keys(obj).forEach(key => {
package/lib/pick.js ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Returns an object with only the properties that pass a given test.
3
+ * @param {object} obj The object to parse.
4
+ * @param {Function} predicate A test function called against each object
5
+ * property. Properties that return a falsy result will not be included.
6
+ * @returns {object} A new object containing only the properties that passed the
7
+ * test.
8
+ */
9
+ export function pick(obj, predicate) {
10
+ return Object.entries(obj).reduce((picked, [key, value]) => predicate(value, key)
11
+ ? { ...picked, [key]: value }
12
+ : picked, {});
13
+ }
package/lib/shuffle.js ADDED
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Shuffles the items in an array.
3
+ * @template T
4
+ * @param {T[]} array The array to shuffle.
5
+ * @returns {T[]} The chunked array.
6
+ */
7
+ export function shuffle(array) {
8
+ const shuffled = array.slice();
9
+ for (let i = shuffled.length - 1; i > 0; i--) {
10
+ // pick a random number from 0 to i and swap the elements at the two indices
11
+ const j = Math.floor(Math.random() * (i + 1));
12
+ [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
13
+ }
14
+ return shuffled;
15
+ }
package/lib/truthy.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Tests if a value is truthy. Can be passed as the callback to an Array
3
+ * `filter()` method to correctly infer the type of the resulting array items.
4
+ * ```
5
+ * const arr: (string | undefined)[] = [];
6
+ * const truthyArr1: string[] = arr.filter(Boolean); // TS error
7
+ * const truthyArr2: string[] = arr.filter(truthy); // no TS error
8
+ * ```
9
+ * @param {*} value The value to test.
10
+ * @returns {boolean} `true` if the value is truthy.
11
+ */
12
+ export function truthy(value) {
13
+ return !!value;
14
+ }
package/lib/uuid.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Generates a random UUID.
3
+ * @returns {string} A UUID.
4
+ */
5
+ export function uuid() {
6
+ return crypto.randomUUID();
7
+ }
package/package.json CHANGED
@@ -1,55 +1,82 @@
1
1
  {
2
- "name": "@ekim088/toolkit",
3
- "description": "A simple JavaScript utility library.",
4
- "version": "0.3.0",
5
- "author": "ekim088 <edward@cyberbird.co>",
6
- "type": "module",
7
- "license": "MIT",
8
- "main": "./lib/index.js",
9
- "types": "./lib/@types/index.d.ts",
10
- "scripts": {
11
- "build": "rm -rf ./lib && tsc & yarn docs",
12
- "docs": "typedoc",
13
- "format": "yarn exec prettier . --write",
14
- "lint": "yarn lint:js && yarn lint:types",
15
- "lint:js": "eslint . --fix",
16
- "lint:types": "tsc --noEmit",
17
- "test": "vitest",
18
- "test:ci": "vitest run",
19
- "test:coverage": "vitest run --coverage",
20
- "test:pre-commit": "vitest related --run",
21
- "_postinstall": "husky",
22
- "prepack": "pinst --disable",
23
- "postpack": "pinst --enable"
24
- },
25
- "devDependencies": {
26
- "@commitlint/cli": "^19.8.1",
27
- "@commitlint/config-conventional": "^19.8.1",
28
- "@eslint/js": "^9.27.0",
29
- "@types/node": "^22.15.29",
30
- "@vitest/coverage-v8": "3.1.4",
31
- "@vitest/eslint-plugin": "^1.2.1",
32
- "eslint": "^9.27.0",
33
- "eslint-plugin-jsdoc": "^50.6.17",
34
- "global-jsdom": "^26.0.0",
35
- "globals": "^16.2.0",
36
- "husky": "^9.1.7",
37
- "jsdom": "^26.1.0",
38
- "lint-staged": "^16.0.0",
39
- "pinst": "^3.0.0",
40
- "prettier": "3.5.3",
41
- "typedoc": "^0.28.5",
42
- "typedoc-plugin-markdown": "^4.6.3",
43
- "typescript": "^5.8.3",
44
- "typescript-eslint": "^8.32.1",
45
- "vitest": "^3.1.4"
46
- },
47
- "repository": {
48
- "type": "git",
49
- "url": "git+https://github.com/ekim088/toolkit.git"
50
- },
51
- "volta": {
52
- "node": "22.16.0",
53
- "yarn": "4.9.1"
54
- }
55
- }
2
+ "name": "@ekim088/toolkit",
3
+ "description": "A simple JavaScript utility library.",
4
+ "version": "0.4.0",
5
+ "author": "ekim088 <edward@cyberbird.co>",
6
+ "type": "module",
7
+ "license": "MIT",
8
+ "main": "./lib/index.js",
9
+ "types": "./lib/@types/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./lib/@types/index.d.ts",
13
+ "import": "./lib/index.js"
14
+ },
15
+ "./*": {
16
+ "types": "./lib/@types/*.d.ts",
17
+ "import": "./lib/*.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "lib"
22
+ ],
23
+ "sideEffects": false,
24
+ "engines": {
25
+ "node": ">=22"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "scripts": {
31
+ "build": "rm -rf ./lib && tsc",
32
+ "docs": "typedoc",
33
+ "format": "yarn exec prettier . --write",
34
+ "lint": "yarn lint:js && yarn lint:types",
35
+ "lint:js": "eslint . --fix",
36
+ "lint:package": "yarn build && yarn pack --out package.tgz && publint run package.tgz --strict && attw package.tgz --profile esm-only",
37
+ "lint:types": "tsc --noEmit",
38
+ "test": "vitest",
39
+ "test:ci": "vitest run",
40
+ "test:coverage": "vitest run --coverage",
41
+ "test:pre-commit": "vitest related --run",
42
+ "_postinstall": "husky",
43
+ "prepack": "yarn pinst --disable",
44
+ "postpack": "yarn pinst --enable",
45
+ "release": "yarn build && yarn changeset publish",
46
+ "changeset:version": "yarn changeset version && yarn docs"
47
+ },
48
+ "devDependencies": {
49
+ "@arethetypeswrong/cli": "^0.18.3",
50
+ "@changesets/cli": "^2.31.0",
51
+ "@commitlint/cli": "^19.8.1",
52
+ "@commitlint/config-conventional": "^19.8.1",
53
+ "@eslint/js": "^9.27.0",
54
+ "@types/node": "^24.0.0",
55
+ "@vitest/coverage-v8": "3.1.4",
56
+ "@vitest/eslint-plugin": "^1.2.1",
57
+ "eslint": "^9.27.0",
58
+ "eslint-plugin-jsdoc": "^50.6.17",
59
+ "global-jsdom": "^26.0.0",
60
+ "globals": "^16.2.0",
61
+ "husky": "^9.1.7",
62
+ "jsdom": "^26.1.0",
63
+ "lint-staged": "^16.0.0",
64
+ "pinst": "^3.0.0",
65
+ "prettier": "3.5.3",
66
+ "publint": "^0.3.21",
67
+ "typedoc": "^0.28.5",
68
+ "typedoc-plugin-markdown": "^4.6.3",
69
+ "typescript": "^5.8.3",
70
+ "typescript-eslint": "^8.32.1",
71
+ "vitest": "^3.1.4"
72
+ },
73
+ "repository": {
74
+ "type": "git",
75
+ "url": "git+https://github.com/ekim088/toolkit.git"
76
+ },
77
+ "packageManager": "yarn@4.9.1",
78
+ "volta": {
79
+ "node": "24.16.0",
80
+ "yarn": "4.9.1"
81
+ }
82
+ }